private void OnGUI()
    {
        // Save Control Group
        GUILayout.BeginHorizontal();
        autoSave = GUILayout.Toggle(autoSave, "Auto-Save");
        if (!autoSave && GUILayout.Button("Save"))
        {
            ManualSave();
        }
        GUILayout.EndHorizontal();

        // Quest Creation, Deletion, Editing, and Selection Crontrol Group
        GUILayout.Label("Editing: " + s_QManager.targetObject.name, EditorStyles.boldLabel);
        questIndex = EditorGUILayout.Popup("Select Quest: ", questIndex, m_QManager.Quests.Select(x => x.Name).ToArray());
        EditorGUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace();
        if (GUILayout.Button("Add Quest", GUILayout.ExpandWidth(true), GUILayout.MinWidth(100), GUILayout.MaxWidth(150)))
        {
            m_QManager.AddQuest();
        }
        if (GUILayout.Button("Delete Quest", GUILayout.ExpandWidth(true), GUILayout.MinWidth(100), GUILayout.MaxWidth(150)))
        {
            if (questIndex > 0)
            {
                m_Quests.DeleteArrayElementAtIndex(questIndex);
                questIndex--;
                m_Quest = m_Quest.GetArrayElementAtIndex(questIndex);
            }
            else
            {
                return;
            }
        }
        EditorGUILayout.EndHorizontal();

        // Isolate selected Quest
        m_Quest = m_Quests.GetArrayElementAtIndex(questIndex);
        SerializedProperty questName        = m_Quest.FindPropertyRelative("Name");
        SerializedProperty questDescription = m_Quest.FindPropertyRelative("Description");
        SerializedProperty questRewardType  = m_Quest.FindPropertyRelative("RewardTypes");
        SerializedProperty questReward      = m_Quest.FindPropertyRelative("QuestReward");

        // Begin Modification Control
        EditorGUI.BeginChangeCheck();
        s_QManager.Update();

        // Quest Stage Creation, Deletion, Editing, and Selection Control Group
        questStageIndex = EditorGUILayout.Popup("Select Quest Stage: ", questStageIndex, m_QManager.Quests[questIndex].QuestStages.Select(x => x.stageName).ToArray());
        EditorGUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace();
        if (GUILayout.Button("Add Stage", GUILayout.ExpandWidth(true), GUILayout.MinWidth(100), GUILayout.MaxWidth(150)))
        {
            m_QManager.AddStage(m_QManager.Quests[questIndex]);
        }
        if (GUILayout.Button("Delete Stage", GUILayout.ExpandWidth(true), GUILayout.MinWidth(100), GUILayout.MaxWidth(150)))
        {
            m_QManager.DeleteStage(m_QManager.Quests[questIndex], m_QManager.Quests[questIndex].QuestStages[questStageIndex]);
        }
        EditorGUILayout.EndHorizontal();

        // Isolate selected Quest Stage
        IEnumerator questStageEnum = m_Quest.GetEnumerator();

        while (questStageEnum.MoveNext())
        {
            SerializedProperty current = questStageEnum.Current as SerializedProperty;
            if (current.name == "QuestStages")
            {
                m_QuestStages = current; break;
            }
        }
        m_QuestStage = m_QuestStages.GetArrayElementAtIndex(questStageIndex);
        SerializedProperty questStageName        = m_QuestStage.FindPropertyRelative("stageName");
        SerializedProperty questStageDescription = m_QuestStage.FindPropertyRelative("stageDescription");
        SerializedProperty questStageHidden      = m_QuestStage.FindPropertyRelative("stageHidden");
        SerializedProperty questStageOptional    = m_QuestStage.FindPropertyRelative("stageOptional");

        InsertGUISpaces(2);
        EditorGUILayout.LabelField("Quest[" + questIndex + "]: " + m_QManager.Quests[questIndex].Name);
        EditorGUILayout.PropertyField(questName);
        EditorGUILayout.PropertyField(questDescription);
        EditorGUILayout.PropertyField(questReward);
        InsertGUISpaces(2);
        EditorGUILayout.LabelField("Stage[" + questStageIndex + "]: " + m_QManager.Quests[questIndex].QuestStages[questStageIndex].stageName);
        EditorGUILayout.PropertyField(questStageName);
        EditorGUILayout.PropertyField(questStageDescription);
        EditorGUILayout.PropertyField(questStageHidden);
        EditorGUILayout.PropertyField(questStageOptional);

        EditorGUI.EndChangeCheck();
        // End Modification Control

        // Automatic Saving
        if (GUI.changed && autoSave)
        {
            Undo.RecordObject(s_QManager.targetObject, "save");
            s_QManager.ApplyModifiedProperties();
            EditorUtility.SetDirty(s_QManager.targetObject);
            AssetDatabase.SaveAssets();
            Debug.LogWarning("Auto-Saved: " + s_QManager.targetObject.name);
        }
    }