public static void MirrorTangent <T>(this PathEditorTool <T> pathEditorTool) where T : ScriptablePath
        {
            var targets = pathEditorTool.targets;

            foreach (var target in targets)
            {
                var path = pathEditorTool.GetPath(target);

                if (path.selection.Count == 0)
                {
                    continue;
                }

                path.undoObject.RegisterUndo("Mirror Tangents");

                for (var i = 0; i < path.pointCount; ++i)
                {
                    if (!path.selection.Contains(i))
                    {
                        continue;
                    }

                    path.MirrorTangent(i);
                }

                pathEditorTool.SetPath(target);
            }
        }
        public static void CycleTangentMode <T>(this PathEditorTool <T> pathEditorTool) where T : ScriptablePath
        {
            var first       = true;
            var mixed       = false;
            var tangentMode = TangentMode.Linear;
            var targets     = pathEditorTool.targets;

            foreach (var target in targets)
            {
                var path = pathEditorTool.GetPath(target);

                if (path.selection.Count == 0)
                {
                    continue;
                }

                for (var i = 0; i < path.pointCount; ++i)
                {
                    if (!path.selection.Contains(i))
                    {
                        continue;
                    }

                    var point = path.GetPoint(i);

                    if (first)
                    {
                        first       = false;
                        tangentMode = point.tangentMode;
                    }
                    else if (point.tangentMode != tangentMode)
                    {
                        mixed = true;
                        break;
                    }
                }

                if (mixed)
                {
                    break;
                }
            }

            if (mixed)
            {
                tangentMode = TangentMode.Linear;
            }
            else
            {
                tangentMode = GetNextTangentMode(tangentMode);
            }

            foreach (var target in targets)
            {
                var path = pathEditorTool.GetPath(target);

                if (path.selection.Count == 0)
                {
                    continue;
                }

                path.undoObject.RegisterUndo("Cycle Tangent Mode");

                for (var i = 0; i < path.pointCount; ++i)
                {
                    if (!path.selection.Contains(i))
                    {
                        continue;
                    }

                    path.SetTangentMode(i, tangentMode);
                }

                pathEditorTool.SetPath(target);
            }
        }