From 94e91e2936811b7de7cef8669401475ccecab1a4 Mon Sep 17 00:00:00 2001 From: uc-hoba Date: Sat, 14 Apr 2018 23:38:56 +0800 Subject: [PATCH] update missing files --- .../PostProcessing/Editor/Utils.meta | 9 + .../Editor/Utils/CurveEditor.cs | 847 ++++++++++++++++++ .../Editor/Utils/CurveEditor.cs.meta | 12 + .../PostProcessing/Runtime.meta | 9 + .../PostProcessing/Runtime/Attributes.meta | 9 + .../Runtime/Attributes/MinAttribute.cs | 12 + .../Runtime/Attributes/MinAttribute.cs.meta | 12 + .../Runtime/Attributes/TrackballAttribute.cs | 12 + .../Attributes/TrackballAttribute.cs.meta | 12 + .../PostProcessing/Runtime/Utils.meta | 9 + .../PostProcessing/Textures.meta | 9 + .../CustomMotionVectorDebugProfile.asset | Bin 7537 -> 12872 bytes .../CustomMotionTexture/ExampleScene.unity | Bin 34816 -> 35512 bytes .../Materials/DebugMotionVectors.mat | Bin 2265 -> 5100 bytes .../Materials/DebugQuad.mat | Bin 2255 -> 5092 bytes .../Materials/UVChecker.mat | Bin 2061 -> 5024 bytes .../Materials/WheelMotionVectors.mat | Bin 2208 -> 5100 bytes 17 files changed, 952 insertions(+) create mode 100644 Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils.meta create mode 100644 Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils/CurveEditor.cs create mode 100644 Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils/CurveEditor.cs.meta create mode 100644 Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime.meta create mode 100644 Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes.meta create mode 100644 Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/MinAttribute.cs create mode 100644 Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/MinAttribute.cs.meta create mode 100644 Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/TrackballAttribute.cs create mode 100644 Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/TrackballAttribute.cs.meta create mode 100644 Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Utils.meta create mode 100644 Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Textures.meta diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils.meta b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils.meta new file mode 100644 index 0000000..7afa936 --- /dev/null +++ b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b52c69ccefdae7545bfb4d0bf9b7df71 +folderAsset: yes +timeCreated: 1467189428 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils/CurveEditor.cs b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils/CurveEditor.cs new file mode 100644 index 0000000..ee8f1c1 --- /dev/null +++ b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils/CurveEditor.cs @@ -0,0 +1,847 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace UnityEditor.PostProcessing +{ + public sealed class CurveEditor + { + #region Enums + + enum EditMode + { + None, + Moving, + TangentEdit + } + + enum Tangent + { + In, + Out + } + #endregion + + #region Structs + public struct Settings + { + public Rect bounds; + public RectOffset padding; + public Color selectionColor; + public float curvePickingDistance; + public float keyTimeClampingDistance; + + public static Settings defaultSettings + { + get + { + return new Settings + { + bounds = new Rect(0f, 0f, 1f, 1f), + padding = new RectOffset(10, 10, 10, 10), + selectionColor = Color.yellow, + curvePickingDistance = 6f, + keyTimeClampingDistance = 1e-4f + }; + } + } + } + + public struct CurveState + { + public bool visible; + public bool editable; + public uint minPointCount; + public float zeroKeyConstantValue; + public Color color; + public float width; + public float handleWidth; + public bool showNonEditableHandles; + public bool onlyShowHandlesOnSelection; + public bool loopInBounds; + + public static CurveState defaultState + { + get + { + return new CurveState + { + visible = true, + editable = true, + minPointCount = 2, + zeroKeyConstantValue = 0f, + color = Color.white, + width = 2f, + handleWidth = 2f, + showNonEditableHandles = true, + onlyShowHandlesOnSelection = false, + loopInBounds = false + }; + } + } + } + + public struct Selection + { + public SerializedProperty curve; + public int keyframeIndex; + public Keyframe? keyframe; + + public Selection(SerializedProperty curve, int keyframeIndex, Keyframe? keyframe) + { + this.curve = curve; + this.keyframeIndex = keyframeIndex; + this.keyframe = keyframe; + } + } + + internal struct MenuAction + { + internal SerializedProperty curve; + internal int index; + internal Vector3 position; + + internal MenuAction(SerializedProperty curve) + { + this.curve = curve; + this.index = -1; + this.position = Vector3.zero; + } + + internal MenuAction(SerializedProperty curve, int index) + { + this.curve = curve; + this.index = index; + this.position = Vector3.zero; + } + + internal MenuAction(SerializedProperty curve, Vector3 position) + { + this.curve = curve; + this.index = -1; + this.position = position; + } + } + #endregion + + #region Fields & properties + public Settings settings { get; private set; } + + Dictionary m_Curves; + Rect m_CurveArea; + + SerializedProperty m_SelectedCurve; + int m_SelectedKeyframeIndex = -1; + + EditMode m_EditMode = EditMode.None; + Tangent m_TangentEditMode; + + bool m_Dirty; + #endregion + + #region Constructors & destructors + public CurveEditor() + : this(Settings.defaultSettings) + {} + + public CurveEditor(Settings settings) + { + this.settings = settings; + m_Curves = new Dictionary(); + } + + #endregion + + #region Public API + public void Add(params SerializedProperty[] curves) + { + foreach (var curve in curves) + Add(curve, CurveState.defaultState); + } + + public void Add(SerializedProperty curve) + { + Add(curve, CurveState.defaultState); + } + + public void Add(SerializedProperty curve, CurveState state) + { + // Make sure the property is in fact an AnimationCurve + var animCurve = curve.animationCurveValue; + if (animCurve == null) + throw new ArgumentException("curve"); + + if (m_Curves.ContainsKey(curve)) + Debug.LogWarning("Curve has already been added to the editor"); + + m_Curves.Add(curve, state); + } + + public void Remove(SerializedProperty curve) + { + m_Curves.Remove(curve); + } + + public void RemoveAll() + { + m_Curves.Clear(); + } + + public CurveState GetCurveState(SerializedProperty curve) + { + CurveState state; + if (!m_Curves.TryGetValue(curve, out state)) + throw new KeyNotFoundException("curve"); + + return state; + } + + public void SetCurveState(SerializedProperty curve, CurveState state) + { + if (!m_Curves.ContainsKey(curve)) + throw new KeyNotFoundException("curve"); + + m_Curves[curve] = state; + } + + public Selection GetSelection() + { + Keyframe? key = null; + if (m_SelectedKeyframeIndex > -1) + { + var curve = m_SelectedCurve.animationCurveValue; + + if (m_SelectedKeyframeIndex >= curve.length) + m_SelectedKeyframeIndex = -1; + else + key = curve[m_SelectedKeyframeIndex]; + } + + return new Selection(m_SelectedCurve, m_SelectedKeyframeIndex, key); + } + + public void SetKeyframe(SerializedProperty curve, int keyframeIndex, Keyframe keyframe) + { + var animCurve = curve.animationCurveValue; + SetKeyframe(animCurve, keyframeIndex, keyframe); + SaveCurve(curve, animCurve); + } + + public bool OnGUI(Rect rect) + { + if (Event.current.type == EventType.Repaint) + m_Dirty = false; + + GUI.BeginClip(rect); + { + var area = new Rect(Vector2.zero, rect.size); + m_CurveArea = settings.padding.Remove(area); + + foreach (var curve in m_Curves) + OnCurveGUI(area, curve.Key, curve.Value); + + OnGeneralUI(area); + } + GUI.EndClip(); + + return m_Dirty; + } + + #endregion + + #region UI & events + + void OnCurveGUI(Rect rect, SerializedProperty curve, CurveState state) + { + // Discard invisible curves + if (!state.visible) + return; + + var animCurve = curve.animationCurveValue; + var keys = animCurve.keys; + var length = keys.Length; + + // Curve drawing + // Slightly dim non-editable curves + var color = state.color; + if (!state.editable) + color.a *= 0.5f; + + Handles.color = color; + var bounds = settings.bounds; + + if (length == 0) + { + var p1 = CurveToCanvas(new Vector3(bounds.xMin, state.zeroKeyConstantValue)); + var p2 = CurveToCanvas(new Vector3(bounds.xMax, state.zeroKeyConstantValue)); + Handles.DrawAAPolyLine(state.width, p1, p2); + } + else if (length == 1) + { + var p1 = CurveToCanvas(new Vector3(bounds.xMin, keys[0].value)); + var p2 = CurveToCanvas(new Vector3(bounds.xMax, keys[0].value)); + Handles.DrawAAPolyLine(state.width, p1, p2); + } + else + { + var prevKey = keys[0]; + for (int k = 1; k < length; k++) + { + var key = keys[k]; + var pts = BezierSegment(prevKey, key); + + if (float.IsInfinity(prevKey.outTangent) || float.IsInfinity(key.inTangent)) + { + var s = HardSegment(prevKey, key); + Handles.DrawAAPolyLine(state.width, s[0], s[1], s[2]); + } + else Handles.DrawBezier(pts[0], pts[3], pts[1], pts[2], color, null, state.width); + + prevKey = key; + } + + // Curve extents & loops + if (keys[0].time > bounds.xMin) + { + if (state.loopInBounds) + { + var p1 = keys[length - 1]; + p1.time -= settings.bounds.width; + var p2 = keys[0]; + var pts = BezierSegment(p1, p2); + + if (float.IsInfinity(p1.outTangent) || float.IsInfinity(p2.inTangent)) + { + var s = HardSegment(p1, p2); + Handles.DrawAAPolyLine(state.width, s[0], s[1], s[2]); + } + else Handles.DrawBezier(pts[0], pts[3], pts[1], pts[2], color, null, state.width); + } + else + { + var p1 = CurveToCanvas(new Vector3(bounds.xMin, keys[0].value)); + var p2 = CurveToCanvas(keys[0]); + Handles.DrawAAPolyLine(state.width, p1, p2); + } + } + + if (keys[length - 1].time < bounds.xMax) + { + if (state.loopInBounds) + { + var p1 = keys[length - 1]; + var p2 = keys[0]; + p2.time += settings.bounds.width; + var pts = BezierSegment(p1, p2); + + if (float.IsInfinity(p1.outTangent) || float.IsInfinity(p2.inTangent)) + { + var s = HardSegment(p1, p2); + Handles.DrawAAPolyLine(state.width, s[0], s[1], s[2]); + } + else Handles.DrawBezier(pts[0], pts[3], pts[1], pts[2], color, null, state.width); + } + else + { + var p1 = CurveToCanvas(keys[length - 1]); + var p2 = CurveToCanvas(new Vector3(bounds.xMax, keys[length - 1].value)); + Handles.DrawAAPolyLine(state.width, p1, p2); + } + } + } + + // Make sure selection is correct (undo can break it) + bool isCurrentlySelectedCurve = curve == m_SelectedCurve; + + if (isCurrentlySelectedCurve && m_SelectedKeyframeIndex >= length) + m_SelectedKeyframeIndex = -1; + + // Handles & keys + for (int k = 0; k < length; k++) + { + bool isCurrentlySelectedKeyframe = k == m_SelectedKeyframeIndex; + var e = Event.current; + + var pos = CurveToCanvas(keys[k]); + var hitRect = new Rect(pos.x - 8f, pos.y - 8f, 16f, 16f); + var offset = isCurrentlySelectedCurve + ? new RectOffset(5, 5, 5, 5) + : new RectOffset(6, 6, 6, 6); + + var outTangent = pos + CurveTangentToCanvas(keys[k].outTangent).normalized * 40f; + var inTangent = pos - CurveTangentToCanvas(keys[k].inTangent).normalized * 40f; + var inTangentHitRect = new Rect(inTangent.x - 7f, inTangent.y - 7f, 14f, 14f); + var outTangentHitrect = new Rect(outTangent.x - 7f, outTangent.y - 7f, 14f, 14f); + + // Draw + if (state.showNonEditableHandles) + { + if (e.type == EventType.repaint) + { + var selectedColor = (isCurrentlySelectedCurve && isCurrentlySelectedKeyframe) + ? settings.selectionColor + : state.color; + + // Keyframe + EditorGUI.DrawRect(offset.Remove(hitRect), selectedColor); + + // Tangents + if (isCurrentlySelectedCurve && (!state.onlyShowHandlesOnSelection || (state.onlyShowHandlesOnSelection && isCurrentlySelectedKeyframe))) + { + Handles.color = selectedColor; + + if (k > 0 || state.loopInBounds) + { + Handles.DrawAAPolyLine(state.handleWidth, pos, inTangent); + EditorGUI.DrawRect(offset.Remove(inTangentHitRect), selectedColor); + } + + if (k < length - 1 || state.loopInBounds) + { + Handles.DrawAAPolyLine(state.handleWidth, pos, outTangent); + EditorGUI.DrawRect(offset.Remove(outTangentHitrect), selectedColor); + } + } + } + } + + // Events + if (state.editable) + { + // Keyframe move + if (m_EditMode == EditMode.Moving && e.type == EventType.MouseDrag && isCurrentlySelectedCurve && isCurrentlySelectedKeyframe) + { + EditMoveKeyframe(animCurve, keys, k); + } + + // Tangent editing + if (m_EditMode == EditMode.TangentEdit && e.type == EventType.MouseDrag && isCurrentlySelectedCurve && isCurrentlySelectedKeyframe) + { + bool alreadyBroken = !(Mathf.Approximately(keys[k].inTangent, keys[k].outTangent) || (float.IsInfinity(keys[k].inTangent) && float.IsInfinity(keys[k].outTangent))); + EditMoveTangent(animCurve, keys, k, m_TangentEditMode, e.shift || !(alreadyBroken || e.control)); + } + + // Keyframe selection & context menu + if (e.type == EventType.mouseDown && rect.Contains(e.mousePosition)) + { + if (hitRect.Contains(e.mousePosition)) + { + if (e.button == 0) + { + SelectKeyframe(curve, k); + m_EditMode = EditMode.Moving; + e.Use(); + } + else if (e.button == 1) + { + // Keyframe context menu + var menu = new GenericMenu(); + menu.AddItem(new GUIContent("Delete Key"), false, (x) => + { + var action = (MenuAction)x; + var curveValue = action.curve.animationCurveValue; + action.curve.serializedObject.Update(); + RemoveKeyframe(curveValue, action.index); + m_SelectedKeyframeIndex = -1; + SaveCurve(action.curve, curveValue); + action.curve.serializedObject.ApplyModifiedProperties(); + }, new MenuAction(curve, k)); + menu.ShowAsContext(); + e.Use(); + } + } + } + + // Tangent selection & edit mode + if (e.type == EventType.mouseDown && rect.Contains(e.mousePosition)) + { + if (inTangentHitRect.Contains(e.mousePosition) && (k > 0 || state.loopInBounds)) + { + SelectKeyframe(curve, k); + m_EditMode = EditMode.TangentEdit; + m_TangentEditMode = Tangent.In; + e.Use(); + } + else if (outTangentHitrect.Contains(e.mousePosition) && (k < length - 1 || state.loopInBounds)) + { + SelectKeyframe(curve, k); + m_EditMode = EditMode.TangentEdit; + m_TangentEditMode = Tangent.Out; + e.Use(); + } + } + + // Mouse up - clean up states + if (e.rawType == EventType.MouseUp && m_EditMode != EditMode.None) + { + m_EditMode = EditMode.None; + } + + // Set cursors + { + EditorGUIUtility.AddCursorRect(hitRect, MouseCursor.MoveArrow); + + if (k > 0 || state.loopInBounds) + EditorGUIUtility.AddCursorRect(inTangentHitRect, MouseCursor.RotateArrow); + + if (k < length - 1 || state.loopInBounds) + EditorGUIUtility.AddCursorRect(outTangentHitrect, MouseCursor.RotateArrow); + } + } + } + + Handles.color = Color.white; + SaveCurve(curve, animCurve); + } + + void OnGeneralUI(Rect rect) + { + var e = Event.current; + + // Selection + if (e.type == EventType.mouseDown) + { + GUI.FocusControl(null); + m_SelectedCurve = null; + m_SelectedKeyframeIndex = -1; + bool used = false; + + var hit = CanvasToCurve(e.mousePosition); + float curvePickValue = CurveToCanvas(hit).y; + + // Try and select a curve + foreach (var curve in m_Curves) + { + if (!curve.Value.editable || !curve.Value.visible) + continue; + + var prop = curve.Key; + var state = curve.Value; + var animCurve = prop.animationCurveValue; + float hitY = animCurve.length == 0 + ? state.zeroKeyConstantValue + : animCurve.Evaluate(hit.x); + + var curvePos = CurveToCanvas(new Vector3(hit.x, hitY)); + + if (Mathf.Abs(curvePos.y - curvePickValue) < settings.curvePickingDistance) + { + m_SelectedCurve = prop; + + if (e.clickCount == 2 && e.button == 0) + { + // Create a keyframe on double-click on this curve + EditCreateKeyframe(animCurve, hit, true, state.zeroKeyConstantValue); + SaveCurve(prop, animCurve); + } + else if (e.button == 1) + { + // Curve context menu + var menu = new GenericMenu(); + menu.AddItem(new GUIContent("Add Key"), false, (x) => + { + var action = (MenuAction)x; + var curveValue = action.curve.animationCurveValue; + action.curve.serializedObject.Update(); + EditCreateKeyframe(curveValue, hit, true, 0f); + SaveCurve(action.curve, curveValue); + action.curve.serializedObject.ApplyModifiedProperties(); + }, new MenuAction(prop, hit)); + menu.ShowAsContext(); + e.Use(); + used = true; + } + } + } + + if (e.clickCount == 2 && e.button == 0 && m_SelectedCurve == null) + { + // Create a keyframe on every curve on double-click + foreach (var curve in m_Curves) + { + if (!curve.Value.editable || !curve.Value.visible) + continue; + + var prop = curve.Key; + var state = curve.Value; + var animCurve = prop.animationCurveValue; + EditCreateKeyframe(animCurve, hit, e.alt, state.zeroKeyConstantValue); + SaveCurve(prop, animCurve); + } + } + else if (!used && e.button == 1) + { + // Global context menu + var menu = new GenericMenu(); + menu.AddItem(new GUIContent("Add Key At Position"), false, () => ContextMenuAddKey(hit, false)); + menu.AddItem(new GUIContent("Add Key On Curves"), false, () => ContextMenuAddKey(hit, true)); + menu.ShowAsContext(); + } + + e.Use(); + } + + // Delete selected key(s) + if (e.type == EventType.keyDown && (e.keyCode == KeyCode.Delete || e.keyCode == KeyCode.Backspace)) + { + if (m_SelectedKeyframeIndex != -1 && m_SelectedCurve != null) + { + var animCurve = m_SelectedCurve.animationCurveValue; + var length = animCurve.length; + + if (m_Curves[m_SelectedCurve].minPointCount < length && length >= 0) + { + EditDeleteKeyframe(animCurve, m_SelectedKeyframeIndex); + m_SelectedKeyframeIndex = -1; + SaveCurve(m_SelectedCurve, animCurve); + } + + e.Use(); + } + } + } + + void SaveCurve(SerializedProperty prop, AnimationCurve curve) + { + prop.animationCurveValue = curve; + } + + void Invalidate() + { + m_Dirty = true; + } + + #endregion + + #region Keyframe manipulations + + void SelectKeyframe(SerializedProperty curve, int keyframeIndex) + { + m_SelectedKeyframeIndex = keyframeIndex; + m_SelectedCurve = curve; + Invalidate(); + } + + void ContextMenuAddKey(Vector3 hit, bool createOnCurve) + { + SerializedObject serializedObject = null; + + foreach (var curve in m_Curves) + { + if (!curve.Value.editable || !curve.Value.visible) + continue; + + var prop = curve.Key; + var state = curve.Value; + + if (serializedObject == null) + { + serializedObject = prop.serializedObject; + serializedObject.Update(); + } + + var animCurve = prop.animationCurveValue; + EditCreateKeyframe(animCurve, hit, createOnCurve, state.zeroKeyConstantValue); + SaveCurve(prop, animCurve); + } + + if (serializedObject != null) + serializedObject.ApplyModifiedProperties(); + + Invalidate(); + } + + void EditCreateKeyframe(AnimationCurve curve, Vector3 position, bool createOnCurve, float zeroKeyConstantValue) + { + float tangent = EvaluateTangent(curve, position.x); + + if (createOnCurve) + { + position.y = curve.length == 0 + ? zeroKeyConstantValue + : curve.Evaluate(position.x); + } + + AddKeyframe(curve, new Keyframe(position.x, position.y, tangent, tangent)); + } + + void EditDeleteKeyframe(AnimationCurve curve, int keyframeIndex) + { + RemoveKeyframe(curve, keyframeIndex); + } + + void AddKeyframe(AnimationCurve curve, Keyframe newValue) + { + curve.AddKey(newValue); + Invalidate(); + } + + void RemoveKeyframe(AnimationCurve curve, int keyframeIndex) + { + curve.RemoveKey(keyframeIndex); + Invalidate(); + } + + void SetKeyframe(AnimationCurve curve, int keyframeIndex, Keyframe newValue) + { + var keys = curve.keys; + + if (keyframeIndex > 0) + newValue.time = Mathf.Max(keys[keyframeIndex - 1].time + settings.keyTimeClampingDistance, newValue.time); + + if (keyframeIndex < keys.Length - 1) + newValue.time = Mathf.Min(keys[keyframeIndex + 1].time - settings.keyTimeClampingDistance, newValue.time); + + curve.MoveKey(keyframeIndex, newValue); + Invalidate(); + } + + void EditMoveKeyframe(AnimationCurve curve, Keyframe[] keys, int keyframeIndex) + { + var key = CanvasToCurve(Event.current.mousePosition); + float inTgt = keys[keyframeIndex].inTangent; + float outTgt = keys[keyframeIndex].outTangent; + SetKeyframe(curve, keyframeIndex, new Keyframe(key.x, key.y, inTgt, outTgt)); + } + + void EditMoveTangent(AnimationCurve curve, Keyframe[] keys, int keyframeIndex, Tangent targetTangent, bool linkTangents) + { + var pos = CanvasToCurve(Event.current.mousePosition); + + float time = keys[keyframeIndex].time; + float value = keys[keyframeIndex].value; + + pos -= new Vector3(time, value); + + if (targetTangent == Tangent.In && pos.x > 0f) + pos.x = 0f; + + if (targetTangent == Tangent.Out && pos.x < 0f) + pos.x = 0f; + + float tangent; + + if (Mathf.Approximately(pos.x, 0f)) + tangent = pos.y < 0f ? float.PositiveInfinity : float.NegativeInfinity; + else + tangent = pos.y / pos.x; + + float inTangent = keys[keyframeIndex].inTangent; + float outTangent = keys[keyframeIndex].outTangent; + + if (targetTangent == Tangent.In || linkTangents) + inTangent = tangent; + if (targetTangent == Tangent.Out || linkTangents) + outTangent = tangent; + + SetKeyframe(curve, keyframeIndex, new Keyframe(time, value, inTangent, outTangent)); + } + + #endregion + + #region Maths utilities + + Vector3 CurveToCanvas(Keyframe keyframe) + { + return CurveToCanvas(new Vector3(keyframe.time, keyframe.value)); + } + + Vector3 CurveToCanvas(Vector3 position) + { + var bounds = settings.bounds; + var output = new Vector3((position.x - bounds.x) / (bounds.xMax - bounds.x), (position.y - bounds.y) / (bounds.yMax - bounds.y)); + output.x = output.x * (m_CurveArea.xMax - m_CurveArea.xMin) + m_CurveArea.xMin; + output.y = (1f - output.y) * (m_CurveArea.yMax - m_CurveArea.yMin) + m_CurveArea.yMin; + return output; + } + + Vector3 CanvasToCurve(Vector3 position) + { + var bounds = settings.bounds; + var output = position; + output.x = (output.x - m_CurveArea.xMin) / (m_CurveArea.xMax - m_CurveArea.xMin); + output.y = (output.y - m_CurveArea.yMin) / (m_CurveArea.yMax - m_CurveArea.yMin); + output.x = Mathf.Lerp(bounds.x, bounds.xMax, output.x); + output.y = Mathf.Lerp(bounds.yMax, bounds.y, output.y); + return output; + } + + Vector3 CurveTangentToCanvas(float tangent) + { + if (!float.IsInfinity(tangent)) + { + var bounds = settings.bounds; + float ratio = (m_CurveArea.width / m_CurveArea.height) / ((bounds.xMax - bounds.x) / (bounds.yMax - bounds.y)); + return new Vector3(1f, -tangent / ratio).normalized; + } + + return float.IsPositiveInfinity(tangent) ? Vector3.up : Vector3.down; + } + + Vector3[] BezierSegment(Keyframe start, Keyframe end) + { + var segment = new Vector3[4]; + + segment[0] = CurveToCanvas(new Vector3(start.time, start.value)); + segment[3] = CurveToCanvas(new Vector3(end.time, end.value)); + + float middle = start.time + ((end.time - start.time) * 0.333333f); + float middle2 = start.time + ((end.time - start.time) * 0.666666f); + + segment[1] = CurveToCanvas(new Vector3(middle, ProjectTangent(start.time, start.value, start.outTangent, middle))); + segment[2] = CurveToCanvas(new Vector3(middle2, ProjectTangent(end.time, end.value, end.inTangent, middle2))); + + return segment; + } + + Vector3[] HardSegment(Keyframe start, Keyframe end) + { + var segment = new Vector3[3]; + + segment[0] = CurveToCanvas(start); + segment[1] = CurveToCanvas(new Vector3(end.time, start.value)); + segment[2] = CurveToCanvas(end); + + return segment; + } + + float ProjectTangent(float inPosition, float inValue, float inTangent, float projPosition) + { + return inValue + ((projPosition - inPosition) * inTangent); + } + + float EvaluateTangent(AnimationCurve curve, float time) + { + int prev = -1, next = 0; + for (int i = 0; i < curve.keys.Length; i++) + { + if (time > curve.keys[i].time) + { + prev = i; + next = i + 1; + } + else break; + } + + if (next == 0) + return 0f; + + if (prev == curve.keys.Length - 1) + return 0f; + + const float kD = 1e-3f; + float tp = Mathf.Max(time - kD, curve.keys[prev].time); + float tn = Mathf.Min(time + kD, curve.keys[next].time); + + float vp = curve.Evaluate(tp); + float vn = curve.Evaluate(tn); + + if (Mathf.Approximately(tn, tp)) + return (vn - vp > 0f) ? float.PositiveInfinity : float.NegativeInfinity; + + return (vn - vp) / (tn - tp); + } + + #endregion + } +} diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils/CurveEditor.cs.meta b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils/CurveEditor.cs.meta new file mode 100644 index 0000000..808a8aa --- /dev/null +++ b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Editor/Utils/CurveEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: afb349ef0bffd144db2bdd25630f648e +timeCreated: 1472650750 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime.meta b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime.meta new file mode 100644 index 0000000..1f6238f --- /dev/null +++ b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4b79d54138d9d1a498085393504c7d02 +folderAsset: yes +timeCreated: 1466585248 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes.meta b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes.meta new file mode 100644 index 0000000..c8ecf57 --- /dev/null +++ b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 68327f748e8ffd94889a47317b7d327b +folderAsset: yes +timeCreated: 1460383911 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/MinAttribute.cs b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/MinAttribute.cs new file mode 100644 index 0000000..34144ce --- /dev/null +++ b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/MinAttribute.cs @@ -0,0 +1,12 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class MinAttribute : PropertyAttribute + { + public readonly float min; + + public MinAttribute(float min) + { + this.min = min; + } + } +} diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/MinAttribute.cs.meta b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/MinAttribute.cs.meta new file mode 100644 index 0000000..7086770 --- /dev/null +++ b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/MinAttribute.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9af2f505033843c46a362e251937acb1 +timeCreated: 1462281908 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/TrackballAttribute.cs b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/TrackballAttribute.cs new file mode 100644 index 0000000..9acf912 --- /dev/null +++ b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/TrackballAttribute.cs @@ -0,0 +1,12 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class TrackballAttribute : PropertyAttribute + { + public readonly string method; + + public TrackballAttribute(string method) + { + this.method = method; + } + } +} diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/TrackballAttribute.cs.meta b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/TrackballAttribute.cs.meta new file mode 100644 index 0000000..5ae991e --- /dev/null +++ b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Attributes/TrackballAttribute.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 65e30143f4e114f45b84a1d9cba8f469 +timeCreated: 1463400829 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Utils.meta b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Utils.meta new file mode 100644 index 0000000..9913315 --- /dev/null +++ b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Runtime/Utils.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 18fb6a6b698945843a16c2d0111a7af2 +folderAsset: yes +timeCreated: 1459945070 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Textures.meta b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Textures.meta new file mode 100644 index 0000000..8a9ab77 --- /dev/null +++ b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Textures.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e15c29a7abfa52743a8cb7714389c3c7 +folderAsset: yes +timeCreated: 1466585230 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Utilities/CustomMotionTexture/CustomMotionVectorDebugProfile.asset b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Utilities/CustomMotionTexture/CustomMotionVectorDebugProfile.asset index f18fbf7cd0547be1ecb90cb2adaec4ae8579f00a..16f736d7bb37863cfc8aa1f1aeb51a4d802c13c3 100644 GIT binary patch literal 12872 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 HRtgR< z97WSt`}_OEjiN*L4?M>7dv&QxeJXOkl)5$3SBw>RSBpPI-277};!N?Zp0cqeUmKC~ z#WgpgY@EoHeNCkj=N};QpFrlkY=kMfTIYY_h1jFqd#rh?#FV{t8vhK9 zrfk;MjV>;ABXxNT9_7D@fa&8 zIKO{d=tpNHhwHhLyoNt_-lq^vt^p43hxC#2=P_ZdGNKm1)ij~lY^efbF0&j(BbHWuD_h4#h;k0liW`wCWZGY`3AjP}YfHVFRG z0xP7ck16tlKYoyiN*NRIQ3AWnU=ne)vFhA%Fd4F_H|?eyNkL5{ySf zOa}!{70PO#%e`u+Jibrig|51i3Pap_jfQP5Th&OUE0r7{7o-wT#AaJkK)Dp^3<4_) z2J*Fj2sd+)`IuzllGpb`F&eZ2dd386Tdl6rGbvQEGbmFXw{@s$XCtqKX<7p%CnN7| z$Z~Zd$_z!3O?-UXTFg+Z4L{S%0eJT~XoPZ+vFC;@e%9&s4LjsZowt z;pP-c4U`Cy6>kww;w0gf%k!N*qV&VHKw?n>9(m;0l=0NQMijEVXz_56?ZQBi0h9xV zhxomCy5*{cG2_vJ-#K|Ic_HJUdY(rS?^R#TqPh|y`L!A{#}YoELJWXXI=htkzwb*w z5jYAp)%k_ex>$3Ed+mCq52RO<0Y-Qm7;AC>IM)E4ZFoqMezi`UpGsjZ9)x|>BW2u= z&WfiVy3o@G~A*7`EbyAVr(9&XYf z8mmiZN&+4I+67MJc<^DR>*nJlo;JCMmp7t7%5&%6fDE^WI_9mI=Q3TP)wIeM=mCKg zfD#U>A?Xnv=e$HwxRj4@WgmM(t>ss0BK8;^QhV$Rp40@oUq&aBlK>AAkXw~l*qov* zoPgUR8n%dAL(MUDu88c+sWDh(q4HZUgbLa?*9m&n8AApQIs@5CQ?vS&%04<=`&`&3 zU(p`Ti>v25Na{4TZO%7El`I7hTnO!KNN6F9r$%OvK^r`uYm@P!0Bt8psvzGGglCsH zEBjy-2zVG=zp_OpA%Ws96Nbb4|3hcMb7c7fZAyBqQ#5~U|n{`Y@g@Z#d(pAOH1 zvmE_zhnL}`|Nrsg&Vv`kY^&i}@iZ*RZ86?4@VKd9w`?iu0D(B3+N zPSy%6#qVLi+R<*pj<=(I+CV#XG)&3N1+M$H4(u@e!tfrKua&Pj)ce^>wOn+QeaiDV zH@d*(J3d(m)7`>%eF-KpSe_+J8MF6IOQgL!sJ^ zaDCkZBHd7JMl*!o-0_IUSxcFf_-fM?=N(+>Zt^}qtUlZBwf)S1#(#9tu|tK?#7!nf z6F*W|vEi^cqR_g@OHtd2zQ58M%<>aQ^!DMFe7`BW`uRsAyOx|s+GBc=0&T!BxTZnfRe7yA4O=WR$JAXTs`$<}eEoXhOMwpzMKCKG zMb0MALRz>DJOMf3O!NdK#3}*V;0P7RXijX{d}+V()iK5^|C>9{^#e`oGwUSU_rKew Br|kd$ diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Utilities/CustomMotionTexture/ExampleScene.unity b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Utilities/CustomMotionTexture/ExampleScene.unity index eec5f4c059854530821c5df8b2b2f93fc160f9a5..dac806391dd6ee9baab7d49c31722690cc4c5be5 100644 GIT binary patch literal 35512 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 Zj#}r&Ng^RnR;Md%TLRnk))OrIe*pwEgk}H$ literal 34816 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 diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugMotionVectors.mat b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugMotionVectors.mat index 986567c91fcf134a175f3e981921386cae703af1..9bf45d9052d59fd576dcc8329d0b1c24dfd8a072 100644 GIT binary patch literal 5100 zcmeI0ONH!m9WqQ(O%M>ufdY6$E9U)57g?JgnSr^vTm_3NsCe~<2= zx$dSBCAF2!9ir(z_x*{Gh5}x!oor>2XH^>!ouelFK@bjdEMNVcP6i$T7PnF z5j2nUJv@!}sz{0@3wn@>kC{$)+x&JN`e)|nrCn!*@GT+Ywcn)5K*BTfb>&Sf8&?mo-5RLpA_y_3IAAOsoV z>$>_6asCjsTz%fB%jx%LJdd-VpnnoZ{fBWh`gxtVZ!^Bd@`4lBBbIkLaXm_o#{9JB z?J>fXyjwm+ua&pQE$`9!Jclv;dBXA)&UN{mnRt7h>pn%Ut=Gxt)0TJ359l+W%<(fY zHst>>nEBjBp3;A}j;~nm))Bv#x-G8b zYj(a{$L*H8b$s1&w~lXsFIUGMsV~rEBG`zYpYYZ`` zl4hj1tl|Yq=42lI$(fm0YmEn?muN@AAdF&(q$7|6DEDuHF~O`Y*R^ zA08Mvd+v)5H?I8s>KSwX^v{Jk|MI@?KKtm`p@~bwU$?EgxxUluWT2CQP6j#|=wzUi zf&ZTYz88+FZyMyCuI=sz%zFTMWi(dR*rqVjxQu|;S)xF?0+I&YT zkJbH{`>@;0)$tWQzk#g~zhk85`8LGn`mh?LTts|9;8*qpVH__JUb2SyE1TRy-Fzpx zl|H{6lqV~dpt-EmOSE;2Q(gprytyT=EcIRc!aAD$oz~;`6KpM$aApQQ8RYwaRuh|N zJ01C0sn5sBaDa^{SD^9RM!A&_J2@TH_0`;Os2DdL^m#v;x$}qBOn}=F_0gv??N)v{ z8;#$CkiTiAMEM571yq{= literal 2265 zcmd5-O>@&Q5WVMDsE2Y&I=17sv2SUTwi)U+)FlisOh&fXjzE?&mRuSb{yQr<4sKyM zaLC|;CfRT8uHHL-KaOsQd*b$vAI4YYs6HZ^7GW)z-VU>qRF-|uaow;t7z~WobIB{u zbt-4Q&nq?sg z+)?0p!O-);8~R={O3s4(Jaq%d&r(QepXlud!w;KUnsBdS`&CvM-eNV2=5ai~yS2$~ zSh3b6-R!RDTH#F41n(o1rXppcSW;}3(EAolWsUk6JCj|_+rCU{rDb^!0*ilBLyZ*- zOgN=04DmpVh;Hywrl^c5lOStKTTrC{V}JZ)lgIQCvPC5~P-%v86#j8YL#rrP5AZY- zk2|{oSzXlS#-y@p<7-WHU134b=VX*d9jBBVeJ;=yU|B;|G48d43i=dxh;T{rjdxxM`fT^omQR4%QcoP5*gk?$VUkhuju~ejEjT zI>;2t)g_k{q1PhP4&HWaWYE>Z(4^Kf&k=}EPFqofO#5g1(qpRh1xKiEz}p6CH|wRT zl`{d#!2hoVR=mB3oFjGNTSe`@o_1L~(Ic55#2N;*$r{!hm$DWJtqzj-PO+b6tdU>~ zz3zl<8*dyOul0yaDfQaahl^@pezK-Q0J82rTfBj^=Cry-vg3yEy2Zv-x@*P0h_}la z(vJU!cNNoEeq&IsCXypr??+<)B0(T$BYzb3OzcVVY`6p`*P>d-9Qg#z@kDbx8}py2 C40_W5 diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugQuad.mat b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugQuad.mat index 0b0ce303640d15d98b779e8865a31d1dbb45ef55..e84b61ccd552cb43383f4e42f6978cda5d4c66bc 100644 GIT binary patch literal 5092 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 literal 2061 zcmcgtOHOi4Ta?_J4paMMl? zJy-{gz3+$i+ry9N@eK)&!p`Bt`4u@R4~V6CR7!3)$LuIoMYkV>VbtmMdXC!<$(w!{ zxYLQL1!KI+NiAdndGYuJC&Zq`yE0Ku& z$hd&%7)5?IWTq0mNc8dt|CSaIk;nOH1?dxLuam4O1Kp548FWcra)ws-PPX^oC3dq$ zgIn*FrFXFTrZmI27n69JB-6WF@8^c+D_hX@HmT4PCz38P18FRkDVO=2VtJ(9B|TOp z@)N8DyPDRO7?sAV;vOW%{l0_}Bj`DE#%eV2K=YWcF&|eF#*K5ps?cWC7(m;fzj)^f zeFiquY7N?Qq$BaKZ8`RgV(|bk6ZyQA>ygDpS*)Ea&vv?A#FiQZ`n@xb>DWn1g=4-% zBHl9^j4w?H zo?Z!MOj~uiOH)y{*$Bi@%#yyel3=m86pA9M`C;E8$F@Tbxcr2VN~^LAG4AMXO{#`| zHxc_9V`DD_qF{xK-bmfFeNj*65{yIER|lTFxra>P#=$W_?k=AC9W<=RiaE5e!`n42 zvAC3SyJ~3H^>yxoeyx!dO4*eQ1Bbu?q5Ad(Tpk4={DnC zn2+-W(uV%051LzyvJxm3BPEo6t-Sw5h{c762%P(S>2Hd6H9^>*8W$Skh{!08H;Ut3 GiT?t)SwMyW diff --git a/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Utilities/CustomMotionTexture/Materials/WheelMotionVectors.mat b/Unity_2018_Frozen/Assets/Unity-Technologies/PostProcessing/Utilities/CustomMotionTexture/Materials/WheelMotionVectors.mat index 44d2b53adf46171a62f97ec6a020775f579ebdeb..016bd0e2ff9d6440ba2880f6cf8c476e0191be1d 100644 GIT binary patch literal 5100 zcmeI0O>h)N6vy9gK1hOJhzbZuMEpXHqN1WmAR&PWO9C6f^0Ew@PIh#5Cp9yRNtLB@ zvedhlRdA59$_rJN#R(3c^kS7awLIX*5e{7NL|I7u|GQ_J?IafEeVclj?q9$D&+GSQ zm);TSxhS&ws)(!-xd#`K?E~8fwoPx7n+ppIg#y6+qzen5Ub?*T#^tqhS5AyyJG<`8 zni6Oc^WB_Ads!sKk_A0TMGE-$RfnYK3zBvMQp#9CdeQ#{{0>};mKWs@Xl%lm{v9oR z06I@#+>_1aIv*A#{XWy_YVmK?VSL8FD6KjxEHB7@=%0fQ?7CKA&24nHjLwymKOvXvJ1xj(%7Ky?DtO13~!C|F3U}v`!HracjGFl z_IKiB6_<;16}dJy&U-C4^?DOy?rSxSjdf%`Yv_~TM~Fs#4g5Xy8IOKUQgSzM571e2 zH*agm(U{Los3Y@6owbB1d8e++>5Q+lyvy0|gWzVr-A-NBlWXgC>axLdqu+-*^1d6v z&3#?{hv>hXTCP5y)8+L0GhW2($LODdQU76Fjeb$*?dyzhw!FjH*CUp9I{Vr}j>i17 z=Iv3!l)OtmK`+nSW0rU8d|tqq@jPz%3g^E3oSFUhIQM;$Tw9Nm&#jhs$+ze;pUm-7 zFgE7x8`Sp)^!e;RO^8;I6CojhgyZXI8;+^r+NFLhg7 z$5*VsTgM%iyLEika<`7JfiG9bo#fiwI=*gsmoT5KBlE`ZEjE5%@$(MT`yC`qm+p7B zkfSZ$?+{^1?(TQka(BObEqC`j0>0dSN6EFh`{nnj;azeJ5pci!?%WR(>Bn5R z&cojrF%M&~LJPl<@i!Lnn;Ac_i1TLDIhgU1m#E110-2adqMajCeiB9_bBSuie%RP0 z^~$IpsIk51On6BR9qm`Hc~dIlwCUN-0X6?_7)`|h2mP5^Quk&@18;`o;bxqK^&_f* zm4}33qgW!Dk(1&vA!z+8`}LK7u6Ee2J{QQk z&o}QF8W=u*;j<4m^!|MHoSEPF9&c_*D6TeR*RimU=6t91`2GY(%OsqhMo$L$ z`#-CR&9ik!yuErpPKE*;M7aWu?=~uVKCE*(sOzh_-%v3gI_UFxG`{mk)O3Ky5%tki znRcFEdZY1u5b`&r^hiYK$mDZRJ#03TjB8z+yK)k##!OPf&U487-9sE6*96#hut#J4m_+hBE@)m@5h7y?!~JARm4p`+>u8C*n_U}hI)Cq$P0!1Mj6Hy8}8HSp1! z!1wIei?N}KVIK7m((V`gPO}wNnn@9%GfnlH)>0$aCtYqB%~NSW#hW zmk9mH8K;XGxcofuSqR7?Aj=>2TU^ozJ#HxFu{4l#1(~GM?r^ff8C3^|h9if%kBW+A z5gPlWaS)8dU`T^-7^I{0Y@DAHf9wr2LQ~vFX19g#VU48@_m=LyNtHnr>v_CLlEvMv zOLoJGjVbYVU!w1nbAeN+M`(iuVWL=JXqGT-3udwcdjg%wt`<#Srj<6byr%-dzpH2k z2nIHsHVQ&K;3CFbD9VD$n6?SB8rl+TO(FKD&n|g_pJ=vJa!ZwApau6XSQdZi>VXjN4oke1s>Hmj66Yn;_9b?eFUCy3HR`0FF&^;v zB=gS_gO@~;`Gk09!_!et&x2u>k4EA7FbIi`thhr=lF zb0vWqVR$yP*O^1HWnRRQ_I%V4HkmJ@@#`9TS_X9)ivxaZuiz9)I^beBU<$DR|zEt z=RZCwW&nKcP_Czv!_I97;{F29!|H`KP&k=7i9yyY0p`|_(}6pz1#kxm?jURTUzKKS A2><{9