From 6464293157c0ed9ba61f9394b153e95380aa04d4 Mon Sep 17 00:00:00 2001 From: Emilie Thaulow Date: Tue, 21 Oct 2025 02:04:04 +0000 Subject: [PATCH 001/107] Add obsolete attribute to GetInstanceID --- .../Editor/BuildProcessors/CoreBuildData.cs | 2 +- ...SRPDisabledComputeShaderVariantStripper.cs | 2 +- .../ProbeGIBaking.RenderingLayers.cs | 4 ++-- .../ProbeVolume/ProbeGIBaking.SkyOcclusion.cs | 4 ++-- .../ProbeGIBaking.VirtualOffset.cs | 8 +++---- .../Editor/LookDev/Context.cs | 2 +- .../Editor/LookDev/EnvironmentLibrary.cs | 2 +- .../Editor/RenderGraph/RenderGraphViewer.cs | 4 ++-- ...PipelineGlobalSettingsEndNameEditAction.cs | 6 ++--- .../Editor/Volume/VolumeProfileFactory.cs | 2 +- .../Common/DynamicResolutionHandler.cs | 12 +++++----- .../Runtime/GPUDriven/GPUResidentDrawer.cs | 4 ++-- .../ProbeVolumeBakingSetWeakReference.cs | 12 +++++----- .../Textures/PowerOfTwoTextureAtlas.cs | 8 +++---- .../Runtime/Textures/RTHandle.cs | 4 ++-- .../Runtime/Textures/Texture2DAtlas.cs | 4 ++-- .../Runtime/Utilities/CoreUtils.cs | 2 +- .../GPUDriven/GPUDrivenRenderingTests.cs | 22 +++++++++---------- .../RenderPipelineGlobalSettingsUtilsTests.cs | 6 ++--- .../Editor/BuildProcessors/HDRPBuildData.cs | 8 +++---- .../HDRPComputeShaderVariantStripper.cs | 2 +- ...DRPDisabledComputeShaderVariantStripper.cs | 2 +- .../Reflection/HDBakedReflectionSystem.cs | 4 ++-- .../Camera/HDCameraEditor.Handlers.cs | 4 ++-- .../Compositor/CompositorCameraRegistry.cs | 2 +- .../Core/Textures/Texture2DAtlasDynamic.cs | 2 +- .../Runtime/Core/Textures/TextureCache.cs | 21 +++++++++--------- .../Lighting/Light/HDAdditionalLightData.cs | 4 ++-- .../Lighting/Light/HDLightRenderDatabase.cs | 2 +- .../Runtime/Lighting/Reflection/HDProbe.cs | 6 ++--- .../Lighting/Reflection/HDProbeSystem.cs | 2 +- .../Reflection/ReflectionProbeTextureCache.cs | 2 +- .../Runtime/Material/Decal/DecalSystem.cs | 4 ++-- .../Accumulation/DenoisePass.cs | 2 +- .../Accumulation/SubFrameManager.cs | 8 +++---- .../Runtime/RenderPipeline/Camera/HDCamera.cs | 4 ++-- .../HDAdditionalMeshRendererSettings.cs | 2 +- .../RenderPipeline/HDRenderPipeline.Debug.cs | 2 +- .../HDRenderPipeline.PostProcess.cs | 2 +- .../HDRenderPipeline.Prepass.cs | 6 ++--- .../RenderPipeline/PathTracing/PathTracing.cs | 6 ++--- .../Raytracing/HDRaytracingManager.cs | 4 ++-- .../RenderPass/UpscalerUtils.cs | 2 +- .../RenderPipeline/Utility/Texture3DAtlas.cs | 2 +- .../Utilities/DiffusionProfileHashTable.cs | 4 ++-- .../Runtime/Water/WaterDecal/WaterDecal.cs | 2 +- .../Editor/Utilities/ProbeCameraCacheTest.cs | 4 ++-- .../Editor/2D/Light2DEditor.cs | 2 +- .../Editor/2D/Renderer2DDataEditor.cs | 2 +- .../Editor/2D/Renderer2DMenus.cs | 4 ++-- .../Runtime/2D/Light2D.cs | 2 +- .../Runtime/LightCookieManager.cs | 6 ++--- .../PostProcess/UpscalerPostProcessPass.cs | 2 +- .../Runtime/RTHandleUtils.cs | 2 +- .../Runtime/ReflectionProbeManager.cs | 4 ++-- .../FullScreenPassRendererFeature_OldGUID.cs | 2 +- .../Runtime/UniversalRendererDebug.cs | 2 +- .../Runtime/UniversalRendererRenderGraph.cs | 4 ++-- .../Graphs/VirtualTextureShaderProperty.cs | 2 +- .../Editor/Drawing/PreviewManager.cs | 4 ++-- .../Editor/Core/VFXConverter.cs | 2 +- .../Editor/GraphView/Elements/VFXNodeUI.cs | 2 +- .../Editor/GraphView/Views/VFXCopy.cs | 2 +- .../Editor/GraphView/Views/VFXPaste.cs | 2 +- .../Editor/Inspector/VFXAssetEditor.cs | 2 +- .../Blocks/Implementations/HLSL/CustomHLSL.cs | 2 +- .../Spawn/VFXSpawnerCustomWrapper.cs | 2 +- .../Editor/Models/Blocks/VFXSubgraphBlock.cs | 2 +- .../Implementations/VFXComposedShading.cs | 4 ++-- .../Implementations/VFXStaticMeshOutput.cs | 4 ++-- .../Models/Contexts/VFXSubgraphContext.cs | 2 +- .../Operators/Implementations/CustomHLSL.cs | 2 +- .../Models/Operators/VFXSubgraphOperator.cs | 2 +- .../VFXShaderGraphParticleOutput.cs | 2 +- .../Editor/VFXAnalytics.cs | 2 +- .../Editor/VFXAssetEditorUtility.cs | 4 ++-- .../LightBaker/Utilities/SourceMapUtil.cs | 2 +- 77 files changed, 151 insertions(+), 152 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/BuildProcessors/CoreBuildData.cs b/Packages/com.unity.render-pipelines.core/Editor/BuildProcessors/CoreBuildData.cs index a6455d25afb..c11ff6e1809 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/BuildProcessors/CoreBuildData.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/BuildProcessors/CoreBuildData.cs @@ -81,7 +81,7 @@ private void CheckGPUResidentDrawerUsage() return; GraphicsSettings.GetRenderPipelineSettings() - .ForEachFieldOfType(computeShader => computeShaderCache.Add(computeShader.GetInstanceID(), computeShader)); + .ForEachFieldOfType(computeShader => computeShaderCache.Add(computeShader.GetEntityId(), computeShader)); } /// diff --git a/Packages/com.unity.render-pipelines.core/Editor/BuildProcessors/ShaderStrippers/SRPDisabledComputeShaderVariantStripper.cs b/Packages/com.unity.render-pipelines.core/Editor/BuildProcessors/ShaderStrippers/SRPDisabledComputeShaderVariantStripper.cs index fe20e666966..49bdc1aa997 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/BuildProcessors/ShaderStrippers/SRPDisabledComputeShaderVariantStripper.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/BuildProcessors/ShaderStrippers/SRPDisabledComputeShaderVariantStripper.cs @@ -8,6 +8,6 @@ class SRPDisabledComputeShaderVariantStripper : IComputeShaderVariantStripper public bool active => !CoreBuildData.instance.buildingPlayerForRenderPipeline; public bool CanRemoveVariant([DisallowNull] ComputeShader shader, string _, ShaderCompilerData __) - => CoreBuildData.instance.computeShaderCache.ContainsKey(shader.GetInstanceID()); + => CoreBuildData.instance.computeShaderCache.ContainsKey(shader.GetEntityId()); } } \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.RenderingLayers.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.RenderingLayers.cs index 79829a9883c..954dc148af1 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.RenderingLayers.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.RenderingLayers.cs @@ -127,14 +127,14 @@ static AccelStructAdapter BuildAccelerationStructure() Span perSubMeshOpaqueness = stackalloc bool[subMeshCount]; perSubMeshOpaqueness.Fill(true); - accelStruct.AddInstance(renderer.component.GetInstanceID(), renderer.component, perSubMeshMask, matIndices, perSubMeshOpaqueness, 1); + accelStruct.AddInstance(renderer.component.GetEntityId(), renderer.component, perSubMeshMask, matIndices, perSubMeshOpaqueness, 1); } foreach (var terrain in contributors.terrains) { uint mask = GetInstanceMask(terrain.component.shadowCastingMode); uint materialID = terrain.component.renderingLayerMask; // repurpose the material id as we don't need it here - accelStruct.AddInstance(terrain.component.GetInstanceID(), terrain.component, new uint[1] { mask }, new uint[1] { materialID }, new bool[1] { true }, 1); + accelStruct.AddInstance(terrain.component.GetEntityId(), terrain.component, new uint[1] { mask }, new uint[1] { materialID }, new bool[1] { true }, 1); } return accelStruct; diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.SkyOcclusion.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.SkyOcclusion.cs index 3207aa7e536..37eb01539a1 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.SkyOcclusion.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.SkyOcclusion.cs @@ -223,13 +223,13 @@ static AccelStructAdapter BuildAccelerationStructure() Span perSubMeshOpaqueness = stackalloc bool[subMeshCount]; perSubMeshOpaqueness.Fill(true); - accelStruct.AddInstance(renderer.component.GetInstanceID(), renderer.component, perSubMeshMask, matIndices, perSubMeshOpaqueness, 1); + accelStruct.AddInstance((int)renderer.component.GetEntityId().GetRawData(), renderer.component, perSubMeshMask, matIndices, perSubMeshOpaqueness, 1); } foreach (var terrain in contributors.terrains) { uint mask = GetInstanceMask(terrain.component.shadowCastingMode); - accelStruct.AddInstance(terrain.component.GetInstanceID(), terrain.component, new uint[1] { mask }, new uint[1] { 0 }, new bool[1] { true }, 1); + accelStruct.AddInstance(terrain.component.GetEntityId(), terrain.component, new uint[1] { mask }, new uint[1] { 0 }, new bool[1] { true }, 1); } return accelStruct; diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs index 5cc06919cfc..6c86eddc9c3 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs @@ -149,7 +149,7 @@ static AccelStructAdapter BuildAccelerationStructure(int mask) Span perSubMeshOpaqueness = stackalloc bool[subMeshCount]; perSubMeshOpaqueness.Fill(true); - accelStruct.AddInstance(renderer.component.GetInstanceID(), renderer.component, maskAndMatDummy, maskAndMatDummy, perSubMeshOpaqueness, 1); + accelStruct.AddInstance(renderer.component.GetEntityId(), renderer.component, maskAndMatDummy, maskAndMatDummy, perSubMeshOpaqueness, 1); } foreach (var terrain in contributors.terrains) @@ -158,7 +158,7 @@ static AccelStructAdapter BuildAccelerationStructure(int mask) if ((layerMask & mask) == 0) continue; - accelStruct.AddInstance(terrain.component.GetInstanceID(), terrain.component, new uint[1] { 0xFFFFFFFF }, new uint[1] { 0xFFFFFFFF }, new bool[1] { true }, 1); + accelStruct.AddInstance(terrain.component.GetEntityId(), terrain.component, new uint[1] { 0xFFFFFFFF }, new uint[1] { 0xFFFFFFFF }, new bool[1] { true }, 1); } return accelStruct; @@ -350,7 +350,7 @@ static internal void RecomputeVOForDebugOnly() var chunkSizeInProbes = ProbeBrickPool.GetChunkSizeInProbeCount(); var hasVirtualOffsets = m_BakingSet.settings.virtualOffsetSettings.useVirtualOffset; var hasRenderingLayers = m_BakingSet.useRenderingLayers; - + if (ValidateBakingCellsSize(bakingCellsArray, chunkSizeInProbes, hasVirtualOffsets, hasRenderingLayers)) { // Write back the assets. @@ -480,7 +480,7 @@ static uint[] GetMaterialIndices(Renderer renderer) for (int i = 0; i < matIndices.Length; ++i) { if (i < renderer.sharedMaterials.Length && renderer.sharedMaterials[i] != null) - matIndices[i] = (uint)renderer.sharedMaterials[i].GetInstanceID(); + matIndices[i] = (uint)renderer.sharedMaterials[i].GetEntityId().GetRawData(); else matIndices[i] = 0; } diff --git a/Packages/com.unity.render-pipelines.core/Editor/LookDev/Context.cs b/Packages/com.unity.render-pipelines.core/Editor/LookDev/Context.cs index 93f41d3fe88..8ae795ad023 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/LookDev/Context.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/LookDev/Context.cs @@ -435,7 +435,7 @@ public void UpdateViewedObject(GameObject viewedObject) bool fromHierarchy = viewedObject.scene.IsValid(); if (fromHierarchy) - viewedObjecHierarchytEntityId = viewedObject.GetInstanceID(); + viewedObjecHierarchytEntityId = viewedObject.GetEntityId(); else viewedObjectAssetGUID = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(viewedObject)); viewedObjectReference = viewedObject; diff --git a/Packages/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs b/Packages/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs index 712c92f4d91..adf751d1fb2 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs @@ -191,7 +191,7 @@ public static void CreateAndAssignTo(ObjectField field) var icon = EditorGUIUtility.FindTexture("ScriptableObject Icon"); var assetCreator = ScriptableObject.CreateInstance(); assetCreator.SetField(field); - ProjectWindowUtil.StartNameEditingIfProjectWindowExists(assetCreator.GetInstanceID(), assetCreator, "New EnvironmentLibrary.asset", icon, null); + ProjectWindowUtil.StartNameEditingIfProjectWindowExists(assetCreator.GetEntityId(), assetCreator, "New EnvironmentLibrary.asset", icon, null); } } diff --git a/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.cs b/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.cs index 5a86ad27577..75f587cb175 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.cs @@ -2087,7 +2087,7 @@ void DelayedRefresh() void CreateGUI() { - s_EditorWindowInstanceId = GetInstanceID(); + s_EditorWindowInstanceId = GetEntityId(); if (EditorPrefs.HasKey(kPassFilterLegacyEditorPrefsKey)) m_PassFilterLegacy = (PassFilterLegacy)EditorPrefs.GetInt(kPassFilterLegacyEditorPrefsKey); @@ -2143,7 +2143,7 @@ void OnDisable() // maximized, seemingly nothing happens. When it gets unmaximized, both OnEnable() and OnDisable() get called // on a new EditorWindow instance, which I guess was the maximized one? Anyway we need to ignore this event // because the DebugSession is static and we don't want to unsubscribe because the window is still open. - if (s_EditorWindowInstanceId != GetInstanceID()) + if (s_EditorWindowInstanceId != GetEntityId()) return; m_CurrentDebugData?.Clear(); diff --git a/Packages/com.unity.render-pipelines.core/Editor/Settings/RenderPipelineGlobalSettingsEndNameEditAction.cs b/Packages/com.unity.render-pipelines.core/Editor/Settings/RenderPipelineGlobalSettingsEndNameEditAction.cs index a8a4e2fef03..155e72225c1 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Settings/RenderPipelineGlobalSettingsEndNameEditAction.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Settings/RenderPipelineGlobalSettingsEndNameEditAction.cs @@ -8,14 +8,14 @@ namespace UnityEditor.Rendering /// for /// [Obsolete("RenderPipelineGlobalSettingsEndNameEditAction is no longer used and will be removed in a future release.")] - public class RenderPipelineGlobalSettingsEndNameEditAction : ProjectWindowCallback.EndNameEditAction + public class RenderPipelineGlobalSettingsEndNameEditAction : ProjectWindowCallback.AssetCreationEndAction { private Type renderPipelineType { get; set; } private Type renderPipelineGlobalSettingsType { get; set; } private RenderPipelineGlobalSettings source { get; set; } /// - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId instanceId, string pathName, string resourceFile) { RenderPipelineGlobalSettings assetCreated = RenderPipelineGlobalSettingsUtils.Create(renderPipelineGlobalSettingsType, pathName, source) as RenderPipelineGlobalSettings; @@ -45,7 +45,7 @@ internal static RenderPipelineGlobalSettingsEndNameEditAction CreateEndNameEditA internal static void StartEndNameEditAction(RenderPipelineGlobalSettingsEndNameEditAction action, string pathName) { ProjectWindowUtil.StartNameEditingIfProjectWindowExists( - action.GetInstanceID(), + action.GetEntityId(), action, pathName, CoreEditorStyles.globalSettingsIcon, diff --git a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileFactory.cs b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileFactory.cs index c51ca454d89..1fed5e893f0 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileFactory.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileFactory.cs @@ -37,7 +37,7 @@ public static void CreateVolumeProfileWithCallback(string fullPath, Action(), diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Common/DynamicResolutionHandler.cs b/Packages/com.unity.render-pipelines.core/Runtime/Common/DynamicResolutionHandler.cs index 0b6a356721d..d98a8ac8f12 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Common/DynamicResolutionHandler.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Common/DynamicResolutionHandler.cs @@ -135,7 +135,7 @@ public bool runUpscalerFilterOnFullResolution private static Dictionary s_CameraInstances = new Dictionary(CameraDictionaryMaxcCapacity); private static DynamicResolutionHandler s_DefaultInstance = new DynamicResolutionHandler(); - private static int s_ActiveCameraId = 0; + private static EntityId s_ActiveCameraId = EntityId.None; private static DynamicResolutionHandler s_ActiveInstance = s_DefaultInstance; //private global state of ScalableBufferManager @@ -161,7 +161,7 @@ private static DynamicResolutionHandler GetOrCreateDrsInstanceHandler(Camera cam return null; DynamicResolutionHandler instance = null; - var key = camera.GetInstanceID(); + var key = camera.GetEntityId(); if (!s_CameraInstances.TryGetValue(key, out instance)) { //if this camera is not available in the map of cameras lets try creating one. @@ -367,7 +367,7 @@ static public void SetActiveDynamicScalerSlot(DynamicResScalerSlot slot) public static void ClearSelectedCamera() { s_ActiveInstance = s_DefaultInstance; - s_ActiveCameraId = 0; + s_ActiveCameraId = EntityId.None; s_ActiveInstanceDirty = true; } @@ -378,7 +378,7 @@ public static void ClearSelectedCamera() /// The filter to be used by the camera to upscale to final resolution. static public void SetUpscaleFilter(Camera camera, DynamicResUpscaleFilter filter) { - var cameraID = camera.GetInstanceID(); + var cameraID = camera.GetEntityId(); if (s_CameraUpscaleFilters.ContainsKey(cameraID)) { s_CameraUpscaleFilters[cameraID] = filter; @@ -408,7 +408,7 @@ public void SetCurrentCameraRequest(bool cameraRequest) /// An action that will be called every time the dynamic resolution system triggers a change in resolution. public static void UpdateAndUseCamera(Camera camera, GlobalDynamicResolutionSettings? settings = null, Action OnResolutionChange = null) { - int newCameraId; + EntityId newCameraId; if (camera == null) { s_ActiveInstance = s_DefaultInstance; @@ -417,7 +417,7 @@ public static void UpdateAndUseCamera(Camera camera, GlobalDynamicResolutionSett else { s_ActiveInstance = GetOrCreateDrsInstanceHandler(camera); - newCameraId = camera.GetInstanceID(); + newCameraId = camera.GetEntityId(); } s_ActiveInstanceDirty = newCameraId != s_ActiveCameraId; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.cs index acc7b737062..9b2d6f98e48 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.cs @@ -512,7 +512,7 @@ private void EditorFrameUpdate(List cameras) bool newFrame = false; foreach (Camera camera in cameras) { - int instanceID = camera.GetInstanceID(); + int instanceID = camera.GetEntityId(); if (m_FrameCameraIDs.Length == 0 || m_FrameCameraIDs.Contains(instanceID)) { newFrame = true; @@ -544,7 +544,7 @@ private void UpdateSelection() var rendererIDs = new NativeArray(renderers.Length, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); for (int i = 0; i < renderers.Length; ++i) - rendererIDs[i] = renderers[i] ? renderers[i].GetInstanceID() : 0; + rendererIDs[i] = renderers[i] ? renderers[i].GetEntityId() : 0; m_Batcher.UpdateSelectedRenderers(rendererIDs); diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSetWeakReference.cs b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSetWeakReference.cs index 6548d1d3f07..989194d7479 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSetWeakReference.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSetWeakReference.cs @@ -12,7 +12,7 @@ namespace UnityEngine.Rendering internal class ProbeVolumeBakingSetWeakReference { - public int m_InstanceID; + public EntityId m_EntityId; public ProbeVolumeBakingSetWeakReference(ProbeVolumeBakingSet bakingSet) { @@ -21,28 +21,28 @@ public ProbeVolumeBakingSetWeakReference(ProbeVolumeBakingSet bakingSet) public ProbeVolumeBakingSetWeakReference() { - m_InstanceID = 0; + m_EntityId = EntityId.None; } // Change which baking set the references points to. public void Set(ProbeVolumeBakingSet bakingSet) { if (bakingSet == null) - m_InstanceID = 0; + m_EntityId = EntityId.None; else - m_InstanceID = bakingSet.GetInstanceID(); + m_EntityId = bakingSet.GetEntityId(); } // Get the referenced baking set, loading it into memory if necessary. public ProbeVolumeBakingSet Get() { - return Resources.EntityIdToObject(m_InstanceID) as ProbeVolumeBakingSet; + return Resources.EntityIdToObject(m_EntityId) as ProbeVolumeBakingSet; } // Is the referenced baking set in memory? public bool IsLoaded() { - return Resources.EntityIdIsValid(m_InstanceID); + return Resources.EntityIdIsValid(m_EntityId); } // Force the referenced baking set to be unloaded from memory. diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Textures/PowerOfTwoTextureAtlas.cs b/Packages/com.unity.render-pipelines.core/Runtime/Textures/PowerOfTwoTextureAtlas.cs index df3496d78e3..1c16a0dc057 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Textures/PowerOfTwoTextureAtlas.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Textures/PowerOfTwoTextureAtlas.cs @@ -126,7 +126,7 @@ public override void BlitTexture(CommandBuffer cmd, Vector4 scaleOffset, Texture if (Is2D(texture)) { Blit2DTexture(cmd, scaleOffset, texture, sourceScaleOffset, blitMips, BlitType.Padding); - MarkGPUTextureValid(overrideInstanceID != -1 ? overrideInstanceID : texture.GetInstanceID(), blitMips); + MarkGPUTextureValid(overrideInstanceID != -1 ? overrideInstanceID : texture.GetEntityId(), blitMips); } } @@ -145,7 +145,7 @@ public void BlitTextureMultiply(CommandBuffer cmd, Vector4 scaleOffset, Texture if (Is2D(texture)) { Blit2DTexture(cmd, scaleOffset, texture, sourceScaleOffset, blitMips, BlitType.PaddingMultiply); - MarkGPUTextureValid(overrideInstanceID != -1 ? overrideInstanceID : texture.GetInstanceID(), blitMips); + MarkGPUTextureValid(overrideInstanceID != -1 ? overrideInstanceID : texture.GetEntityId(), blitMips); } } @@ -164,7 +164,7 @@ public override void BlitOctahedralTexture(CommandBuffer cmd, Vector4 scaleOffse if (Is2D(texture)) { Blit2DTexture(cmd, scaleOffset, texture, sourceScaleOffset, blitMips, BlitType.OctahedralPadding); - MarkGPUTextureValid(overrideInstanceID != -1 ? overrideInstanceID : texture.GetInstanceID(), blitMips); + MarkGPUTextureValid(overrideInstanceID != -1 ? overrideInstanceID : texture.GetEntityId(), blitMips); } } @@ -183,7 +183,7 @@ public void BlitOctahedralTextureMultiply(CommandBuffer cmd, Vector4 scaleOffset if (Is2D(texture)) { Blit2DTexture(cmd, scaleOffset, texture, sourceScaleOffset, blitMips, BlitType.OctahedralPaddingMultiply); - MarkGPUTextureValid(overrideInstanceID != -1 ? overrideInstanceID : texture.GetInstanceID(), blitMips); + MarkGPUTextureValid(overrideInstanceID != -1 ? overrideInstanceID : texture.GetEntityId(), blitMips); } } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Textures/RTHandle.cs b/Packages/com.unity.render-pipelines.core/Runtime/Textures/RTHandle.cs index 43039450c62..45d840208c2 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Textures/RTHandle.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Textures/RTHandle.cs @@ -209,9 +209,9 @@ internal void SetTexture(RenderTargetIdentifier tex) public int GetInstanceID() { if (m_RT != null) - return m_RT.GetInstanceID(); + return m_RT.GetEntityId(); else if (m_ExternalTexture != null) - return m_ExternalTexture.GetInstanceID(); + return m_ExternalTexture.GetEntityId(); else return m_NameID.GetHashCode(); // No instance ID so we return the hash code. } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Textures/Texture2DAtlas.cs b/Packages/com.unity.render-pipelines.core/Runtime/Textures/Texture2DAtlas.cs index 24bdb09ed12..44f12424ae2 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Textures/Texture2DAtlas.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Textures/Texture2DAtlas.cs @@ -490,7 +490,7 @@ public virtual bool AllocateTexture(CommandBuffer cmd, ref Vector4 scaleOffset, /// Allocated scale (.xy) and offset (.zw). /// True on success, false otherwise. public bool AllocateTextureWithoutBlit(Texture texture, int width, int height, ref Vector4 scaleOffset) - => AllocateTextureWithoutBlit(texture.GetInstanceID(), width, height, ref scaleOffset); + => AllocateTextureWithoutBlit(texture.GetEntityId(), width, height, ref scaleOffset); /// /// Allocate space from the atlas for a texture. @@ -537,7 +537,7 @@ private protected int GetTextureHash(Texture textureA, Texture textureB) /// Texture instance ID. public int GetTextureID(Texture texture) { - return texture.GetInstanceID(); + return texture.GetEntityId(); } /// diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Utilities/CoreUtils.cs b/Packages/com.unity.render-pipelines.core/Runtime/Utilities/CoreUtils.cs index 134f3bd95b7..e85681ad3e8 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Utilities/CoreUtils.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Utilities/CoreUtils.cs @@ -1722,7 +1722,7 @@ public static int GetTextureHash(Texture texture) #if UNITY_EDITOR hash = 23 * hash + texture.imageContentsHash.GetHashCode(); #endif - hash = 23 * hash + texture.GetInstanceID().GetHashCode(); + hash = 23 * hash + texture.GetEntityId().GetHashCode(); hash = 23 * hash + texture.graphicsFormat.GetHashCode(); hash = 23 * hash + texture.wrapMode.GetHashCode(); hash = 23 * hash + texture.width.GetHashCode(); diff --git a/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/GPUDrivenRenderingTests.cs b/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/GPUDrivenRenderingTests.cs index 9e5239b1424..93f5c51d7b3 100644 --- a/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/GPUDrivenRenderingTests.cs +++ b/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/GPUDrivenRenderingTests.cs @@ -118,7 +118,7 @@ public void TestInstanceCullingBatcherAddRemove() foreach (var obj in objList) { obj.material = dotsMaterial; - objIDs.Add(obj.GetInstanceID()); + objIDs.Add(obj.GetEntityId()); } var instances = new NativeArray(objList.Count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); @@ -173,7 +173,7 @@ public void TestInstanceCullingTier0() foreach (var obj in objList) { obj.material = simpleDotsMat; - objIDs.Add(obj.GetInstanceID()); + objIDs.Add(obj.GetEntityId()); } var instances = new NativeArray(objList.Count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); @@ -265,7 +265,7 @@ public void TestSceneViewHiddenRenderersCullingTier0() var objIDs = new NativeArray(1, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var instances = new NativeArray(1, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); - objIDs[0] = renderer.GetInstanceID(); + objIDs[0] = renderer.GetEntityId(); instances[0] = InstanceHandle.Invalid; var gpuDrivenProcessor = new GPUDrivenProcessor(); @@ -345,7 +345,7 @@ public void TestMultipleMetadata() obj.receiveGI = ReceiveGI.LightProbes; obj.lightProbeUsage = LightProbeUsage.BlendProbes; obj.material = simpleDotsMat; - objIDs.Add(obj.GetInstanceID()); + objIDs.Add(obj.GetEntityId()); } objList[2].lightProbeUsage = LightProbeUsage.Off; @@ -1011,9 +1011,9 @@ public void TestInstanceData() Assert.IsTrue(instanceSystem.InternalSanityCheckStates()); - renderersID[0] = gameObjects[3].GetComponent().GetInstanceID(); - renderersID[1] = gameObjects[4].GetComponent().GetInstanceID(); - renderersID[2] = gameObjects[5].GetComponent().GetInstanceID(); + renderersID[0] = gameObjects[3].GetComponent().GetEntityId(); + renderersID[1] = gameObjects[4].GetComponent().GetEntityId(); + renderersID[2] = gameObjects[5].GetComponent().GetEntityId(); gpuDrivenProcessor.EnableGPUDrivenRenderingAndDispatchRendererData(renderersID, (in GPUDrivenRendererGroupData rendererData, IList meshes, IList materials) => { @@ -1037,7 +1037,7 @@ public void TestInstanceData() renderersID.Dispose(); renderersID = new NativeArray(1, Allocator.TempJob); - renderersID[0] = gameObjects[6].GetComponent().GetInstanceID(); + renderersID[0] = gameObjects[6].GetComponent().GetEntityId(); gpuDrivenProcessor.EnableGPUDrivenRenderingAndDispatchRendererData(renderersID, (in GPUDrivenRendererGroupData rendererData, IList meshes, IList materials) => { @@ -1197,9 +1197,9 @@ public void TestDisallowGPUDrivenRendering() gpuDrivenProcessor.EnableGPUDrivenRenderingAndDispatchRendererData(rendererIDs, (in GPUDrivenRendererGroupData rendererData, IList meshes, IList materials) => { Assert.IsTrue(rendererData.rendererGroupID.Length == 1); - Assert.IsTrue(rendererData.rendererGroupID[0] == renderer1.GetInstanceID()); + Assert.IsTrue(rendererData.rendererGroupID[0] == renderer1.GetEntityId()); Assert.IsTrue(rendererData.invalidRendererGroupID.Length == 1); - Assert.IsTrue(rendererData.invalidRendererGroupID[0] == renderer0.GetInstanceID()); + Assert.IsTrue(rendererData.invalidRendererGroupID[0] == renderer0.GetEntityId()); dispatched = true; }, true); @@ -1370,7 +1370,7 @@ SpeedTreeWindAsset CreateDummySpeedTreeWindAsset(params object[] args) renderer.receiveGI = ReceiveGI.LightProbes; renderer.lightProbeUsage = LightProbeUsage.BlendProbes; renderer.material = simpleSpeedTreeDotsMat; - rendererIDs.Add(renderer.GetInstanceID()); + rendererIDs.Add(renderer.GetEntityId()); } var instances = new NativeArray(renderers.Count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); diff --git a/Packages/com.unity.render-pipelines.core/Tests/Editor/RenderPipeline/RenderPipelineGlobalSettingsUtilsTests.cs b/Packages/com.unity.render-pipelines.core/Tests/Editor/RenderPipeline/RenderPipelineGlobalSettingsUtilsTests.cs index 471c44991d5..a744e20f2dd 100644 --- a/Packages/com.unity.render-pipelines.core/Tests/Editor/RenderPipeline/RenderPipelineGlobalSettingsUtilsTests.cs +++ b/Packages/com.unity.render-pipelines.core/Tests/Editor/RenderPipeline/RenderPipelineGlobalSettingsUtilsTests.cs @@ -74,7 +74,7 @@ public void Ensure(string path, bool canCreateNewAsset, AssetState assetState, s else { var instanceInGraphics = GraphicsSettings.GetSettingsForRenderPipeline(); - Assert.AreEqual(instanceInGraphics.GetInstanceID(), instanceEnsured.GetInstanceID()); + Assert.AreEqual(instanceInGraphics.GetEntityId(), instanceEnsured.GetEntityId()); Assert.IsTrue(expectedPath.Equals(AssetDatabase.GetAssetPath(instanceEnsured), StringComparison.InvariantCultureIgnoreCase)); } } @@ -87,13 +87,13 @@ public void EnsureWithAValidInstanceReturnsTheCurrentInstance() Assert.IsNotNull(instanceEnsured); Assert.IsTrue(path.Equals(AssetDatabase.GetAssetPath(instanceEnsured), StringComparison.InvariantCultureIgnoreCase)); - var instanceIDExpected = instanceEnsured.GetInstanceID(); + var instanceIDExpected = instanceEnsured.GetEntityId(); var ensureResult = RenderPipelineGlobalSettingsUtils. TryEnsure(ref instanceEnsured, DummyRenderPipelineGlobalSettings.defaultPath, true, out _); Assert.IsTrue(ensureResult); Assert.IsNotNull(instanceEnsured); - Assert.AreEqual(instanceIDExpected, instanceEnsured.GetInstanceID()); + Assert.AreEqual(instanceIDExpected, instanceEnsured.GetEntityId()); } } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/HDRPBuildData.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/HDRPBuildData.cs index efd8bfbdcec..e316d3ca59a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/HDRPBuildData.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/HDRPBuildData.cs @@ -19,7 +19,7 @@ internal class HDRPBuildData : IDisposable public bool waterDecalMaskAndCurrent { get; private set; } public Dictionary rayTracingComputeShaderCache { get; private set; } = new(); public Dictionary computeShaderCache { get; private set; } = new(); - + public HDRenderPipelineRuntimeShaders runtimeShaders { get; private set; } public HDRenderPipelineRuntimeMaterials materialResources { get; private set; } @@ -51,11 +51,11 @@ public HDRPBuildData(BuildTarget buildTarget, bool isDevelopmentBuild) if (hdrpGlobalSettingsInstance != null) { GraphicsSettings.GetRenderPipelineSettings() - .ForEachFieldOfType(computeShader => rayTracingComputeShaderCache.Add(computeShader.GetInstanceID(), computeShader)); + .ForEachFieldOfType(computeShader => rayTracingComputeShaderCache.Add(computeShader.GetEntityId(), computeShader)); runtimeShaders = GraphicsSettings.GetRenderPipelineSettings(); - runtimeShaders?.ForEachFieldOfType(computeShader => computeShaderCache.Add(computeShader.GetInstanceID(), computeShader)); - + runtimeShaders?.ForEachFieldOfType(computeShader => computeShaderCache.Add(computeShader.GetEntityId(), computeShader)); + materialResources = GraphicsSettings.GetRenderPipelineSettings(); stripDebugVariants = !isDevelopmentBuild || GraphicsSettings.GetRenderPipelineSettings().stripRuntimeDebugShaders; diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/ShaderStrippers/HDRPComputeShaderVariantStripper.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/ShaderStrippers/HDRPComputeShaderVariantStripper.cs index c07916db393..a9ffa22b499 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/ShaderStrippers/HDRPComputeShaderVariantStripper.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/ShaderStrippers/HDRPComputeShaderVariantStripper.cs @@ -194,7 +194,7 @@ public bool CanRemoveVariant([DisallowNull] ComputeShader shader, string shaderV public bool SkipShader([DisallowNull] ComputeShader shader, string shaderVariant) { // Discard any compute shader use for raytracing if none of the RP asset required it - if (!HDRPBuildData.instance.playerNeedRaytracing && HDRPBuildData.instance.rayTracingComputeShaderCache.ContainsKey(shader.GetInstanceID())) + if (!HDRPBuildData.instance.playerNeedRaytracing && HDRPBuildData.instance.rayTracingComputeShaderCache.ContainsKey(shader.GetEntityId())) return true; return false; diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/ShaderStrippers/HDRPDisabledComputeShaderVariantStripper.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/ShaderStrippers/HDRPDisabledComputeShaderVariantStripper.cs index 5ac35a65040..26e0dda18e5 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/ShaderStrippers/HDRPDisabledComputeShaderVariantStripper.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/BuildProcessors/ShaderStrippers/HDRPDisabledComputeShaderVariantStripper.cs @@ -9,7 +9,7 @@ class HDRPDisabledComputeShaderVariantStripper : IComputeShaderVariantStripper public bool CanRemoveVariant([DisallowNull] ComputeShader shader, string _, ShaderCompilerData __) { - var shaderInstanceID = shader.GetInstanceID(); + var shaderInstanceID = shader.GetEntityId(); if (HDRPBuildData.instance.computeShaderCache.ContainsKey(shaderInstanceID)) return true; diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDBakedReflectionSystem.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDBakedReflectionSystem.cs index 73a9ebcdd88..2bcdd91b723 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDBakedReflectionSystem.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDBakedReflectionSystem.cs @@ -437,7 +437,7 @@ public static bool BakeProbes(IEnumerable bakedProbes) } activeProbes.Add(probe); - probeInstanceIDs.Add(probe.GetInstanceID()); + probeInstanceIDs.Add(probe.GetEntityId()); } // APV Normalization (Execute baking) @@ -816,7 +816,7 @@ static void ComputeProbeInstanceID(IEnumerable probes, HDProbeBakingSta var i = 0; foreach (var probe in probes) { - states[i].entityId = probe.GetInstanceID(); + states[i].entityId = probe.GetEntityId(); ++i; } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Camera/HDCameraEditor.Handlers.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Camera/HDCameraEditor.Handlers.cs index 7e5e8541abf..20e933aad82 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Camera/HDCameraEditor.Handlers.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Camera/HDCameraEditor.Handlers.cs @@ -16,7 +16,7 @@ void OnSceneGUI() if (!CameraEditorUtils.IsViewPortRectValidToRender(c.rect)) return; - UnityEditor.CameraEditorUtils.HandleFrustum(c, c.GetInstanceID()); - } + UnityEditor.CameraEditorUtils.HandleFrustum(c, c.GetEntityId()); + } } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Compositor/CompositorCameraRegistry.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Compositor/CompositorCameraRegistry.cs index e2ca2a3ac8e..4a78f576ac4 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Compositor/CompositorCameraRegistry.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Compositor/CompositorCameraRegistry.cs @@ -74,7 +74,7 @@ internal void PrinCameraIDs() { for (int i = s_CompositorManagedCameras.Count - 1; i >= 0; i--) { - var id = s_CompositorManagedCameras[i] ? s_CompositorManagedCameras[i].GetInstanceID() : 0; + var id = s_CompositorManagedCameras[i] ? s_CompositorManagedCameras[i].GetEntityId() : EntityId.None; } } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Core/Textures/Texture2DAtlasDynamic.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Core/Textures/Texture2DAtlasDynamic.cs index bd36843ede1..eddaba6481d 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Core/Textures/Texture2DAtlasDynamic.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Core/Textures/Texture2DAtlasDynamic.cs @@ -442,7 +442,7 @@ public void ResetAllocator() /// Returns True if Unity successfully adds the texture. public bool AddTexture(CommandBuffer cmd, out Vector4 scaleOffset, Texture texture) { - int key = texture.GetInstanceID(); + int key = texture.GetEntityId(); if (!m_AllocationCache.TryGetValue(key, out scaleOffset)) { int width = texture.width; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Core/Textures/TextureCache.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Core/Textures/TextureCache.cs index f6ca9b8e014..628aea3cdd9 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Core/Textures/TextureCache.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Core/Textures/TextureCache.cs @@ -17,13 +17,13 @@ abstract class TextureCache // Counter of input texture that have been fed to this structure private int m_NumTextures; // Array that maps input textureIDs into the slices indexes - Dictionary m_LocatorInSliceDictionnary; + Dictionary m_LocatorInSliceDictionnary; // This structure defines the mapping between an input texture and the internal structure private struct SliceEntry { // ID of the internal structure - public uint texId; + public EntityId texId; // This counter tracks the number of frames since this slice was requested. The mechanic behind this is due to the fact that the number storage of the cache is limited public uint countLRU; // Hash that tracks the version of the input texture (allows us to know if it needs an update) @@ -40,7 +40,6 @@ private struct SliceEntry // Constant values private static uint g_MaxFrameCount = unchecked((uint)(-1)); - private static uint g_InvalidTexID = (uint)0; protected const int k_FP16SizeInByte = 2; protected const int k_NbChannel = 4; @@ -77,13 +76,13 @@ protected bool AllocTextureArray(int numTextures) { m_SliceArray = new SliceEntry[numTextures]; m_SortedIdxArray = new int[numTextures]; - m_LocatorInSliceDictionnary = new Dictionary(); + m_LocatorInSliceDictionnary = new Dictionary(); m_NumTextures = numTextures / m_SliceSize; for (int i = 0; i < m_NumTextures; i++) { m_SliceArray[i].countLRU = g_MaxFrameCount; // never used before - m_SliceArray[i].texId = g_InvalidTexID; + m_SliceArray[i].texId = EntityId.None; m_SortedIdxArray[i] = i; } } @@ -102,8 +101,8 @@ public int ReserveSlice(Texture texture, uint textureHash, out bool needUpdate) // Check the validity of the input texture if (texture == null) return -1; - var texId = (uint)texture.GetInstanceID(); - if (texId == g_InvalidTexID) + var texId = texture.GetEntityId(); + if (texId == EntityId.None) return -1; // Search for existing copy in the texId to slice index dictionary @@ -134,7 +133,7 @@ public int ReserveSlice(Texture texture, uint textureHash, out bool needUpdate) { needUpdate = true; // if we are replacing an existing entry delete it from m_locatorInSliceArray. - if (m_SliceArray[idx].texId != g_InvalidTexID) + if (m_SliceArray[idx].texId != EntityId.None) { m_LocatorInSliceDictionnary.Remove(m_SliceArray[idx].texId); } @@ -246,10 +245,10 @@ public void NewFrame() // should not really be used in general. Assuming lights are culled properly entries will automatically be replaced efficiently. public void RemoveEntryFromSlice(Texture texture) { - var texId = (uint)texture.GetInstanceID(); + var texId = texture.GetEntityId(); //assert(TexID!=g_InvalidTexID); - if (texId == g_InvalidTexID) return; + if (texId == EntityId.None) return; // search for existing copy if (!m_LocatorInSliceDictionnary.ContainsKey(texId)) @@ -281,7 +280,7 @@ public void RemoveEntryFromSlice(Texture texture) // delete from m_locatorInSliceArray and m_pSliceArray. m_LocatorInSliceDictionnary.Remove(texId); m_SliceArray[sliceIndex].countLRU = g_MaxFrameCount; // never used before - m_SliceArray[sliceIndex].texId = g_InvalidTexID; + m_SliceArray[sliceIndex].texId = EntityId.None; } protected int GetNumMips(int width, int height) diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs index 8affa0cf57e..d52ac384ecc 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs @@ -2411,7 +2411,7 @@ internal void ReserveShadowMap(Camera camera, HDShadowManager shadowManager, HDS var requestIndices = shadowRequestIndices; for (int index = 0; index < count; index++) { - requestIndices[index] = shadowManager.ReserveShadowResolutions(viewportSize, shadowMapType, GetInstanceID(), index, updateType); + requestIndices[index] = shadowManager.ReserveShadowResolutions(viewportSize, shadowMapType, GetEntityId(), index, updateType); } } @@ -3522,7 +3522,7 @@ internal void CreateHDLightRenderEntity(bool autoDestroy = false) { HDLightRenderDatabase lightEntities = HDLightRenderDatabase.instance; lightEntity = lightEntities.CreateEntity(autoDestroy); - lightEntities.AttachGameObjectData(lightEntity, legacyLight.GetInstanceID(), this, legacyLight.gameObject); + lightEntities.AttachGameObjectData(lightEntity, legacyLight.GetEntityId(), this, legacyLight.gameObject); } UpdateRenderEntity(); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDLightRenderDatabase.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDLightRenderDatabase.cs index d2316a86a14..a2772f22367 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDLightRenderDatabase.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDLightRenderDatabase.cs @@ -525,7 +525,7 @@ public bool IsValid(HDLightRenderEntity entity) // If the entity is invalid, it returns InvalidDataIndex public int FindEntityDataIndex(in Light light) { - if (light != null && m_LightsToEntityItem.TryGetValue(light.GetInstanceID(), out var foundEntity)) + if (light != null && m_LightsToEntityItem.TryGetValue(light.GetEntityId(), out var foundEntity)) return foundEntity.dataIndex; return -1; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDProbe.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDProbe.cs index d07f8010dda..2e9fb7452e6 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDProbe.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDProbe.cs @@ -913,7 +913,7 @@ private void ClearSHBaking() SphericalHarmonicsL2Utils.SetCoefficient(ref m_SHForNormalization, 7, Vector3.zero); SphericalHarmonicsL2Utils.SetCoefficient(ref m_SHForNormalization, 8, Vector3.zero); - AdditionalGIBakeRequestsManager.instance.DequeueRequest(GetInstanceID()); + AdditionalGIBakeRequestsManager.instance.DequeueRequest(GetEntityId()); QueueSHBaking(); } @@ -994,7 +994,7 @@ private void QueueSHBaking() Vector3 capturePositionWS = ComputeCapturePositionWS(); // If already enqueued this will just change the position, otherwise it'll enqueue the request. - AdditionalGIBakeRequestsManager.instance.UpdatePositionForRequest(GetInstanceID(), capturePositionWS); + AdditionalGIBakeRequestsManager.instance.UpdatePositionForRequest(GetEntityId(), capturePositionWS); ValidateSHNormalizationSourcePosition(transform.position); ValidateSHNormalizationCapturePosition(capturePositionWS); @@ -1050,7 +1050,7 @@ void UpdateProbeName() void DequeueSHRequest() { #if UNITY_EDITOR - AdditionalGIBakeRequestsManager.instance.DequeueRequest(GetInstanceID()); + AdditionalGIBakeRequestsManager.instance.DequeueRequest(GetEntityId()); #endif } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDProbeSystem.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDProbeSystem.cs index ac7f000f74e..a2fbd2394ba 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDProbeSystem.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDProbeSystem.cs @@ -343,7 +343,7 @@ int probeCount if (probes[i] == null || probes[i].Equals(null)) continue; - var instanceID = probes[i].GetInstanceID(); + var instanceID = probes[i].GetEntityId(); HashUtilities.ComputeHash128(ref instanceID, ref h); HashUtilities.AppendHash(ref h, ref result); } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/ReflectionProbeTextureCache.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/ReflectionProbeTextureCache.cs index 615bc768738..f147e78a590 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/ReflectionProbeTextureCache.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/ReflectionProbeTextureCache.cs @@ -113,7 +113,7 @@ private static int GetTextureIDAndSize(HDProbe probe, out int textureSize) { textureSize = GetTextureSizeInAtlas(probe); - int textureID = probe.texture.GetInstanceID(); + int textureID = probe.texture.GetEntityId(); // Include texture size in ID using simple hash const int kPrime = 31; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs index daa780fb05f..b7215a0231d 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs @@ -1278,7 +1278,7 @@ public DecalHandle AddDecal(DecalProjector decalProjector) var material = decalProjector.material; DecalSet decalSet = null; - int key = material != null ? material.GetInstanceID() : kNullMaterialIndex; + int key = material != null ? material.GetEntityId() : kNullMaterialIndex; if (!m_DecalSets.TryGetValue(key, out decalSet)) { SetupMipStreamingSettings(material, true); @@ -1426,7 +1426,7 @@ public void AddTexture(CommandBuffer cmd, TextureScaleBias textureScaleBias) { if (!Atlas.IsCached(out textureScaleBias.m_ScaleBias, textureScaleBias.texture)) { - if (!Atlas.AllocateTextureWithoutBlit(textureScaleBias.texture.GetInstanceID(), textureScaleBias.width, textureScaleBias.height, ref textureScaleBias.m_ScaleBias)) + if (!Atlas.AllocateTextureWithoutBlit(textureScaleBias.texture.GetEntityId(), textureScaleBias.width, textureScaleBias.height, ref textureScaleBias.m_ScaleBias)) { m_AllocationSuccess = false; } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Accumulation/DenoisePass.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Accumulation/DenoisePass.cs index c23a10fc6bc..1ba4a3be455 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Accumulation/DenoisePass.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Accumulation/DenoisePass.cs @@ -67,7 +67,7 @@ void RenderDenoisePass(RenderGraph renderGraph, ScriptableRenderContext renderCo } // copy camera params - passData.camID = hdCamera.camera.GetInstanceID(); + passData.camID = hdCamera.camera.GetEntityId(); passData.width = hdCamera.actualWidth; passData.height = hdCamera.actualHeight; passData.slices = hdCamera.viewCount; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Accumulation/SubFrameManager.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Accumulation/SubFrameManager.cs index 59701ab2598..718049f7092 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Accumulation/SubFrameManager.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Accumulation/SubFrameManager.cs @@ -322,7 +322,7 @@ float ShutterProfile(float time) else if (time > m_ShutterBeginsClosing) { float closingSlope = 1.0f / (1.0f - m_ShutterBeginsClosing); - // We are using max to prevent the weight from going negative due to numerical imprecision + // We are using max to prevent the weight from going negative due to numerical imprecision return Mathf.Max(0.0f, 1.0f - closingSlope * (time - m_ShutterBeginsClosing)); } else @@ -409,7 +409,7 @@ public void PrepareNewSubFrame() /// true if the accumulation is completed, false otherwise. public bool IsFrameCompleted(HDCamera hdCamera) { - int camID = hdCamera.camera.GetInstanceID(); + int camID = hdCamera.camera.GetEntityId(); CameraData camData = m_SubFrameManager.GetCameraData(camID); return camData.currentIteration >= m_SubFrameManager.subFrameCount; } @@ -436,7 +436,7 @@ class RenderAccumulationPassData void RenderAccumulation(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle inputTexture, TextureHandle outputTexture, List> AOVs, bool needExposure) { - int camID = hdCamera.camera.GetInstanceID(); + int camID = hdCamera.camera.GetEntityId(); Vector4 frameWeights = m_SubFrameManager.ComputeFrameWeights(camID); if (AOVs != null) @@ -506,7 +506,7 @@ void RenderAccumulation(RenderGraph renderGraph, HDCamera hdCamera, TextureHandl natCmd.DisableKeyword(accumulationShader, passData.outputKeyword); // Get the per-camera data - int camID = data.hdCamera.camera.GetInstanceID(); + int camID = data.hdCamera.camera.GetEntityId(); CameraData camData = data.subFrameManager.GetCameraData(camID); // Accumulate the path tracing results diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Camera/HDCamera.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Camera/HDCamera.cs index ce271d1c004..210e30cfcd4 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Camera/HDCamera.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Camera/HDCamera.cs @@ -902,14 +902,14 @@ internal float probeRangeCompressionFactor internal bool ValidShadowHistory(HDAdditionalLightData lightData, int screenSpaceShadowIndex, GPULightType lightType) { - return shadowHistoryUsage[screenSpaceShadowIndex].lightInstanceID == lightData.GetInstanceID() + return shadowHistoryUsage[screenSpaceShadowIndex].lightInstanceID == lightData.GetEntityId() && (shadowHistoryUsage[screenSpaceShadowIndex].frameCount == (cameraFrameCount - 1)) && (shadowHistoryUsage[screenSpaceShadowIndex].lightType == lightType); } internal void PropagateShadowHistory(HDAdditionalLightData lightData, int screenSpaceShadowIndex, GPULightType lightType) { - shadowHistoryUsage[screenSpaceShadowIndex].lightInstanceID = lightData.GetInstanceID(); + shadowHistoryUsage[screenSpaceShadowIndex].lightInstanceID = lightData.GetEntityId(); shadowHistoryUsage[screenSpaceShadowIndex].frameCount = cameraFrameCount; shadowHistoryUsage[screenSpaceShadowIndex].lightType = lightType; shadowHistoryUsage[screenSpaceShadowIndex].transform = lightData.transform.localToWorldMatrix; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDAdditionalMeshRendererSettings.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDAdditionalMeshRendererSettings.cs index 58355ce9abb..38ae5eb578c 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDAdditionalMeshRendererSettings.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDAdditionalMeshRendererSettings.cs @@ -620,7 +620,7 @@ float Smoothstep(float edge0, float edge1, float x) lodMode = m_RendererLODMode, lod = strandLOD, shadingFraction = m_ShadingSampleFraction, - hash = GetInstanceID() + hash = GetEntityId().GetHashCode() }; } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Debug.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Debug.cs index 0d1531d0149..4c1130b8159 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Debug.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Debug.cs @@ -1100,7 +1100,7 @@ void RenderOcclusionOverlay(RenderGraph renderGraph, TextureHandle colorBuffer, GPUResidentDrawer.RenderDebugOcclusionTestOverlay( renderGraph, HDDebugDisplaySettings.Instance?.gpuResidentDrawerSettings ?? null, - hdCamera.camera.GetInstanceID(), + hdCamera.camera.GetEntityId(), colorBuffer); } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs index a3699be0007..9a5337934c9 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs @@ -1076,7 +1076,7 @@ TextureHandle inputStencil io.previousPreUpscaleResolution = hdCamera.historyRTHandleProperties.previousViewportSize; io.postUpscaleResolution = new Vector2Int((int)hdCamera.finalViewport.width, (int)hdCamera.finalViewport.height); io.enableTexArray = TextureXR.useTexArray; - io.cameraInstanceID = hdCamera.camera.GetInstanceID(); + io.cameraInstanceID = hdCamera.camera.GetEntityId(); io.nearClipPlane = hdCamera.camera.nearClipPlane; io.farClipPlane = hdCamera.camera.farClipPlane; io.fieldOfViewDegrees = hdCamera.camera.fieldOfView; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Prepass.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Prepass.cs index de466c82090..add711dd42a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Prepass.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Prepass.cs @@ -238,7 +238,7 @@ OccluderPass GetOccluderPass(HDCamera hdCamera) void UpdateInstanceOccluders(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthTexture) { bool isSinglePassXR = hdCamera.xr.enabled && hdCamera.xr.singlePassEnabled; - var occluderParams = new OccluderParameters(hdCamera.camera.GetInstanceID()) + var occluderParams = new OccluderParameters(hdCamera.camera.GetEntityId()) { subviewCount = isSinglePassXR ? 2 : 1, depthTexture = depthTexture, @@ -264,7 +264,7 @@ void InstanceOcclusionTest(RenderGraph renderGraph, HDCamera hdCamera, Occlusion { bool isSinglePassXR = hdCamera.xr.enabled && hdCamera.xr.singlePassEnabled; int subviewCount = isSinglePassXR ? 2 : 1; - var settings = new OcclusionCullingSettings(hdCamera.camera.GetInstanceID(), occlusionTest) + var settings = new OcclusionCullingSettings(hdCamera.camera.GetEntityId(), occlusionTest) { instanceMultiplier = (isSinglePassXR && !SystemInfo.supportsMultiview) ? 2 : 1, }; @@ -766,7 +766,7 @@ void SetupGBufferTargets(RenderGraph renderGraph, HDCamera hdCamera, TextureHand name = "GBuffer2" #if UNITY_2020_2_OR_NEWER , fastMemoryDesc = gbufferFastMemDesc -#endif +#endif }); builder.SetRenderAttachment(prepassOutput.gbuffer.mrt[currentIndex], currentIndex++); prepassOutput.gbuffer.mrt[currentIndex] = renderGraph.CreateTexture( diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/PathTracing/PathTracing.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/PathTracing/PathTracing.cs index a22091d0856..a92fd874d7f 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/PathTracing/PathTracing.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/PathTracing/PathTracing.cs @@ -335,7 +335,7 @@ public void ResetPathTracing() /// Camera for which the accumulation is reset. public void ResetPathTracing(HDCamera hdCamera) { - int camID = hdCamera.camera.GetInstanceID(); + int camID = hdCamera.camera.GetEntityId(); CameraData camData = m_SubFrameManager.GetCameraData(camID); ResetPathTracing(camID, camData); } @@ -417,7 +417,7 @@ private UndoPropertyModification[] OnUndoRecorded(UndoPropertyModification[] mod private void OnSceneGui(SceneView sv) { if (Event.current.type == EventType.MouseDrag) - m_SubFrameManager.Reset(sv.camera.GetInstanceID()); + m_SubFrameManager.Reset(sv.camera.GetEntityId()); } #endif // UNITY_EDITOR @@ -831,7 +831,7 @@ TextureHandle RenderPathTracing(RenderGraph renderGraph, ScriptableRenderContext pathTracedAOVs.Clear(); #endif - int camID = hdCamera.camera.GetInstanceID(); + int camID = hdCamera.camera.GetEntityId(); CameraData camData = m_SubFrameManager.GetCameraData(camID); ImportPathTracingTargetsToRenderGraph(); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingManager.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingManager.cs index 694898524bf..f71fcef603b 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingManager.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingManager.cs @@ -288,7 +288,7 @@ private static AccelerationStructureStatus AddRegularInstanceToRAS(RayTracingAcc // Check if the material has changed since last time we were here if (!materialsDirty) { - materialsDirty |= UpdateMaterialCRC(currentMaterial.GetInstanceID(), currentMaterial.ComputeCRC()); + materialsDirty |= UpdateMaterialCRC(currentMaterial.GetEntityId(), currentMaterial.ComputeCRC()); } } } @@ -369,7 +369,7 @@ private static AccelerationStructureStatus AddVFXInstanceToRAS(RayTracingAcceler // Check if the material has changed since last time we were here if (!materialsDirty) { - materialsDirty |= UpdateMaterialCRC(currentMaterial.GetInstanceID(), currentMaterial.ComputeCRC()); + materialsDirty |= UpdateMaterialCRC(currentMaterial.GetEntityId(), currentMaterial.ComputeCRC()); } } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/UpscalerUtils.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/UpscalerUtils.cs index 1ba70c8bb9d..62613371f22 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/UpscalerUtils.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/UpscalerUtils.cs @@ -18,7 +18,7 @@ public class State : IDisposable public object data; public UInt64 lastFrameId { set; get; } - public static int GetKey(Camera camera) => camera.GetInstanceID(); + public static int GetKey(Camera camera) => camera.GetEntityId(); public void Init(Camera camera) { diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/Texture3DAtlas.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/Texture3DAtlas.cs index 6398d886a07..11637641c5b 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/Texture3DAtlas.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/Texture3DAtlas.cs @@ -178,7 +178,7 @@ protected int GetTextureHash(Texture texture) #if UNITY_EDITOR hash = 23 * hash + texture.imageContentsHash.GetHashCode(); #endif - hash = 23 * hash + texture.GetInstanceID().GetHashCode(); + hash = 23 * hash + texture.GetEntityId().GetHashCode(); hash = 23 * hash + texture.graphicsFormat.GetHashCode(); hash = 23 * hash + texture.width.GetHashCode(); hash = 23 * hash + texture.height.GetHashCode(); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/DiffusionProfileHashTable.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/DiffusionProfileHashTable.cs index 6c766025b68..d070f3a59bb 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/DiffusionProfileHashTable.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/DiffusionProfileHashTable.cs @@ -82,7 +82,7 @@ public static void UpdateDiffusionProfileHashNow(DiffusionProfileSettings profil // We can't move the asset } // If the asset is not in the list, we regenerate it's hash using the GUID (which leads to the same result every time) - else if (!diffusionProfileHashes.ContainsKey(profile.GetInstanceID())) + else if (!diffusionProfileHashes.ContainsKey(profile.GetEntityId())) { uint newHash = GenerateUniqueHash(profile); if (newHash != profile.profile.hash) @@ -92,7 +92,7 @@ public static void UpdateDiffusionProfileHashNow(DiffusionProfileSettings profil } } else // otherwise, no issue, we don't change the hash and we keep it to check for collisions - diffusionProfileHashes.Add(profile.GetInstanceID(), profile.profile.hash); + diffusionProfileHashes.Add(profile.GetEntityId(), profile.profile.hash); } } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterDecal/WaterDecal.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterDecal/WaterDecal.cs index b484492171f..02353dc6437 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterDecal/WaterDecal.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterDecal/WaterDecal.cs @@ -112,7 +112,7 @@ internal bool IsValidMaterial() internal int GetMaterialAtlasingId() { // If material has a property block, we can't reuse the atlas slot - return HasPropertyBlock() ? GetInstanceID(): material.GetInstanceID(); + return HasPropertyBlock() ? GetEntityId(): material.GetEntityId(); } #endregion diff --git a/Packages/com.unity.render-pipelines.high-definition/Tests/Editor/Utilities/ProbeCameraCacheTest.cs b/Packages/com.unity.render-pipelines.high-definition/Tests/Editor/Utilities/ProbeCameraCacheTest.cs index ab447ba6787..ebd77a19a05 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Tests/Editor/Utilities/ProbeCameraCacheTest.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Tests/Editor/Utilities/ProbeCameraCacheTest.cs @@ -17,13 +17,13 @@ public void GetOrCreate_And_Dispose_Works() var sameCamera = cache.GetOrCreate(0, 0); Assert.IsNotNull(sameCamera); Assert.True(ReferenceEquals(camera, sameCamera)); - Assert.AreEqual(camera.GetInstanceID(), sameCamera.GetInstanceID()); + Assert.AreEqual(camera.GetEntityId(), sameCamera.GetEntityId()); // Get another camera var otherCamera = cache.GetOrCreate(1, 0); Assert.IsNotNull(otherCamera); Assert.False(ReferenceEquals(camera, otherCamera)); - Assert.AreNotEqual(camera.GetInstanceID(), otherCamera.GetInstanceID()); + Assert.AreNotEqual(camera.GetEntityId(), otherCamera.GetEntityId()); // Clear the cameras cache.Dispose(); diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Light2DEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Light2DEditor.cs index 900aac1bd01..04ffda3cf10 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/Light2DEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Light2DEditor.cs @@ -313,7 +313,7 @@ void OnEnable() internal void SendModifiedAnalytics(Analytics.Renderer2DAnalytics analytics, Light2D light) { - Analytics.LightDataAnalytic lightData = new Analytics.LightDataAnalytic(light.GetInstanceID(), false, light.lightType); + Analytics.LightDataAnalytic lightData = new Analytics.LightDataAnalytic(light.GetEntityId(), false, light.lightType); Analytics.Renderer2DAnalytics.instance.SendData(lightData); } diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DDataEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DDataEditor.cs index ced1ddbee80..7a35e6e7926 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DDataEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DDataEditor.cs @@ -79,7 +79,7 @@ void SendModifiedAnalytics(Analytics.IAnalytics analytics) { if (m_WasModified) { - Analytics.RenderAssetAnalytic modifiedData = new Analytics.RenderAssetAnalytic(m_Renderer2DData.GetInstanceID(), false, 0, 0); + Analytics.RenderAssetAnalytic modifiedData = new Analytics.RenderAssetAnalytic(m_Renderer2DData.GetEntityId(), false, 0, 0); analytics.SendData(modifiedData); } } diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DMenus.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DMenus.cs index f5614e03e86..5b820c95531 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DMenus.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DMenus.cs @@ -113,7 +113,7 @@ static Light2D CreateLight(MenuCommand menuCommand, Light2D.LightType type, Vect var parent = menuCommand.context as GameObject; Place(go, parent); - Analytics.LightDataAnalytic lightData = new Analytics.LightDataAnalytic(light2D.GetInstanceID(), true, light2D.lightType); + Analytics.LightDataAnalytic lightData = new Analytics.LightDataAnalytic(light2D.GetEntityId(), true, light2D.lightType); Analytics.Renderer2DAnalytics.instance.SendData(lightData); return light2D; @@ -208,7 +208,7 @@ static void Create2DRendererData() { Renderer2DMenus.Create2DRendererData((instance) => { - Analytics.RenderAssetAnalytic modifiedData = new Analytics.RenderAssetAnalytic(instance.GetInstanceID(), true, 1, 2); + Analytics.RenderAssetAnalytic modifiedData = new Analytics.RenderAssetAnalytic(instance.GetEntityId(), true, 1, 2); Analytics.Renderer2DAnalytics.instance.SendData(modifiedData); }); } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Light2D.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Light2D.cs index 3ee0b4fcdd4..3d77a64b56c 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Light2D.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Light2D.cs @@ -182,7 +182,7 @@ private enum ComponentVersions int m_BatchSlotIndex = 0; internal int batchSlotIndex { get { return m_BatchSlotIndex; } set { m_BatchSlotIndex = value; } } - private int lightCookieSpriteInstanceID => lightCookieSprite?.GetInstanceID() ?? 0; + private int lightCookieSpriteInstanceID => lightCookieSprite?.GetEntityId() ?? EntityId.None; internal bool useCookieSprite => (lightType == LightType.Point || lightType == LightType.Sprite) && (lightCookieSprite != null && lightCookieSprite.texture != null); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/LightCookieManager.cs b/Packages/com.unity.render-pipelines.universal/Runtime/LightCookieManager.cs index 6762336f3fe..6507b71a1a1 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/LightCookieManager.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/LightCookieManager.cs @@ -86,8 +86,8 @@ private struct LightCookieMapping if (d == 0) { // Sort by texture ID if "undecided" to batch fetches to the same cookie texture. - int ai = alc.GetInstanceID(); - int bi = blc.GetInstanceID(); + int ai = alc.GetEntityId(); + int bi = blc.GetEntityId(); return ai - bi; } return d; @@ -633,7 +633,7 @@ uint ComputeCookieRequestPixelCount(ref WorkSlice validLight { var lcm = validLightMappings[i]; Texture cookie = lcm.light.cookie; - int cookieID = cookie.GetInstanceID(); + int cookieID = cookie.GetEntityId(); // Consider only unique textures as atlas request pixels // NOTE: relies on same cookies being sorted together diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UpscalerPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UpscalerPostProcessPass.cs index 465c914a48a..180bdddbe15 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UpscalerPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UpscalerPostProcessPass.cs @@ -78,7 +78,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer motionData = additionalCameraData.motionVectorsPersistentData; Debug.Assert(motionData != null); } - io.cameraInstanceID = cameraData.camera.GetInstanceID(); + io.cameraInstanceID = cameraData.camera.GetEntityId(); io.nearClipPlane = cameraData.camera.nearClipPlane; io.farClipPlane = cameraData.camera.farClipPlane; io.fieldOfViewDegrees = cameraData.camera.fieldOfView; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RTHandleUtils.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RTHandleUtils.cs index 10785882b1b..ba1ba87dd9b 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RTHandleUtils.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RTHandleUtils.cs @@ -176,7 +176,7 @@ internal int GetHashCodeWithNameHash(in TextureDesc texDesc) internal static TextureDesc CreateTextureDesc(RenderTextureDescriptor desc, TextureSizeMode textureSizeMode = TextureSizeMode.Explicit, int anisoLevel = 1, float mipMapBias = 0, FilterMode filterMode = FilterMode.Point, TextureWrapMode wrapMode = TextureWrapMode.Clamp, string name = "") - { + { var format = (desc.depthStencilFormat != GraphicsFormat.None) ? desc.depthStencilFormat : desc.graphicsFormat; TextureDesc rgDesc = new TextureDesc(desc.width, desc.height); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/ReflectionProbeManager.cs b/Packages/com.unity.render-pipelines.universal/Runtime/ReflectionProbeManager.cs index 30930e9313f..871fbac13e9 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/ReflectionProbeManager.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/ReflectionProbeManager.cs @@ -159,7 +159,7 @@ public unsafe void UpdateGpuData(CommandBuffer cmd, ref CullingResults cullResul var probe = probes[probeIndex]; var texture = probe.texture; - var id = probe.reflectionProbe.GetInstanceID(); + var id = probe.reflectionProbe.GetEntityId(); var wasCached = m_Cache.TryGetValue(id, out var cachedProbe); if (!texture) @@ -263,7 +263,7 @@ public unsafe void UpdateGpuData(CommandBuffer cmd, ref CullingResults cullResul for (var probeIndex = 0; probeIndex < probeCount; probeIndex++) { var probe = probes[probeIndex]; - var id = probe.reflectionProbe.GetInstanceID(); + var id = probe.reflectionProbe.GetEntityId(); var dataIndex = probeIndex - skipCount; if (!m_Cache.TryGetValue(id, out var cachedProbe) || !probe.texture) { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature_OldGUID.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature_OldGUID.cs index 755f3e03f82..6c8142f96df 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature_OldGUID.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature_OldGUID.cs @@ -31,7 +31,7 @@ void DownCast() var serializedObject = new SerializedObject(this); var scriptProperty = serializedObject.FindProperty("m_Script"); MonoScript currentScript = scriptProperty.objectReferenceValue as MonoScript; - AssetDatabase.TryGetGUIDAndLocalFileIdentifier(currentScript.GetInstanceID(), out var currentGUID, out var _); + AssetDatabase.TryGetGUIDAndLocalFileIdentifier(currentScript.GetEntityId(), out var currentGUID, out var _); if (currentGUID != oldGUID) return; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererDebug.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererDebug.cs index d094149219e..6051d5008c6 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererDebug.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererDebug.cs @@ -201,7 +201,7 @@ private void SetupRenderGraphFinalPassDebug(RenderGraph renderGraph, ContextCont { var debugSettings = DebugHandler.DebugDisplaySettings.gpuResidentDrawerSettings; - GPUResidentDrawer.RenderDebugOcclusionTestOverlay(renderGraph, debugSettings, cameraData.camera.GetInstanceID(), resourceData.activeColorTexture); + GPUResidentDrawer.RenderDebugOcclusionTestOverlay(renderGraph, debugSettings, cameraData.camera.GetEntityId(), resourceData.activeColorTexture); float screenWidth = (int)(cameraData.pixelHeight * cameraData.renderScale); float screenHeight = (int)(cameraData.pixelHeight * cameraData.renderScale); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs index e9996c62851..c866f6f3cf9 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs @@ -778,7 +778,7 @@ private void UpdateInstanceOccluders(RenderGraph renderGraph, UniversalCameraDat int scaledWidth = (int)(cameraData.pixelWidth * cameraData.renderScale); int scaledHeight = (int)(cameraData.pixelHeight * cameraData.renderScale); bool isSinglePassXR = cameraData.xr.enabled && cameraData.xr.singlePassEnabled; - var occluderParams = new OccluderParameters(cameraData.camera.GetInstanceID()) + var occluderParams = new OccluderParameters(cameraData.camera.GetEntityId()) { subviewCount = isSinglePassXR ? 2 : 1, depthTexture = depthTexture, @@ -806,7 +806,7 @@ private void InstanceOcclusionTest(RenderGraph renderGraph, UniversalCameraData { bool isSinglePassXR = cameraData.xr.enabled && cameraData.xr.singlePassEnabled; int subviewCount = isSinglePassXR ? 2 : 1; - var settings = new OcclusionCullingSettings(cameraData.camera.GetInstanceID(), occlusionTest) + var settings = new OcclusionCullingSettings(cameraData.camera.GetEntityId(), occlusionTest) { instanceMultiplier = (isSinglePassXR && !SystemInfo.supportsMultiview) ? 2 : 1, }; diff --git a/Packages/com.unity.shadergraph/Editor/Data/Graphs/VirtualTextureShaderProperty.cs b/Packages/com.unity.shadergraph/Editor/Data/Graphs/VirtualTextureShaderProperty.cs index 3537a87b587..e261de9d93d 100644 --- a/Packages/com.unity.shadergraph/Editor/Data/Graphs/VirtualTextureShaderProperty.cs +++ b/Packages/com.unity.shadergraph/Editor/Data/Graphs/VirtualTextureShaderProperty.cs @@ -207,7 +207,7 @@ internal void AddTextureInfo(List infos) var textureInfo = new PropertyCollector.TextureInfo { name = layerRefName, - textureId = texture != null ? texture.GetInstanceID() : 0, + textureId = texture != null ? texture.GetEntityId() : EntityId.None, dimension = texture != null ? texture.dimension : UnityEngine.Rendering.TextureDimension.Any, modifiable = true }; diff --git a/Packages/com.unity.shadergraph/Editor/Drawing/PreviewManager.cs b/Packages/com.unity.shadergraph/Editor/Drawing/PreviewManager.cs index 464f339083a..5528667d9c6 100644 --- a/Packages/com.unity.shadergraph/Editor/Drawing/PreviewManager.cs +++ b/Packages/com.unity.shadergraph/Editor/Drawing/PreviewManager.cs @@ -102,7 +102,7 @@ void SetupUITKPanelSettings() m_PreviewElement.style.bottom = 16; root.Add(m_PreviewElement); m_PreviewShadedElement = m_PreviewElement.Q("shader"); - UIElementsUtility.RegisterCachedPanel(m_PreviewPanelSettings.GetInstanceID(), m_PreviewPanelSettings.panel); + UIElementsUtility.RegisterCachedPanel(m_PreviewPanelSettings.GetEntityId(), m_PreviewPanelSettings.panel); SetupUITKFonts(); } @@ -1517,7 +1517,7 @@ public void Dispose() if (m_PreviewPanelSettings != null) { - UIElementsUtility.RemoveCachedPanel(m_PreviewPanelSettings.GetInstanceID()); + UIElementsUtility.RemoveCachedPanel(m_PreviewPanelSettings.GetEntityId()); Object.DestroyImmediate(m_PreviewPanelSettings); m_PreviewPanelSettings = null; } diff --git a/Packages/com.unity.visualeffectgraph/Editor/Core/VFXConverter.cs b/Packages/com.unity.visualeffectgraph/Editor/Core/VFXConverter.cs index 5f419eab265..852546742da 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Core/VFXConverter.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Core/VFXConverter.cs @@ -192,7 +192,7 @@ public static object ConvertTo(object value, Type type) { if (value == null) return null; - if (value is UnityObject obj && obj == null && obj.GetInstanceID() != 0) + if (value is UnityObject obj && obj == null && obj.GetEntityId() != EntityId.None) return obj; if (type == typeof(GraphicsBuffer)) return null; diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXNodeUI.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXNodeUI.cs index f37fe2c98e5..ab9a5e8cd48 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXNodeUI.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXNodeUI.cs @@ -85,7 +85,7 @@ public VFXNodeController controller protected virtual void OnNewController() { if (controller != null) - viewDataKey = $"NodeID-{controller.model.GetInstanceID()}"; + viewDataKey = $"NodeID-{controller.model.GetEntityId()}"; } public void OnSelectionMouseDown(MouseDownEvent e) diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXCopy.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXCopy.cs index a1656eaec32..3cfc139a1b2 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXCopy.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXCopy.cs @@ -270,7 +270,7 @@ Parameter CreateParameter(VFXParameter parameter, ParameterNode[] nodes) { return new Parameter { - originalInstanceID = parameter.GetInstanceID(), + originalInstanceID = parameter.GetEntityId(), name = parameter.exposedName, category = parameter.category, value = new VFXSerializableObject(parameter.type, parameter.value), diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXPaste.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXPaste.cs index 6f99bfb9ee8..f788e7a7c1c 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXPaste.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXPaste.cs @@ -824,7 +824,7 @@ private void PasteParameters(VFXViewController viewController, SerializableGraph foreach (var parameter in serializableGraph.parameterNodes) { // if we have a parameter with the same name use it else create it with the copied data - VFXParameter p = viewController.graph.children.OfType().FirstOrDefault(t => t.GetInstanceID() == parameter.originalInstanceID); + VFXParameter p = viewController.graph.children.OfType().FirstOrDefault(t => t.GetEntityId() == parameter.originalInstanceID); if (p == null) { Type type = parameter.value.type; diff --git a/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs b/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs index 9d5173a1971..6220033e73a 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs @@ -174,7 +174,7 @@ void OnReorder(ReorderableList list) m_OutputContexts[i].vfxSystemSortPriority = i; } - if (VFXViewWindow.GetAllWindows().All(x => x.graphView?.controller?.graph.visualEffectResource.GetInstanceID() != m_CurrentGraph.visualEffectResource.GetInstanceID() || !x.hasFocus)) + if (VFXViewWindow.GetAllWindows().All(x => x.graphView?.controller?.graph.visualEffectResource.GetEntityId() != m_CurrentGraph.visualEffectResource.GetEntityId() || !x.hasFocus)) { // Do we need a compileReporter here? AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(m_CurrentGraph.visualEffectResource)); diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/Implementations/HLSL/CustomHLSL.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/Implementations/HLSL/CustomHLSL.cs index 0f3a82ca75a..9a6df5fa796 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/Implementations/HLSL/CustomHLSL.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/Implementations/HLSL/CustomHLSL.cs @@ -235,7 +235,7 @@ public override void GetImportDependentAssets(HashSet dependencies) base.GetImportDependentAssets(dependencies); if (!ReferenceEquals(m_ShaderFile, null)) { - dependencies.Add(m_ShaderFile.GetInstanceID()); + dependencies.Add(m_ShaderFile.GetEntityId()); } } diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/Implementations/Spawn/VFXSpawnerCustomWrapper.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/Implementations/Spawn/VFXSpawnerCustomWrapper.cs index 3bfcf24416b..b9b5be9310f 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/Implementations/Spawn/VFXSpawnerCustomWrapper.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/Implementations/Spawn/VFXSpawnerCustomWrapper.cs @@ -86,7 +86,7 @@ public override void GetImportDependentAssets(HashSet dependencies) base.GetImportDependentAssets(dependencies); if (customBehavior != null) { - dependencies.Add(customBehavior.GetInstanceID()); + dependencies.Add(customBehavior.GetEntityId()); } } diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/VFXSubgraphBlock.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/VFXSubgraphBlock.cs index 4363f9986db..121cb483c8a 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/VFXSubgraphBlock.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Blocks/VFXSubgraphBlock.cs @@ -27,7 +27,7 @@ public override void GetImportDependentAssets(HashSet dependencies) base.GetImportDependentAssets(dependencies); if (!object.ReferenceEquals(m_Subgraph, null)) { - dependencies.Add(m_Subgraph.GetInstanceID()); + dependencies.Add(m_Subgraph.GetEntityId()); } } diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/Implementations/VFXComposedShading.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/Implementations/VFXComposedShading.cs index c7ee59cff23..0caf5788226 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/Implementations/VFXComposedShading.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/Implementations/VFXComposedShading.cs @@ -52,7 +52,7 @@ ShaderGraphVfxAsset GetOrRefreshShaderGraphObject(List<(string error, VFXErrorTy errors.Add(("DeprecatedOldShaderGraph", VFXErrorType.Error, ParticleShadingShaderGraph.kErrorOldSG)); currentShaderGraph = VFXResources.errorFallbackShaderGraph; - } + } else if (VFXLibrary.currentSRPBinder != null && !VFXLibrary.currentSRPBinder.IsShaderVFXCompatible(currentShaderGraph)) { if (errors != null) @@ -191,7 +191,7 @@ public override void GetImportDependentAssets(HashSet dependencies) base.GetImportDependentAssets(dependencies); if (!ReferenceEquals(shaderGraph, null)) { - dependencies.Add(shaderGraph.GetInstanceID()); + dependencies.Add(shaderGraph.GetEntityId()); } } diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/Implementations/VFXStaticMeshOutput.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/Implementations/VFXStaticMeshOutput.cs index 9dee93e077b..e634605c3de 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/Implementations/VFXStaticMeshOutput.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/Implementations/VFXStaticMeshOutput.cs @@ -64,7 +64,7 @@ private Shader GetOrRefreshShaderGraphObject(bool refreshErrors = true) var wasShaderGraphMissing = m_IsShaderGraphMissing; var meshShader = ((VFXDataMesh)GetData()).shader; //This is the only place where shader property is updated or read - if (meshShader == null && !object.ReferenceEquals(meshShader, null) && meshShader.GetInstanceID() != 0) + if (meshShader == null && !object.ReferenceEquals(meshShader, null) && meshShader.GetEntityId() != EntityId.None) { var assetPath = AssetDatabase.GetAssetPath(meshShader.GetEntityId()); @@ -109,7 +109,7 @@ public override void GetImportDependentAssets(HashSet dependencies) base.GetImportDependentAssets(dependencies); if (!object.ReferenceEquals(shader, null)) { - dependencies.Add(shader.GetInstanceID()); + dependencies.Add(shader.GetEntityId()); } } diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXSubgraphContext.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXSubgraphContext.cs index 27792a11ba2..5f4c87bd947 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXSubgraphContext.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXSubgraphContext.cs @@ -44,7 +44,7 @@ public override void GetImportDependentAssets(HashSet dependencies) base.GetImportDependentAssets(dependencies); if (!object.ReferenceEquals(m_Subgraph, null)) { - dependencies.Add(m_Subgraph.GetInstanceID()); + dependencies.Add(m_Subgraph.GetEntityId()); } } diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/Implementations/CustomHLSL.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/Implementations/CustomHLSL.cs index 1e3efc4d25d..d90b5bc27d8 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/Implementations/CustomHLSL.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/Implementations/CustomHLSL.cs @@ -228,7 +228,7 @@ public override void GetImportDependentAssets(HashSet dependencies) base.GetImportDependentAssets(dependencies); if (!ReferenceEquals(m_ShaderFile, null)) { - dependencies.Add(m_ShaderFile.GetInstanceID()); + dependencies.Add(m_ShaderFile.GetEntityId()); } } diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/VFXSubgraphOperator.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/VFXSubgraphOperator.cs index cf4d5a66b39..99a8db383b3 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/VFXSubgraphOperator.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/VFXSubgraphOperator.cs @@ -191,7 +191,7 @@ public override void GetImportDependentAssets(HashSet dependencies) base.GetImportDependentAssets(dependencies); if (!object.ReferenceEquals(m_Subgraph, null)) { - dependencies.Add(m_Subgraph.GetInstanceID()); + dependencies.Add(m_Subgraph.GetEntityId()); } } diff --git a/Packages/com.unity.visualeffectgraph/Editor/ShaderGraph/VFXShaderGraphParticleOutput.cs b/Packages/com.unity.visualeffectgraph/Editor/ShaderGraph/VFXShaderGraphParticleOutput.cs index 1ecb6c294be..c683a1defb7 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/ShaderGraph/VFXShaderGraphParticleOutput.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/ShaderGraph/VFXShaderGraphParticleOutput.cs @@ -99,7 +99,7 @@ public override void GetImportDependentAssets(HashSet dependencies) base.GetImportDependentAssets(dependencies); if (!object.ReferenceEquals(shaderGraph, null)) { - dependencies.Add(shaderGraph.GetInstanceID()); + dependencies.Add(shaderGraph.GetEntityId()); } } diff --git a/Packages/com.unity.visualeffectgraph/Editor/VFXAnalytics.cs b/Packages/com.unity.visualeffectgraph/Editor/VFXAnalytics.cs index b0f061680b8..2bfd029af48 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/VFXAnalytics.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/VFXAnalytics.cs @@ -123,7 +123,7 @@ public void UpdateGraphData(VFXView view) return; } - var instanceId = view.controller.model.asset.GetInstanceID(); + var instanceId = view.controller.model.asset.GetEntityId(); var graphInfo = openedGraphInfo.SingleOrDefault(x => x.graph_id == instanceId); if (graphInfo.graph_id > 0) { diff --git a/Packages/com.unity.visualeffectgraph/Editor/VFXAssetEditorUtility.cs b/Packages/com.unity.visualeffectgraph/Editor/VFXAssetEditorUtility.cs index ef0e7893ee3..0043b827a64 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/VFXAssetEditorUtility.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/VFXAssetEditorUtility.cs @@ -180,7 +180,7 @@ public override void Action(EntityId entityId, string pathName, string resourceF { CreateTemplateAsset(pathName, templatePath); var resource = VisualEffectResource.GetResourceAtPath(pathName); - ProjectWindowUtil.FrameObjectInProjectWindow(resource.asset.GetInstanceID()); + ProjectWindowUtil.FrameObjectInProjectWindow(resource.asset.GetEntityId()); } } @@ -189,7 +189,7 @@ internal class DoCreateNewSubgraphOperator : AssetCreationEndAction public override void Action(EntityId entityId, string pathName, string resourceFile) { var sg = CreateNew(pathName); - ProjectWindowUtil.FrameObjectInProjectWindow(sg.GetInstanceID()); + ProjectWindowUtil.FrameObjectInProjectWindow(sg.GetEntityId()); } } diff --git a/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/Utilities/SourceMapUtil.cs b/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/Utilities/SourceMapUtil.cs index 065e108c7b9..ba6f1d28c78 100644 --- a/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/Utilities/SourceMapUtil.cs +++ b/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/Utilities/SourceMapUtil.cs @@ -11,7 +11,7 @@ internal static class SourceMapUtil if (go == null) return new uint?(); - int instanceID = go.GetInstanceID(); + int instanceID = go.GetEntityId(); int instanceIndex = map.GetInstanceIndex(instanceID); if (instanceIndex == -1) From 50a755e00468545380c6c7953aa57127c8f398d5 Mon Sep 17 00:00:00 2001 From: Nicola Cerone Date: Tue, 21 Oct 2025 12:38:10 +0000 Subject: [PATCH 002/107] Fix XBox performance issue with UIToolkit shader. --- .../Data/Nodes/UI/DefaultBitmapTextNode.cs | 3 +- .../Data/Nodes/UI/DefaultSDFTextNode.cs | 2 +- .../Data/Nodes/UI/RenderTypeBranchNode.cs | 73 ++++++++++--------- .../Editor/Data/Nodes/UI/RenderTypeNode.cs | 4 +- 4 files changed, 44 insertions(+), 38 deletions(-) diff --git a/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/DefaultBitmapTextNode.cs b/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/DefaultBitmapTextNode.cs index 709bb00d708..2d8e4e4b3ef 100644 --- a/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/DefaultBitmapTextNode.cs +++ b/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/DefaultBitmapTextNode.cs @@ -35,7 +35,7 @@ public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMo sb.AppendLine("float4 {0} = float4(1, 1, 0, 1);", outputVarName); - sb.AppendLine("[branch] if (_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY && round(IN.typeTexSettings.x) == k_FragTypeBitmapText)"); + sb.AppendLine("[branch] if ((_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && round(IN.typeTexSettings.x) == k_FragTypeText && (!(GetTextureInfo(IN.typeTexSettings.y).sdfScale > 0.0)))"); using (sb.BlockScope()) { bool hasTint = GetInputNodeFromSlot(k_InputSlotIdTint) != null; @@ -43,6 +43,7 @@ public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMo sb.AppendLine("Unity_UIE_EvaluateBitmapNode_Input.tint = {0};", hasTint ? GetSlotValue(k_InputSlotIdTint, generationMode) : "IN.color"); sb.AppendLine("Unity_UIE_EvaluateBitmapNode_Input.textureSlot = IN.typeTexSettings.y;"); sb.AppendLine("Unity_UIE_EvaluateBitmapNode_Input.uv = IN.uvClip.xy;"); + sb.AppendLine("Unity_UIE_EvaluateBitmapNode_Input.opacity = IN.typeTexSettings.z;"); sb.AppendLine("CommonFragOutput Unity_UIE_EvaluateBitmapNode_Output = uie_std_frag_bitmap_text(Unity_UIE_EvaluateBitmapNode_Input);"); sb.AppendLine("{0}.rgb = Unity_UIE_EvaluateBitmapNode_Output.color.rgb;", outputVarName); // To correctly apply the opacity we have to multiply the alpha values by the input color's alpha if input color is not used as the tint diff --git a/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/DefaultSDFTextNode.cs b/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/DefaultSDFTextNode.cs index b4665271ab9..8791c282b74 100644 --- a/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/DefaultSDFTextNode.cs +++ b/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/DefaultSDFTextNode.cs @@ -35,7 +35,7 @@ public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMo sb.AppendLine("float4 {0} = float4(1, 1, 0, 1);", outputVarName); - sb.AppendLine("[branch] if ((_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && round(IN.typeTexSettings.x) == k_FragTypeSdfText)"); + sb.AppendLine("[branch] if ((_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && round(IN.typeTexSettings.x) == k_FragTypeText && (GetTextureInfo(IN.typeTexSettings.y).sdfScale > 0.0))"); using (sb.BlockScope()) { bool hasTint = GetInputNodeFromSlot(k_InputSlotIdTint) != null; diff --git a/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/RenderTypeBranchNode.cs b/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/RenderTypeBranchNode.cs index 6c2cffbc114..4d35f17f2fb 100644 --- a/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/RenderTypeBranchNode.cs +++ b/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/RenderTypeBranchNode.cs @@ -95,45 +95,50 @@ public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMo sb.AppendLine("{0} = Unity_UIE_RenderTypeSwitchNode_Output.color.a;", outputVarNameAlpha); } } - sb.AppendLine("else [branch] if ((_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && TestType(IN.typeTexSettings.x, k_FragTypeSdfText))"); + sb.AppendLine("else [branch] if ((_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && TestType(IN.typeTexSettings.x, k_FragTypeText))"); using (sb.BlockScope()) { - if (GetInputNodeFromSlot(k_InputSlotIdSdfText) != null) + sb.AppendLine("[branch] if (GetTextureInfo(IN.typeTexSettings.y).sdfScale > 0.0)"); + using (sb.BlockScope()) { - sb.AppendLine("{0} = {1}.rgb;", outputVarNameColor, GetSlotValue(k_InputSlotIdSdfText, generationMode)); - sb.AppendLine("{0} = {1}.a;", outputVarNameAlpha, GetSlotValue(k_InputSlotIdSdfText, generationMode)); + if (GetInputNodeFromSlot(k_InputSlotIdSdfText) != null) + { + sb.AppendLine("{0} = {1}.rgb;", outputVarNameColor, GetSlotValue(k_InputSlotIdSdfText, generationMode)); + sb.AppendLine("{0} = {1}.a;", outputVarNameAlpha, GetSlotValue(k_InputSlotIdSdfText, generationMode)); + } + else + { + sb.AppendLine("SdfTextFragInput Unity_UIE_RenderTypeSwitchNode_SdfText_Input;"); + sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.tint = IN.color;"); + sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.textureSlot = IN.typeTexSettings.y;"); + sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.uv = IN.uvClip.xy;"); + sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.extraDilate = IN.circle.x;"); + sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.textCoreLoc = round(IN.textCoreLoc);"); + sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.opacity = IN.typeTexSettings.z;"); + sb.AppendLine("CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_sdf_text(Unity_UIE_RenderTypeSwitchNode_SdfText_Input);"); + sb.AppendLine("{0} = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb;", outputVarNameColor); + sb.AppendLine("{0} = Unity_UIE_RenderTypeSwitchNode_Output.color.a;", outputVarNameAlpha); + } } - else + sb.AppendLine("else"); + using (sb.BlockScope()) { - sb.AppendLine("SdfTextFragInput Unity_UIE_RenderTypeSwitchNode_SdfText_Input;"); - sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.tint = IN.color;"); - sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.textureSlot = IN.typeTexSettings.y;"); - sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.uv = IN.uvClip.xy;"); - sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.extraDilate = IN.circle.x;"); - sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.textCoreLoc = round(IN.textCoreLoc);"); - sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_SdfText_Input.opacity = IN.typeTexSettings.z;"); - sb.AppendLine("CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_sdf_text(Unity_UIE_RenderTypeSwitchNode_SdfText_Input);"); - sb.AppendLine("{0} = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb;", outputVarNameColor); - sb.AppendLine("{0} = Unity_UIE_RenderTypeSwitchNode_Output.color.a;", outputVarNameAlpha); - } - } - sb.AppendLine("else [branch] if (_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY && TestType(IN.typeTexSettings.x, k_FragTypeBitmapText))"); - using (sb.BlockScope()) - { - if (GetInputNodeFromSlot(k_InputSlotIdBitmapText) != null) - { - sb.AppendLine("{0} = {1}.rgb;", outputVarNameColor, GetSlotValue(k_InputSlotIdBitmapText, generationMode)); - sb.AppendLine("{0} = {1}.a;", outputVarNameAlpha, GetSlotValue(k_InputSlotIdBitmapText, generationMode)); - } - else - { - sb.AppendLine("BitmapTextFragInput Unity_UIE_RenderTypeSwitchNode_BitmapText_Input;"); - sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.tint = IN.color;"); - sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.textureSlot = IN.typeTexSettings.y;"); - sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.uv = IN.uvClip.xy;"); - sb.AppendLine("CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_bitmap_text(Unity_UIE_RenderTypeSwitchNode_BitmapText_Input);"); - sb.AppendLine("{0} = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb;", outputVarNameColor); - sb.AppendLine("{0} = Unity_UIE_RenderTypeSwitchNode_Output.color.a;", outputVarNameAlpha); + if (GetInputNodeFromSlot(k_InputSlotIdBitmapText) != null) + { + sb.AppendLine("{0} = {1}.rgb;", outputVarNameColor, GetSlotValue(k_InputSlotIdBitmapText, generationMode)); + sb.AppendLine("{0} = {1}.a;", outputVarNameAlpha, GetSlotValue(k_InputSlotIdBitmapText, generationMode)); + } + else + { + sb.AppendLine("BitmapTextFragInput Unity_UIE_RenderTypeSwitchNode_BitmapText_Input;"); + sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.tint = IN.color;"); + sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.textureSlot = IN.typeTexSettings.y;"); + sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.uv = IN.uvClip.xy;"); + sb.AppendLine("Unity_UIE_RenderTypeSwitchNode_BitmapText_Input.opacity = IN.typeTexSettings.z;"); + sb.AppendLine("CommonFragOutput Unity_UIE_RenderTypeSwitchNode_Output = uie_std_frag_bitmap_text(Unity_UIE_RenderTypeSwitchNode_BitmapText_Input);"); + sb.AppendLine("{0} = Unity_UIE_RenderTypeSwitchNode_Output.color.rgb;", outputVarNameColor); + sb.AppendLine("{0} = Unity_UIE_RenderTypeSwitchNode_Output.color.a;", outputVarNameAlpha); + } } } sb.AppendLine("else"); // k_FragTypeSvgGradient diff --git a/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/RenderTypeNode.cs b/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/RenderTypeNode.cs index 965f96a56b4..3aaed5f3bcf 100644 --- a/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/RenderTypeNode.cs +++ b/Packages/com.unity.shadergraph/Editor/Data/Nodes/UI/RenderTypeNode.cs @@ -41,8 +41,8 @@ public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMo { sb.AppendLine("bool {0} = _UIE_RENDER_TYPE_SOLID || _UIE_RENDER_TYPE_ANY && round(IN.typeTexSettings.x) == k_FragTypeSolid;", GetVariableNameForSlot(k_OutputSlotIdSolid)); sb.AppendLine("bool {0} = _UIE_RENDER_TYPE_TEXTURE || _UIE_RENDER_TYPE_ANY && round(IN.typeTexSettings.x) == k_FragTypeTexture;", GetVariableNameForSlot(k_OutputSlotIdTexture)); - sb.AppendLine("bool {0} = (_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && round(IN.typeTexSettings.x) == k_FragTypeSdfText;", GetVariableNameForSlot(k_OutputSlotIdSDFText)); - sb.AppendLine("bool {0} = (_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && round(IN.typeTexSettings.x) == k_FragTypeBitmapText;", GetVariableNameForSlot(k_OutputSlotIdBitmapText)); + sb.AppendLine("bool {0} = (_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && round(IN.typeTexSettings.x) == k_FragTypeText && (GetTextureInfo(IN.typeTexSettings.y).sdfScale > 0.0);", GetVariableNameForSlot(k_OutputSlotIdSDFText)); + sb.AppendLine("bool {0} = (_UIE_RENDER_TYPE_TEXT || _UIE_RENDER_TYPE_ANY) && round(IN.typeTexSettings.x) == k_FragTypeText && (!(GetTextureInfo(IN.typeTexSettings.y).sdfScale > 0.0));", GetVariableNameForSlot(k_OutputSlotIdBitmapText)); sb.AppendLine("bool {0} = _UIE_RENDER_TYPE_GRADIENT || _UIE_RENDER_TYPE_ANY && round(IN.typeTexSettings.x) == k_FragTypeSvgGradient;", GetVariableNameForSlot(k_OutputSlotIdGradient)); } From 2c40ca586ba8f5832c739b5b733db848546e6441 Mon Sep 17 00:00:00 2001 From: Kirill Titov Date: Tue, 21 Oct 2025 12:38:13 +0000 Subject: [PATCH 003/107] Fixed Additional Data missing warning from Debug UI when Build --- .../Editor/Debugging/DebugWindow.cs | 2 +- .../Runtime/Debugging/DebugDisplaySettingsUI.cs | 4 ++++ .../Runtime/Debugging/DebugManager.cs | 14 +++++++++++++- .../Runtime/Debugging/DebugUI.Fields.cs | 4 +--- .../Runtime/Debug/DebugDisplay.cs | 8 ++++++++ 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugWindow.cs b/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugWindow.cs index 67ae557bf26..6e59bc9894c 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugWindow.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugWindow.cs @@ -30,7 +30,7 @@ public int selectedPanel get => Mathf.Max(0, DebugManager.instance.PanelIndex(selectedPanelDisplayName)); set { - var displayName = DebugManager.instance.PanelDiplayName(value); + var displayName = DebugManager.instance.PanelDisplayName(value); if (!string.IsNullOrEmpty(displayName)) selectedPanelDisplayName = displayName; } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugDisplaySettingsUI.cs b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugDisplaySettingsUI.cs index bb29b4cf382..726a3c34701 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugDisplaySettingsUI.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugDisplaySettingsUI.cs @@ -32,6 +32,10 @@ private void Reset() /// to be registered public void RegisterDebug(IDebugDisplaySettings settings) { +#if UNITY_EDITOR + if (UnityEditor.BuildPipeline.isBuildingPlayer) + return; +#endif DebugManager debugManager = DebugManager.instance; List panels = new List(); diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugManager.cs b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugManager.cs index b90eed0d6da..f519eb4d8fe 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugManager.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugManager.cs @@ -297,12 +297,24 @@ public int PanelIndex([DisallowNull] string displayName) return -1; } + + /// + /// Returns the panel display name + /// + /// The panelIndex for the panel to get the name + /// The display name of the panel, or empty string otherwise + [Obsolete("Method is obsolete. Use PanelDisplayName instead. #from(6000.4) (UnityUpgradable) -> PanelDisplayName", true)] + public string PanelDiplayName(int panelIndex) + { + return PanelDisplayName(panelIndex); + } + /// /// Returns the panel display name /// /// The panelIndex for the panel to get the name /// The display name of the panel, or empty string otherwise - public string PanelDiplayName([DisallowNull] int panelIndex) + public string PanelDisplayName(int panelIndex) { if (panelIndex < 0 || panelIndex > m_Panels.Count - 1) return string.Empty; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Fields.cs b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Fields.cs index 2f732228409..2803b3dce0d 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Fields.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Fields.cs @@ -574,9 +574,7 @@ IEnumerable cameras if (camera.cameraType != CameraType.Preview && camera.cameraType != CameraType.Reflection) { - if (!camera.TryGetComponent(out var additionalData)) - Debug.LogWarning($"Camera {camera.name} does not contain an additional camera data component. Open the Game Object in the inspector to add additional camera data."); - else + if (camera.TryGetComponent(out _)) m_Cameras.Add(camera); } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.cs index 5ea69f4da34..7ded743ff74 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.cs @@ -2125,6 +2125,11 @@ void UnregisterRenderingDebug() internal void RegisterDebug() { +#if UNITY_EDITOR + if (UnityEditor.BuildPipeline.isBuildingPlayer) + return; +#endif + RegisterMaterialDebug(); RegisterLightingDebug(); RegisterRenderingDebug(); @@ -2142,6 +2147,9 @@ internal void UnregisterDebug() void UnregisterDebugItems(string panelName, DebugUI.Widget[] items) { + if (items == null || items.Length == 0) + return; + var panel = DebugManager.instance.GetPanel(panelName); if (panel != null) panel.children.Remove(items); From 9098eeb40a9f55da93dfee1140b39cd05c772eca Mon Sep 17 00:00:00 2001 From: Layla Arab Date: Tue, 21 Oct 2025 12:38:29 +0000 Subject: [PATCH 004/107] Add correct docs link for ProbeVolumeBakingSet --- .../Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.cs b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.cs index fb80883c6bd..ff5e52958b4 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.cs @@ -26,6 +26,7 @@ public LogarithmicAttribute(int min, int max) /// /// An Asset which holds a set of settings to use with a . /// + [CoreRPHelpURL("probevolumes-usebakingsets", "com.unity.render-pipelines.high-definition")] public sealed partial class ProbeVolumeBakingSet : ScriptableObject, ISerializationCallbackReceiver { internal enum Version From 3a8c08fbb4105e7c2b789454a8c0fddaa9fe35ed Mon Sep 17 00:00:00 2001 From: Aljosha Demeulemeester Date: Tue, 21 Oct 2025 12:38:32 +0000 Subject: [PATCH 005/107] URP Remove dead code and hide obsolete IntermediateTextureMode setting --- .../Editor/UniversalRendererDataEditor.cs | 18 ++- .../Data/UniversalRenderPipelineAsset.cs | 10 +- .../Runtime/Deprecated.cs | 12 +- .../Runtime/ScriptableRenderer.cs | 111 ------------------ .../Runtime/UniversalRenderPipeline.cs | 2 - 5 files changed, 19 insertions(+), 134 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs index 3f5299f742b..50a3190c48f 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs @@ -42,7 +42,8 @@ private static class Styles public static readonly GUIContent defaultStencilStateLabel = EditorGUIUtility.TrTextContent("Default Stencil State", "Configure the stencil state for the opaque and transparent render passes."); public static readonly GUIContent shadowTransparentReceiveLabel = EditorGUIUtility.TrTextContent("Transparent Receive Shadows", "When disabled, none of the transparent objects will receive shadows."); public static readonly GUIContent invalidStencilOverride = EditorGUIUtility.TrTextContent("Error: When using the deferred rendering path, the Renderer requires the control over the 4 highest bits of the stencil buffer to store Material types. The current combination of the stencil override options prevents the Renderer from controlling the required bits. Try changing one of the options to Replace."); - public static readonly GUIContent intermediateTextureMode = EditorGUIUtility.TrTextContent("Intermediate Texture", "Controls when URP renders via an intermediate texture."); + public static readonly GUIContent intermediateTextureMode = EditorGUIUtility.TrTextContent("Intermediate Texture (Obsolete)", "Should be set to Auto. Controls when URP renders via an intermediate texture."); + public static readonly GUIContent warningIntermediateTextureMode = EditorGUIUtility.TrTextContent("'Always' is Obsolete. Change it to Auto. This can improve performance. The setting will disappear once it is corrected to 'Auto'."); public static readonly GUIContent deferredPlusIncompatibleWarning = EditorGUIUtility.TrTextContent("Deferred+ is only available with Render Graph. In compatibility mode, Deferred+ falls back to Forward+."); } @@ -263,13 +264,18 @@ public override void OnInspectorGUI() EditorGUI.indentLevel--; EditorGUILayout.Space(); - EditorGUILayout.LabelField("Compatibility", EditorStyles.boldLabel); - EditorGUI.indentLevel++; + //Hide the obsolete setting if the value is Auto. This is the only valid setting from now. Users that still have it at Always can still see it and change it to Auto. + if( m_IntermediateTextureMode.enumValueIndex != 0) { - EditorGUILayout.PropertyField(m_IntermediateTextureMode, Styles.intermediateTextureMode); + EditorGUILayout.LabelField("Compatibility", EditorStyles.boldLabel); + EditorGUI.indentLevel++; + { + EditorGUILayout.PropertyField(m_IntermediateTextureMode, Styles.intermediateTextureMode); + EditorGUILayout.HelpBox(Styles.warningIntermediateTextureMode.text, MessageType.Warning); + } + EditorGUI.indentLevel--; + EditorGUILayout.Space(); } - EditorGUI.indentLevel--; - EditorGUILayout.Space(); serializedObject.ApplyModifiedProperties(); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs index 05c90eb8f21..71a76fd3f72 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs @@ -300,8 +300,9 @@ public enum ColorGradingMode } /// - /// Defines if Unity discards or stores the render targets of the DrawObjects Passes. Selecting the Store option significantly increases the memory bandwidth on mobile and tile-based GPUs. + /// Obsolete from 6000.3. /// + [Obsolete("#from(6000.0) #breakingFrom(6000.4)", true)] public enum StoreActionsOptimization { /// Unity uses the Discard option by default, and falls back to the Store option if it detects any injected Passes. @@ -575,8 +576,8 @@ public partial class UniversalRenderPipelineAsset : RenderPipelineAsset m_SupportsTerrainHoles; /// - /// Returns the active store action optimization value. + /// Obsolete from 6000.0. /// /// Returns the active store action optimization value. + [Obsolete("#from(6000.0) #breakingFrom(6000.4)", true)] public StoreActionsOptimization storeActionsOptimization { get => m_StoreActionsOptimization; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs index e08751d6bb2..41fcefef531 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs @@ -232,17 +232,7 @@ public IntermediateTextureMode intermediateTextureMode public abstract partial class ScriptableRenderer { - // Deprecated in 10.x - /// - /// The render target identifier for camera depth. - /// This is obsolete, cameraDepth has been renamed to cameraDepthTarget. - /// - [Obsolete("cameraDepth has been renamed to cameraDepthTarget. #from(2021.1) #breakingFrom(2023.1) (UnityUpgradable) -> cameraDepthTarget", true)] - [EditorBrowsable(EditorBrowsableState.Never)] - public RenderTargetIdentifier cameraDepth - { - get => m_CameraDepthTarget.nameID; - } + } public abstract partial class ScriptableRendererData diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs b/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs index fe6b67ecf7e..3f5d3d325fd 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs @@ -405,14 +405,6 @@ static void SetShaderTimeValues(IBaseCommandBuffer cmd, float time, float deltaT cmd.SetGlobalVector(ShaderPropertyId.lastTimeParameters, lastTimeParametersVector); } - /// - /// Returns the camera color target for this renderer. - /// It's only valid to call cameraColorTarget in the scope of ScriptableRenderPass. - /// . - /// - [Obsolete("Use cameraColorTargetHandle. #from(2022.1) #breakingFrom(2023.2)", true)] - public RenderTargetIdentifier cameraColorTarget => throw new NotSupportedException("cameraColorTarget has been deprecated. Use cameraColorTargetHandle instead"); - /// /// Returns a list of renderer features added to this renderer. /// @@ -445,92 +437,18 @@ protected List activeRenderPassQueue /// public GraphicsDeviceType[] unsupportedGraphicsDeviceTypes { get; set; } = new GraphicsDeviceType[0]; - static class RenderPassBlock - { - // Executes render passes that are inputs to the main rendering - // but don't depend on camera state. They all render in monoscopic mode. f.ex, shadow maps. - public static readonly int BeforeRendering = 0; - - // Main bulk of render pass execution. They required camera state to be properly set - // and when enabled they will render in stereo. - public static readonly int MainRenderingOpaque = 1; - public static readonly int MainRenderingTransparent = 2; - - // Execute after Post-processing. - public static readonly int AfterRendering = 3; - } - - private StoreActionsOptimization m_StoreActionsOptimizationSetting = StoreActionsOptimization.Auto; - private static bool m_UseOptimizedStoreActions = false; - - const int k_RenderPassBlockCount = 4; - - /// - /// An RTHandle wrapping the BuiltinRenderTextureType.CameraTarget render target. This is a helper - /// that avoids having to (re)allocate a new RTHandle every time the camera target is needed. - /// - protected static readonly RTHandle k_CameraTarget = RTHandles.Alloc(BuiltinRenderTextureType.CameraTarget); - List m_ActiveRenderPassQueue = new List(32); List m_RendererFeatures = new List(10); - RTHandle m_CameraColorTarget; - RTHandle m_CameraDepthTarget; - RTHandle m_CameraResolveTarget; - - bool m_FirstTimeCameraColorTargetIsBound = true; // flag used to track when m_CameraColorTarget should be cleared (if necessary), as well as other special actions only performed the first time m_CameraColorTarget is bound as a render target - bool m_FirstTimeCameraDepthTargetIsBound = true; // flag used to track when m_CameraDepthTarget should be cleared (if necessary), the first time m_CameraDepthTarget is bound as a render target - // The pipeline can only guarantee the camera target texture are valid when the pipeline is executing. // Trying to access the camera target before or after might be that the pipeline texture have already been disposed. bool m_IsPipelineExecuting = false; internal bool useRenderPassEnabled = false; - // Used to cache nameID of m_ActiveColorAttachments for CoreUtils without allocating arrays at each call - static RenderTargetIdentifier[] m_ActiveColorAttachmentIDs = new RenderTargetIdentifier[8]; - static RTHandle[] m_ActiveColorAttachments = new RTHandle[8]; - static RTHandle m_ActiveDepthAttachment; ContextContainer m_frameData = new(); internal ContextContainer frameData => m_frameData; - private static RenderBufferStoreAction[] m_ActiveColorStoreActions = new RenderBufferStoreAction[] - { - RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, - RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store - }; - - private static RenderBufferStoreAction m_ActiveDepthStoreAction = RenderBufferStoreAction.Store; - - // CommandBuffer.SetRenderTarget(RenderTargetIdentifier[] colors, RenderTargetIdentifier depth, int mipLevel, CubemapFace cubemapFace, int depthSlice); - // called from CoreUtils.SetRenderTarget will issue a warning assert from native c++ side if "colors" array contains some invalid RTIDs. - // To avoid that warning assert we trim the RenderTargetIdentifier[] arrays we pass to CoreUtils.SetRenderTarget. - // To avoid re-allocating a new array every time we do that, we re-use one of these arrays for both RTHandles and RenderTargetIdentifiers: - static RenderTargetIdentifier[][] m_TrimmedColorAttachmentCopyIDs = - { - Array.Empty(), // only used to make indexing code easier to read - new RenderTargetIdentifier[1], - new RenderTargetIdentifier[2], - new RenderTargetIdentifier[3], - new RenderTargetIdentifier[4], - new RenderTargetIdentifier[5], - new RenderTargetIdentifier[6], - new RenderTargetIdentifier[7], - new RenderTargetIdentifier[8], - }; - static RTHandle[][] m_TrimmedColorAttachmentCopies = - { - Array.Empty(), // only used to make indexing code easier to read - new RTHandle[1], - new RTHandle[2], - new RTHandle[3], - new RTHandle[4], - new RTHandle[5], - new RTHandle[6], - new RTHandle[7], - new RTHandle[8], - }; - private static Plane[] s_Planes = new Plane[6]; private static Vector4[] s_VectorPlanes = new Vector4[6]; @@ -564,15 +482,7 @@ public ScriptableRenderer(ScriptableRendererData data) m_RendererFeatures.Add(feature); } useRenderPassEnabled = data.useNativeRenderPass; - Clear(CameraRenderType.Base); m_ActiveRenderPassQueue.Clear(); - - if (UniversalRenderPipeline.asset) - { - m_StoreActionsOptimizationSetting = UniversalRenderPipeline.asset.storeActionsOptimization; - } - - m_UseOptimizedStoreActions = m_StoreActionsOptimizationSetting != StoreActionsOptimization.Store; } /// @@ -1203,10 +1113,6 @@ internal void AddRenderPasses(ref RenderingData renderingData) if (activeRenderPassQueue[i] == null) activeRenderPassQueue.RemoveAt(i); } - - // if any pass was injected, the "automatic" store optimization policy will disable the optimized load actions - if (count > 0 && m_StoreActionsOptimizationSetting == StoreActionsOptimization.Auto) - m_UseOptimizedStoreActions = false; } static void ClearRenderingState(IBaseCommandBuffer cmd) @@ -1236,23 +1142,6 @@ static void ClearRenderingState(IBaseCommandBuffer cmd) cmd.SetGlobalVector(ScreenSpaceAmbientOcclusionPass.s_AmbientOcclusionParamID, Vector4.zero); } - internal void Clear(CameraRenderType cameraType) - { - m_ActiveColorAttachments[0] = k_CameraTarget; - for (int i = 1; i < m_ActiveColorAttachments.Length; ++i) - m_ActiveColorAttachments[i] = null; - for (int i = 0; i < m_ActiveColorAttachments.Length; ++i) - m_ActiveColorAttachmentIDs[i] = m_ActiveColorAttachments[i]?.nameID ?? 0; - - m_ActiveDepthAttachment = k_CameraTarget; - - m_FirstTimeCameraColorTargetIsBound = cameraType == CameraRenderType.Base; - m_FirstTimeCameraDepthTargetIsBound = true; - - m_CameraColorTarget = null; - m_CameraDepthTarget = null; - } - // Scene filtering is enabled when in prefab editing mode internal bool IsSceneFilteringEnabled(Camera camera) { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs index f08e4d15532..1abd2aa4428 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs @@ -750,8 +750,6 @@ static void RenderSingleCamera(ScriptableRenderContext context, UniversalCameraD var cameraMetadata = CameraMetadataCache.GetCached(camera); using (new ProfilingScope(cmdScope, cameraMetadata.sampler)) // Enqueues a "BeginSample" command into the CommandBuffer cmd { - renderer.Clear(cameraData.renderType); - using (new ProfilingScope(Profiling.Pipeline.Renderer.setupCullingParameters)) { var legacyCameraData = new CameraData(frameData); From ba4a180afe8e398c0dea25311bc639c6c0103d64 Mon Sep 17 00:00:00 2001 From: Kirill Titov Date: Tue, 21 Oct 2025 12:38:39 +0000 Subject: [PATCH 006/107] Removed temp empty stubs for URP comp mode --- .../Runtime/Deprecated.cs | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs index 41fcefef531..92df847674f 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs @@ -14,35 +14,6 @@ public abstract partial class ScriptableRenderPass /// Use this CommandBuffer to cleanup any generated data. [EditorBrowsable(EditorBrowsableState.Never)] public virtual void FrameCleanup(CommandBuffer cmd) => OnCameraCleanup(cmd); - - - /// - /// This method is obsolete. - /// - [Obsolete("This method is obsolete.")] - public virtual void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { } - - /// - /// This method is obsolete. - /// - [Obsolete("This method is obsolete.")] - public virtual void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { } - - /// - /// This method is obsolete. - /// - [Obsolete("This method is obsolete.")] - public virtual void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { } - - /// - /// This method is obsolete. - /// - [Obsolete("This method is obsolete.")] - public void ConfigureClear(ClearFlag clearFlag, Color clearColor) - { } } namespace Internal From 1cdc4ea424685747692f2405ea181844129aab5a Mon Sep 17 00:00:00 2001 From: Paul Demeulenaere Date: Wed, 22 Oct 2025 01:20:38 +0000 Subject: [PATCH 007/107] [VFX/SG] Update Label when Name changes --- .../VFXAbstractComposedParticleOutput.cs | 8 ++++- .../Editor/Data/Repro_114261.unitypackage | 3 ++ .../Data/Repro_114261.unitypackage.meta | 7 +++++ .../Tests/Editor/VFXViewWindowTest.cs | 30 +++++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/Repro_114261.unitypackage create mode 100644 Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/Repro_114261.unitypackage.meta diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXAbstractComposedParticleOutput.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXAbstractComposedParticleOutput.cs index ad6480cf8e7..6c3a9ccd83e 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXAbstractComposedParticleOutput.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXAbstractComposedParticleOutput.cs @@ -421,11 +421,17 @@ public sealed override void CheckGraphBeforeImport() { if (m_Topology != null && m_Shading != null) { + var currentName = name; MarkCacheAsDirty(); base.CheckGraphBeforeImport(); if (!VFXGraph.explicitCompile) { - ResyncSlots(true); + bool slotChanged = ResyncSlots(true); + if (!slotChanged && currentName != name) + { + //`Invalidate(this, InvalidationCause.kUIChangedTransient)` won't trigger Modified/onModified + Invalidate(InvalidationCause.kUIChangedTransient); + } } } } diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/Repro_114261.unitypackage b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/Repro_114261.unitypackage new file mode 100644 index 00000000000..890aab574d0 --- /dev/null +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/Repro_114261.unitypackage @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de336b15867e0b4bc642367631c7b5a92fd788137673aeeafe2d0dd0340d2974 +size 8407 diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/Repro_114261.unitypackage.meta b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/Repro_114261.unitypackage.meta new file mode 100644 index 00000000000..d0e474eaee5 --- /dev/null +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/Repro_114261.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1e6864d5f25f95f40b7b3df2ba067e83 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXViewWindowTest.cs b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXViewWindowTest.cs index d4c31148281..f53407ba5d7 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXViewWindowTest.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXViewWindowTest.cs @@ -8,6 +8,7 @@ using UnityEditor.VFX.UI; using UnityEngine; using UnityEngine.TestTools; +using UnityEngine.UIElements; using UnityEngine.VFX; namespace UnityEditor.VFX.Test @@ -208,5 +209,34 @@ public IEnumerator Repro_CustomHLSL_In_Subgraph() AssetDatabase.SaveAssets(); Assert.IsFalse(EditorUtility.IsDirty(vfxGraph)); } + + [UnityTest, Description("Repro UUM-114261")] + public IEnumerator Switch_SG_And_Name_Updated_In_VFX_Controller() + { + var packagePath = "Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/Repro_114261.unitypackage"; + var vfxPath = VFXTestCommon.tempBasePath + "/VFX_114261.vfx"; + var sgUnlitPath = VFXTestCommon.tempBasePath + "/SG_114261_Unlit.shadergraph"; + var sgLitPath = VFXTestCommon.tempBasePath + "/SG_114261_Lit.shadergraph"; + + AssetDatabase.ImportPackageImmediately(packagePath); + + var resource = VisualEffectResource.GetResourceAtPath(vfxPath); + var window = VFXViewWindow.GetWindow(resource, true, true); + window.LoadResource(resource, null); + yield return null; + + var vfxContextUI = window.graphView.GetAllContexts().Single(o => o.controller.model is VFXAbstractComposedParticleOutput); + var subtitle = vfxContextUI.Q /// Input value. public void SetValue(bool value) => opened = value; + + void IValueField.SetValue(object value) + { + SetValue((bool)ValidateValue(value)); + } + + object IValueField.ValidateValue(object value) + { + return (bool)value; + } } /// diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Fields.cs b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Fields.cs index 2803b3dce0d..64c676fe3ef 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Fields.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Fields.cs @@ -15,6 +15,9 @@ public partial class DebugUI /// The type of data managed by the field. public abstract class Field : Widget, IValueField { + /// + public bool syncState { get; set; } + /// /// Getter for this field. /// @@ -433,8 +436,10 @@ protected void AutoFillFromType(Type enumType) /// /// A dropdown that contains the values from an enum. /// - public class EnumField : EnumField + public class EnumField : EnumField, ISyncUIState { + bool ISyncUIState.syncState { get; set; } + internal int[] quickSeparators; private int[] m_Indexes; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Panel.cs b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Panel.cs index 688bf532b04..61b42558484 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Panel.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.Panel.cs @@ -1,4 +1,5 @@ using System; +using static UnityEngine.Rendering.DebugUI; namespace UnityEngine.Rendering { @@ -135,6 +136,25 @@ public override int GetHashCode() /// Panel to compare to. /// True if the panels share the same group index. int IComparable.CompareTo(Panel other) => other == null ? 1 : groupIndex.CompareTo(other.groupIndex); + + internal bool TryFindChild(string childDisplayName, out T foundChild) + where T : DebugUI.Widget + { + foundChild = null; + if (!string.IsNullOrEmpty(childDisplayName)) + { + foreach (var child in children) + { + if (child.displayName.Equals(childDisplayName) && child is T castedChild) + { + foundChild = castedChild; + break; + } + } + } + + return foundChild != null; + } } } } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.cs b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.cs index 33d08dd5aaa..f8c77216d0a 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugUI.cs @@ -248,6 +248,15 @@ public interface IContainer string queryPath { get; } } + internal interface ISyncUIState + { + /// + /// If the state on the editor ui needs to be sync + /// + /// true if needs to be sync + bool syncState { get; set; } + } + /// /// Any widget that implements this will be considered for serialization (only if the setter is set and thus is not read-only) /// diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Volume/VolumeManager.cs b/Packages/com.unity.render-pipelines.core/Runtime/Volume/VolumeManager.cs index cdb7b2d84a9..b246d550b03 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Volume/VolumeManager.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Volume/VolumeManager.cs @@ -86,51 +86,63 @@ public sealed partial class VolumeManager return supportedVolumeComponents; } - List<(string, Type)> BuildVolumeComponentDisplayList(Type[] types) + internal bool TryGetVolumePathAndType(Type type, out (string path, Type t) result) { - if (types == null) - throw new ArgumentNullException(nameof(types)); + if (type == null) + throw new ArgumentNullException(nameof(type)); - var volumes = new List<(string, Type)>(); - foreach (var t in types) - { - string path = string.Empty; - bool skipComponent = false; + string path = string.Empty; + bool skipComponent = false; - // Look for the attributes of this volume component and decide how is added and if it needs to be skipped - var attrs = t.GetCustomAttributes(false); - foreach (var attr in attrs) + // Look for the attributes of this volume component and decide how is added and if it needs to be skipped + var attrs = type.GetCustomAttributes(false); + foreach (var attr in attrs) + { + switch (attr) { - switch (attr) + case VolumeComponentMenu attrMenu: { - case VolumeComponentMenu attrMenu: - { - path = attrMenu.menu; - break; - } - case HideInInspector: - case ObsoleteAttribute: - skipComponent = true; - break; + path = attrMenu.menu; + break; } + case HideInInspector: + case ObsoleteAttribute: + skipComponent = true; + break; } + } - if (skipComponent) - continue; + if (skipComponent) + { + result = (string.Empty, type); + return false; + } - // If no attribute or in case something went wrong when grabbing it, fallback to a - // beautified class name - if (string.IsNullOrEmpty(path)) - { + // If no attribute or in case something went wrong when grabbing it, fallback to a + // beautified class name + if (string.IsNullOrEmpty(path)) + { #if UNITY_EDITOR - path = ObjectNames.NicifyVariableName(t.Name); + path = ObjectNames.NicifyVariableName(type.Name); #else - path = t.Name; + path = type.Name; #endif - } + } + + result = (path, type); + return true; + } + List<(string, Type)> BuildVolumeComponentDisplayList(Type[] types) + { + if (types == null) + throw new ArgumentNullException(nameof(types)); - volumes.Add((path, t)); + var volumes = new List<(string, Type)>(); + foreach (var t in types) + { + if (TryGetVolumePathAndType(t, out var result)) + volumes.Add(result); } return volumes diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/PropertyDrawers/HDRPDefaultVolumeProfileSettingsPropertyDrawer.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/PropertyDrawers/HDRPDefaultVolumeProfileSettingsPropertyDrawer.cs index f5695a30189..8f02202ef93 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/PropertyDrawers/HDRPDefaultVolumeProfileSettingsPropertyDrawer.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/PropertyDrawers/HDRPDefaultVolumeProfileSettingsPropertyDrawer.cs @@ -36,6 +36,10 @@ protected override VisualElement CreateAssetFieldUI() tooltip = defaultVolumeProfileAssetLabel.tooltip, objectType = typeof(VolumeProfile), value = m_VolumeProfileSerializedProperty.objectReferenceValue as VolumeProfile, + style = + { + flexShrink = 1, + } }; field.AddToClassList("unity-base-field__aligned"); //Align with other BaseField field.Q

vk66Byrb2blN=AxTkQWWV}gxSbU_#-nRrI<1|SBZ0M{!`LE%Sr z0<%^oZQS@Gv!guoNx&yLxLa={!p5+p)<$Vtww6)|AOI3|N-7LF6akpGZo~QrD{(&D zfxwjAh|ux_kSrKNvbDVqz51c-$W)k(h)4Qj(s=AuTh6hNGr6>J&&gBlK%N zl0MZSmBmr(El%7mOy7bj2?1My+R3D0hO{V%N3_aVav=+-=+XZn13VcM{3f|I3`OV> z@)-$zJm9hjJq^EIE^(`8f!majoyG&85d}e@9-}%4WV2^r##5Jrc+Ofqv$|BYglFcB zUa?xDUwj7_P73=2L_*Zjc}b zia}&^q8Kvj0ufDvl#VgOQrCE4hz=bCOQkujdD41bKZR~HSO)|cx>fPqm;VwFmj@+? zV-W&iz>c;4>{M->bPB88iq}F1v2Wdk1g1`}6X5yCni1wTz&c(`DQsaTXyL}S^TVE4 z=H#0=((s?S>hTwcAtb~$jKUH((NIzcX-^-eUn!X2Oz)0ZAZ+xkZ>KX87$~GG27rFas?UGEe=LWR}tZuwp#HMBGC+EvUON=-6wN>^e?CW*DD9T7a)kmp+JXv+jG#D`K%FH?NCwk;UfDW z}HHK{wFuwgJ&{M}Gl_ zBmBbQ@C%2(fgR8v0O;r!?HB$4jt+#oi7+${+v=u4LLj744Jy@i>((7IZ_b&|bk1JO zFVM%;%iF*YN-U{^S9r97#rzS^~ttB5Q`_z)4ULi2^|S946X+W)@!{ zDp$`^P<;-=E~wD|SVyuyXn4mU*HHEfcn6~DNc($iw3Ham2MgY2(FjCf5IK1kE{_0U+7iH!x7kf_ zmM#Di#i+NE*UE`wRKir^1PCx7fp6@w#9UPT1@oy8fFzb`yMzM3h@$}8UDK%r2*kfK zkS;6+xmZi$gbkUl+a6|p(20Q)`(jm}cr4siwn@C$kXm?u9D*bkr6dKVR98ASnKqaN z&-?s!7Ic?KVU%q^))GVEjpCrxpo08&uWU&>s${=tpDx$7;{elu2|U3Gq&8M+{FGwO zG6L&!=JbFxCZ0rECUM^<$aSw-UT+2Ay>Uapl}@L$VU?20v1SDaWaLm+bdjwRz#F4T zbWIB8V?kXs6w$5Z)gAeGj_k2#E*_3DRs^n^s(gyDkD0mJ#DU00gX2)LP;@^}1XoAT z0woZbw6c~e^57+z4C5C(=;JV2^7dfh{2`=Le@;$v*Jy# zMYeA?cxw{M(_b28B9RHnjWIS}C1N${SI$8`??FJpjF7j)=({1b%~umJVixq6y}jPz zYel=+1^q6;lQ7YjcL>?LA!ubl!F3Ypd!^aKQZ4ta>IqpwCmwXKmj#ptaC;Oqgbzzz zM8@-B(e76rorP&-!37A2YV+lMs~ixGu1 zCfjZ!@pGNCg3<%t#6c-kDDAEUbpD29kB>zdyV?{%L_;b)H(RKf5ps_p*<+1a3*dF@ zR!c`q&S4&UD)&c+BG5J1!~i^KB{n2(V=Fn;N)+`c001BWNkl9f=Qn%N zsp|@i4a7D>;i>fL6`3_(gH&jZ0I=QSW&^-nsnG10HKD6YC&+BBESyJ(CQ3DcDQ19c zhP2u)59_s!Xu_zrH|)M5%*;oddJMBJoUK_cID`@rlgOaPC)zAaRVF!;SRFrKf| zd{EkmB!5t-lnUik${#?-$^P0<;$#zYUkQhx&6^0oB%&KRuwoIJ6VQo9RHZrDNl1Ck z>H}P1?g9v>-EkZRr%?%v2sYa=AK-Y&381sYm7-!MEE6q%t3h28%uKEw&89_NIq6~_ zGqcXb6`BDG;{G6ORqJ9a&kC(k&MZh5-gb)I82FwDY{V_mTd3ORB#OFM2lh4Cuvr7Be z-R>V|Mv%=;ZHZj9GxhpN%8K4J^rgY5;Dt3K&?P>qt0n@>7lO0JU5_tC2L@Sx>QF^& z0^FK}jRvCTSpk4Z1H9Ma{wVs9X%R0__=J#^l~y+R1P@8Iv7D7&Iag1F$)^Rap+kU$ z2?`fj%H-Rg$tu@WDw!X8QX>e+B;c)S)1mqxjh3LIoJoM&(>M-*#g9}7K<*w^MMSo8 zg82ce@}r*Pnn~QsbY}Jh()^NUd9Bm}1;|rVMj+0Wga3*wQjM6v_dEHGDj<2+NOAEM z8Z<$xFCI5Eiva;fm*dmC}TD%vx5H}M@{g_9qWS|h$v7VwCkoIhTvjLVkn1A zsm=VBBHN;36Qm7zP5J5y`TSsGg=Lj0wi+woIg8fZ1%cuaTnE0>mPLehMS>tmLfYZm103Z@} zftlIV_qL*-A+h$~4N(U0i^z}|JOoV`MTFE@RLKN5>&!?9U=(2-DPlmhw`gFz=sBWC z7y7<6n~rQ1Lr{i$kdfMX?_RwLFi{E=EYEvmRe#g$}e#wQWw zj9@9G#hQ=n-e-`^J;0PCTge0%t!d8&9jMJr6+l)Zg`;=hC8WL0mcX}kzKmw(5G-TD zKE#xj`K^aGyH5gUBsDE%_B5a6vN0`_H?YOpYXSJ+nsOQ+V z0(o`NWzi1)q$V{A~j$-xSq*-)lmGsp(BH&loF?uly2)z zK=t5BKmv+H1Q=rgLJ`CeDaNL0W77l(`fw+}#GDm~i)YW4Pacra#yBL!WB8wdkeE4y zfPkHACt1O!%q(6a=z{`51SBO84j57ec$~FG;G}+T8v!u-5+SQ_87pC9jcB%LmK;Cf zvj0VH5(Cs zV2)omf25BDK*yj38e`>O7a|B>oE=}CA6=cFU0$7>pFDkV@RJW8zcXK7_Iyc=iHQhF zH~|F~RdfSeRh1h-Bng>$&WI$GeE(yrMsmLm0HESiM46k21i(EEgsJBx09*~HM<)+H zIIf*Yc=!GF3}oDfaYMq)oQRN_D-fn2VF-kI0%dbeOetBb0~ApZh*A%I45Tr99C& z&1I|ld}S(|7Tr1(@%~Bz&}M^^CXgh^8f@ZLa1>;t4XXr~Jued|D@E(s?G8s&GLbox zN!@H-kztD?4od!zluD&0m{c9Js#D9V$R*PSTP>x#MyQk0tliG+%^driZ|OLW&8lB6 z&Q33m506it9UXrBlZQWgc=+BGp9Tf0Y2_`97%+kWGGinNz~hFu#-ojKoOEH-LKC2k z7?6=91PlQK5rQ-^Xj>&_1>y_@KtN_DvbHmcy$2~tVn|6er#CS&L!TfeStsawT&&@0 zHJmOM!m)d_1c2MSOn3kUDd@0P#CjC3UVZOeQU5DfKXBjbGV`1cJmCIQ3 zFbx6XAO6e#_Oqk+ds-k-z7QD%iGrlvX}rBP*__D6B*w^HOQSBv$W6mdY(SW~=ad8n z0!Yk}h@~Wj=Cu|=?LK0npa~-68y17cXp`zGhQN{}Hy*6>eP#%On4yU+&}enG{eS=Q zF(K|v8-XN=6{B*s;(^h(N2bUWhNH_gUk@+e=!CgxLP|^&hLi$P(?n(o1b_Cw|EryQ zFK_SOoldrScW*SFjyJZu*escu#Sj=-bD5LVuYvgMX@34HG~c9(%&9W#JX%=egTz>5dYYS*t-+?TtDj2V9o%Pg`KqPwa>i{HAM>KYu6+K)pPwfK9V?gnaphFHFo%gb0 zn8qrmrA)u7E3Gbga?nN%Z}U>Z=R-E_<)SY}Tk_>>uY4AuL&?2W*!2P1+Ig#i4q|Wspp=LKechm=2)5a zcFiq%p0yqs4IYt;GKi+0NeI*;CQj_Cq$oWg3Bp@H{j;+pLbe`Sl61JSzwz9cUVQV$ zjTg2yZ%=l1HaE5=+j{}2*Gnpk+btbhTs$Hn=%^QiV*GqU)UO^3wyKvynV6(GZntp+n44(1NDscx_uHXgD%enR`;!tj^qx zzx%V}&CNI+Ngzo>5=npwU@a_?hQZL+#RZMd?Dm)`$e`+MlaUJ3sMZ2t$Z&IJAU8uA z8`A(hWt~x`AB8UoIl%`lM_rn>J^sk5n;1~=qg>Gae2yom}Y87{<6>yO6NIeAb^Ki zqrjqj^xY2#>DFckk}S0eVLb=}j2Z$-Rd$F0O2mX-5-Btd4T;-;f)WDFS~_11w>IVW zeIc5#%+~8PU($TRSBrFVg-=gcPtMnCMr^`TE(Z|Pc2{Hkc??e5RrfAMQK zZoaZ}>-J=Gb3EQ$4V*XyBAbzB(2bfovy;!s_aIU!Xts!r8XQULrd}usG1`|qbO>s^q)%x4 zwK1Pxftu*XwRBOHu_r^Y$}Fh1>4;=!yUFH^3gvqR02YauwH^YBQqFrxjREB(XqBRv z+5>WaVBTKlNwW{FvV`6veF-rYzPtcSz$`}2W*RJLk?9u7+F~irSUoQ}-4cLr% zdqyCV0Gl{v*jO&o%WEU4OsU>Z;x%nyKBNoN!(;QX2w1AH485ue zGDkLRCa#^MpL4?%ew*sgH9g2NGg6Wx#JQ+W^Hf-|UtD5`T3+Q^afd!O&~-dWy{9Ot zjpb=6ESl?6vhtqzY%W{uNo#S=I!i!^B1Pt{|4!DSrhxIy#oj_Hc{tTc;K1}e;Fdc3 zz~Z?jAaFGX&L&p^MdBFfqLw*T+gu>T#3jcgL=u)Jj6e9!DT?fGjb|P8eQ&^Eg43(@ z?d=Y$L{y`6=sdV$yNUr8A3knbWo6QH0>A?>V?|8eB}5#ON|IpcmjKu` z&~EbnHa^etwb%+xuja$m6`WrVhv(s=gZas#rx+Re+VZ?H}6iicbIWVNuNLqO0>a<&GW5a;@nq?s%X@_lR*UFL2_cbPjXE_RjJW3gUC%n zlFi`Bp+j}WV?8riDy$SUb|Sn+S+sn?YW9j%k~CaPypo(*&9*mmQXu5}59?f!EcVMy zk=`UhTV5$C@_DI9?kO+pHnyRtFK+}8BeU3cTpU_hiQ97UOKHfg>nbDF{K8$c^9u+t z5vF89D5&@0P*77klXRc^Eequ#gc9#G^lQX^ z(!!*H{cU&^`B#5-vRKjirJSF`(M9^?aB+AEOwc#WA3yod4VN+H zy)Wev-T5lPGegDZziN;yAFa!UraS1fa=2e?IC>a-cH%iPF@3{u*3`v***kn^l8PsN)Jut{if z3+2PwmmXC+uG<3!*Mg|e2BJ8gV@Q&@NP2Pj)XDN=lQe+j&cjdRGl0Lr|G9A0MDgX1fCa=w0Xx83Xn5FefliRHz;#@(UlE_ehM3KT-~ z!S}C-pb5A)3(C&b&g5j?@60-p%G|2X8vz8_9!LEH3_K9vxWQ-VYoZZ~B<9^oK!8T% z@)=I=nobT}R_uYK*CckjJ%^X`kY?fssGWynoj#vL0&5(1+c7F6n2hv()6 zOO*~MRTxXfzs1taNzq?n1v$*xBi~OHBcN5Ql4UpOppyJ7x?>HEj0CwV0mK+$gMD-K zuIW&a5qp-D){+MUk_bp2y%;c)du@(3Bq6H&ioyhNzM#K+Z@xQg-*_QxbOQi>@N|_J zzVv)6AWu&C)6@RVm%5g~Z9|sz+4me{KoV4~vA*$wq&a7vJ)y&)hbR60+f6_ix8bwX zVY!BJD+($@0QLkFK}ct#2Y>cy0C@Gz2Buzocq|Yu7mJ%WXCgys;1~p9NCwwbDr6uc z#7V?iOG8S5kO*fDZqM42tM%DW*PAb>A68tgZD(9=@}SD2*5c9GxM)&m6aeg3ixz2b zS9W*!3okXliMywle0Ii9kNMrtF3)-a!h`jL|Lw2;6@3?BkQaBp^s8U{t=sorzwz9? zb~NibWn&N-h{+751VACM2v&5Gf?I|9Fa;+MW(?^yj=9~)jv}>Rxd_9GO)nQJWCk*o z=CVo<^Au7517H`3k(U>j!*Y4CI9ps?tk$c=`Lm15v*U}W51)Pf?BwxknD@LIpij_; z5cJB{Tmt`rYOlt`LIlVp1f=kV1bIpXh{A~lWZ(vxh@&>Nqi*BQjh9~7e{nY5-rU-s z%yviP(R6crG?|PywgLwH{cpeiIZfnx;I<)8^{_i+;P}0ttWH-%lD_fAc-Hoxo#Lm* z{m;J8O*;O`V>rI-fAO^rBvqClL{Qo$1T0yW;EI|hfF=lqw zm=5A8G^6ticy`)9KB9LYo?WS-Or6PuA;n*K@i)KrGr#fNi?8n9zPBC*R?8U{F-2(* z{pc@)qmr0S+Br}alnXA1M9I;kqA5L|i0+MPS-)6~fbQkc8m0+NKv=JrR~IK2=V#0F zi_68?*|W!=ojmyHvmal~kLT%fke*udSanUK2G%an$0_<@6Duu%Nl;j#Ib_5st);k1 z<;xAM1V2NWS@CFMZB<^{B!&?n^%5YCX?An>ZUnoy{l_B)%UvrgHxWVTfBp;I-+iz? zn&S^YT7BbwyFKBLk8!n@aSIG-cSZp$MOLazDs&)>!wvvYB!N4&ZHm`WdTuLxdOEBI z62vCR-OaEu@|a}>2D+T}>S28N?+*jP7w>KbNazOhLGbu;`P$8?Z6O(uGQSiBWJnT7 z0-~;kbVo>@cdv_>=eLOfU;)P;rj1u~9f|A-b%lmp#_Q$~H&7UB@u99uPq-+yGD{>E zk+fdSMlihvFF%LB^3|>Li*R(3K0QqDe0JFj4Pp4+!+-zX2mc2!-59_4o4@$2mtOhm zt><6DW;6(2%Vx}Pg_|t0G!;Y(1_R6#`AunQD_wMfpl7FoA0q+*u?>+(7W2!+#o77E z@%-xa=>X$1Ay{5VUqLxnq$yATe=*2oMow9qdfI-PyEjQrpU8gaIKS zcWuA`6tHawfI|!c86hD8ksv@~34z=#Kq+a=GYUgWC<5y>4?{|ch9v7Xtb19m==f?l zIGtZCQqN>+f&dIM$BU0o-^G9NC--X|5(_A8pU4gy9}JU#3=;qLgZ1$oe(9CCw;^vo z9PVs2J2O6CVi&O?&elE=p+G3mC-KxEsai>?SR=)=aWdygi=&utG)>#q+QufoQ6~TC zkB%3goKIT%l`n2mmf#9Jz2L6Fy$R)wpBCs^fD*#SIBs;&rU!;7B%PTg))xR{41fBA zi%$+O#$TBJ>VLoA_lpdwPb>u%=Wm1l@DTLxRuU1_7)3>+fK*28Lfc6xerbai!h{PdFt&pvwlhK*kN+ zn6)=HyN!uVIvTaowy|xcYcU3i0fiF)3!C7)yojt(c9@urUXvsQDT`!hD&`Tb!|nXP zRTqt>=tjgqgrQljVMx-i<6<$aR&qH{=T~rWI^gg9@$2Qi|4 z)8YAj+MOkah!(*ph9LC<+2i}HFQYmcyz+UOJr~{Xpj%`rLFYc@wQs47qj&yv@$kpU)h`JVO=?l?dc1F2;tWDNac6t%CTri&4|~08hA2~-~R4n z6nyi4czN>Tg^3r6OdJcR$fMZN%{K$105&SZ_X;V;fM!^v(~$fW5RFR(bd|EIM<{fQ zH60$Mk01AMKfWAvXo(~#g%p17rC)#ZXaDi@uif9=xwRSwbC%>qr_11-$XVP=c>}Hc zM*&8`F2=s^=NHGP&kjz{4xc^#_^pq>|Jm_R7jj{1PKUk;i7*6~af7$Fx|^HL=7h%` zO~%-EIO;+ZBp|0Wu=`B%u!dZPp+%H#2aAZCtlek5r3e5dsK5-eAk^hy=G`UTiK7D& z3r0$W0_N1mlH(x~f_~M6|Kd+x&)y5kp}R$>$l{RhY`z905MUmxA@g0DAgU53uPXF& z=r2rx2q6t@7OkRn1)qh9fG0)fU8l|97z0IY9{*i<>wkSfB(L6_yu2U0{}jad$5k!&MD9pN;*BKWp8a2`&vqso500_nQ-~I6Pv!l!I*7Vo@$6L}| zaRMZLTr{YdSTkg8N@20Qi1^`A8WO*HqeVzctz7oV0Hct!YqV!FTMly$82TJbp8zhR zUjRl519wL!>9Yg*;e*TbgsS{TLQMFxcfRrUU-<2NU-t-$u*QQL+} zL2dtul(HpI01$ugkH1*k1wD8xz38BdqK% zDba=a@GKoI@xj3kMlidoPgr-89jM6 zy!FZa$((~hq=cBha{HHm)r*n2001BWNklhygo5xd5y0^4%9yv9TCiXq69FL138Ee1KvVe(QQzJeLy ztPQc)R>H(=uhs8=`*rjm@obThU~?2Ly-Q@$#*I->LEcK}d+!~6{q_AeIPKkO=70Ba_})(r0mE1R z>$`hj={Y4rN-QDd*zKZz(ejU(*Bm}R>USr!KS3l|4fOuA;r2$jF;fi!Bw@|Jwg;LD zh$(wh{X#C8RJoA5mX=QK$whd2)W7}7;_;lEA<+BuES_xEf$RND^8PX-K?IV8t1EtWHT@ za21H3Ay|b{Ky?w0WHkTl%k^JBL&4dYe&LnP7Lyl^A`m`1nm@lcv692TBQg~@9$l?> zCQTPr5N{fl?P=SQjQ}5?%jvv-i+cakDnYb63Q?9clWklSthnYF5>n0 zQTrl=1wz2}fB`uWBH+Mqcro1EY!L>^4O}*Un5D+5pK8%&baHQF&4i=qTqK>NsXQHs z5aa0L3LYQu4?n(oe9>dDmJ0g-BGPzJ1|b2ANM6_--QEt{Gu+x}r&A1+fCnAFdb7Y< z!`Nr8yv5)kAYIN7QPT0WJ#)lzP5zL(aNp-tN*=9SOkX1znURzZR#*XEIdGYR=1sYV z1F`A8Oj8)h+;;U|I9Y$0qJDsWfK@MxUiw5m^TlfD6GCN~ z_a&ngomS=5$Z4{b7h9_dF9|3+O(DN^5hESI#h)M0VV_uTY&2iGHyh!gRP@B0@eGbV z6Njl7X7g&*3*tr>u065>kzjA5(*rdS{phpHooRPxi`*$|I+ry!|MqW>Pp;-b^u~X6 zcl0W^5u1?ONGT0k`kBtrLui7hL9ze=B~8(@Fi|N&%q(klQ&^6oF|53}TMNzE%SjdU z6-Cm2p~R|DhuDly&*AAo|NW2VM=Mqh6{5k%fBlW;U%9*Px&e8m<*Y7PgxSMNim*)i z6skPOV#c*~dvf;Mb*YiDz71L733wa<>>!ISjEPcE*K|GfryX=n7+*Sb5mnkFpLAT={EFMUgLu6trW zXGzQCaouKGP^t5+vAf001qucn<5gE*F1utkSqqi(k37wKWz6jhUx`bBM96 z(2pI$gRyg{LA3i%c zTL2>Lccb6f3wPrHYrSXKgjYOnVAh36;89DHjz$dtrvmh}Bn;AptNr3EknMk*J840n z#G+x3;Muw=DYOljaGgyA*F(Q5tuzkO9v;K{pR9iTWMLC)ln(G0UYx!9Lc6ua!hK4d zqYq3wok{op+_U))-BPJcVOLcvV>oBBWT~8F- z1Y*vNJ`-t@IEL?2{aBaeqA4MZoft%?VD3AzC&vZ5)_BSF(!a@qHLXaxMQ%Rmy zT}CzY*0;tdLXbFTC{{FF;H06KfFg2m37?(}Z#>t|8d3TbQAi>r34n5K;vg;XmWF-v zh2aaoeG`iPAm@PETTX@ij=mzY&&*QMqM>qT;eM7tV5{C%C$GwAfnf+Xx%0IGS2bfnoz;l%4}b%0wNt;ND>;i zA|l5Ny6R=x;G_Wn>^c1C;re31H#Q@H1eazO9!rK4`X4uZ@wfN9X)GOc(cqWxsQPD_ z($kT3QeQU)x_~N}$Z-M8LIJVxD=qDnfR=xD2Jc-U;J6F-@6Nt_ce*o{HrPF?&5({A zvg#{@I3Mt%!}TYJa~AmGbJJ0jg4xN;zfxODd2Y&L(*B=4b4n5;tx^z-QDvhdgUG-l z07FWXD6ica@69IjmCToYSc!amwfw;uEU0^K#&PgWm+VN)EpHf@=L4Ru;OQlwEwGmm z12(~SM-KEuXIbadQ5hMaLAtr@@fX9;2Kjia(%^i3X&NNa+%ps&kA@d+;@4i?xG`zY z&xiS%63T<))!% za?`w-asOoA+S;+?%rU8bj#)oLo<`mae)x<}muY((n}Fvlo)5U$;iLsYd~hV^E10yn zzu_M8oIF{AoRvar)k(Pj+c&vrRI)bKwY6CYNmxf%cx~rtu6fFo&C4ZF0{wo6l<4>* zHBHd4_Adk1_1;N0FeO!!g9c?HJ&Ws>7~5;@Z!TK z^RvYufOmJhdwWgQ^XQWSg`@9N#!OMgjJ;?3v@Eb3;4j}jeR#aY*p9olX$VA9>wpDQ z;>0}d)lQM@+*^<_Pfa8;35g)v-$Au z4RuSd;fHfw`H%*g#RmXe4_fq2}6%hfPx0-4tBJS&0@(!)U+7LDz?Q!4xVw-$aA+_ zKzQ_M)hE1nchnMI{rRc9eW7oY%DxFP5a!(>GYpQ+fxIyW0N_a%zy8`L;eZ8ulucYV zFcXYdYhLw9M4A{j#~}iE~=?;l)!cCu1Y=XBh>us_=0Xg9`j+F%HP!ikw# z0-<17rSQ{d!+W1R1Az9Q+{7;vmY6dTkq|;18sNxXXMBqQ!B!(L?}Z2h1*+KKDozH( z`cx7yTzH|Bqe{z2UFu9BWZe=wmdp4+ES@O^N_^2_Ylv~aZa@BX_)qU$EIfRs1^%Vi zX0N~8jk=zIE2loNro4&hSOu$Ezr63Y4zFYZN&)m*!V>#EoYTzFWx^!@1FC$^qXj)U zNnJ><-|Eg6^3gHBb|Y+da&jd;}9sV2VAYWZJ}+$`YJ6J1I=XepKbG< z+2vmy;HAU}i8%rG%pOQ-f?qGaSf)e}aGn6*t1oT^?6X1HWm6aeF~nzA{bwi3!;@8V zC;%r$klTCH=l8n(X%Oyn7KU*8(%sqlf-hD*0?k+byAKoLT!aI{xC`S^Hyd{$K;nV9 zUne;}yAl!72hc|{47ggR(U=@Err#xT8WaMhhC4#y#3xL6l)i8y2q#1;D@Ya=2zlG; z8(j87(YMAx0gbe8N_$mUl&9ZP&W!d6!XQBd`c#gQCe7lFSK$7uyB|MX{moC8hjUpa z`41ml{pC+De*T5cFTXn8*;)@nG7L#ZyO^hO*fT3qXyUbSTp$hkr^(9`+q(76_iCDF3!{C+=hTVJF#m8kLGBaT~sPcjNYUjJl~65rBhB{Qie$46t$k*6Bxw zVaZeo`!@PSD6zMQld|ay_fbNcU?DqU??&b2cJrVv<*V?zA@j+_klc zj<|t@oo6h-LLw4Frb24z;v;U`6y?)6{}FugtOMnM!Wf|nesZ+8T=Vc>2i|3JBMAG3 z&)6>PfqscWfH${7HCvS66zo>A6-PkSr-8sAO^rilFLPZblE>WK3}uRXc!>AFdcn$gZ5$^#e^X9 zK@QT@4^Hsua<%5SJ~?~)0lsv5hMBGHY-89cNJ*{LA3bbDFFd!0h@|_^k*<~+`L*m#t+(nr=A|x2}-6Cx?J)4lw z1oJ2iI3xg&HWut$wcF28=^961X|=hi(4ABseq=$etwaJ;{PR2-8!8T7mV4PjrrnzzuolW`@e=|7(1y{ofBle7 zdoZUgCPOXzO)QW$;_MgqyVpjtnFbm12h;0uL|u9!i@!Zvy>k+*Y{G_kcXJveJwCn? zpxJ+OZonHz7?C&;B%S5zV$=UhPHn_Fbc;;Vq zZ2~;M0k=1VGBd}IYR-B)1T9^tB0=ODL@hoxPt;He<@S^vh<36C36Z~FqF{?7mt6=5 zCuiw}aJdNYeU!fY!TDg!CfaM^>tCAPyW0d=2uNZH!t5OYDIW7mMLyo&BcDyE#z z88#aK4lJfgDUfNbXuI_rWM_gS`_2oMF#_{$v2lb<#u;na}anuVJi7!7Ze>r|tck#EOTaSh^F1W<{a zp5KYyf2W#Cp9@01*65lr+jjQf`osGwVk+d#T-$)Fz+J_j z7aJ*A@Dcj#NT*c8kktBUvpio0TNP5VT&bAiuU1kvq=I{aijZ{~y zza$wrnv5qXEUfSxrW~ATs$-!nj;+LxsCGx4Usj1fI0SfE~dUrUu*V0=N~h|onEH#lyv4ctVSwyM=*CBUHT zj)_oZZitA#`vC~ zSJrDu<(6_R3S{!Dd0sOLO`IU^ce+6^G242w9VZ*oa{{|3e0f}o00mP2Om!#~(PA0V z3Hr=i(K8$gM-5IIoHW=)8MoL3L>N3;Hc##_bKyNH*~iz{$zqkSN=`1D2M7E!ufzri z7G{BG=gr~i@THd`$p9dN5fM>(;gV+Rm}FpM{+Kr-hckHhibWNc2N*f9*LK1MJm`w$ z(c?q--rH9XE(QQb00MdG&TQ{y2h^)G2Yeb+tZtb5V92*OS6hV&15uKsy++6uPN;sE zNQG!J_cO?(4U-6yMn(;e8fcUUhazD9ikQDiDH*cXrs>m6%BUy|>TEyIH;D^o&m7RK zV>P$nn?61pE3@*^x8s>+sYkh_1VkR5j#4#vq(3bsc8?NM5qX#gpl%Am0}8HXHs)vv zU@}FA_!OKxSwheyJvKwMYy=1hO~imOYC;pF4HAjlKp|ikBWcYdNy#fZ=VMpoVZ}w& zI$O*ihS|WBwN+}S!*WmH$)$X9GVC9PySvN)AvQnyWU*NB8!t70(5LwJr|YX#`o{gS zX7)&q`tpNDTSPILWF-i}I(`OJyUf%%!uTVi1y zgy$w$JQ1k)sY(DVgTkQ58sCzv!8vjZVj$D6BKT#M4eS7EeP^G(`47fV58J*3(b;oM)D9oOXi;7C%*eEgDQU;rD-#&-R(2m@OLfqhe~ zrL}(x>Z}l;1;cWI&lUo}LDI%3#LNN9gFGpmMAPZ9z{$~YeknKh<786gKq*0DY1=|^ zP+UUJ{j(VhP)ZyEv54-x@&%U-)R1?dIk&h(!egds+v3o8zJdXfF%SrIOVCAXf)H{< zh%pc_0xJqG2Gj>#t6L)U{gB-xB7&F{IH~8Rf&&n!XwhNFwhjcy=*5sp$-Z#1p@jFp zkm)=g)2#JxvZ)9l!jKXXf!V*+>Y4+y?ETr<5gn zy0s_&>>q7De#-yxt;@%k!#d$lKADdn!z(Y&Hn-4IQlv=Y3X3l1Q&fq|xq@Xc6j8Jc zV3wM&Rt01T`g+_8Zzd$m7EU=9%x<>mVJ?KY5hpX@iO2i!QuH3Zw(7gnLwww{WFJ{>Eu()L`s>W(O&4AusA zn06=BHP8j=ktN$S6NxBI&fO)x-+5!X8# zoiNN-0wOQ$($18#K{WT-ERdw=z4E|XpP8QV@G@6DX}OkGH~0CU|D%nMKTZGP$Cu~5%-8(m_s@4XntLydyRi#_T(D@txPgkEBFABv z6F;ZJqxF7;7$AAF=l4TyI&wFK1<&R^oJB|pg!{j<@5_sfrU68Jb~G%P$VtZIAOdY0 z&MyWQ1d-9$qHPYJt(Pm^MiUflHzcb5|uhRC##0H}YeWtNCep%XLC=w&J5JnXhq`0DwYc z-8?%BkEl4TC58o0fPjj65in~Xwz|+FJ8mf ziaMSR0Gg==pv_jWtS&p+#Rge6HmAamkv4M1=>^oOKN4~qSzn>5!O|oIplX046_Zu} z_=GU+s0lu?(7Mc%`3jjBKzGtbV&EUl*(pVO?RuJYb639l>h>7Ir^h`YUM|z4CyN%_ z@kWEd2Jz5+d2sK)6eo#@td{uMqt$d0DH!ad{OPP%uPzOwtktVRV~ZogS`Rb^ZusJF z@7sZAH@@i)+9v9w#{d8yHAzH4R1OJXvEb#3XVX9gT^BDe*TP{sMkFS}^NS=5dwZ>J zD=HL&gpTkv9=~&+*5D$CyRJXEqQ1OC6?Jnb(|A~+!&;5_KYP|CaG8B zsM}WC@8$`XK5PWnAW{r0#aQSrXBR&d#zb|>V{W2yRY@t?P@h84rDgY$liRegVfVAZ zH9MEPigfYp3>Ab*Y+pwjVa{YnWjgeCZsC_-n5G3hzUYDQzT6>D+7!=d(F@4ck*o)Hk!TQDCOlut=@Jg+aBz{1=5n#3)j;cn41ow^2t^|6SB~0+ z2yxBy_=1}l8Y=O*g|Up+d{ur0+et3D+tfJ*VhDNNB<@vkH%eZ-U=LT1fHGr7pMJXI%+$tE4@G#TxQ#n5YEo}7;rKnLVEmk zH4Lz|6;%~ddA6_)l@qSZ?)+foSO=fTz46T(Tm)+7B-P?sKt>%-MqxBEIc98dI-yZV zIYSN6HB99HG6p0_$*GAss9oLorojqXa5 zvINQTIax1=bs3j+T>{s{73#-Byp|kaMW`#u9fS!hEdXIg0Oppd_IYFWZ}?uEkX-6m zP1mKw#Za~;R*y!m6QqL9k{yevOcc!TtgA8+KWB5d6_u{ob0QMtPy&|OIKBST==QXG za=2P^S`P5^a4G9B+h}7DKwotFmo5Myz-qxnVKPN#JUQ+s6x8e!p{=lmvzE8#V%?6r)@^)oHPMZE(hS0UfpfZ z7U`mwmv_U6csW2IXo6)|YN{V*mQe-`m~4>cll;8@<(I3v>}Lrggo|=yO=#f|q@>RydfIU;qV*bLRK&Gc zaV(AoRjNwqNJ|1QR0>(I+(abY|DAoT)>ue62ix%*%vf3KZErxRJ%a&egl#5}t-94T z)1v(dr3%AA7xS91SMqtL(o|DTQ9vW*Qw<7{Vhff$P|{UK^#Ksdo0gSUXf_e=H4%vz za5?abbw)&oS7|w554(az z5e~kP#A0Wrr;f}ozr#ibE~P*lEmwKthg{d2mS@neB+> z379XXBPydH(7-ZT^RHSX4V03kRtxXTJZ}2epV8mHxqt(I*i~SDcsbvF_@ic^=C2SV5RcMn4fS4Z^EOP*W+hzzIV+!6t}jxqtKZ^v#RK-F?~i ze5&>K;lw9eUCt3JiXDm=i-4kJ4l_wIOLgN3-Jj7q$*G1RCbQ)OrMJI***N{-&8eCT z&D~#&{5?2Vj8YiAK@_06diJ9*sP#zGE+1vErMJ8=)b-b-S_hkOgvkJmnqx7|tC1M` zDVQ7L#oNot?hU&vu#rGyI_wCP=9?I|0}5b88Y*@b_X9qi@Nv)gyL!9jyIozMXw$)Q zz@Y+TMiN`>CeAVjsGi1B3V9F)I~Xh}>=n$AMg?MlW{gm|$|0wxnD9nTGg7U*#P)?M z8P0zMgPW|(WE!dx9%xI9#gv4z!VyVJIklA+8VfhpHQK*#gCvhdn9-}V`j5X_tfrHn z?oI_@b1XL>4(GG!{EU#f(FiQuH^_Z#9V@NOmN;N7h}7KX+R12vEAjzTB5WuSgSpvB zbef#&T40*jn|tb@KSE7i2d+Gb3V~Fys-z`3ndFHJ?*#xcp*o@izhagI`r_K(9VZY9FX@v#W7%D^qX1Bn4EU|;A^ zVAJEe!^b1vZ0h~Ct~=ZhbgFq^sE`m-vs_bEhj^f{WuK%}tIV_7H)r_5$m&ciT+Itn zhWr>b1@>?_LieBM!OPPN8NZHDJs&eb&QuUErSzYFF1Jtc`IX?&73%IZ|J`5uX~y}? z;C4*p+%%IWoeeAjouP)}3se&ZlNH99;0-C)k zKFx&m@HpJu4~rR1Cdhzgpr@x{KF{P^S3Y}lh64ml?U=Mk+BS+q2xx!iQ}9yC8vvm@^79(@`{D8;x3hk;Dcy;e%QT-0F?7AD>vcIh%fe3AqRArg z(DvIHVl*RB2#kfQIvxo4F$YU!ai7+!rJVw-hPMq}Q*sZ1yFtoeu3aw*o?(@@E9i>I zWC0mdUtrhQ%?Ump;qCx8n|izD?TLQ>WBuvlFjT%;qU?(nD+3xGpq)&E+e=K0z)>m% zsi`N&#tfiVh~#$H2SPZf6d0hmnk^SUpEa>B)eknsLtC>5?QXf{Ux*zNh@vGhHxR+z|# z7o;ag)N_H2i&0{N(NhT6-7^9;-84F?nj?kMWhF3c28j%i?W4Khf18-Gaw9_-szXRL zu?CEqIY0p1?>J8~KxKqufyXD_cQs9^OLV`3o9FU)gx!$$J)SC7CQOu()KIzsP{wE& z13d!JxpJ+FBL~~MkpW!$fS{Jz#?@tBolXDut|y?^S3pF6x+$Mugj7X z#71##V}@kU7eR-6#LTJj)b#&=ND3|JKy{KJIUUi~(&87Q;7~S$jkn?dp%55|A;Z3K z)d1jrUw^(GcH3cfk(q&zo}SC;#FtB&&JX~Pr*!C{AZ|K%>fm9=H(S2n)oqW*f%;0# z4lZTU9ARp^8iB%~P-M{UnUD?>C47L48XC|JE9a-VUN5Ia^kT`(Wwpq!udszzmzw6O ze)knoEegP(`3;Br7)d#;Zgv~omoW^FzkGKnfRvNzzo0lD z)lwjZu)-WRmwKk?YG6d1PI0ptO2Ng9W^;OaDv0>%mpGsf( zE7TVpDgi!s*eSMxf}^3l&{{MiLb zvu+HTa8sY8)Pt{{-<*wqWVC499Te)!^5`tFPKkN3m+RQIQH^S(Qu&Ci!f zvx345n|%U`&d`%e7g2KZVm+3=|Lsc%vnn^#4mRV`8zJ`tY_|1qEVF4&)I>M9-VTJ6 z6R7)=T2EQlY@^Pz1j#f?mIB#)el}Te`q_-;^NLKXWtvVaA`S!YkM&|nt0jb}sgSb4 z5zn^zRb*(D-95&FwHlV^ZrIABvP!M;D9i`dsz^POH8*bLbnkxJs5v?Q;)=%*#fTx( zjv`mwAD~vgyv&IB_;DzeU%#Fbz~R9ABhRO}T#|WcR4c2EIfzslx&r%wo{#WwfV&;v zZR@6^<3Oj1g(>BfBsy0VQfdoO_W@{0>U|EW>ne&3+0|5unMdc zBOK#SO?D({SYQpJI3G(EuS^mu^L#RV_s#qa@=p(aCA@n)9@l(%HBH1`{@Jqjp_nM2 zY^rSpeO8n<{pQ_gP4Mm&yZM-^pM-%Jvlo|z`Qt1v$;$c93({oIf}msqY|9n(9s3VpBh$MqoF`EV1+-l>x#&9`X4I8DPH1yKT<^ zm#a)fPtW~gK534keGl8+aCMpU1dI|J5|AS!#J^UB?deo;d*by89}aN49&We18*(?` zsQ{&vawO0y+1q6$YXdwpoWEH*;cxBh&Dzdn`Kj0iX- zdOC1noMsIIV^$bY?g!-Z&j61}Jv#tA2 zZ-02z64KjZ;#v*jR~tQYn-%1o)2XYa!r6kP+pEj~lZ+TnWc91?9w1`&lrV}!kbv7j zM=gEYpQWU?q+}$bFvh@7dc&Q_OatAf&PP2OkAtW`8JRZY|KzUY`^U1|^^3C!VMWBp zk7ai#7Z(%bz_c+Oj22#S!LO>RRdx*^R<4Z#SZ#?gAl8fJbh*kYSKxYno>$A%h%U2P zUY_Uq0*zr23ByhLO^A{8U_&m3s-FJTM%oP271;K$?%-h$H|yc)2>YIff&dwFa=M0} zgnD9{8ptD!Bc|NuGr)|L(BvN2rqMRFWDoXZfNh6QM_5c?Ho?<(XTRmo&lD!QtX%#94jh?u^A_lixF zWVaQ5sw6OROG<#q{ZQvK5?&+%15YN>63Q=2RMj4$Wycz612y_tS5gvU8heUsBYGJW z0}PmS2EfX6Ky=Rx^Pp5oar-l2AZs7){25@&Z`0N9N#!Y}!=aRlr7!2_nHjb_E~Q>w zWF?#$!3`btRIe>1V{)q#lEu0(dX9NOArTp|w&IwmMY%{{LByCO*P|-?%_}{XsI$Vu zlKu>#NHeoZHIPG%6C4qj+h-4fITW&lQi@H-?B z$XT?$P8zTdDrfw-ud@Wp8SHy_Jn)wnX_`T$d4Y6?fv1g_sQmJ)$yb->e|&#rfRF2b zzpa-SbHIx3SmD+c*1IVISxFlpD9}p_lK1Q*dAphgrn8^cM^2}-n5UeZ$BIl_70~4{ zDbVd}V6!nyA(jRfcg&$rYw1Ab904~w4c?6A>ft^%@+(e#?faTDnSjLkg{}b8?}`2D zXuEhirTxAP6;`WE2>ppm;meEsN$iPc`kGCa!vH4TvFp^tF6<;dIfuxZ8Ieb=ZU8Qe zqv-jHK6o;8MLcmMq)~N#Sj8$C>nOmkQOAK9PZc*EKcDb!S0DGh@2Rg?IHjC&!-}-J zQwwJSmnaDP8hJ4^MMj_2RRX}wlZ1;*^NiCB43HCC%^RL96f)US;8JO2F=4Is;(U1f z=HlV5U-xz2)w{dn)oMPSQX3tTASD=NxefRtuR9v?rb!}E6vq?_xS%008nhbRl2OJ{ z*ji`9@ky6Sg@y8Kns7Y|1L!*jE@XR6`V9h2l$rXVTz;Z@}&UHr@ml}5_ z*vv8ja!&pC-<(bR{NrQK05|vDBB$j=X3s+q+>;3X{&D+Y?Eyg3y0yV4lVX@uxv7WR zbF{!<_s{|tOhvB?v@ga`S@uQjg@f%jLT7c^Wv}-GOQjY_crMnG>>vrmCQ8(1x{5>+ zatx&!k0z{fXO%%BKuWwgC#yGvkk5LPj=Wg?MhbV6v*f`X)hZ zrg=&m^b3-`KC&5rrc+=FqF}aAoND27@_SALGw>wS=~VZJlCqRCT5=dksX6JT!g%O; z-QnGyZ#U&IP}d^>VWLS+u9{Q>iNF?B1wA_F&lux@t;9~E0Wwj9)8<$}Au)^R)@u!4 zexAO(T>R<7VPJfC?n;N(SCbYcp;m%qj0FTwMl6N7DZ;EfZX`_@d9}zoByt|Ak^afK z28wM}t7qDIEDi;%BrM=?kvn`C5q%}6c}j{G4{a2wS(Xet71) z-EbQC_O83WIGfGcBCbv8VW@mt&N>JKn;Jj})m3D@t>XZwvmK|QqvoJFFto%IWZG0x z7h>o|&`O=wgs4XnTCIvk~obgFq%SH%Dq}3Mth!NH;YI9{m~# zvNz4UH8Q42Mik3qG?rm3%smIfmVLJ3rJ!>#9DAk6;EM8EICfR5)D&UftlY0|I z3Dsyu8?{HMX+B8afU7#jHl-cyh=6n)VB5j%u0HHx;MCM%lSG<3fq}$|u6$1!0V(}K;*SUzCdA)-Jz4PdFAqI4yuUk~O=jmyGCMXMfHogdrA55`=U2+w z8V%B<4<>U+^!Vv$(QH}JsO%!`FmV)#V~k~^u7)7y8iq`X7%lW7O41gMaYhs-^Y(23@5WJOMa z8F9hKaZaAB%GQ-*?9VhUHn_=q7=}eWF$9xGqeI2WCWL5y;)Y>tSXhwOnK%Fgr`O7^ zDt@Nq#NCKga0q!KuZWEEh@R{_ny4Vf4cGn#X$k?gj9~yXQ^%0P%WfNIM}L6lZ6z6Y z8bd||8MRQX(b$U}?~_A>3|GK$d^@=TPKff=xJG9^RVGXW0c3<5vw;;er6_2o}Lb;rW%eK~A~>+3mEK?m$e8b8GJ z{kxZrL|9z5+!aQmkh&szZkg;25Gjd+Lr9Bpj|u5N*z>tG)dzA)rejhU`K0w4geitY zj13#JZ1E6MrY=aX??y5B7RgoBYFgk8f|zSZg_e)y?8OtSq)eLN5)vXGss?B=Si$R2e^NU)G7^&kt<%d zDMyUeL9}3bBD#lG&D2^cp_@4P88GG{v+DrarzGfZ?ABIMvEGvecj_G62(6EW&H^WH7B$Y$j_59fJkdCxrGg%0$=N}S5qT$!ST+|)BU-zd9_xIh4%d^R} z`nZV*0MgrcuQV5g-3&tr5$4wbu9Nom)gCc{n;d%GPg<5Z_!=NP4ZW(tI>(Lc*`uSp zb!(Sb5w;Sm{h&YV7AW?~Aaz8F4{khQ$yKdHA!j=$Z0;Q#3u{$3Fj1IqXMdfLkTv@g$7Ui)Q_C( zeYj>t#io8cd0~$VgJO^nK@FFfu%r+x)3%3)13&C)g*44NWMMlA& z;}#>u^lyGKKj-}C`@S-~|FB;z=8JRHVz>S@Ky!3RQmW(p9E0gf8aXq+qd>z@G-3*hbq zx7)fOC{dbbM5@XA&rwH+YWc}JAd6fP^)CWMe)TeazFhqA{h=b=KAbYsa%J|R_AIE6SM1gN=;$B2`d1b^7r$oZ0sF6s z`>(&m)vr6tMZbDt<(h-{yn6i01Frd*qn&$q-#%;B?sd|vH{>XPI<-#TckP;0i{ACV zuQ|8+^Un1gxc{1Y^T(WW=$X!C#`6B?1D5T(_OQFoew6yN#CJVp`F@AKcG?N=b8a2c z=0(SzwEoo3FFS6X%WOZo-?q)?7rV?mzQy}jpS1q0Q^$=eTu=EwQ+~=x1E;T#FHhDp9~Tin z`sDQ|4UC#~+SRW9zU9u%{phKuoOXI^JGX)Us=X&_fIjv3J zxiwd9v*%Iu#eXP_E0EyaXC9qIpPak*{r4aJ;^{AcxUsHqAkiZERf6Uzw(Z6h?sX0K z;_1)d*;tpR+e>*p`zobpzs&V+vAcsdGOpqJ-MP*sPiKGW65?^ZOY~8m3dyC(0;-(u z!}xM{T&5>VGMQYQWRpyseaOvi-RRCbf@+JZd+mP9rcl?E)=SBUH|`ZJ$Zs2cv)@In zRtp@uDA|`RQ{1TB!iY6xW&>R99*dW|4}b{Mfj8x@cB^s=-RkJg?!e5|ZY?mE^b4}* zxapKRnfMyQ3o;8`O!_{+e*<%XHNX_$7~oJ~U*Mgp(B*ir z_3^#|)HH65IgE+4vidXv?4|y7g72UDXnj@NY2VbpA)t4iFc2@WwK|)0jrEh6TimJf z<*ncGJT2GfRtWO#u}*ZPr7sC=UhMUX6G&j zZ#KB4nVosDOY4QqJKUt)bhnc6GT&}{#&8&QJ_bH)M?T?BhH!HBaW|glegRbXgw2uW ziFIb}R}(H{-hW+itzS{cG6D7c8}J>i}l&z4jH#%hFHROGocW(tw14qUIV|f4f zhQn98n^m56_E0;19b7}9fHDh!`2p024iKIh*cx2T8eHv017m>Q0JVED@J-;gz$9QX z^^PY0Wcu-L;SBNd^kJrOgZie?x8;Pr8UuN@GaU1D^RJoX+<8DBFem5Sxhc#duh9$P z653cmx%aAW;TCo86++(6pg!UKv$WCR-QFGHv}BI8Z8XTceKiMZIFmjvAwDziw=vAj z+~}4FXQ`994k0uN&e5Lewi?3FAIdMKo<4=~iLRHn%jD05kaU}ic6hm)&bxh+pSYFT zo!#r=@4LO?BY8f6a5v`XGNZxYWdG4Umid6oExQsyFG;G&QQ;t5Z&nWDin0SQ$2r4dS}_Kea_sQT;q>w8=r-RM3PAM8GpyT-jLz6YG8t<1gd90AW?B|MdR_4w3{ zbAvb(aLGdQ3s=CQO+wK?m2?ZiBj}~|AmJFoUl1-J+~`BMSh7LPEA_tlWU zJ8YM~+I=H)b?axE5AgDE=3lfu3)mT$&RD+(h>yUBS#QaX^IJ#e-r71c-lugWf6~O)rZW#yvsWR*y&M&N z){`gQ*yMM{+vXGRH98ax&U59=_HKIo$JPtk9(Qv5A+!wWQt9BxfqIuMxKZ)L@Z5de z>G5T)yW$H>#;%Ary2Ikx&@g40v$09WO-z=%)s%5oA3Q{%($xQ47W@=1SVbJ(rf~rC zwf4CeTou?p`L){>eltC}+Qurr(a3(nZAaQvD|-fVg}U;yT~9XSX7gTordyel&=*Xv zaMMU@&js%!o0qE2+(GamuTM-*7PMX{^tgqBFW2NbA?a1?J_o z@ekcj@hZ0s&*E+SCLcsb%|vFdLOufVqrgURv*F|5zzTbZZbAON;`f+5uO#!_>v%W8 z-sRln+)OuDkex=^quq}2mDF}Jwr96&*v!CkYF#WTBFc&sX@?^8F&OH4bnC`=k z2WHN9*8rDieo9~Wb8m~TYTdv*@6`pXI^)@0qIUvwv%9#j184I*hwwjuFZsB;l<;T3 z2dMi-!fSJEOaz%d!Dm9!E(1OR+#KF@hH9@fKHPIMp>;!NdU8Fo28f<(-5}_Er|0b1 zZdcmdHM^vBgCKqy{RPOq$MxmUbbaymq)(jpS#{|7rWMj$nl&3X5_cE`KdbxZNgweF}+2zU^}+=XtbAiF#G0CdL-H@T&P-1m70 zbjP!wrQGJ=aP;0wg^S>zaIPz!+uv<3$ZXfTAv0ceA=iL*{5JS1pt4rJio66wyMoMh z$YP-VeiwK?5awGnsCkVq_2t9*gmnpF$WQ-v&fe4guI0Pz)r)J?=1KK!ZWnu6Uu`@Fn9cLoN&5uhd4#ZqznDEq3N2^n{3}<{T;f82z!aG z30cpuuA2#m>^;KzZz-fc+lven+I*({&sn?LqihRP*Fup4U#Cs*z2&I4C#&aE6_ig1NyoLBA!aoF=7ItU~fT?!GCSoEvvT_@0Q)&@wOZvK}L7V>2A6Gm&Svf z4`Fesn=i=sw{8%0>!s2GhUfuXh=+ry@;&_){A{}KoXzL;2eU~2J)@R1E z2M&>Ky$Swy;jQ#@(+|-B zHKxo*wO4ZUfJHzL@D<>sfE(H?)Al17PQtX$%^u$RL-tmnO9$Lyd>8j-*7ghJtD`%@ zt6MMTknpl=z^5-xLkFMVM%ReVOfBHt^H1FHJ%p!Zww;(Pb$s z8?sBor3v;a%9eAxJN2W&J8wrmz|F>1yu11e9KbuBQ_YG$j2-i6oz=9Sm)$+HyZdys z(Up)NkCm==(~4`|G;DRtQKDw%C%T#0x40#R$6Al0n?26?kIr*s3o^ONIv2xphwV=~ zg41{iW#hClr*W?X$j(FmsB2r;UnfV0N|@NeSGO-SH%A=l8Ugf~zpE zReyyTbHH3Gvhx2tUs_A zcs(FIwNP_rwnN4nYmDertnGW~?{o2~>`g^)Y2Mt4Zh7vzz+KGS2e6ZTk@Ll!U0-fL z&O$!OnBNXeBK;@mu@`clccGgREp6Qy{kxkCB!bLgZgPAQv~{%0M%eo^&jRVW8X@*+ z_a{O05@i6+PQqF48lKl=u8y|lz0L{GOrLe$#WQIO-Pa7#I!L>+1IX9wjr~RI zxHL{4%O^b`1(>{RaRa0EdVq4RqsYUaxAiP=1;G7~02{x^XU!X0O z-N-&%ZCn2yA{3}>=&PPP-2IMw=mo)mm5j#N(eMR|S zevD_vXyfL+@>sr@w1arR4I$-QHv?;cJTMB7-QaoPHlD{3J_y_m%p$%Ez`Shy3Gj1h zH02BKr<{Wv7-MySzxC#+Sz&fpa65aqWVfT4Sy2y0(S2|k!Jwl!1q1z-?(zoI4iSsUh=O&z~*}2xBJ;2)qLLEA9^JiW^r~gCrnxIE@=oDrn2yKM%Scv=#==ZEuci7hJ znIGLlk={3A7}jTtAv6q**f}%xNgww5^lnedyIAg()uzJgF-TbQVJ9bEtmZ6(^t9uZIthZod!u_mGf1 zT^eT|hUo2^iT9-QW#KUQ54=q-*yd6jBJB*lhZExH*UWE=_H?&R`=Gs9m(jWtusI;V z?o>2#YvJ3&K&szM#~%X8OYl%2zj!Fg(<^BM*9MT)|WEd8?*=ocM0I3 zPLRaI17p{oV-pBt%m11F3g7?&yXT<04kLi|6{%TBLHm!*0egQZ$iJAvDTEym)*{Sj zn5!`E(D%@v&{ilnQm8c)gmHF;hh)IQ>c z2|TZGyV*H(Pj;$!i|ifX#!lJqxZ{u)()R??{k{&J?vA^(oq zgDJBgaIonVOXGJB(zxBP(Y+dh?&R!C{t~+262c;o?(gA=Gu0MjS&`kJJ7K!}!#n9` zsw4Xv(zx#vAB_(ATJT~l;})FC*#GE(`yi9K*D^V}1bCk3t4aSe^Lr4_?2Y3O0_dZe zF9VC-8i!oaltvHZA18W;9Wq~L-ZT!1u`cP?oUWt*z+f6_5fZBRMJq- zl#9+I{1ot(G~eOa3(g1jByAhQ*@RyJ_QaMzebK!K z`$)S#wI}1eg7JzLZU$dUl+oR3*Jdl}vDw|KtOb&n|6 z)a}m3F!zkQ?`?F)!`VnUi`Zhk>wG4RJA|8z-?gp+Z}h!EpY46&z2NQ_kqO@tfJc+z z(f@9^gr1$b7<&D_+atHF*(2v<(0Pnkig$6BpXV3T`u5NMz<7DrHx8V!rr$Qi17;`H z{n`ntAJ`jN8SJ!e8!hSkiq8@*i{H;a5tQV4TX<1od_}xvKhJ-nYY4AtU76XIH0+Y_ zj#1GWga;aokNzHN5I+%*n#EZDG37s>YF%OcLtqW6LwGA?9a^_NC z4In?o%)o8$-Ab+>09C;??I5r6}abpSgQ*=-#CbUOp=_1*F`gy%vl zk8+3ExdG0+_RRbY+tzp8p7Gh-ySo#c&EL6K@$OL06PEFP&>ML^FuTwlpZShIvqGPF zEooCIdyM7#hV6sHw^h2MKQs43;3{Ouao8lTB%JC>+=m^VT}j(lFs~Q6UE-sNbB0fR zY-SYt>qo$s)A<(X4(wXvsq+eKaqmTcx{9@0;pty^#R085_Rn68-STLhtgptF zW&P2I$AnYNN|Q|BD=DUU#9`l-X? zub+F;4Tpti!d=xF`mQqUr*iLgV+HhiUh+}$(-!?(jIDDlYvt5t<`B;M4&glh5Z43j z22_AWz_!3NKxum3s(kc!Wg(A^kbAi7mHt_fD}$f+xDOtukQFJcWka}J(RfCL)nX4Ph}r#J(WMw z&F9QuJ~C;3((4wMAAIqr@cB8+3A=iCB5<0*?tX7c7wpczr8x8ThwK}Xefwj(dX)2s z_wa3s?Dm{H@?FbRWa5$RiKI_yZ%{5Q4meEz+yUnif#_9mMx``7%Z zu|ZG92K{IF{ean^?F=AE@6{ojRs#F$PDbuN_CUKK58uMJF_XC&!?$efxf^{L-?N-S`aSM&c+Rx!C9S)X z+uZw-KU3~I?i|*8T5>LU@Ew=qUgPP>jl@6Z&dS}?`eSk}@6RAk8gpJs=233F{e(r!Rjwit9b|bz$Jbfnf@d3AA zGT+r%<1fRX8~L~M-7layEpYZ#I1zX~u&bL~dM9l@<9Y?z?YXxB2=_M!+4q8PK>Rp& zwmP1>_nF9OVJ^L-uX#92bX+hvoCt{-j;1$|Wukzu> zCke4d*qO}rJab0cS_yPMN4&q1G(xjqZAbXJ6fPv}gn8t>kF-|-I|sd<=PzbDzL5go zwxS}IX-zAVg-rh~cCe#Y#Xv^c-Pvm zdp)9c?qlrD?H*|Ny|r%sh@Iy((Z}3tg502uTeSyCzKPB7gx0a;d2W0GNTfgJ*i(h` z!85UG+yKwJguBGA)?FIiB?0&ro$!fdt$QNF-y2Xr1*J>e9?^~1?+$irfH?CWx1ivn z*X2LUH$p(>lh{ko;qMdpdafc|ox9x~nG66&@V5@6V_)8SIlf%qy1V_D2mLLBe^6OH z1INQBtuCIAi8qpV8h`8HS$9D)37h3k?sNIZ;B&-Tuw3ZhNMWwWeX83&(Ji}}vo(C% z-HT0WJHjTg2$-3|9u{7YuHj)cd}cl{k@Q}m{cSkUe@WQ_`Af7pJ^mJY+i@+pY*so;VA*3zIzm~MV)-Czn-MsvhZXGghd*;m` zIh#H6N$70c*Ma}&d+{fe$B{qJQsy-F9DLiIf1|q~cO>NwA)W%~tE-9^*}hx%{B*x( z+eCN#E_Mqu+ne0fez!r{`;yu2q_~f7m!EZ)(w_b%#M;8M(D3e@;s3ik1ATmV?o`g? zO!}bAKlA2H%w@M~3l;dCES8oPLTBdn!24;u z*WV>MNApZs{auq2sP8r8Js7x}A?%gOyA9DdsVfaNU%aa(Pol@)M&EVURW_1$us;W| z`5D;$fxS*~HD_iYbbA*ooSS9b-i7mte~$0OH$WS|+cZ>Pv~ILxHjz!je}NzT0$tAA zRhHzgMTWEI#=g8NdzM>K>g5i}4V*oscR;d#;Qh~eKL==_yQFrH+)v2=ICy?2Hi)Oe zgR$I=U5A~A`?`#;8SEn2HRu}!Ae^&=a2@!y0hsF!5TIZ68OU~_zxl$xD0vfi6wiW3 zT)}zM8`;0jV%`qrTY2n}@%3&8+QJ4&o)3B36uPSJ5F50|H<~+cZ>DUTC#f?(Z*d1u zc3OOe{*Fp|c7I6g2l4r>do_2qK7Zuh3}}LT$gJ)D$(!Bb?E4N#E+y8zoV@Fj>}Z`y(i}v zQn$`;pJiTju5y#FiOL@Qv~LtzTt7Vsx;-=7cku zdge0rpp!doz0AYztQSC@4GG^K)3$7rw&q%Q?)MySwuX=JUH4N!opsrd`Nrl7-Eh8U zcH9i*Gw_9qctdti-t!&4!AY%m5a;jKZ2Wn4Prz+_C*NRK=<{wF*=WCt4)Im?q@Qw8 z@-KYPbDrIYTA$nCGT4J>$}V7Y!Q6D~6C=grQGDkpNY8V+^|USOed%`xVGoLq^c7?& zqF8rnHckZoj%RpOi=BU~;o;@?!>`T-&f)&d0C}+6=^Hw;FCHI1=pHVd?t1y*diKjl zQFQzXg`El~w{p273u9hiSTecoR-RBO6n?y5#j0BW*ke{M9T+%vU~GT?Vg0ig9@M|= z?q&V!TLXXGzc4U=-R`SaKel1*qOTsa^7m`kty?#5>VmcFk39B=1I_31)m*NS&*gIY zK}V$>?%4Im9P{emuV24Me*T|Y1D~Co)4SQ3XtzRi?akZGoBhJ^g=l=V-*>-Xqn6sJ zLiC%SYwj;(3b|-Mc z^7-}o{(ODqhJl4sYrEHWuM|GIV*ZNx{j=syTs?91z{-iE2O9lr`K_BhZ}z-}Qzu3T zMT)N?qp! zatI5ryF zAN4OitipI(-32IkC}T&pf! zQCSs5BrRQ9tB+ku6}5w^14GOZRcN)9zAAE zRKi(QnJsUPoU<*TmGF5BKKM)gIdcYc7o%vJU@&D1Pg`uSqw>hNH0XD>97Qv6YHjxH zW>XMa79z>1Q@&%9K(0yQbsBcoHD}H=a_aYg)b;!LYK>l|}C4AwLBNs~Mh z49yv0TGXK~ya{1g?x9PbE}d3+Cq9r|f+x0uCag@>F~|aVRks7zrM*&D^Me)K1$dnJg2di8JOlm7(pL`QzaL zX>`T>$k<=Ba>KF5%(V(4-mctGhLa18jMJy6A}+7R7pI4nt)-EP6rUKe;wc)zJ%bxR zK0GPxz=O=X&KErIl*Z>q8Gh#G(t_9=ZqDQ=8t=2rhW|&=JYa$zqByqTr2z}t-sIBE zKL5s&b_y=Chmm}}9O<1;e+6>1`}oQ~yhN3mxwGb$4G%Q=V*j`)@@C}ZN71!#mWfMO z_e68ICnkjPZnT~Q0+2NLW^O&?k(i27yqySUvi@_TIRglrs9u;`pIaxPQ5V*HcHYF* z{k!W0c+vxVfXyJt9?)+a3Pr1;arn4$M@yEl8E?h>RqOPt?cTpC{Jhx5kB)iF3w{ZI zFaD1`M!$iT{x|kU{Q~<6Z11pjhne=`HJF7{{qLX!{@2dEcG>!6>!lwoJ9gQz{SQdP zSwFCL!4VJ4PvveDtyobtH{M)|nq8yWA$1`c^$%C2j$E!Ub!bTArlxL?U5J`?*kRqe zzP_nbL+Q|Bh=*{~()MPBT*w3QpcpJA>bo@HX()7}zdxEQys@fOW`@v9Xi*Yr4sq=n z7?K(yhdm#jEJV49rbpA~im{C!Z`^SG5o)_BdJk*~ttF<~nZ^QU4puP5aCtC3#zjKWfar~}QDts)%*6KS+Uf{o)E9D(D6$5nfJBtnJk*Z>LH00W z(~1^&VzE7^Gr8ggSBbCLSIGtR1rrr;u8_?X`H`PESt^6WSU=U+zCrVXx# z%5|a|75ENB(at;4FF8;`LTH;lZASp&<09YiSdujveND2CP4ioJw0Xuku5;;?(so*; z;r2&H2O(ECY6$fL4C)xl)txicFlSCc!@-h=l`9*v4-R3)4Py+jii z!S;iY4tafOstau16z_PfBu%vAS%|5o)V?oiROlC_k+_E$_yK-$x7E7 zahJB6GiQ6xT8xa<5m=aVKodLKB3sr`^qL%PNomNvprmTMzlkq@f~cEC*)Ow&tbkWcj$7n9aWCriD|ZIN6X?p z%FGGrNn7G&y5)=l=i#s^amTz=_F0?pIDzrB8 zSG`O4CG*R!%-@)(xC(yN{FQaZfxs$H_?s9pJe`IH-YDE+(i5-_;?HnX@i}G0-@$Fy`lFlarsL0YGw^4-?eXWh9a?{IJGz z-rO8~?(5?(F#lCA+`;%qyF>8TyVv0#ga4E})*Xt! z!5xl2;EupQ4*yAaygL&A1owLUH<M?ztR||0cH{|0MHIcE_|Hcc-{x@lSOd z@ZanP@ZaK&YdyxDnB(zJH~$QG0?%iebk+ee}Q`+{)Og$%$>vYMehCl zHO+r?AHcuZos0i*_d&{j!kx$4OU%F2eTe6Oa(|EiN%vv${ImI&x$}Acl=}z#%kh8a zKJ7k={~31y{=c{j@vp%Dsry&=G5jmtMfjg}7vo=r{}cB)_i_BI-6!y`ahH((dGo*E z{)vuxaro9?qbf6HBk|L^W|t$W;mnE!2e4bL~a&*Oi`eW7)?`>y%lb6@27Ki!w{ zzmI>H`+@rk{tw-?`2Xdu!@tS=AGzyWcexZB(f__v#X zhx;bace-!2Zg+RN|G>Z7{CnKDdA`@($X6Wqx$ofLZ~jl*_jvxP`%k`n|C#weci-pv z0rvy^2i*@_x42)p|H6OB-Gu+J`w{*l?&j8y-J|9|=6=lcM!T-JcY3nBUockI6 zAI$%w`#H~lau2rt%l+B?0{?mQUvLlc{Gxlf^+S$7<-hD6#oy>2!*99ATR-?8p8o$i zPyeOy^j{iJf5v$FGse@OF`oX6@${#Sr$22x{b}RrPa98v+IafY#?zlRp8m8GPk+jI z`cuZ!pE91#?K61#lg87ZG@kyX@$@H+r$1pl{R!jgPdM@PCyb{*VLbhDS`lH6vA2FW(i1GACjHf?hJpEzg=?@!E zf7p2X!%jT?A>-)}8Bc%6c=|(5JpC8O(|=(+{TIg5f8oT_e_=fRLF4HU8c%=l{~}NS zM9R~D;{F<*e!ubb`;DjH@5IyZH=cgK@$~zhc>4Xu)9*8$exLF5`311Vzsq>~oyODeG@gE^ z6HmX>c={d2)9)~zeuooJzted79mdn|FrI#g6HmXxc>3+e({Fd;>9-qCzukEHZN}4Y zGoF5%@$}n_r{8Kk{Z=QQeyj2HTaBmR>crD;F`j;l@$_4ar~lZAr{8Qm{bu9oHycmC z*@>s$Y&`vD{u#+!jvxR)AP#}`vmw~LxW)nFc z$Q~C}BAX?~?VBXYBwXI1c%fjKycgqqBNnGwN>gQp9#E@Z5iP1S#1h_{qv=AakSnYH z9Q9^$>M^;Jvig*#)vRs`6$){dj^W|*{2y}pgu6jjEnTF_LM~5(B4j_%q;BWrbQy-KB$FUxWNsa#=Hc2h|+94Ezu zVKBYcpmiyIQkQH{8d%I=@_3=AgZ(TdCVyLZQgq7Gfrhbs@^~ zrb|QyMwnx5G|ZSsh0Jxnp!Fi3CN7&TSrIBAsbuS`rLk2eMyU5-n=P@LVM@KVF!i&T4P8v0EM~(b;UBs5bzwOjFFb&D>_a*eFy~+V$(C4?TOz2xQR} zQnpAB{4ae+37*=usu!?3FbN6_#Kk<3Bd2xIEXr~JGpj#|p{4W7r-==VHeA?Vq^<`o z&QPZ%?sQ?fyO!J*nw8dScY^A#R!b$rQn8X00_Jvx!j7R3Fs>b{Z=Jo-vqvF?AQ`BL z(x@Zl&h3sZu%cZ#s0z~!ZmoCPheHH*qx|i{GK96gBYR~C-&U8 zkaGbAXh^NlCvhP0Gk!)=j7Afn6bhybDJEpYRk9>T>LdZ-trUiai_|94C2s~7C$SMK za?6N5t%`AlC-Sr-lGmxDH@K1f&AszwUV$98 z#sH*afG0%MrNA88Po#sUAS&8YsR+Xm{%?gF6!e2^$oECQ`WM>r;@`(00sBGb{04KR zZ$(p3iq~MI>F9@S_rEr~BNy|f8Pm_VN{cqB!V6KL$h%nd7%b6VD)~2(L8il$ji&Kn z2pZCh7RUD|UV=<{v+J>l?0%BD>!&=mil1Y%Bq*PHmjDeVB zymTqkQA}A*`Ju!N4x*h6W+Ii_fkH*~ z%LbRS8KfX6qM_TUG->*QUQ7iNzz;Si-J_6(uQ?Jk<1uwA-|l-z?0A>vwBc%D)Lh%y zdJHBB?bCN^(r0B>=%+>fJKF+yQN^A^>ZqkFcT%wVr7$IYJJd*j8IJX!%Y(sa^C<19 z(=~hbe=~u&sZ+0fx1~>c%|hCRSNB7&l}li%ElZ<~2A{a#lryL{ouxAp+Tv||DN=?# zON%HK%CJm{Yk0q=UOO=6jit-S)mo$0Cqy%Blb5=*_u3?TUX)KO194zlo~bBgxOB2m zq>3nmdf=x{#AhV*--MYL`g{{%`3Ve z?c_^U31IeVEII_7t4LBIsjK+X2ca6FAf#0(6jEsemn>Hbm3ogn7N!)FHCHItLF4VGJ*UG47yl^0P`RmB3LV}WSBY>AY;{BN{2nELZ7?} zAlAdEZTZbZ6f^(Kq}fl{U9sUNx8_nBoah-N4)kyO6l<7gQS_7cCHCpJp;|PJTO*|_ z5FY)gs82@t*6P-Junn;etV)G^rOJRoDO*+SN$h!8I(nqec@@w4XM16ZQ2i1ihS1XM z%f6q!*G05x5UPm!i#@K)d|4b5hWHV0hO?U{rzv8{ZF>?j1%9OV*g&UN0-HA4Rj9SIKA?$9 z8<*8UVE89bmWlvJ5TIIB4M%5|WYSRz*^dL5hv-pUe-pmVO*9a~Hrvc4< z1A{&@J{TG43DG`B$CU&3Hd3TP^{9JD8u%CaXJ{9QM96S7Ip(Y{#3aVO<2^JdIm$3pGlk_OwHb_}%o!tv z>58nST`9jW?TIt3iWlA`mdmP9Lb`Ql`ux*KzUFtNcdu9-Ba!VZkj_wm|qQU{3;jglZIrxXFPC zG;xdEG7C#K@BmuXk&&=Q_9XdQK#v*fQp!$H22tTKW=LB?qHnc5$uk(3OuJ5DcKavg z#IR6)z*%yn_M{5J8`0a&;h(hXsqF|E7=9sTFt=En@2&c)7&9V~WO4?ahC7SAOKh#> zylqG6a;1{#FcnV*;uz?mxWTs^5T#C8{aYDz*frspe5lBCoKR}8#dgWGl}$@q4wE)U zB54#$I#J&zA&+5@uZ&$rS^Ea7N_IGMn$9BpsI=`#=nFDMTBY)g1Yutt=nUQZ9;3f7 z!{U@;S7Ju?k2x@64++ejq%gZnF%RPoup1G*^)#D7W0B)Q78yOE3g`hSHn%4&Sb9vG?3i)O|$r#={6F* z^ocfH_Mdt=m`@mN?fN7kL|Ph#Wj$l+)xO6P->wZ@qKZxl37IV%`AQH5PK4KX4#WU90RIeNJ<)}<`I*0&LP~I6%z|0D_kM2 zR2tAFTeWhwOoA+NAfVZk*aD_CwUNW0aSw^=YDk=sNsVd> z7{x1^72{vbZ&}wB$~7wE9t2Vd>0iiKK}68ATw{q@0h)%C!5KdG(w^2FjJ#4URvUft z$WYetA6BHgJlT_K#hO;GW;Rqq3lU&z-ZKWRm}Bq+HAmzprohnP209g$Est@DgxT;T zno$&}2~9MoeZE#l>`6ar#(cnNG)=Oek_8&c)|6YuCbK80pv1bkjd(dVYgp>Ax-4=B zwIK}6e%Q?DtuSp6``Y4T5Zl<1y6X56vmicJF0tTZZp7LSR>#P6g~rxv(4NHF6snL8 z6RQ&eO@j){oVk|{2IlW7LSkVXu)TFvX1uc~4*#rT%D#+PzsANfNi)f%H>GO@o>Q=C9es0#il z-KJFxPd{}+0#rYVIA+`TlVaA-5Mx<1CS#J25kDzM*k*B>5#}&~LSq)S)1E|Mz%pH! z!2*YpPW`kY496i4ctG=JnwV3ztB@_TNVLM*7L0xs6+eZGpvhDv6G21CAAHR{l`6*c zgA5WNycPv&>UmkM3@S~+Qg{&DkHwY_K~D99*3}<5TTcvdK7sC=ChId>-ZUqpC%08C zh7r^#ryiv)OP_QkO@MRe<7vu7L5eFU#^_3d!5ePI3JrBeRzs5%%Zopc=){m^QKP%? zBs;@VdyrX5$!Y&A(AsI-y4EI;)j*(;%Q1HM zB){4(By29lr9IVYqXoKB8_Q%X#EkMcT>a%atsPFwA|4Rf@1|krLUulDQHMI!)#<`= z4_$J<(5$ppyA!m&^*TE?kEMts*a;9Yw=)!WYzpdLV9zFCJA0#Nk3tHCXxbVEnyT}E zV#viDlu6?beO7NJs!RyS>mMm|vHNZmkT1XR6MOd6G=2x~w>ls0L|l7#6mebS!9qz8E_C2d!R>^L_wIiMO%2>4vkW zI(FHUI`SyDobXz|P?zxA{|4(*yV4J2E#p}lj%hzaaqj{%H^f7-Xqyn;mCODw6?qmY zCMd?h1e()X2WM`nQ`VpvshqFJ%O!@3MjL7kErxh#Wz*7WGZZj7Nu%t_i26QBUW!;! z2d}E=rB#K&T?M7a6l?I7DpyQ!B3ft^mD(z8dyrknB9aGOGTvhdYS?5rsit6DQhpho zkW>5#bzB-bb0pgn6iiH-sCXhy_9SsfSOL8yut#}2G=gnD@NOo6?=K zu(7r5Z8Fr}RH&y(l@odSCn2f&1`j|9pe8zFxoC#V*krPe6W6n3Pa=^X3VmS}iil$| z03|aPm@oH#HSlg%sL~fSY3tpf*EdGr$AGx06KeQA+9*u3kapo$PdbJ&$`^R0hBIpp z4(yNW+Vz@%hF&l6r7;v5XU#RWRl|}5hEz(hd-@ITsZ|&}iOd^ISBUG)-safQ&yhqnK>$ylB8WMVjfK zo%SU4yu&H#?MX7J$qHWKnuU0%>~i3%CK?k_1DfTuK=+T>is$QaKsw63BkZr*nbS*{ zCo@z-_z2N4nqW`DWYjZS9=W*FM17@dL!L|y^)hAbU4UVO$Vy|PPEUi{G zdna2}A&)**;zo+>mMl1nE^`8#SrT=5L|wu$2cS8hSm{|RiHH@Z1n-32JVVesoaWs> znJEV@wl$7~=2S#YL#v*;ug zIfdYiyCOVQJC=p@gwJSeNs8GI8H*N0=EbZxD3+3vcoD0rIO*(jIHS~7gF^LsUO)OI z`=-XX^$u;SSeIkr>YSXT^HL=`hO+-zqa~@mtgwo58GaLKqLpCz|ev;Mt8Di9z zX9#@$!T;J<){lbBllliMNXn%Ob`k8$Vv1!Ztcq?WeyBj_udJtr2?mM@Y7xOetua|( zm*7^_iV)!k1E3~WO;O#8DAnubYO#d<)oL-eN&mfL70J)^+dWvY7)%gq&`?sZb)NbJ zdyJ~LcKNoh{5wKD{(TFfHsef6DJa0z|Vku(9W zeOZ(Fz`-?f$_jB}>lLtJP-2HO>gtH6kDQZl#(|5VCQkF9gH=rioR-SfD$KFN(Rmw@ zPI?86Mzt!?$mJyA1+aQJg23|t&kIzmxQ3QYYPA0`SdCU*`k-<6=gstcq*tD}hJBl< zPcFk%yO|I(-kr2*yp8Aq#X~rRn?fz3j_@uG*-oZE=*M$*`61WP{A#+G)15D)H%jsZ zSZ-!eyAe5kg=rsSYVB~$D-#QHMGqaiMNZIsPkrIvND z^b`ftP;uRQL>{=&gLsDAxZ)>hdRqDFx9$;B8mjiei31P&04)$z;489 zInVymg@d_dd0WcY(q$Lg1XK~1*Yb+fbEt!^NX2ksUyDZ*8u2Y@KD{(jk_{%S3D9ff zjJA~UBPbO)N-`+aUQCmWI#Gg;RJpue(v=NZbK9O|rTx^~p3LveEHx*4lHZRguI9b- zn~9Npm(W9k8$8tFvmfGQR5r*SP^69^ucOEI zaHUP_>Z214Q>~6=Rd(jW!{| zD=lDPA6S{}S(zw}8MlbGRO6x?|1r~6IWOpgfcLcxvNe5Q7uxdTKg|)Nsqm{ZH;CSj zJbG4n;kDOb=&$`C8~Y8-E&af^ZW<1vmWgc39q7!QX8}6DsBz27yK2>Rn7SteNoesN zFNMMIN}Xj0xUa1KEjm4Kd_9s+UfV=^r7pA>;-QsIOIr?;HAW$66xD>N?~~-Eh$VGs zIyK$2vZ|_BpV|MjU8$6tTwcW3sP!`H(;2YrLEcG;M4j&ZmW1AdOJI;~U`)B8d6yhcv4UKqY!3<(4`%olqUPJf0wQG<$F2jYh#lQ2w4uJ zk}<5LH#8zSROu&CNAHHPWz<6?Tq3=1-5Tecv(B;HU^E_FIpEnXwP#MrBavq zp$J}~T(ar$FZH=kI~(c}B#+Vv6VWv@4Q}wmBLrE%KVAe(jEhw%A==a+pxN|D?0`Mm zk86%gpc2%S4n(EY_Ye=`gMpdKo6?=KaGlXm5X?w(dCb$O&54@RH?p0h+QS7|D7cq~ zs9cm};5?Wyt^GX$=?FFbt-zHN|4BTrJr(C#Rf2wdpLa%^z&Ml<(u1jlV4dv*UQ7jzXc0 zOdeww%c?Cc^Om9FxTkk???m-MPDX>^(%yr11#Ohr=V;?ZWeg6cr8v7FF77~Lbdp0e zebCM5t949~pH0qoP+jh7pZM!k;)h}Yq*J1DAa_|d|p+ePA?kR36f?ys1t8XUHYj+XH;AHY+S8i;Hef$-0Ptv zQ>OWp?#G>rQmqG?EtjD28uvd+g(e&jeuJHe3ry&PPz{P+mNSnAmIMFB)T&`JamK)rw($8xXyiJPPDmJEGaF6ArN;bAnyGb`1kiRL6T7JU}Fas5k&G-AImN^#fQlcXqVnI#aUCWxhi zX|^!*ViS8(4)Z80A#IGJm;g;jlRb&ffV|$G)X3{cpCr@0<-z0dmVG)%-nT8vD3ySFQgaA!?aP{)GVxg@dih+f=L!Op zG9`96Ro^Z+m|kcMK5zO2F4{+(bdc|-5sA9>Dm_!aK&=MQ+7abuoBn)%vDnj7s|h4! z%!zXY)hgw*)yF;^q>kvHu^U%VJHlE0^apR~mb~=AhB4eoHtqeUDfDpDM4ys@)3CX- zY3lHp@s8LCkKHz+_V#IT@38zP9|ej*S5d5HW#EXp6Au|weave|FY*o=Cn!Il#; zV>LFlCrNJXNwB|QK;+1Qx8;1DgD)+%kR_msxV)utRxY;d?FeiUv3+_pf>$vq))G>D z1bdRSnXm;lv26Avh5=WBTbYy8Mp0L^3fXc(Ce7U2lVpEFs^LVu?cFR?>z(c&q@N)v zA>Bfd5oK*N{^s8KlCMAxzvh1vpP@2^HI@<$%r6|~AI_L~mbhW65i42l!9dZ)UfGhk zgVLD~U451qFS)p08KxT$C$s#l1^SnY0r9sHLqK2DS!NqO*`}}Tg9L~DK=%Fw$NK85=8dcP<-3Xlh}7j_Of->e!}Qex|)4-jy)+D$U4PT_cH_Ya)7>g%|om_ zKwIvlT9IUn_GAJtOSHNI$roRq6@ev^L-r*7!Bl3BI7*t5Wl-@vUFU~zN==21%w<55 zQzKUMo>bAHp#z1u@z8Bg5{nVXSG)Ga_?V7T4Zb9#0bBG}L{KP&Dd3CU z=RtPC12p+KVT`vYiC3GmWP8%PR2bNBb)P|H+WBmUJebr$TDI+_H{iR3v2})$S`UyD zU-l$cn~7ywaT*8nWO9T4(nIB?$6Wl$({JsvH*rO6a$v+^G173{L^oNJ84ygGf*NOT z(5Jj+A??Cj0M%=~Q!as&8tD%8O08tqoXnmSRGZGyx-Np+SI&>(0G8beD}~*!!DsQZ zCt(87)N4y?_9X5@_x6qHn=C{Vwgs%ybJ}sNDeTm=FDU8UfXWaOs3V{RfBUG+#U1UH zG0JdlMc=F4w*^_cf zIooKAf-Vyncv5GrB_?T^jV9v~aObneT_5K~L!-f+8;rCp*VfsSs^td8q%ubFhGwP6 zL~DNQx~@>~g=RSe;5-5=OS#ws-op**y&xi!k3Ik?gEN&%6H9^$vaw7`^=73xdV)Nx zBsJ_w5PG9ep6p3Il^(5J528TM&m#I6)25qFYQSjJzox7$4ObjsJ7R1)*5{!-XiuVM zh~Ai3uD9HS#j4KT3XZvq!=N(gFB+j&@ChDu(MR+PSTuN2H~p7|!89nGK`-U2eNKBA zmzY|KThqFMWV;a>zzV~5-Lw=K6g6Y6;4d~|+vLxPqL3hun3Y=6OPf+W#UHI_G%5kB zTPV7V!jy=|2qz$6&8p4^O z5t$`|lfdWitWg1an>sA!#FaVOtq~F4cB56$dzOpU(DD@Z=e9vr@+qz}JdIl{73P~X znnnGJO_@&pMR4Er*7+q^N3%)6W)Bu&IuECS$HknXLwq!CowF_(u2`3B-h|nCq#zb! z-%s^a{q$KXuuZT@_2E+cGHgL>*$JMeI}@_cft-OukgXKhwK3(X6y&veuck z(9r;K$skcFF4t@fDotX8W={g$K`&`DG7r%yQI_GGkOK2(l>~@Oi(s`_X62=TWrXTf zQZ<54`LG$Z>=WK$mPU{1PleL6-d+20gn&$2{)JeShPWV zlK$Wg{ganI*f540$!3Ppe&va)9qoL`G^gq!fK5|}$BcKxMtJlV-*oHdw^rWw^fBm* zHnayE_6HqlbLoF3CBaS0-=;9NZ|qK7TH*{opfR7fOWf(gat~c{ztF6-R=X2~34MLs002vc0RaN$c80=^O+hrFbafSa z+0=Oy5-JI4wZ#lH)$9M5f!$Bi_AK;Sz2(wQYEP;)68;9H^udmw;t&~Jh#fvVcxl*( zy{xYM7O)4PA?Ta|?yQY6>KY26C=$R7Pt{}kFwGZxo4PP48L*SQa-(gfwCS868Yjm`&t)mt&U{+g6 zBol@weY{?%SJ|$h>}}onshO7bvpUTmWM~{)bfg>3`W&gX2(vN2cAk{+sl4!7KYAN} z`ojzS+PRGuq#r0nqt_4B0io=1iy2C-JDv&nyF%ezy>2=TI-7UW66E}Ql)0vCM&2o_ ze=DO7yCxiy4+e~E5`=wqtS86=E`dSPUr=#8Kd>+VA$}ni_`>K!>f%p4dwUYh zBjpbKbqncnwk^So1RIe3h!5h7GqGRMA7;YklE&!#=uUf*4G7K2R9<;>j7B7is-vWo za_4~WFCxe08Qx^}Bs6U6zLv=IJzto{wI~!+j zsN5VvmYOwgzw<4eCM&##!ONZ`?Uxr!oS_Q0CS`AEN%7E098miM0G+GS; zr#@?SB^SK&>4;2Ic}@3CzxrgiqwItE)ET1ypCpwmEzOS3dWJQ6J=tI{l;fv27xe&_1-!k(tBf4Z9vpQaBl@F@5ksT}_`s=>sy% zhRhuF0*Awn;GI5G(ngsL2d{t%S2egA)YH?`98Cjo7w?#4{)rlGqBNDMcCU#NorS@& zHaMG$;XRO-jTCGkB{}t^1P6*;vC1)^+F)$jP-q_c+hPUB#Eos59As}NJSu0K%`vhk z!N7A|>(J4w(2b2IwedX~SAYiaVL$is|gcU#!ZQGM5mD++0A=0R>hGb*x{Y^HM z8=Emh_t5`cwP^}M~IHmBv)== zG8!{c9`>ZVc6y9=lsq_4wYSnMn^iA6V>!*Coc?YDhwj30Bq$u+zZUK2?g%_cm+_2u zHJfm!GT))`&8v`vU5?h9GWlE|75C6xzX|v1WCe>v4T=~A9DSI_Utx;g`gz zTbPO^RSXt=TDx8&ZM7^rnXXE3pQ>|1BlDOrtrPn;L9;?nkL#UL*Df1MZq&g~tox=1 zYdCWHQ#s{AQ>%(1zzt9gh#daa(9~?%^e5eQ4_!()9fN$b^aOQSH-_oF4$`D>bJI9I zaWZzN)loLjGFdbXf#MW>d=!X*R4=&r(!ltWLltBWsUM3+Z?#(EyMKpdY!vYjg9sh{ep`l*2rBS&S1bd*F+WvrNtwW{fQA?$tIe(VcuCC$O27716 zv0Up^Oac_*?BSDJfV*UAo)8#yg~(u75`P}ifv*047LdY#Oo5o`2zsV`fm#iqwbQtD ztxYg$6o&+%024F5Btgu26z_BkFI{wLD#Ck66TVnHwn8N*M# z_+PZWS#u;ulII!H#RL$i-}eZ*wy>y;V)<&i2IxaSrV{K6pHnevx%s<+u7I(NwHcr%rq8*LUJ? zf7Piki@Nx-`0jq$<*uXYY4!HyDrm@aWI3Qz5a3r2xtG6!j+d)tiU#KNtE!s8MqhVX z90=))(Z(U8;qiOwzASV9d@D`~PbSH>FY@SRL6g7a3z(}4tQe+uV zVzuFvCpbJu1DXJ#>A!H2X4qnO)1ZaDf(zk##pqHraGw(y^IfheOCUiqDmtLoyFx=! zzPA0=Id{(=aK)+f{~kYlD&}KoKBR~FUFbMs975blL{*?ZPz@v@dE3u9k}rsJgFQjB zxGZAyJD9KKf0Gf=R0I=Fdwr7hMsze?3R1u@mJ%wdPFF|-PU^EOZ~$Xp0KfsgP7sCB z59FW@6lyT&F)}SAfrk^0xsouVRU80$mmUn?Xd2$iD|iEJs9!ufgBM{M7(+(3RTc%e zr);QNLI`;%Uk6(pyz*@tMuKbOV4k0*fy3gjcE654(Esi_$@Oy2am7cQx#2HOkQu@3 zWEdI`lel3ZDMd6GZq`Z=B+13KTq-s}MQ0G46r4yWI*dbWpNfB@-}i5E_g>y@SJ+`2 zBDRYx6p8tBbrQW41f7ahTsmp@gh3cE=Mzj%u*z^?!+A};M0GHdVp4og{p2*es4*@& z5!5IFMqhwRiXLR3!#wagU~WOC(g5&vIv^$pc3d2}_hn-IB40AL8Oy3EsUe;6Lmf{9 z)UfWLEM$4(FtK3~KUGBaZz`|cXopp;T+>a zG;l_Uh_RTlCbNJXRC)*cBncF1N3se`Czw~7gfTLOrh*TzvE3(0g;&lM2>dFhn@{OB z5H$Ig7`VZeBU4G$B_e>#F-LDsWHIIO z>Te;k>wKB5QZ!0hU~3)AaJ|6IBbb-?z~IZlBSUBjk(hvzV~T~4^kfthF^q?7Vp6V5 z7r28dq779v08LaN6Ih95aL?r!x+cC0qn6T$;-rns*nA#c<+>UG2U`Max=~KQcxj?d zx6~mBK7iLjtN-p@t9AgD@lbi9t&BFXQKF8TAfG z!53N&jU$*Mzq(!|JfDul@g-s+w`)|BqV8xr=JO1&A#Nd)k_|*1DAb=JhxdP`(QGU0R(yD|wcJ z9aKwLp}!YwR8Q4Z_0)e_Xh6+INbk(A6531q^ekTHA@O-v*Q+2x{TrI*Z4uyR3Hxhp zj!#2qnW*GV2yUkf^||0e5DLct)ezFa>*E;A8AuzyS|&oCjCdZgS_C99S!EgXGp^O>44Z~um~QDrdt;GYHSU_%6rfQ+QP@`YqdH3qwjG4f4$mYJwpw@cJ5Ev zJ%ZcI4(3&~xV79jH$d~-ixY{?Ta6Dt4Bq;6mI7_%gb?u5m)ENn7(T%9P7q~iK^^#C zC;;C6*$i_IdMA080&4R)58j5LUD2&Caw zR4rF+nP$nNz%OMrojCO8@gsH|&IYp-zexd-0LFugu)IJ883R%+a?FEuNid(BKu9lf zZ$gH|H5f#|2YH>(0*KcUk#SeVNg(fG&O-wxiUImjfgVCDxfQQghV2YynC~Rm0)_-J zQeKo4I3kM4WKJ@(qs&msM;foAeZAflc^pvruWY|{&fW6|T;cls@3Mt}!$&~#AuR+^ ziwF}HKt3c9ZXJUmqIWSfFEMLY(j~!^pjiy6l)(69Fvrn-Q4j@LMH5c@2_~gCk}*VL zWVDEvdF0?ik#aH16*xfSp6)|V)awLM0EO&FvS@R{P8u2kk<3v^%pwJ^&yp~WfV@kI z^BZl$lO03&TG=gr#PK4c^DG9l_Me+vc5xMlTHIN-r&>urCAfARjMEbtCu396`m6Zm zS>g{2-C5&e?onetbAV2R6yb-h;&eL(YHZ@zco^a{T!A86ap$8b%aX(+GF|F8d_6JC zBsjS-r7X>|%@+)1e{KylXj2VEyO+wYaJA* z6Ej>)C>pekQJj43q1uRvL>Y8x`v-6&TJQz%FP2hN+$<2tr@-?7Gms3ZuMUU_!nnmB zG+wqyGZ7WX*=-IIqsRM&tn28Fa~2icp>5<6wjaJGJ;P{3kq42MEEt@_8|nIkAGKPeRn7 zDm0WiYo5AUA7bqX_k{DkK?0l8Suu=Ow6A|q5y8EpHicIZ@&~d{Ouo>;sZ}NujKxqI zEcM1xV8Dg`xRY?KWSn^}8brYa5Q@k<10hvo`IAbqBLV&%i=Pj0mw{OGIDLvJwvR_Jn(737^uj%p))qgK_*X{p3dInF}dg>$A+t^HNHQcR7+E|Ax9u%_0Pp0&BWTkaxY>(#Wu z%!YK5!bPNE21Bu;pJp*{MVHL?F`)usjLWO48JZ(Q$y}3O>63s(C=%QUa=|i45KeIg zU!a=C7n2h6OO!7Gb&vwZXyV$1JWSQ63XVgM;EKYOuJ9Z{;Gol4G34K*X_!-5jU9(c zT$_vGfhagWVgy^W_BD2s9uYG+gc(rp;M*ins2#~F zFq#0q^{A1va0jC`b^(@%4E(aijt5lyHT*Yho#- z>3#0H)F+*GnLvuRjiXh*jOVLlo@B6O5O~@dC$t2O-zupXv!MjmWTk1W3g8|bl2j&` z9WQ`{UqN;-sdr~afOX#|kE9i?9J_tB-K+a8}6h|kLuV)i>Lx-~aN+F1{u_&nrH7Nz^-YHvn?{^eF zcU7v;_Z60N{CV(~jH6}nPBIUY2X!*3*PzAfXN)m!Z?;UY5JdtuzNV_DYN>^8SzJf+ z9I5QOh_o>2BRwmdpc*BL67(YRHN6t7B6h*9%HRv5#|7A5Nv|Y%4$@@Ko1nCL5DF;J zT(1<@I?b{;gB!3UIo> zpQ_KE$AQP${NCVc%2Wop+^I}#%Z5?M_gr0RUk+Ie&U|Vs2523;C^ot-_D}yV%Gbxv zM{aK70QWjjeTV!1T+QG8A2s~iwSOuK;!hqa>CHhI8~#=4~o+-p094v&~TVt+tXR}{S5TyMejFs#}V#wXh8pK^Z}_S zD+b102qb`{u5;a|hV`BH*01lx-~OsoUlw)oW%1qpvddjZ)6?qh%T=Jzws|f{6$JRz zL+<4-tSo%vc@>lZa1{NjszzYNjb0W9Li%E~afDoAp*eM2Q@elO!Pv;}%-319Mae?% zs3iH-1iXC$!P77M3uJOU(!)6>B~XqCM|=e`zFwp>KSYQDk9u13AjDCEG66%NxL+AT zu5Q+CQD)1gOn{JyLx0w7bRx-dI2+9ibt$I>HXc-j4{#3NTY<{f@m>u001Y; z(6=|C_(q+;D_ML1w;DkG6@+k2R(KZl7vjTsXx0hkZl!3S8l8$f4&+bw_V(?gmskG*SDZTk@A1RuL+7&y ziG;3!>r!Z1O8gq?M6AJd4O-1Pc`va(&6h2GP=wK{O7p187gN~#1%}C0jRQ)TOgQb+ zqeyRr0+^lxDIjE2iIH0@XCVSmw!9Iv84kdNlEM1Wc{!{fTO9ErYCxk3W}X#>152!&PKEKT%QqM%$@hiTA)a4_iDL$$FXh>rLIzTwt@CE*_!a6|!Mkk?1B zCk$~oC(ucRaK4n&B9gjXnfNnD6i}8-#AKQjbLuo-6DW^UNDNQC&DZ@h58zd-MCh5eKA|qmn{f9}2T@Q#v9z)aR?w9i0R3_N!yw2k- za^;VCa;0`~oQF`kU!UpDi7OIq5x3zv4o64C>Wjv>`$2f1ORms-JM)<75XD#FN_efq z%IHYD@;UH)lCD69as`m0#$KPnEcYZ@m8p_q>Eq6hB0@1d zU*rOz!N>;xUjvbIAq#j@-L)W{DG@9ArUQs&fwxGWddl`q(>FNx(%~!k(oi(ZiSzeG400a)p z$`eszU2hdu9biURAYWy-d84dKZ~~mP)$Y7G+)p0WgdV`eDM&jCM-NBkI16zXP6Mb~ z>zuCAYD^9ApT}9Sv!2kEp0&BW8yB^vAP3`41^d#2>^TG2j!EQc z7d7@w5)i5u*Y=2{%j<*=U(gv-R?Pd;JdeSW)gZ3jVNx0D=@!!=Swqq2p1aqW(m3-U zD9qI_s7+y%SyTu!@k4Y~R*O~NY3 z7Gb`~OGYC!mi9zCmd{0)cZ}JX$u6T@@o>uq+aJ1zyoD=(PQed|a$V#7TA@jBatO-0 zqKc~VR+}J7nvryS<11?FLs0r!I2FX~(v$-iibww|rLdF+a3VACs-m7aA;0!z% zHYrOGcZmNC4JKg#^AzJw_spg(53VD0SuD>4ei~e-sQUX<7U%@xok?W|J5eYOObfNp zXkbp-0yjpnq9|7&uZXD3Mn;Zr@D^hguPsbwASYu*gv${A02b0dfb?^a2&S-QcGEJQ z-5dayUzuvAOVSiPrO-U7hw&XYvIUr`bEHE-|0Si3w^bWVYKWa=OJQ~!cbA(*RZW^N z8462Wpq6=ti`$a9<*tcy_C=l&!J@*wEs5x;8;oz*zG;O3XXh$ONKya}RK`qv(WJv% z-k5xg^dQVg+q^@KOQSh7CcLI1X!5V%m(~L^@N20d@Fnab9T_f@oS6Wp@%>qlu;+_vKwb#m3lX4mTP8-0_jsp_f!w9qX}Xm*KI zc2m(w+NWnj*#uE7qi@LPNzSAp()}biNeXtQPxTFH%2UvDigv7UlHwN}58jJnj$u?u z!pCgJn2=RHh4@s_AL*-j82+X!`WcVK1ptk> zB^s1MD>ylA>X$q?3UaWYbi@p2I8OkFN=cKbK_}-@km)RQ{Gymd!02?bu9d4GTdva; z_GmG6&*R_%0H=I|0j}C8MGSU@QI`Ts0vPNX`i#7que3%XNormc8(1%n*v_hXee8T> zI!z;E735D8$$N|utKq1vR=w4);tWIw@_e<@+V@4FRbQ@x4FMs1HP13B(w#D0dL?O| zrAL+VOO#9R5zK1gWA(M#oc_^wxc|@9{N4Xi!>?WYr{+tt$}Y`%)?zfg{eE);tNHfg z#>aW9(cy=|TfbT0my>1*r}xY2REuz4CJF*M9bd+)7;M2Fkb1IWz>Gs60VK~K0bew% z@3gmmeJB3**Vw%m8+Gwz@!kEh%Uws))9UTZRgf?Y$Z|lb%qf2LkbC*-w2op_{p!)O zepOW?u=={o;y_4We2r3CBBmcxedqd7(HZhP^L18jUFtbu{=B-LOjjNR-7l{TSIFcc zDo!-E#PHzhn5NmaOf<_Jgbfj5z=NG{(1CLXWr8%wAP$`A>G<7HHD%B@8L%>O=#Or* zZVVPWn=EQ9TLL5jj0Y8Ad37~pnrJ7mzO)p&Bw0;72=EdiLKr&<6|hI5cV6d1%qgxH zxKhU$0<1{PM1Cj04KH{o2H4697!O*hn-_Ue;OU!zz(CE4+<@B4i;}|Nq$sB#MI56Q zWeHTS4T|=StI>6sKfbm7);V|QA8>{1^S{d$I*z;o&5vfz@!te0ARFgsIc?FAc z84lvk2rYn+pP-Pp8O+-IoUSOmDQO!RCeB?h(liLJ9S0*XBrX1)i!1pa#~@i2{sw2H#XRNVP2Ynrn3h^%Pa)>|6#ylEsjNq!Yw z5?xgqSXcZT{l0(8>$~j=-jXB^0fedXV4!V<;MF8OY#6O{i78~!= zkILYUdvMJs==uTd-*?1V(fajf+3H|+HBRA!OWb5Nsi(bWN(oxf6S9BwS(h4JeT1)4bh%U znj&t)a~!UB)x*wCA#wog47%hB#Dyus4({^2gox%F9Tr45oQ@#JKcHzyx@=)`7~v0f zpLGeQH~rdaQ;g|9vGzd>es;wHfdJDL?dv~8yEuj2XRdjM3APJFs}RRVBp1-Zb2pb5 z1DG!~MghhttP&Vg-O1}Db+gpFU1PZ?Y1rhXiXa?Ejpd)BkSGxVV4M?>2`$)u3q(x* z!y^|~4Pgf3F3>XrDans7&M==7kLikFN_EHndn%_B5O|%Fl8~ZHu939$iR|i9t}~Kh zUv2klIG^q&EJ3V2Bo~THAS9&nKyc^##YzlPZ7Bd@Dx4}gOb=JU85dS`17Le!|ku$}`bnzWR=Jk4eyZNj- zs5twV`~OsXzz#_bS7?N$GK=wp#UB+Fj3J_e-watf$nrE}rbZ@_59ms&PH-H;if?+{ zN`QCq5F8uAeCEKmMH4Txnkrxy(U?)jHz3jPr&)NHrl>*{LRxb~M{x=9G z2vVQ{*%(g+7b$cs?poQ4hB9B`H%D7sUje^#K zM4qfcTG6O+xn|6!31hrcJRI{yqiR`At2ILf>j3-!Lm7t>T&U9YBz7&QQQfBP{=GI) zoR&AMEaiJQ#Gy4{psY{(nC|S6j8)7azz50C{)%3p_R6jWKW0V7dvy(Nydp71CYuJt z6XQQa<_`4#SKtwZc_Fd+Y)FQ*OVDMp#Ktth$iiqAsQNdBMiJk)Dxf71{7r?BX$z!Q zFvFa*HO|rzYzUek$Sbq$kv$s88R+E&xIr`3h|FQaT^z#$Di?4@^HdB;N)%KOl+yvu zX+e$~`IQ;brA>rRiled(-|xp%o5!fVhC!m1wn0<%0gt5peU&EjiVWO zj`D>d(RV8iH;8sdl~sh>1WF#J0mM1YNX#(4ex%hQY(dyCT4e<~(Wy8zEJ^{4-m0S^ z>MZC)Q^0PSQr>WiD7`L?QECWxatSEY)ftMUFp^JtJ_BR{Jw-RJ@R~zK0|cT;O4MIT zoJWbmmvO4nNJod4#x-JJlA_j5L%JCzEooaueA3gl*!q_#=mZKWQIWn!F&7y9Szw<8 zibaD&;jk>vy7tU82}qqjNlIt|7Gk9c4)DgWh%!1&ydUR6SiP7J!nUCDKJ zr=EyDY2jtx=P50rvs3DHlk<<-C`Sx-CE>^TC4NPpSD?9hpcMo3=^Fo|$3Nfb5Avnm z`Ty7d0gLeh90Z$lb)7`AvFUv`rW3NU%Uktkt%7b18r<3ft?PAFY4x;6(H&Yb9iU;> zDzqd6kAC%3*oUPQudp4`39#_7s1p-$SJ`d_jpBm&#e~z# zQ#cDm8$v{oHX6hts^Y$oMkQVr@TnE9wKH%4Tv~?Te1eLK`CtT5BE{H`@JE3K3XSrb zH&aI7MTKipkr!#Stn;=2wOo2Ie4`N{^iCIKT!uqMXM`3q4a_qtGxG2D5Oi&+b1fc$ z`71?h1=o&)k>`~bhK()$YWHjWfl%PdjdOK_-BeaYD`GrV9P5_nHN~H+D&t`~Hw;9f zMT5O&s3^LwM#^xd>iga#E;eP^brLtE4b~vi6&RyV#lO+-`?tKl+pd7^fGt(A-8`=< z?YcUNUb1tlgY1>HPTHd?^6uu-8D_B}TQ^zU1=e92w9GDq&WQ_MIqB5Tfl%N!A}0`` zK?GQ;Ny-9)!#I-UsDU0TgfPWehS?d+C#f9u546{%AH@ocWd}?^aF^43k?s)=2l~Q9 z_5@an@^x^qcW#BF$v!_g7Z66ahaasVF# zy5tJx$(^opOC`sC6x`^rVw@dLmpKqL3&oH=Nf|WFXGC)~DB6#YMX_!cWA`D}evscV zdDfGk0n&K7_eWAra3t}eNWcoqdFKv!~|kqjMjcWN-}ZVEagiEWTv zwxYyuhfDL@s6)kY5%+h@fW?D&preY7B(KJYuQkDqQ=@FkMn_bIh_@Tx=o< zIrtG>9MZo}-%q}%eLO!T(4dY~OZ=4MEW}+n4WM`oozqoXjj6#)sLAU1L64c}N)LvY zcM~Fn#ehyc1VNvbX_G-B@{X|hgnn98kmw|=`91=a-yvk)Z1(s2FF+SS_l7R2{B>05{LDe_CBJ6K+5QTc1)P6zA z99&J4_e0+w#I1X5hv>wgABp1aJa?}#rE%szR*2`D`lK+LAV`4*H5o7YLpIylTYR0YuaVJa-OU$c;0q}^_fb1^j zn{>>FtckV2)=HiTQZy1JE>?RWS`NQiP{lH1WOy)~++<-3uHHa>4idjfe z`iu_HB`5*l(Z}FZ1z4d%DR3AaiX>G=g|XXtxFpR^i=$@;Gqlm+S*HWl&CK@25x zbJ-jIF=NiEL#i%PI%>Ymla>(6B8!u}=!zo25i4MdKXEWr3^mV`nn)iB&{BC4s!EZO z!IqewNr;UiVA5r3H2_fxcBCJC>Cg}HR4@>(FGU@b|E zk6j%;t}LPTC_?IGQI}IXHBE}Snlz)$^$lEr(;YNP{s93$Sl$rYLJ*38BEyvlU?s4i z1z(~}&hT^U!U7};R21wM6+7!S`Si1qw#8eRfLPJCRO$<8Y6iJN1%kCf!G8Gr0twVl zZo#&X~cjSXtS^l{M7ZLGIcvjEfm=lT}<)nPH?-8PL@PkZpYMPnK*t7?juo>n13 z#UY5}&{M_Ap!?%JD3xp}L7Y@eo6|q`8E<{b>)O9Q0-Ak&&>i`1{Z|CHS3(xSk=AnG z+yKpQFJ6H1zZxB0V|4npfKLT=XlOV~fwpc;VN>IJKX7v6xsxU64mpy0G`I{~7t%z* zywY+iIPXFr6^wZ*!fA}9Q>VT4>pStczv|SNMO}PZe0RU>a@W!Hw0iq;6*TPk$Z|lc zAi%F4axZ_K7n>9qZgpBnK+d$0s;VN9&2XVF^u>XYz8Ht+L?WgiQ#;GCDOX`QJi64^ zS+&J!2il@i_ful_JqVtD*$?sYfUctULxR`vE{f`A4i*b*n!lI69WRdgG@YhpQ6bOE z7edNvg*VS1_Winzck2pRnK<<4@gvD`I9mjL%n?otTs)`<%L@Qv5sD?aQHV1L;X>&m#}dg&UHv68?uz+<3$x+O2?&WcTH!&YuCv{`Y2qNmFPq#q zmh_yEY^4IExR6nk$(*I%jxx)g=GIZszFEoCQMj^vYx}Kp?#@5pif@kHf8R+MX5#9J zRm@@tviS-Yaf3Sv2A&A&gH<14ep(O)QLLf^eD9DK$=G!Hu@9GJT7-2{C)>7+kJW_J zE0;!Qf=Li=0G0w-ql%k!ti%ft8JA>X8@16~H~``b-rztQ32Hhln+3d(=%G#sI)GIp z%v_YmVO`Y)k#%KX0cV#U4Bu!32tCM#$~j=vt8H-vE8z4+k#zJ zCrM`P_(~K-+vV)rqnfI%O6;RqRu$X6NY|ltm&pC;Jp%c??jCb(hc z?x)(B1)XE7^FB0hkt=`9lPk4@<2*c<;W-V_o=ch{Zo_jNj*iGC?Udvq2k_gVOB8IH zZzsUV0YfJHL^|lO(rBO!;d5jTlu!Y+g)1UWfui2Xro&w_ieh@xFNKYI#@Y{_Db6Gk zSn+`A`(OL|pI{ESR~h|thDjmpJWU9c1ywKeGYi_{TslQ-0D9pRdD);p4hE)qacKoB zB(qG4WL=Ygm1(-vSnfhxz1aor^H~^7Eb$Ki5CH-HZ-5P?aYcRLeTf}I;&B{SGV_(_ zx)ncQMZ`m3Vp;5^v9)9qI%TtQNgJ!8OAu_8$yE9XyYA$`q(gS2MO3K?C`4+Z=2$_0 zVKe0+fEE;u3MxwcF_j|q23-ppCEyc5PxKmj6Qwyd#^VT~2UU_qde!JHgQzAI=o=+j zgA&T5{LQJ)KTm#D8+ib8prJj%vEwYnT{sP(cnqD>Ra%Xy0sgz9O+Q#u>q-xXmv<8) zBnOaebsvUfQRjUDi73}ZxRTmu9^gC`X0b$Cf==EcWKQ>YAMSot9aK(!j`qJbFJVp$ zgfhqfyGV=TaIG#Y=A>dq`nUqX0cc(mUaN1__6k#)R=_!? z3#Imp@@%^3`*Pfj<2^Pj1x8qr;EN=Dk_6Ptp1b#)z5iIL+ z`dr=eu%K-~+|-OyFTO8$$AK8yJwJDvJ!bSt=2h!U}9 zAfq?_)8y%*mD6b%D?ud08g^k7;vPr%y>Tf<_)!BaYCIo{RB1%J43!bB($4o$PG%G3 zp1%Ry5DJmiiH#zZ4(q7gJrKzGW|PpB&vV8jYTQdu+IU;F6kLKd4}HSyHtsGr!DcfV z|D`s45+Q`9PXf7-Bq^LjQ5>*0fz@jASC5j-7%|iX+uo)&o z*^rA!_?fApB^KmJ=4h8x1ofs*(q#^@p--a2@LsG&U|r8AJQeAp5y`DETF*go(kG2* zJi0O(#U((5O7f~m)r3B2WOO?g063z#Uh0$Z4||85Qn*rTR`?@!Xnb*ryjjdtiH2En zhU|f)Ue}V(bFLxjwsDU-i%JH}KqyQU&(>o&N}sgG4+xF)@7E=9C3Q@V6+@-H+4fWi zyJl1saeBRKL(?an1s}$cRYzMflv+sN1kRbF7CY5c^)wzAK9_EhR<9!jbvn>V+E+Y) z_(JKE04Drws%e3mFGYbwlcKIfd0Q4`rF>AxJa9cxNEbq!q)$Sl>GVlel1rb|fk{E4 zcy|_Qj}iubFyADv0pZheEV?A$Kx1H~pg(kxu&G(`pvm;J^hp&&)*S4n8l~{}i*YzJ zO@h+}9!e83uwk_kBOt91l_H>&O0lH)s>j!h8b%gHm4-R+WEaDeaY&)3x-vyIiy)^b z!p5w;?0czCnp3B#9DUSA)x@@Jl=Y!3HHs?C&l=**u#B{l`Bw)oiXQ)bY6-v{Pffb3h?sjdfRa8a=h6LYT?BlgYts>8a zmM-;4=wPC z0h-@l&VrZwPh;aeTI@gE6WpTVQOAC9S4l(5Ad+xsi)xXqKzGnkupD=Sx#2uYjX}r; zEvItUCy9Vq_o-ohr@i&-JMp)_>eQD-U3^)5cfag%*U|K}di!z}BpeQXFDUit2K4J8 z_wrZJ@p47eXhpxODigLEeKoA@Hx7jK#rPJ&8RPML>b|{8W?=dxS#W)wRa+D+itnH_ z1Nx-cgP{9GZJI_5vIOe`9)OrX8Qx`yJ_#%qHgv@RCx~~o(^)t~ho6-{S}FlYD&8{G8F4 zLtT>N`S-Plbe^_ckojk{7Q{0TgZdTBIz$DZVoO(Pxx7aIi`ELR9S5UG zJ}qtnku#sblc>A+1O4J-ApQqZTZH6aIF+K1DChl*D!Cb<2XdutH&)y*5QTO+ABVi^ zdK~-SBQjm;&MFRW90!WD!LRj6{*AwV%j>)C3gf$M)Y)!TwVgx*S0~X+c6=pJhxJl6 z*`wOJtt<3NSl7zk06!L4hiTA8Q(V-)txr-aCKLn+rMKk zSV6GHFq>gmoUO?gY7BpRbm5IKO~23>L$DNyDi`XrD#`!H!bOdO%Zv~YCrb>y`_ z>62{UY3Y-cw+bc}eG*$~l+OAj8dFT@-_$4J%7{XM9PA9H9Qs0^VKf%C7dkk#%4E{P zRH9GHK`)#ltp(2c?&K8S_xUnxZww-gkm=Y+pQMkw&?liJLJ9&3B;!Cfq+yJvX)Aq_ zsc>M`5N3#<;`lO!37|z6T(QGI+{vxa9WW`Z~! z;)n*b?xy4rS=B6w@W#W8qK8TM!EFJ$XAbj=E)-zIZ^Sa5Ap8U+>H%HP9zEP49#+a6lqAi=U%CKnEO-b$+(XXAQ3 z9{_U_b&9!(rfcAI4M5{~&}Hb8oT*_PE8z-t*F?H<74D*8pUY`ilRn;DwN1WByD0CY zeq=PFsjDSdmO~BR>TemdRe`uT;Qm|0do=1K?!xaVfc3872N=qzcItYICc#M^=#$pl za{K-#ZPL8#q)#H1(j7MC5e!uC%Y9DI?U9UCJd3MI1C>>QLCH)Ta`3c*E)w;;aG%1+O%z@-iAV@pi7jsMz&BSt8>s0z+OXIJQYyfI@FyZ=4Hz_ z^-1A&JK6thhiabyo@8iA!IflCGUpHs?1Ji;l{^bKbPg_OHGXh)J~mB;g%Azb1`j<_ z$dMY=IG9C@5F1ZBp&pVuCir*(VAm2_D}~w%shx`OiYd^A^n{quU`BDg7~qdt<(G_7-F2u^QG!k8LNtk)udom zLJXyrU|QoKhMKcBS2|Zut2GzVEzztB*Hx3uHguBq>DgStxmdRsRow?o-=bD4(WuXB znzW=(bM;X>Z@^%9f#cB{(}j!-rKQGyb0&tVXi>W%&8*k3&JFq&jC&&zCF7Ty*{Shl zFZcU;os|dL7J?Ki9*&8~q`rWr64gmO93iEka+&X?TBKEDfa$XXFH z6!0vACQ~V}A$KzH3WeO=tUA=~JXnk+RXkm+YZZDb`dBcOxKm^Ys0g0*ss?&)v!G5h zDQ470?Zmch7v1khmn+frLNA-?_ zyWTfjc}`7l^{Y4ozA*0lG}U@{Hw;?MM9YToLv&{e4wy4C?Q4~tN;xF-tEV#gglsFk z2X8)G_*i|dHm85|9q#{gHGlVi)bMN9zT5w6lXkC!ELz-J?wcEQ)Ne0Nm^*JZHk^0q z^VR}BE$ow_(NP1pkcW?jobkGzGj35WNVQT|v78p{7@5J!qzTEZN9+wPr-E@8*J1$4 zcnmf|YbC)TFI792`@R!@`)lmpi;cSYviR1p-$Ju znBDC=U}fUapAe@2Aq{7ot>Z18(jKjPP!X0_M+?*Aa?Hr)!NR;vJUIc8GGpm22}hv< zq%XwU!6C;JWw>mJ!-kBX`jL^VfWfYf-hqWp&oz{a_OsrEE+Fh$4BN+uOLDu8cozje;t`3GF#`uy**r4`^Kp!ubB z9lG79Nr$c=K_9k|9EBWO&2UQWRMCX#Ls6x>s>#tT*6+7T08vl+ywC5(HhbSqIPKHz zViLqAfEPU$ye=DxL+9WEBMbu2n9jig*bs#`I8dZIyRHC=aIBH^Fe$PCS!Gxw62QbI zYq-0<>+3AqwA-$U>PruXZ?p|h2HCIxaDF)>G;)4jpeMnsV+Qi6TgFa{Ltbo8Pf+l_ z;M#F8UOUCGvE}({yWaQ%-G};2OELpYpE*DuZRP;j`3gCbnI!A=!HO3R6pL}9!r-s2 z+waHGBQjkI*JGvc_j@U#+?XOE0R^G#RQwzLzJJT>yX^`S8#E%63|;ga)`T5bCqzGn zmk~|9M2f7MeS6fV)C7+65Gwbpr#qK4McjtxIK*|h)j3^? z9Kbq*Eh6^cnmAFpPGJq1yoe&2pJlpamhmjg=~6B; zl5svH2SayrQbBxRq_JtEJ;m2SK7v@4Q{Ee8yo_N0PSCvV3j{s!p(tNSG=^~*+{+sP zZAEz{eV-wIc1&sTM#=Wzgf>@j)MfeQpC|uWZR7z=pdl?496iNx7UC|PN11pGozqoX zji~|tH_cf5WKFFrJs4izO{}6EK+5nVX12Pow{?|n+kG#*j^YOAsaT3YWnB!flB}3M zeE9O=KdTNZ&i>{8*FaU;95h+zqLB;AW+eA5(pA>9O%F&k^-%XsTUK?}^-Xs@CBgMH z>u4l^8VZ&m8@skgeVNWXI-FKZm?|P6Tx7M~w#Vb~@KHYH9@`O?$)850K41OpxqHvq z`;V0n^v$`F(|m#;g%~86`BZWyyuF?z-CnNbn&ogIfkN##W7euk(4;>cLGIxQAw`}n3O^gSfFrShYEMn4x`EuHo zYsmC!=&M7qPO43^*)tleRPrS4yXnANn@7fMThCBDl&hl3?i9L~Ebu!*Feg4PL*T^+ z2OrvF+a8=8LZ;%~u{nPJ584!H4`vC}vfV$mY`{R>eRE$mRdbJItm5b#QAYsP6t5@3 zA{Q{3%3iG^=LLEX9EBN#Bp99V0j09=p-!n`4|)kA&X-q!d=u|VKKBZ%zF zVm6@a|1iLS(tMsl46;LHKMb`pYw zNPk!-CrJfdmaY1PuPIhdm5e2s#%Yyt@xaV@q0)*jgkuo~Y13gqNrN^iC_tB8Csz!G z9S~|qzWKUt`b5(Fvp^%2njq~AediQ$HvY7UkH^XVzl|s?(Vk}8HC_@KbIZ*aXT)X1 zH$E~-`nu@5RoGX1Qg-z?_I3TS?@4+|EYym0_QW=3`C^_eMocEkSe~UFU65^!p(YIn-2LnMX`)xs(`MOnZDfS6+y$7xA`|O^0Lju&2 zUg@Q{biRu3dvJwC>vIVx(_%DS*m6w|RLKnil*kH}Ard#dte5*)OVViG+>`642O}VT zREs*QR^mbXv z=;855bvhjS)_qY;<84}DzNSv9oMRpd0A=Z@6!Ffsg!7)^v*-a!xzf3Ms+L-g9jS}@ zK9Km-ISSEf2? z-`4BAO=6K#2oy}g&~pKKvhHtB^!fy$0Uk;dGO(@4ECvq5OAQ~q1=IUbDX?p;kh^I( zG9Y-c6nVgtU5twvhwwBr>|HaIpp$wij85d;yf2d-E%WtyK{O>ll!wSw*TdjJlU&R?{xNNt1 zuJ!3@x6|rr5AI?J;dwNUa|}xI6q21o+4sb8=&7140d&KA(7xKj$4;n@Hm85|9q#{g zHGlVi5Qnc_`|keV`h2`J>*-AsTHJoWxdEErUflRNZ#6occj@z1L)jJ$jj`~Hf1a-Q z1E(_>DWgM2_P&(yX5$WWmUDI1V_7L3OGF?huEh$*q{CeIsbPJmz4hxm@wdOm?!DL; zM!eYg?ta>36RQ<3ws98BKczJ2ua>ObI$Z;su6-$^-CW)P^nE&Hrx;B3htD zA(!Iyoy_r>srxwp)U?H2+gA_UL-+lWz=pcdHr1wj+ONy+#|fv+H-jqm_*)kY>o zPrBdXcd5340W_62Pjc|e_8Fli#ZrXdF9x%AmDd*SM=cJ)u{Fnf;2rKsaP2r4ubpDp z*m6d9y59H$Jrn*$OK#%6aDYnRJ43S@{lg#yk~@>iwN zrc1r0VY9ivM{qh47DD<6W%(w9Du!-X{2Tqgf6ME;?F!?!Y=qeEu-@%Ec3qta$z^yM z(Nsm?bPhUckJ_zw6bB|;7Ikd3IQ|s>*v`(BQy(Np&bq{Sj})tbagdY%>v9<3kBP+9C4^Sd zRHjq^cnm*rpnb@E@;cpktUXlPITl;bSKT{sP(cnqD>Ra%Xy z0sfD}zWEQ<2fEUO;pN@9pnScAV>k;%Bz1WB@>t4OtSG_rauDCRx1e*M}Bt z)*+y&02Uu-8BKpS>djW z8Ro?1*knt%FwL&FoA#mJXYC<7+%X!v0(o*6ivBo)w+^2fvqQ%iKQ>|A6(8hkl&=n- z;0mA`@B<8GChZ!>$MyQb$swdRyM62*|M9qh04zuzhZ`%hdyC;8+VtR^zm`>^xtW1Y0Rl@77*4tyy@ml+0Vi543~ z1Ext?7WtYuH_{xV$QX#9Upure@G}j*18KblcSJbiwAgOnFIUw)PI7W+D#krw`zyt^ zuWE!}IF6_Fdb}HpCvY^5Z~0p3r5Iu)n0i{b>z15gK>)r4l$aa=4=xt6grN{>)0?qa zp*a*Og0kD;gy>XQ70=|*~u4M=ZT!TouovsTq0wH2HBUnvl%c5Mp zf6BGw???2~KFHrOUw?CpG|@h(v|an*@_~V+eeAa_&XikhM>rSllku=wpemu>G}s*< z&sTKoakB}C-z%}sVPne|&=yD!UWaMdvs3i#7PT8e8@IRM%W;i1erWFsxvv8iV?A`^ z4lnnor}b^!qkk>1^(Sj=V&vK)|0R@;_+`=+@Vx~3k^TY#1qlM2B~6A;k7uSyaEikv z*iTAma(4q<(By(hQ009RR&I;Bs%FuS2vdl)m_$IzE?(KSL^DFWb=^{T>WP3u@;nYs zG*>@Cx!o?e{G&G7A_lwC@uLx>Jvmn^Z&2^3xaK% zD9x8r-FFSVrRfHirW4Ye^;W-%Gti)srC00s-ye@!J?*KoGS<4=fmAWlYDS%+P{w-M zf8h#H?xkth=shHlu!WCRrL{TzW1sQXm%Oh1>mv-h*9YB^tEc~t;Py($qQ$M{zPVXw zgub=7@p0a2beuO>(y$@*y899UTj>b&ktIF+w(I zITZpiNxlalsq0+#sbSS&Ut4`A{`S|{y%!sY7tdSY-7mY`bu>M#-o9J~4L|;Pe=jH% z1o+iM?&Ytb<8l?00B{ujs;YR6n(18(>2q-)q%WQWw6a9`G4;b|*N;;~7Wtj|I;*w` zQD81R=>B0r%)SRf_lr)xEw(lBvRH1%eO+jHk0Ts9SS&x#{152cam;PPWxH%Q;|`2W z?p^RViL02wdi9qt4^MaX_fNZY%~W27{yZpD>5{W!{#eu50FnU4gNm@cIvOIeM4ynu zZ?-%EHA6me_mi6s4%*&?O@tXsWbIIZvnH7&kZ`x#iHdbSh5##Y67o$@*6kbsvQTU_ zo-8dD{65dxACGm`?_gL!&GP=nE1#USDhzrGcv?l4ek<|vhPj%J-O;{$eqFJQ7+4Th zUT@z%dU@R+aE0shzsr`-FA4}$+1Fz+BsHnIH`QT>c8M0~8#s)(CSAaYXUdpVU%H`s zKa9=C!`=Glha%o|W3g}c&F9-~{qt_Z>C~kqo{SZFtjT{-#6!NTkKKozk=t~yNV)2^ z3cvwGSdRG3_r+aT32N?pNO5|%7CqDnpaWNS2P2BFtMmPKzpk_U?c;9D*1yB=QcZ?w zODLuQ>W%Br_8Fn2b#OlF$iLf%PqF20qvi4%{cpnvxONP>C? z{nL{aQIcO_-WCvlG{^p_{*8X$zvcDac7=%zHbQK7v%S3~9Rf*5Rh)Mw5ah~weS5d& zq&@1myWMS;K|2h)@q5&XPla-3AZ&qxNTbHwAimfT#7kSJPo*x4e#jIwMVjU+g}G6l zsS%_Albcp_XTCvb2N4{j9KA^`GS3K7Ac%r=#$W=HT1aDz@`x<4Bt+!^I%Q_o zA+au*Wy!n4>|4R|;m_%>{rpTh#RVXr#$DYu_?h=|l>rG#-rfCNJQYtQMlKf9?CPoh5x3zv4o63n(^THl zj&p(E23^8K60#EH+oe3j*l&uZ4#&dhWXD5Fz#Issqcw9(CiI72b9nBMeD zWC&O2)2#hqCF?;VffWY?DEv-E`}!B}AGlZS)UeEhQf1(N(BOp#s*Z;<3wnnJY1!68 zy3{E~M(;obeG+Oqz4KH?2GKYfo2LVLtV!V{!13o=#m?h`OU4k=PCz(NVBq`K9uL)l zIao;#4XZ}fM@Q-yvS~1McetDl+nh$@omB~>yz0|G7sZG1fXq5nkK3oc z@H*(>STa~EiL?YLUl(<|`10$2{Pn*vlmI$Ss&OvH`H=*Ye16;YX1m5Q^lm#;4;#ec z&A107#`O{9{ubZkdbi)~$aQ@+o7cO7M#6g0*X7*Xewlo`T<$WIfOJO8(RIIw9v-$I zKYsl1XJv79m{c?KgB9m&v}PcX0i^@F8M8Hs5jY=2lhJ^cl*oYm9gWAFf&9|?~D0E^`#!-}E%@sV#!+a?5NWT}lpd*oCy%Ad8a= zOk9dRc|fJHFMz`~9*5$--=y$1^YZ@Xg>I z-UDVuLon{kT1p!)&`3QdNb}Gq%x>fEa+81hH2M5LkD%g^7P~)?GoxxrBDfN&a%Dy8 zWqievs&@mR93|WSkr2z>*bXoZyIoIUD4tv>sVkgFVGgPVH9;SV=V%FL%*$Cx(%_M+ zcfxb0BBX+Dhhndhf*n+PID87i=KXHRupukJ?ygxa!^2oH0Wco}>bsgqbgmhKA(Id)8(_Bst7U}kR89EtbE&2Lv}>X1===T;3i_n} z^Ct@V{J;P4>2RpWzOD}2wx4D9C7-d5x5iwmN-(@m3Z_ziBH?5~h-kmqmD_4ptEQ@_ z7nSLjVzoulwX0T7bdvVz*#l(0k;}=&d%hOOX@lI}!hSABq?2Cuza|waH z)q!2L(E%~o6?y4v1ZfWkSIENMhqTtZ?nqMeqS(NCam042&##Z2kA&f2$V5QV_s-WH z4v98mSBc)LRd4mHpqno&@9vsL>rX%3-)r@>2aX`sdOU(unR!r-!6@7a2bAR)r7_8_ z@W8^)AH@jP6)k+MzE+#lKl%>$|GApK`#*@o*RH+#{67)gjAyr|I&En2%iXvCUucBB zwYc$d-fDbkK)ksyitu_pE#%>2+2(e=8((bo`cCK$9n`L|0ab#n%bms`WP_GdAs8Hk z%Y{BkXl)H4d#T#F-1nXM+h29+%c3s6EWW#6cDd_ldRo1Gxe6M7`Q`n4L8*5S*RO}% z%U?mqAhRPaP>vf)pyN6-bRI+e}hwyB$gA8Z7ZV z>-PSkE!OyD*W`}VBzjC#pg>-V6v1t4q|1fj+tDPr(Ok_c+J81+;z6zQwe7dgxqJSA zD_o!dUA818sH)w2NL;(C#!NHw?AyEJfMSs7rEXi5Nn7QMU78NNy!my#X+Cat{SWu= zw}1XnrTbx5-F0`}PmhQ8FSnCl*JCc<49c$Q%C=fV+s5+PJq$k_rH2{v+kUJbo5v;s z2h^Ji9MEuJ-3V&lBbo2=_gm3Jod7zh5{xMe7vYnCd%WFt#rwmDBdA62|2qnV-YL92 znFnId2(1xS7dK*yV0H^kZ=wBedE9I9=RMk!sX%b;I2f;;f|IdD(0*EYs__SUI%;z* zCE|WgytOOv3RX;P&G!5E6o2mF;d?7yhD1WO;?CdRe*XOay#|JgF7;-%ySvYyC2rJs zoY(adizTX<(LdF{(eL}WyuRD6Fs{o+i0$qV505)`U7bWP*>P0>j&_glx9r=a9*z&k zeGs8oIPQKzo%p%34r9=^6^RfWGieXT*+wMv1Uc5Ft%f@u-AwSb3Yr||hKvEt4y1sr zj*H_6^NY_C5;vHyLMoSwA~asUOr)*kaWQ^01fgm2F68wa+%APpl=6|R7yKKo2!TbR z#5~6z{yG2axHwZzeU+5b1BUf(987Tu5|re7`a=aQyaQ=K>tM^6w6pfe(AA_wr>pi6kj z6-k21!)l3Agnc3%beJd$up`(O)dqe>70K^W7->FBDU(R1w8}x4r2Rotz%R@^3O7@X zsr`bbm{8JzxZ(lR_rLb_e}fiy2fLrFwhWUUFT^R&n0&&Q&MfF-mP2XUF<)u43^|+t z^I)kg;Cf_)JPGzV_CoJ&@7MIY60x=#1+M>TF&<3C(?LVwq z*p>ue%31sg~Gb$61KGkh(d~ z#bfB4uF@)orW?B9Y5%zXS8Hiq>A~>wZbF2>+Rd2%b5;GYyW4!&%G~hzR(Ktden2W2 z8-$lGs`8tv9Tva*_5c3s|6nMYKIt+el(8YsZs@;)Sxd0d(Pf}tb`yuWWHXSeu5wccq2Poa2_hhj!@j`q`Jin zsCSSLNCJi0am9e0B)j&%d_UsgyV-T4Bt*=#YlC3EgO@_!Wzw(p@%ZE6@V%2mifH}u$K4PA>EE;& z#@*wpKJKf-=YK+-`xy*${CW5Di0T_(1+8X14ESfz z7QnJ8NRDPoBSg)#K{bvOY$35hc=JaIg$&;ti0N<+h{|wsFS1u zE^Cw9YPZ=92}u9_NMGoN0}}s{ zRSY%DZH+X4rUtV72+}8{R9_PTI~HDj%-bj%_I=2a>a}}xPry`92n5B$s(iqeM!=03A#3Lg;l9g;$cL?QNeH2nV z6+zPJ4f@G7-AxIm_!7mvp09MW&G7-9Xmq!0iirK5K-DjY!|~&>`GQ9iDK(lSxlf4G zZ}G1Bau^RIARk5Yq&^S@TJkx{CMowxc7WbjDGVt{WX61k%D6T zr+@qet^_oiyF)+D^Y=9g>^8~47)ZxzI)6D;LMk#XS#YeIb#QDBCLX(bx>_F_xvT_- z@*{zx!S{5M_UYNRkTQ|?@nQd%A0Kan!wxm!kp}z7#~<-PJ05Ruqa*ft`lig=nl2<$ zo#I!^%})Kb8}9}%Z3}nJ zQ4o{Cdr&Ib!pG`swK@Hx?{NR0tNFYCWBh&X+Uqa>>)73&7&2=t+tA|Yov-}|G{3!^ zL@_6jvDMh{!{GF50iPE3$xykc25xa@58QEiy(%!|ANLZ>xW@+97MMMj{14d}977Z+ zowSmBsq0+#sbSS&Ut4`A{%_vi1I~4%B9*EtGaJS3#f{lMLwg2nF3OW_|K0DF?C->9VNgh|NQXBg4rurd$;izrjN}63WDL zQy|GDQ3gduSOAcxcnp61CT509rln_XO9rkmF8Ol^Cn_-$pTb!&X+l$)5Q)&nLlvU( zRMAA~VYrY2zsWjTAp3L?Kum$BBiaQrh&eO(gQngN10LDnnSK7a@C!>pb;`9ziL_1oXiINCZR@sj^&# z+xMzumc_V0`2Pq19X-jWQowqL+|YWTtYv3`!xxS_IO{0S=cnAHOO*C=xc^8}OL*;a zFrIxInvIhVR{(z3TPfdX!#;3f#Q4mOzs9bj2f2l;1VBR@RYdGLG1I&6mrmr0M zG=g&3vZ_`0e=0>;X`YWjQ7nr_8;Hb)$zGQcgdAW5-V?oj?Rh1rt~Zl;C61T#K(3CiZ(y;sVGp7%Jkq zTmkwJcroy6q(4#a6H_`n8BR?`#+jndNiZ#hFqVzR-Rnu2GDnW0rWrTlE&e`SmvxZ; zpdxTN50A_6I1TE14)!TdQH?kbw?BajC;A!c(x^KCzYTJUT!^|blaNr}upCOw=2KI2 zI0`485G#PD$1oiT!in;6q8pG`0Qyal<6ZcngB2X{_mC(}Qw(&fIF#QcF`+Id02w^Q z^y;7X>3=34En?_`x)ab$fbLLG&n-|BAlp{DnFBf`NK?&Acu(;&g1Og279IU2hRmfs;@mM}LIg?Fta2*3P zduaTZ!71}nGMj)^hXWMq2I59=AC6)jtx`BaggfVku_EaMaeR~q_X2p)R?IVFl^${`9K{Bav5@gkxRj-Esj~844#XjYc`jfOhNe}4U18X5fG~}mqxgO zOk9kD)kJ<|&%o&k4l7DlNI(MvW}Od(oCU^QVoP3SjJ7AQVa`z*dHfKeMlwlz#80`L z1#uV97X%QGLFXtJEe=xy{5MKEcho6r%ITru!K))sE(f(P#@AA*rl|0yfG$F^%0$