diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..139742de1649a92ebbd8ecc4a38db9420a3cecc6
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,53 @@
+image: node:latest
+
+stages:
+  - build
+  - test
+  - deploy
+
+build-job:
+  stage: build
+  script:
+    - echo "Building application..."
+#     - npm install -g eas-cli
+#     - npm ci
+#     - EXPO_TOKEN=$EAS_TOKEN eas build --platform android --platform ios --profile production --non-interactive
+    - echo "Application successfully built."
+
+test-job:
+  stage: test
+  script:
+    - echo "Running unit tests..."
+    - echo "Unit tests complete"
+
+deploy-job:
+  stage: deploy
+  environment: production
+  script:
+    - echo "Deploying application..."
+#     - curl -o builds/my-app.apk "$(eas build:status --json | jq -r '.artifacts.buildUrl')"
+    - echo "Application successfully deployed."
+#   artifacts:
+#     paths:
+#       - builds/my-app.apk
+  rules:
+    - if: '$CI_COMMIT_BRANCH == "main"'
+  dependencies:
+    - build-job
+
+
+# # à supprimer à l'avenir
+# # deploy-job-test:
+# #   stage: deploy
+# #   environment: production
+# #   script:
+# #     - echo "Deploying application..."
+# #     - curl -o builds/my-app.apk "$(eas build:status --json | jq -r '.artifacts.buildUrl')"
+# #     - echo "Application successfully deployed."
+# #   artifacts:
+# #     paths:
+# #       - builds/my-app.apk
+# #   rules:
+# #     - if: '$CI_COMMIT_BRANCH == "develop"'
+# #   dependencies:
+# #     - build-job
\ No newline at end of file
diff --git a/App.tsx b/App.tsx
index 2633a5c53b4b0793c035e273e18c5c191533a240..4b3b1c00d3e7960846bc4969b9106cd7d09e05ae 100644
--- a/App.tsx
+++ b/App.tsx
@@ -3,17 +3,38 @@ import {I18nextProvider, useTranslation} from "react-i18next";
 import i18n from "./translation/i18n"; // Importez l'instance déjà initialisée
 import { SafeAreaProvider } from "react-native-safe-area-context";
 import StackNavigator from "./routes/StackNavigator";
-import Question from "./screens/Question/Question";
+import { useEffect } from 'react';
+import * as SplashScreen from 'expo-splash-screen';
+import {QueryClient, QueryClientProvider} from "@tanstack/react-query";
+const queryClient = new QueryClient();
+
 export default function App() {
-    LogBox.ignoreAllLogs(true);
+    // LogBox.ignoreAllLogs(true);
+    useEffect(() => {
+      async function prepare() {
+        try {
+          await SplashScreen.preventAutoHideAsync(); // affichage
+          
+          // Chargement des fonts, appels API externes, etc...
+          
+          // On fait une pause 2 sec pour simuler un chargement lent
+          await new Promise(resolve => setTimeout(resolve, 2000));
+  
+        } catch (e) { console.warn(e); } finally {
+          await SplashScreen.hideAsync(); // masquage
+        }
+      } prepare(); }, []);
+
 
   const { t } = useTranslation();
   return (
-    <SafeAreaProvider>
-        <I18nextProvider i18n={i18n}>
-            <StackNavigator/>
-        </I18nextProvider>
-    </SafeAreaProvider>
+    <QueryClientProvider client={queryClient}>
+      <SafeAreaProvider>
+          <I18nextProvider i18n={i18n}>
+              <StackNavigator/>
+          </I18nextProvider>
+      </SafeAreaProvider>
+    </QueryClientProvider>
   );
 }
 
diff --git a/app.json b/app.json
index 74d20a723fc8508cdff49ce848df7a8e10300ff3..c930458a7a7a4c98a26c08f93a60de55ca561be3 100644
--- a/app.json
+++ b/app.json
@@ -3,12 +3,13 @@
     "name": "vili",
     "slug": "vili",
     "version": "1.0.0",
+    "newArchEnabled": true,
     "orientation": "portrait",
     "icon": "./assets/icon.png",
     "userInterfaceStyle": "light",
     "splash": {
-      "image": "./assets/splash.png",
-      "resizeMode": "contain",
+      "image": "./assets/splashscreen.png",
+      "resizeMode": "cover",
       "backgroundColor": "#ffffff"
     },
     "ios": {
@@ -22,6 +23,11 @@
     },
     "web": {
       "favicon": "./assets/favicon.png"
+    },
+    "extra": {
+      "eas": {
+        "projectId": "8ee47c40-1e74-451c-972a-e1cc75ab11ff"
+      }
     }
   }
 }
diff --git a/assets/BackgroundQuestion.png b/assets/BackgroundQuestion.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa5cdaa069e93679016f12bd8b8989e1b15ed607
Binary files /dev/null and b/assets/BackgroundQuestion.png differ
diff --git a/assets/FondDuo.png b/assets/FondDuo.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2abf1e8d90e9daf13cc5217a54b9ae861103cc2
Binary files /dev/null and b/assets/FondDuo.png differ
diff --git a/assets/GoBackNavigation.png b/assets/GoBackNavigation.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ce5f9c1812181299641b7ecf871b5f404a0d05f
Binary files /dev/null and b/assets/GoBackNavigation.png differ
diff --git a/assets/GoHomeNavigation.png b/assets/GoHomeNavigation.png
new file mode 100644
index 0000000000000000000000000000000000000000..68b716cb9fcb970acf527989ac09384f53062bf9
Binary files /dev/null and b/assets/GoHomeNavigation.png differ
diff --git a/assets/ImageGenerateQuiz.png b/assets/ImageGenerateQuiz.png
new file mode 100644
index 0000000000000000000000000000000000000000..47a561544bbad44158e1165cf92d583942b2527f
Binary files /dev/null and b/assets/ImageGenerateQuiz.png differ
diff --git a/assets/MenuBackground.png b/assets/MenuBackground.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e9ece3d28dbf3b8b4e92329d3e6486d13561184
Binary files /dev/null and b/assets/MenuBackground.png differ
diff --git a/assets/Name.png b/assets/Name.png
new file mode 100644
index 0000000000000000000000000000000000000000..48c1d284cce9aa4a66f1d8cfd47f84b5cfa72d2c
Binary files /dev/null and b/assets/Name.png differ
diff --git a/assets/ProfilBaseImage.png b/assets/ProfilBaseImage.png
new file mode 100644
index 0000000000000000000000000000000000000000..123c902c001c1d4dd715c364adb55b21d129860d
Binary files /dev/null and b/assets/ProfilBaseImage.png differ
diff --git a/assets/TitleApp.png b/assets/TitleApp.png
new file mode 100644
index 0000000000000000000000000000000000000000..40dba7c972a9121502a2e3fa6bac3af9072cea51
Binary files /dev/null and b/assets/TitleApp.png differ
diff --git a/assets/add.png b/assets/add.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ca8aad752ac7e6f52cb5fd353a3955526ea037c
Binary files /dev/null and b/assets/add.png differ
diff --git a/assets/icon.png b/assets/icon.png
index a0b1526fc7b78680fd8d733dbc6113e1af695487..faee7622c57c0e59493f8dffdf1998d64e14b981 100644
Binary files a/assets/icon.png and b/assets/icon.png differ
diff --git a/assets/splashscreen.png b/assets/splashscreen.png
new file mode 100644
index 0000000000000000000000000000000000000000..7fb90c52530abcbaf7a7f980aeef669199e6d076
Binary files /dev/null and b/assets/splashscreen.png differ
diff --git a/assets/stars.png b/assets/stars.png
new file mode 100644
index 0000000000000000000000000000000000000000..09c430621cb58984d1b88f1e46e5d71c2b9a3284
Binary files /dev/null and b/assets/stars.png differ
diff --git a/assets/uWin.png b/assets/uWin.png
new file mode 100644
index 0000000000000000000000000000000000000000..9456efb9f5b9be207760a222ab4871ea3d73eac8
Binary files /dev/null and b/assets/uWin.png differ
diff --git a/components/Multiplayer/ModalCreateLobby.tsx b/components/Multiplayer/ModalCreateLobby.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..831538c03dcaecd042919dbb6a30e31cd89a5493
--- /dev/null
+++ b/components/Multiplayer/ModalCreateLobby.tsx
@@ -0,0 +1,97 @@
+import { Modal, View, Text, TextInput, StyleSheet } from "react-native";
+import WhiteButton from "../buttons/WhiteButton";
+import BlueButton from "../buttons/BlueButton";
+import { useState } from "react";
+
+interface Props {
+    showModal: boolean;
+    onClosePressed: () => void;
+    onPlayPressed: (nbPlayer: number) => void;
+}
+
+export default function ModalCreateLobby({showModal, onClosePressed, onPlayPressed}: Props) {
+    const [nbPlayer, setNbPlayer] = useState<number>(1);
+    return (
+        <Modal visible={showModal} animationType="slide" transparent={true}>
+            <View style={styles.centeredView}>
+                <View style={styles.modalView}>
+                    <Text style={styles.title}>CREATE A LOBBY</Text>
+                    <View style={styles.inputGroup}>
+                        <Text>NUMBER OF PLAYER</Text>
+                        <TextInput style={styles.input} defaultValue={nbPlayer.toString()} onChangeText={(text) => setNbPlayer(Number(text))}/>
+                    </View>
+                    <View style={styles.buttonGroup}>
+                        <View style={styles.button}>
+                            <WhiteButton text="CLOSE" onPress={onClosePressed} isDisabled={false}/>
+                        </View>   
+                        <View style={styles.button}>
+                            <BlueButton text="PLAY" onPress={() => onPlayPressed(nbPlayer)} isDisabled={false}/>
+                        </View>
+                    </View>
+                </View>
+            </View>
+        </Modal>
+    );
+}
+
+const styles = StyleSheet.create({
+    centeredView: {
+        flex: 1,
+        justifyContent: 'center',
+        alignItems: 'center',
+        backgroundColor: 'rgba(0, 0, 0, 0.5)'
+    },
+    modalView: {
+        display: 'flex',
+        justifyContent: 'space-between',
+        height: 400,
+        width: '90%',
+        margin: '10%',
+        padding: '5%',
+        backgroundColor: 'white',
+        borderRadius: 20,
+        alignItems: 'center',
+        shadowColor: '#000',
+        shadowOffset: {
+            width: 0,
+            height: 2,
+        },
+        shadowOpacity: 0.25,
+        shadowRadius: 4,
+        elevation: 5,
+    },
+    buttonGroup: {
+        flexDirection: 'row',
+        justifyContent: 'space-between',
+        width: '100%',
+    },
+    button: {
+        width: '45%',
+    },
+    title: {
+        fontSize: 40,
+        fontWeight: "bold",
+        color: "#00b3f4",
+        marginBottom: 10,
+        alignSelf: "center", // Centre uniquement le titre
+        textAlign: 'center',
+    },
+    inputGroup: {
+        width: '100%',
+        marginBottom: 20,
+    },
+    input: {
+        width: "100%",
+        height: 70,
+        backgroundColor: "white",
+        borderColor: "#2ec7ff",
+        borderWidth: 3,
+        borderRadius: 8,
+        paddingLeft: 10,
+        elevation: 5,
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: 4 },
+        shadowOpacity: 0.25,
+        shadowRadius: 3.84,
+    },
+});
\ No newline at end of file
diff --git a/components/Multiplayer/ModalInvitePlayer.tsx b/components/Multiplayer/ModalInvitePlayer.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..de1e14c9a6b0bf469f19a9e37e74e695260e6870
--- /dev/null
+++ b/components/Multiplayer/ModalInvitePlayer.tsx
@@ -0,0 +1,75 @@
+import { Modal, View, Text, StyleSheet, Image } from "react-native";
+import WhiteButton from "../buttons/WhiteButton";
+
+interface Props {
+    showModal: boolean;
+    onClosePressed: () => void;
+    roomId?: string;
+}
+
+export default function ModalInvitePlayer({showModal, onClosePressed, roomId}: Props) {
+    return (
+        <Modal visible={showModal} animationType="slide" transparent={true}>
+            <View style={styles.centeredView}>
+                <View style={styles.modalView}>
+                    <Text style={styles.title}>JOIN</Text>
+                    <Image source={require('../../assets/favicon.png')}/>
+                    <Text style={styles.or}>OR</Text>
+                    <Text style={styles.link}>Room ID: {roomId}</Text>
+                    <View style={styles.buttonGroup}>
+                        <WhiteButton text="CLOSE" onPress={onClosePressed} isDisabled={false}/>
+                    </View>
+                </View>
+            </View>
+        </Modal>
+    );
+}
+
+const styles = StyleSheet.create({
+    centeredView: {
+        flex: 1,
+        justifyContent: 'center',
+        alignItems: 'center',
+        backgroundColor: 'rgba(0, 0, 0, 0.5)'
+    },
+    modalView: {
+        display: 'flex',
+        justifyContent: 'space-between',
+        height: '50%',
+        width: '90%',
+        margin: '10%',
+        padding: '5%',
+        backgroundColor: 'white',
+        borderRadius: 20,
+        alignItems: 'center',
+        shadowColor: '#000',
+        shadowOffset: {
+            width: 0,
+            height: 2,
+        },
+        shadowOpacity: 0.25,
+        shadowRadius: 4,
+        elevation: 5,
+    },
+    buttonGroup: {
+        flexDirection: 'row',
+        justifyContent: 'space-between',
+        width: '100%',
+    },
+    title: {
+        fontSize: 40,
+        fontWeight: "bold",
+        color: "#00b3f4",
+        marginBottom: 10,
+        alignSelf: "center",
+        textAlign: 'center',
+    },
+    or: {
+        fontSize: 32,
+    },
+    link: {
+        color: '#0000EE',
+        fontSize: 22,
+        fontWeight: "bold",
+    }
+});
\ No newline at end of file
diff --git a/components/PlayQuiz/AboutAQuiz.tsx b/components/PlayQuiz/AboutAQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ed0162622452fc1ef302a33e4310012f2b7c3ec5
--- /dev/null
+++ b/components/PlayQuiz/AboutAQuiz.tsx
@@ -0,0 +1,58 @@
+import React from "react";
+import { View, Text, StyleSheet } from "react-native";
+import  {Quiz} from "../../models/Quiz";
+import {QuizInformations} from "../../models/QuizInformations";
+import {RunInformations} from "../../models/RunInformations";
+
+interface Props {
+    runInformations?: RunInformations;
+    quizInformations?: QuizInformations;
+}
+export default function AboutAQuiz({runInformations, quizInformations} : Props) {
+    return (
+        <View style={styles.container}>
+            <Text style={styles.title}>About this quiz</Text>
+            <View style={styles.separator} />
+            <View style={styles.infoContainer}>
+                <Text style={styles.text}>Category : {quizInformations ? quizInformations.category.name : "?"}</Text>
+                {/*<Text style={styles.text}>Question : {quizInformations ? quizInformations.o : "?"}/{quiz ? quiz.questionCount : "?"}</Text>*/}
+                <Text style={styles.text}>Score : {runInformations ? runInformations.score : "?"}</Text>
+            </View>
+
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        backgroundColor: "white", // Fond blanc
+        borderRadius: 10, // Coins arrondis
+        padding: 20, // Espacement intérieur
+        shadowColor: "#000", // Couleur de l'ombre
+        shadowOffset: { width: 0, height: 4 }, // Décalage de l'ombre
+        shadowOpacity: 0.25, // Opacité de l'ombre
+        shadowRadius: 3.84, // Flou de l'ombre
+        elevation: 5, // Ombre pour Android
+        marginVertical: 10, // Espacement vertical
+    },
+    title: {
+        fontSize: 18,
+        fontWeight: "bold",
+        marginBottom: 10, // Espacement entre le titre et le séparateur
+    },
+    separator: {
+        height: 3, // Épaisseur de la ligne
+        backgroundColor: "#ddd", // Couleur de la ligne
+        marginBottom: 15, // Espacement entre la ligne et le contenu
+    },
+    text: {
+        fontSize: 16,
+        fontWeight: "bold",
+        marginBottom: 10, // Espacement entre la catégorie et les informations
+    },
+    infoContainer: {
+        flexDirection: "column", // Aligne les éléments horizontalement
+        justifyContent: "space-between", // Aligne les éléments verticalement
+        gap: 10, // Espacement entre les informations
+    },
+});
diff --git a/components/PlayQuiz/InputPlayQuiz.tsx b/components/PlayQuiz/InputPlayQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4a4d5cf08ae498fb6ec8fa48b2c37f72551e964e
--- /dev/null
+++ b/components/PlayQuiz/InputPlayQuiz.tsx
@@ -0,0 +1,62 @@
+import React from "react";
+import { TextInput, View, StyleSheet, Text } from "react-native";
+
+interface Props {
+    title?: string;
+    setText: (text: string) => void;
+    noTitle?: boolean;
+    placeholder?: string;
+    numeric?: boolean;
+    defaultValue?: string;
+    isSecure?: boolean;
+}
+
+export default function InputPlayQuiz({ title, setText, noTitle, placeholder, numeric, defaultValue, isSecure=false }: Props) {
+    return (
+        <View style={styles.container}>
+            {!noTitle && title && <Text style={styles.title}>{title}</Text>}
+            <TextInput
+                style={styles.input}
+                placeholder={placeholder || ""}
+                placeholderTextColor="#bebebe"
+                keyboardType={numeric ? "numeric" : "default"} // Clavier conditionnel
+                onChangeText={(text) => {
+                    setText(text);
+                }}
+                defaultValue={defaultValue}
+                secureTextEntry={isSecure}
+            />
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        display: "flex",
+        flexDirection: "column",
+        alignItems: "flex-start",
+        width: "100%",
+    },
+    input: {
+        width: "100%",
+        height: 70,
+        backgroundColor: "white",
+        borderColor: "#2ec7ff",
+        borderWidth: 3,
+        borderRadius: 8,
+        paddingLeft: 10,
+        elevation: 5,
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: 4 },
+        shadowOpacity: 0.25,
+        shadowRadius: 3.84,
+    },
+    title: {
+        fontSize: 20,
+        fontWeight: "bold",
+        marginBottom: 5,
+        color: "#333",
+        textAlign: "left",
+        width: "100%",
+    },
+});
diff --git a/components/PlayQuiz/PlayQuizMod.tsx b/components/PlayQuiz/PlayQuizMod.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..803b11740fd6799932d11dfa7db19a44e2ccc81e
--- /dev/null
+++ b/components/PlayQuiz/PlayQuizMod.tsx
@@ -0,0 +1,9 @@
+import {View, Text} from "react-native";
+
+export default function PlayQuizMod() {
+    return (
+        <View>
+            <Text>PlayQuizMod</Text>
+        </View>
+    )
+}
\ No newline at end of file
diff --git a/components/PlayQuiz/RunStartedList.tsx b/components/PlayQuiz/RunStartedList.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..34da38583da6b151ca2c3c9db5536301a31968d4
--- /dev/null
+++ b/components/PlayQuiz/RunStartedList.tsx
@@ -0,0 +1,130 @@
+import React from "react";
+import { FlatList, View, Text, StyleSheet, TouchableOpacity, ActivityIndicator } from "react-native";
+import {RunsInformationsAllRuns} from "../../models/RunsInformationsAllRuns";
+
+
+
+/**
+ * QuizList : Un composant affichant une liste de quiz avec leur titre, nombre de questions, et catégorie.
+ *
+ * @component
+ *
+ * @param navigation - Propriété de navigation utilisée pour naviguer vers l'écran "InformationsOfQuiz".
+ * @param quizList - Liste des quiz à afficher. Peut être null ou undefined.
+ * @param isLoadingData - Boolean indiquant si les données sont en cours de chargement.
+ *
+ * @example
+ * <QuizList
+ *     navigation={navigation}
+ *     quizList={quizzes}
+ *     isLoadingData={isLoading}
+ * />
+ *
+ * @description
+ * - Ce composant gère trois états :
+ *   1. Chargement : Affiche un spinner si `isLoadingData` est true.
+ *   2. Liste des quiz : Affiche une liste interactive des quiz si `quizList` contient des éléments.
+ *   3. Liste vide : Affiche un message si `quizList` est vide.
+ *
+ * - Chaque quiz affiche :
+ *   - Son code en tant que titre.
+ *   - Son nombre total de questions.
+ *   - Sa catégorie, affichée en majuscules.
+ *
+ * @returns Un composant React contenant une liste interactive de quiz ou des messages en fonction de l'état.
+ */
+interface Props {
+    runList: RunsInformationsAllRuns[] | undefined;
+    onRunPressed:(runInfo: RunsInformationsAllRuns) => void;
+    isLoadingData: boolean;
+}
+export default function RunStartedList({ runList, isLoadingData, onRunPressed }: Props) {
+    const renderQuizItem = ({ item }: { item: RunsInformationsAllRuns }) => (
+        <TouchableOpacity style={styles.quizItem} onPress={() => onRunPressed(item)}>
+            <Text style={styles.quizTitle}>{item.quiz.name ? item.quiz.name : item.id}</Text>
+            <Text style={styles.quizDetails}>{item.quiz.category ? item.quiz.category.name : "Community quiz"}</Text>
+        </TouchableOpacity>
+    );
+
+    return (
+        <View style={styles.container}>
+            {isLoadingData ? (
+                <View style={styles.loadingContainer}>
+                    <ActivityIndicator size="large" color="#2b73fe" />
+                    <Text style={styles.loadingText}>Loading quizzes...</Text>
+                </View>
+            ) : runList && runList.length > 0 ? (
+                <FlatList
+                    data={runList}
+                    renderItem={renderQuizItem}
+                    keyExtractor={(item) => item.id}
+                    showsVerticalScrollIndicator={true}
+                    contentContainerStyle={styles.listContent}
+                />
+            ) : (
+                <Text style={styles.emptyMessage}>No quizzes available.</Text>
+            )}
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        flex: 1,
+        backgroundColor: "white",
+        padding: 10,
+        borderRadius: 10,
+        borderColor: "#fafafa",
+        borderWidth: 3,
+        elevation: 5, // Ombre pour Android
+        shadowColor: "#000", // Ombre pour iOS
+        shadowOffset: { width: 0, height: 4 },
+        shadowOpacity: 0.25,
+        shadowRadius: 3.84,
+        width: "100%", // Assurez-vous que le conteneur occupe toute la largeur
+    },
+    listContent: {
+    },
+    quizItem: {
+        backgroundColor: "#f3f3f3",
+        padding: 15,
+        borderRadius: 10,
+        marginVertical: 5,
+        elevation: 3, // Ombre pour Android
+        shadowColor: "#000", // Ombre pour iOS
+        shadowOffset: { width: 0, height: 2 },
+        shadowOpacity: 0.2,
+        shadowRadius: 2,
+        width: "100%",
+        alignSelf: "center", // Centre les éléments dans leur conteneur
+    },
+    quizTitle: {
+        fontSize: 22,
+        fontWeight: "bold",
+        color: "#000",
+        marginBottom: 5,
+        textAlign: "center",
+    },
+    quizDetails: {
+        fontSize: 18,
+        color: "#555",
+        textAlign: "center",
+    },
+    emptyMessage: {
+        fontSize: 18,
+        color: "#888",
+        textAlign: "center",
+        marginTop: 20,
+    },
+    loadingContainer: {
+        flex: 1,
+        justifyContent: "center",
+        alignItems: "center",
+    },
+    loadingText: {
+        fontSize: 16,
+        color: "#555",
+        marginTop: 10,
+        textAlign: "center",
+    },
+});
diff --git a/components/PlayQuiz/SelectListBoxCategory.tsx b/components/PlayQuiz/SelectListBoxCategory.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..95715e1670eafdd2140aebc8788a4d80e28cff98
--- /dev/null
+++ b/components/PlayQuiz/SelectListBoxCategory.tsx
@@ -0,0 +1,84 @@
+import { View, StyleSheet, Text } from "react-native";
+import { SelectList } from "react-native-dropdown-select-list";
+import React from "react";
+import { Category } from "../../models/Quiz";
+
+interface Props {
+    data: Category[], // La liste des catégories
+    setSelected: (val: Category) => void, // Fonction pour gérer la sélection d'une catégorie
+    title: string, // Titre affiché au-dessus de la liste
+}
+
+export default function SelectListBoxCategory({ data, setSelected, title }: Props) {
+    // Transformer les données dans le format attendu
+    const transformedData = data.map((category) => ({
+        key: category.id.toString(), // Sauvegarde l'ID en tant que clé
+        value: category.name, // Affiche le nom
+    }));
+
+    return (
+        <View style={styles.container}>
+            <View style={styles.dropdownContainer}>
+                <Text style={styles.title}>{title}</Text>
+                <SelectList
+                    setSelected={(key: string) => {
+                        // Trouver la catégorie sélectionnée à partir de son ID
+                        const selectedCategory = data.find((category) => category.id.toString() === key);
+                        if (selectedCategory) {
+                            setSelected(selectedCategory);
+                        }
+                    }}
+                    data={transformedData} // Données transformées pour SelectList
+                    save="key" // Sauvegarde la clé (ID)
+                    dropdownStyles={styles.dropdownStyles}
+                    boxStyles={styles.boxStyles}
+                    inputStyles={styles.inputStyles}
+                />
+            </View>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        alignItems: "center",
+        width: "100%",
+    },
+    dropdownContainer: {
+        width: "100%",
+    },
+    title: {
+        fontSize: 20,
+        fontWeight: "bold",
+        marginBottom: 5,
+        color: "#333",
+        textAlign: "left",
+    },
+    dropdownStyles: {
+        position: "absolute",
+        width: "100%",
+        top: 40,
+        zIndex: 2,
+        backgroundColor: "white",
+        borderColor: "black",
+        borderWidth: 1,
+        borderRadius: 8,
+    },
+    boxStyles: {
+        backgroundColor: "white",
+        borderColor: "#bebebe",
+        borderWidth: 2,
+        borderRadius: 8,
+        height: 70,
+        alignItems: "center",
+        elevation: 5,
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: 4 },
+        shadowOpacity: 0.25,
+        shadowRadius: 3.84,
+    },
+    inputStyles: {
+        fontSize: 18,
+        color: "black",
+    },
+});
diff --git a/components/PlayQuiz/SelectListBoxString.tsx b/components/PlayQuiz/SelectListBoxString.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..5bca1d5d01701c01dea451389bc92ac08f4687a1
--- /dev/null
+++ b/components/PlayQuiz/SelectListBoxString.tsx
@@ -0,0 +1,74 @@
+import { View, StyleSheet, Text } from "react-native";
+import { SelectList } from "react-native-dropdown-select-list";
+import React from "react";
+
+interface Props {
+    data: any,
+    setSelected: (val: string) => void,
+    title: string,
+
+}
+
+export default function SelectListBoxString({data, setSelected, title} : Props) {
+
+    return (
+        <View style={styles.container}>
+            <View style={styles.dropdownContainer}>
+                <Text style={styles.title}>{title}</Text>
+                <SelectList
+                    setSelected={(val: any) => setSelected(val)}
+                    data={data}
+                    save="value"
+                    dropdownStyles={styles.dropdownStyles} // Applique un style personnalisé au menu déroulant
+                    boxStyles={styles.boxStyles} // Applique un style personnalisé au champ de saisie
+                    inputStyles={styles.inputStyles}
+                />
+            </View>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        alignItems: "center",
+        width: '100%',
+    },
+    dropdownContainer: {
+        width: "100%",
+    },
+    title: {
+        fontSize: 20,
+        fontWeight: "bold", // Met le texte en gras
+        marginBottom: 5, // Ajoute un espace entre le titre et la boîte déroulante
+        color: "#333", // Couleur du texte
+        textAlign: "left", // Aligne le texte à gauche
+    },
+    dropdownStyles: {
+        position: "absolute", // Rend le dropdown flottant
+        width: "100%", // Ajustez la largeur du dropdown
+        top: 40, // Ajustez la position verticale
+        zIndex: 2, // Assure que le menu apparaît au-dessus
+        backgroundColor: "white", // Ajoute une couleur de fond
+        borderColor: "black", // Optionnel : bordure de couleur
+        borderWidth: 1, // Optionnel : épaisseur de la bordure
+        borderRadius: 8, // Optionnel : coins arrondis
+    },
+    boxStyles: {
+        backgroundColor: "white",
+        borderColor: "#bebebe",
+        borderWidth: 2,
+        borderRadius: 8,
+        height: 70, // Hauteur augmentée
+        alignItems: "center",
+        elevation: 5,
+        // Ombre pour iOS
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: 4 }, // Décalage de l'ombre en bas
+        shadowOpacity: 0.25, // Opacité de l'ombre
+        shadowRadius: 3.84, // Flou de l'ombre
+    },
+    inputStyles: {
+        fontSize: 18, // Taille du texte augmentée
+        color: "black", // Couleur du texte
+    },
+});
diff --git a/components/PlayQuiz/SelectMode.tsx b/components/PlayQuiz/SelectMode.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..17a6535d44a7c4c268542903f95ff77d8f48a6cf
--- /dev/null
+++ b/components/PlayQuiz/SelectMode.tsx
@@ -0,0 +1,74 @@
+import { View, Text, StyleSheet, TouchableOpacity } from "react-native";
+import { SelectModeType } from "../../models/SelectModeType";
+
+interface Props {
+    mode: SelectModeType;
+    setMode: (mode: SelectModeType) => void;
+}
+
+export default function SelectMode({ mode, setMode }: Props) {
+    return (
+        <View style={styles.container}>
+            <View style={styles.buttonContainer}>
+                <TouchableOpacity onPress={() => setMode("play")} style={{marginLeft: '10%'}}>
+                    <Text style={[styles.text, mode === "play" && styles.activeText]}>Play a quiz</Text>
+                </TouchableOpacity>
+                <View style={[styles.bar, mode === "play" ? styles.activeBar : styles.inactiveBar]} />
+            </View>
+
+            <View style={styles.buttonContainer}>
+                <TouchableOpacity onPress={() => setMode("join")} style={{marginRight: '10%'}}>
+                    <Text style={[styles.text, mode === "join" && styles.activeText]}>Join a quiz</Text>
+                </TouchableOpacity>
+                <View style={[styles.bar, mode === "join" ? styles.activeBar : styles.inactiveBar]} />
+            </View>
+
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        display: 'flex',
+        width: '100%',
+        height: '10%',
+        flexDirection: 'row',
+        backgroundColor: '#f3f3f3',
+        borderRadius: 10,
+        justifyContent: 'space-around',
+        alignItems: 'center',
+        // Ombre pour Android
+        elevation: 5,
+        // Ombre pour iOS
+        shadowColor: '#000',
+        shadowOffset: { width: 0, height: 4 }, // Décalage de l'ombre en bas
+        shadowOpacity: 0.25, // Opacité de l'ombre
+        shadowRadius: 3.84, // Flou de l'ombre
+    },
+    buttonContainer: {
+        display: 'flex',
+        flexDirection: 'column',
+        width: '40%',
+        alignItems: 'center',
+        gap: "5%",
+    },
+    text: {
+        fontSize: 25,
+        color: '#bebebe',
+    },
+    activeText: {
+        color: '#2ec7ff',
+    },
+    bar: {
+        width: '100%',
+        height: 4,
+        marginTop: 4,
+        borderRadius: 10,
+    },
+    activeBar: {
+        backgroundColor: '#2ec7ff', // Couleur pour le bouton actif
+    },
+    inactiveBar: {
+        backgroundColor: '#bebebe', // Couleur grise pour les boutons inactifs
+    },
+});
diff --git a/components/PlayingQuiz/ComfirmModal.tsx b/components/PlayingQuiz/ComfirmModal.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4b91e825ff3c9e79afc85b554ce4075b5b494881
--- /dev/null
+++ b/components/PlayingQuiz/ComfirmModal.tsx
@@ -0,0 +1,105 @@
+import React from "react";
+import {
+    Modal,
+    View,
+    Text,
+    StyleSheet,
+    TouchableOpacity,
+    TouchableWithoutFeedback,
+} from "react-native";
+import Icon from "react-native-vector-icons/MaterialIcons";
+import BlueButton from "../buttons/BlueButton"; // Pour l'icône de fermeture
+
+interface Props {
+    visible: boolean;
+    onClose: () => void;
+    onConfirm: () => void;
+}
+
+export default function ConfirmModal({ visible, onClose, onConfirm }: Props) {
+    return (
+        <Modal
+            animationType="slide"
+            transparent={true}
+            visible={visible}
+            onRequestClose={onClose} // Ferme la modal en cas d'interaction système
+        >
+            <TouchableWithoutFeedback onPress={onClose}>
+                <View/>
+            </TouchableWithoutFeedback>
+            <View style={styles.modalContainer}>
+                <TouchableOpacity style={styles.closeButton} onPress={onClose}>
+                    <Icon name="close" size={24} color="#000" />
+                </TouchableOpacity>
+                <Text style={styles.title}>WOULD YOU LIKE TO RETURN TO THE MENU ?</Text>
+                <View style={styles.separator} />
+                <View style={styles.buttonContainer}>
+                    <BlueButton text={"CONFIRM"} onPress={onConfirm} isDisabled={false}/>
+                </View>
+            </View>
+        </Modal>
+    );
+}
+
+const styles = StyleSheet.create({
+    overlay: {
+        flex: 1,
+        backgroundColor: "rgba(0, 0, 0, 0.5)",
+    },
+    modalContainer: {
+        position: "absolute",
+        top: "40%",
+        left: "10%",
+        right: "10%",
+        backgroundColor: "white",
+        borderRadius: 10,
+        padding: 20,
+        alignItems: "center",
+        elevation: 5,
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: 2 },
+        shadowOpacity: 0.25,
+        shadowRadius: 4,
+    },
+    closeButton: {
+        position: "absolute",
+        top: 10,
+        right: 10,
+        zIndex: 1,
+    },
+    title: {
+        fontSize: 16,
+        fontWeight: "bold",
+        color: "#000",
+        textAlign: "center",
+        marginVertical: 20,
+    },
+    separator: {
+        width: "100%",
+        height: 2,
+        backgroundColor: "#bebebe",
+        marginVertical: 10,
+    },
+    confirmButton: {
+        backgroundColor: "#1FA9FF",
+        borderRadius: 8,
+        paddingVertical: 10,
+        paddingHorizontal: 20,
+        alignItems: "center",
+        justifyContent: "center",
+        marginTop: 10,
+        width: "80%",
+    },
+    confirmButtonText: {
+        color: "#fff",
+        fontSize: 16,
+        fontWeight: "bold",
+    },
+    buttonContainer: {
+        flexDirection: "row",
+        justifyContent: "space-between",
+        alignItems: "center",
+        width: "80%",
+        marginTop: 10,
+    },
+});
diff --git a/components/PlayingQuiz/EndQuiz/EndQuizListPlayer.tsx b/components/PlayingQuiz/EndQuiz/EndQuizListPlayer.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..819fabeaea65c23577a6e39aa4a746c224d2bb45
--- /dev/null
+++ b/components/PlayingQuiz/EndQuiz/EndQuizListPlayer.tsx
@@ -0,0 +1,86 @@
+import React from "react";
+import { FlatList, View, Text, StyleSheet, Image } from "react-native";
+import {User} from "../../../models/User";
+
+interface Props {
+    users: User[];
+    maxScore: number;
+}
+
+export default function EndQuizListPlayer({ users, maxScore }: Props) {
+    const renderUser = ({ item, index }: { item: User; index: number }) => (
+        <View style={[styles.userContainer, index === 0 && styles.firstPlace]}>
+            <Image
+                source={require("../../../assets/ProfilBaseImage.png")} // Replace with actual profile picture if available
+                style={styles.avatar}
+            />
+            <View style={styles.infoContainer}>
+                <Text style={[styles.username, index === 0 && styles.firstPlaceText]}>
+                    {item.username.toUpperCase()}
+                </Text>
+                <Text style={styles.score}>
+                    {10 + index}/{maxScore} {/* Adjust score logic as needed */}
+                </Text>
+            </View>
+        </View>
+    );
+
+    return (
+        <View style={styles.container}>
+            <FlatList
+                data={users}
+                renderItem={renderUser}
+                keyExtractor={(item) => item.id.toString()}
+                showsVerticalScrollIndicator={false}
+            />
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        width: "100%",
+        padding: 20,
+        backgroundColor: "#fff",
+        borderRadius: 20,
+    },
+    userContainer: {
+        flexDirection: "row",
+        alignItems: "center",
+        backgroundColor: "#f9f9f9",
+        borderRadius: 10,
+        padding: 15,
+        marginBottom: 10,
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: 2 },
+        shadowOpacity: 0.1,
+        shadowRadius: 3,
+        elevation: 2,
+    },
+    firstPlace: {
+        // backgroundColor: "#ffe700",
+        // shadowColor: "#ff9900",
+        // shadowOpacity: 0.3,
+    },
+    avatar: {
+        width: 40,
+        height: 40,
+        borderRadius: 25,
+        marginRight: 15,
+    },
+    infoContainer: {
+        flex: 1,
+    },
+    username: {
+        fontSize: 18,
+        fontWeight: "bold",
+        color: "#333",
+    },
+    firstPlaceText: {
+        // color: "#ff9900",
+    },
+    score: {
+        fontSize: 16,
+        color: "#666",
+    },
+});
diff --git a/components/PlayingQuiz/EndQuiz/UserScore.tsx b/components/PlayingQuiz/EndQuiz/UserScore.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..65836228e260ddff5bbf4f40f77a89320e37072b
--- /dev/null
+++ b/components/PlayingQuiz/EndQuiz/UserScore.tsx
@@ -0,0 +1,79 @@
+import { View, Text, StyleSheet, Image } from "react-native";
+import {User} from "../../../models/User";
+
+interface Props {
+    user: User;
+    score: number;
+    maxScore: number;
+    isFirst: boolean;
+}
+
+export default function UserScore({ user, score, maxScore, isFirst }: Props) {
+
+    function shortenString(input: string): string {
+        if (input.length <= 5) {
+            return input; // Si la chaîne est déjà de 4 caractères ou moins, on la retourne telle quelle
+        }
+        return `${input.slice(0, 5)}...`; // Garde les 4 premiers caractères et ajoute "..."
+    }
+
+    return (
+        <View style={styles.container}>
+            <View style={[styles.avatarContainer, isFirst && styles.firstAvatar]}>
+                <Image
+                    source={require('../../../assets/ProfilBaseImage.png')} // URL de l'avatar ou placeholder
+                    style={styles.avatar}
+                />
+            </View>
+            <Text style={styles.userName}>{shortenString(user.username.toUpperCase())}</Text>
+            <Text style={styles.userScore}>
+                {score}/{maxScore}
+            </Text>
+        </View>
+    );
+}
+
+
+
+const styles = StyleSheet.create({
+    container: {
+        display: "flex",
+        flexDirection: "column",
+        alignItems: "center",
+        justifyContent: "space-around",
+        marginHorizontal: 10,
+    },
+    avatarContainer: {
+        width: 70,
+        height: 70,
+        borderRadius: 50,
+        backgroundColor: "#d9e3f0", // Fond gris clair
+        alignItems: "center",
+        justifyContent: "center",
+    },
+    firstAvatar: {
+        width: 90,
+        height: 90,
+        // borderWidth: 3, // Ajoute une bordure pour le premier utilisateur
+        // borderColor: "#FFD700", // Couleur or pour marquer le premier
+    },
+    avatar: {
+        width: "100%",
+        height: "100%",
+        resizeMode: "cover",
+    },
+    userName: {
+        fontSize: 16,
+        fontWeight: "bold",
+        color: "#000",
+        marginTop: 5,
+        textAlign: "center",
+    },
+    userScore: {
+        fontSize: 14,
+        fontWeight: "500",
+        color: "#333",
+        textAlign: "center",
+        marginTop: 5,
+    },
+});
diff --git a/components/PlayingQuiz/GoHomeButton.tsx b/components/PlayingQuiz/GoHomeButton.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..56f24766d57a1d56f8d761fc9d18eedac4bc3d0e
--- /dev/null
+++ b/components/PlayingQuiz/GoHomeButton.tsx
@@ -0,0 +1,21 @@
+import {Image, StyleSheet, TouchableOpacity} from "react-native";
+import {NavigationProp} from "@react-navigation/native";
+
+interface Props{
+    navigation: NavigationProp<any>
+    onPress: (bool:boolean) => void
+}
+
+
+export default function GoHomeButton({navigation, onPress}: Props){
+    const handleGoHomeButtonPressed = () =>{
+        onPress(true);
+    }
+
+    return (
+        <TouchableOpacity onPress={handleGoHomeButtonPressed}>
+            <Image source={require('../../assets/GoHomeNavigation.png')} />
+        </TouchableOpacity>
+    )
+}
+
diff --git a/components/Profil/LineOfUserStat.tsx b/components/Profil/LineOfUserStat.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..9a718af9ebb75ce9a47cbdd863943a198e93b842
--- /dev/null
+++ b/components/Profil/LineOfUserStat.tsx
@@ -0,0 +1,45 @@
+import {View, Text, StyleSheet} from "react-native";
+
+export interface Props {
+    title: string;
+    value: string;
+    isLast?: boolean;
+}
+
+export default function LineOfUserStat({title, value, isLast}: Props) {
+    return (
+        <>
+            <View style={styles.container}>
+                <Text style={styles.textTitle}>{title} :</Text>
+                <Text style={styles.textValue}>{value}</Text>
+            </View>
+            {!isLast &&<View style={styles.separator} />}
+        </>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        display: "flex",
+        flexDirection: "row",
+        justifyContent: "space-between",
+        width: "85%",
+    },
+    textTitle: {
+        fontWeight: "bold",
+        fontSize: 20,
+        color: "#555",
+    },
+    textValue: {
+        fontStyle: "normal",
+        fontWeight: "bold",
+        fontSize: 20,
+        color: "#00B3F4",
+    },
+    separator: {
+        width: "90%",
+        height: 1,
+        backgroundColor: "#000",
+        marginVertical: 10, // Espacement entre la ligne et les stats
+    },
+});
\ No newline at end of file
diff --git a/components/Profil/StatsOfUsers.tsx b/components/Profil/StatsOfUsers.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..157097eaccb4b5a472041f919b3b7c13ce190a93
--- /dev/null
+++ b/components/Profil/StatsOfUsers.tsx
@@ -0,0 +1,41 @@
+import React from "react";
+import {View, Text, StyleSheet} from "react-native";
+import LineOfUserStat from "./LineOfUserStat";
+import {User} from "../../models/User";
+
+interface Props {
+    user?: User;
+}
+
+export default function StatsOfUsers({user}: Props) {
+    return (
+        <View style={styles.container}>
+            <LineOfUserStat title="Quizzes created" value={user?.stats ? user.stats.quizzesCreated.toString() : "?"} />
+            <LineOfUserStat title="Quizzes played" value={user?.stats ? user.stats.quizzesPlayed.toString() : "?"} />
+            <LineOfUserStat title="Correct answers" value={user?.stats ? user.stats.correctAnswers.toString() : "?"} />
+            <LineOfUserStat title="Total responses" value={user?.stats ? user.stats.totalAnswers.toString() : "?"} isLast={true}/>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        display: "flex",
+        width: "80%",
+        height: "45%",
+        marginTop: "10%",
+        justifyContent: "space-around",
+        alignItems: "center",
+        backgroundColor: "#f9f9f9",
+        borderRadius: 15,
+        shadowColor: "#000",
+        shadowOffset: {
+            width: 0,
+            height: 4,
+        },
+        shadowOpacity: 0.3,
+        shadowRadius: 5,
+        elevation: 5,
+        paddingVertical: 15,
+    },
+});
\ No newline at end of file
diff --git a/components/buttons/AnswerButton.tsx b/components/buttons/AnswerButton.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..5b861da586b2e3dc37366d3ea982c9ac136b67ba
--- /dev/null
+++ b/components/buttons/AnswerButton.tsx
@@ -0,0 +1,83 @@
+import {TouchableOpacity, Text, StyleSheet, View, Image} from "react-native";
+import {ButtonsStyles} from "../../styles/ButtonsStyles";
+import {TextsStyles} from "../../styles/TextsStyles";
+import React from "react";
+
+interface Props{
+    text: string;
+    handleButtonPressed:() => void;
+    buttonStyle?: any;
+    buttonText?: any;
+    indicator?: number | undefined;
+}
+
+/**
+ * AnswerButton : Un bouton par défaut, il possède déjà un style mais on peut le surcharger grâce à la propriété buttonStyle
+ * @param text - Texte du bouton
+ * @param handleButtonPressed - Fonction qui sera exécutée lorsque le bouton sera pressé
+ * @param buttonStyle - Surcharge du style du bouton
+ * @param buttonText - Surcharge du style du texte du bouton
+ */
+export default function AnswerButton({text, handleButtonPressed, buttonStyle, buttonText, indicator}: Props){
+    return(
+        <View style={styles.containerButton}>
+            <TouchableOpacity onPress={handleButtonPressed} style={[styles.defaultButton,buttonStyle]}>
+                {indicator !== undefined && (
+                    <View style={styles.indicator}>
+                       <Text style={styles.indicatorText}>{indicator}</Text>
+                    </View>
+                )}
+                {
+                text.includes('data:image') ?
+                    <Image 
+                        style={[styles.answerImage]}
+                        source={{uri: text}}
+                    />
+                :
+                    text.includes('data:audio') ?
+                    <Text style={[TextsStyles.defaultButtonText, buttonText]}>sound: not supported</Text>
+                    :
+                    <Text style={[TextsStyles.defaultButtonText, buttonText]}>{text}</Text>
+                }
+            </TouchableOpacity>
+        </View>
+    )
+}
+
+const styles = StyleSheet.create({
+    defaultButton: {
+        backgroundColor: "#45128C",
+        padding: 10,
+        alignItems: "center",
+        justifyContent: 'center',
+        borderRadius: 10,
+    },
+    indicator: {
+        position: "absolute",
+        top: "-16%",
+        left: "5%",
+        width: 25,
+        height: 25,
+        borderRadius: 15,
+        backgroundColor: "#D3D3D3",
+        justifyContent: "center",
+        alignItems: "center",
+        zIndex: 1,
+    },
+    indicatorText: {
+        color: "#000",
+        fontWeight: "bold",
+        fontSize: 14,
+    },
+    containerButton: {
+        height: 150, 
+        width: '100%',
+        display: 'flex',
+        alignItems: 'center',
+        justifyContent: 'center'
+    },
+    answerImage: {
+        width: '100%',
+        height: '100%',
+    },
+})
\ No newline at end of file
diff --git a/components/buttons/AnswerButtonImage.tsx b/components/buttons/AnswerButtonImage.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..8716144bd818a697248cf67eddd8e6a29e1b0cb3
--- /dev/null
+++ b/components/buttons/AnswerButtonImage.tsx
@@ -0,0 +1,73 @@
+import {TouchableOpacity, Text, StyleSheet, View, Image} from "react-native";
+import {ButtonsStyles} from "../../styles/ButtonsStyles";
+import {TextsStyles} from "../../styles/TextsStyles";
+
+interface Props{
+    url: string;
+    handleButtonPressed:() => void;
+    buttonStyle?: any;
+    indicator?: number | undefined;
+}
+
+/**
+ * AnswerButtonImage : Un bouton par défaut, il possède déjà un style mais on peut le surcharger grâce à la propriété buttonStyle
+ * @param url - Texte du bouton
+ * @param handleButtonPressed - Fonction qui sera exécutée lorsque le bouton sera pressé
+ * @param buttonStyle - Surcharge du style du bouton
+ * @param buttonText - Surcharge du style du texte du bouton
+ */
+export default function AnswerButtonImage({url, handleButtonPressed, buttonStyle, indicator}: Props){
+    return(
+        <View style={styles.containerButton}>
+            <TouchableOpacity onPress={handleButtonPressed} style={[styles.defaultButton,buttonStyle]}>
+                {indicator !== undefined && (
+                    <View style={styles.indicator}>
+                        <Text style={styles.indicatorText}>{indicator}</Text>
+                    </View>
+                )}
+                <Image 
+                    style={[styles.answerImage]}
+                    source={{uri: url}}
+                />
+            </TouchableOpacity>
+        </View>
+    )
+}
+
+const styles = StyleSheet.create({
+    defaultButton: {
+        backgroundColor: "#45128C",
+        padding: 10,
+        alignItems: "center",
+        justifyContent: 'center',
+        borderRadius: 10,
+    },
+    indicator: {
+        position: "absolute",
+        top: "-16%",
+        left: "5%",
+        width: 25,
+        height: 25,
+        borderRadius: 15,
+        backgroundColor: "#D3D3D3",
+        justifyContent: "center",
+        alignItems: "center",
+        zIndex: 1,
+    },
+    indicatorText: {
+        color: "#000",
+        fontWeight: "bold",
+        fontSize: 14,
+    },
+    answerImage: {
+        width: '100%',
+        height: '100%',
+    },
+    containerButton: {
+        height: 150, 
+        width: '100%',
+        display: 'flex',
+        alignItems: 'center',
+        justifyContent: 'center'
+    }
+})
\ No newline at end of file
diff --git a/components/buttons/BlueButton.tsx b/components/buttons/BlueButton.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..21e78e70a5037352e82f88a5578add164d825409
--- /dev/null
+++ b/components/buttons/BlueButton.tsx
@@ -0,0 +1,48 @@
+import { View, Text, StyleSheet, TouchableOpacity, GestureResponderEvent } from "react-native";
+
+interface Props {
+    onPress: ((event: GestureResponderEvent) => void) | undefined;
+    text: string;
+    buttonStyle?: any;
+    isDisabled: boolean;
+}
+
+export default function BlueButton({ onPress, text, buttonStyle, isDisabled }: Props) {
+    return (
+        <TouchableOpacity
+            style={[
+                styles.container,
+                isDisabled ? styles.disabledContainer : styles.enabledContainer,
+                buttonStyle,
+            ]}
+            onPress={onPress}
+            disabled={isDisabled}
+        >
+            <Text style={[styles.text, isDisabled && styles.disabledText]}>{text}</Text>
+        </TouchableOpacity>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        width: "100%",
+        height: 70,
+        alignItems: "center",
+        justifyContent: "center",
+        borderRadius: 10,
+    },
+    enabledContainer: {
+        backgroundColor: "#2b73fe", // Couleur bleue par défaut
+    },
+    disabledContainer: {
+        backgroundColor: "#b0b0b0", // Gris désactivé
+    },
+    text: {
+        fontSize: 28,
+        color: "white",
+        fontWeight: "bold",
+    },
+    disabledText: {
+        color: "#d0d0d0", // Texte grisé pour un bouton désactivé
+    },
+});
diff --git a/components/DefaultButton.tsx b/components/buttons/DefaultButton.tsx
similarity index 88%
rename from components/DefaultButton.tsx
rename to components/buttons/DefaultButton.tsx
index d4aaa4f740682dfc0d14a4acfa7295cc7ddf1b69..cd0fe2ab6b173a9a9c9d7884e3a92090de0fada6 100644
--- a/components/DefaultButton.tsx
+++ b/components/buttons/DefaultButton.tsx
@@ -1,6 +1,6 @@
 import {TouchableOpacity, Text} from "react-native";
-import {ButtonsStyles} from "../styles/ButtonsStyles";
-import {TextsStyles} from "../styles/TextsStyles";
+import {ButtonsStyles} from "../../styles/ButtonsStyles";
+import {TextsStyles} from "../../styles/TextsStyles";
 
 interface Props{
     text: string;
diff --git a/components/buttons/MenuButton.tsx b/components/buttons/MenuButton.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..a7d38f70e20c8b2a431374cd224be233a39696d4
--- /dev/null
+++ b/components/buttons/MenuButton.tsx
@@ -0,0 +1,32 @@
+import React from "react";
+import {TouchableOpacity, StyleSheet, Text} from "react-native";
+
+interface Props{
+    text: string
+    handleButtonPressed:() => void;
+}
+/**
+ * MenuButton : Bouton du menu principal
+ * @param text - Texte du bouton
+ * @param handleButtonPressed - Fonction qui sera exécutée lorsque le bouton sera pressé
+ */
+export default function MenuButton({text, handleButtonPressed}: Props) {
+    return (
+        <TouchableOpacity onPress={handleButtonPressed}>
+            <Text style={styles.textStyle}>{text}</Text>
+        </TouchableOpacity>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+    },
+    textStyle: {
+        color: '#2ec7ff',
+        fontSize: 50,
+        fontWeight: 'bold',
+    }
+});
\ No newline at end of file
diff --git a/components/buttons/WhiteButton.tsx b/components/buttons/WhiteButton.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..a7025577445843fc3a3c8b2f6a9840caa5dd162b
--- /dev/null
+++ b/components/buttons/WhiteButton.tsx
@@ -0,0 +1,50 @@
+import { View, Text, StyleSheet, TouchableOpacity, GestureResponderEvent } from "react-native";
+
+interface Props {
+    onPress: ((event: GestureResponderEvent) => void) | undefined;
+    text: string;
+    buttonStyle?: any;
+    isDisabled: boolean;
+}
+
+export default function WhiteButton({ onPress, text, buttonStyle, isDisabled }: Props) {
+    return (
+        <TouchableOpacity
+            style={[
+                styles.container,
+                isDisabled ? styles.disabledContainer : styles.enabledContainer,
+                buttonStyle,
+            ]}
+            onPress={onPress}
+            disabled={isDisabled}
+        >
+            <Text style={[styles.text, isDisabled && styles.disabledText]}>{text}</Text>
+        </TouchableOpacity>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        width: "100%",
+        height: 70,
+        alignItems: "center",
+        justifyContent: "center",
+        borderRadius: 10,
+        borderWidth: 5,
+        borderColor: "#508bff",
+    },
+    enabledContainer: {
+        backgroundColor: "white", // Couleur bleue par défaut
+    },
+    disabledContainer: {
+        backgroundColor: "#b0b0b0", // Gris désactivé
+    },
+    text: {
+        fontSize: 28,
+        color: "#508bff",
+        fontWeight: "bold",
+    },
+    disabledText: {
+        color: "#d0d0d0", // Texte grisé pour un bouton désactivé
+    },
+});
diff --git a/components/comboBox/ComboBox.tsx b/components/comboBox/ComboBox.tsx
index d89f42523b0928bd77946059024c5b404f3eb6b5..12ed9f3660f0190815b086285b217c77d43213d2 100644
--- a/components/comboBox/ComboBox.tsx
+++ b/components/comboBox/ComboBox.tsx
@@ -1,7 +1,7 @@
 import React, { useState } from 'react';
 import { View, Text, StyleSheet, Modal, TouchableOpacity, TextInput, Platform } from 'react-native';
 import { Picker } from '@react-native-picker/picker';
-import DefaultButton from "../DefaultButton";
+import DefaultButton from "../buttons/DefaultButton";
 
 interface Props {
     options: string[];
diff --git a/components/lists/QuizList.tsx b/components/lists/QuizList.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..81051a6c0ef0f9ed7e65e530c17672ee4e880d19
--- /dev/null
+++ b/components/lists/QuizList.tsx
@@ -0,0 +1,143 @@
+import React from "react";
+import { FlatList, View, Text, StyleSheet, TouchableOpacity, ActivityIndicator } from "react-native";
+import {Quiz} from "../../models/Quiz";
+import { NavigationProp } from "@react-navigation/native";
+
+
+
+/**
+ * QuizList : Un composant affichant une liste de quiz avec leur titre, nombre de questions, et catégorie.
+ *
+ * @component
+ *
+ * @param navigation - Propriété de navigation utilisée pour naviguer vers l'écran "InformationsOfQuiz".
+ * @param quizList - Liste des quiz à afficher. Peut être null ou undefined.
+ * @param isLoadingData - Boolean indiquant si les données sont en cours de chargement.
+ *
+ * @example
+ * <QuizList
+ *     navigation={navigation}
+ *     quizList={quizzes}
+ *     isLoadingData={isLoading}
+ * />
+ *
+ * @description
+ * - Ce composant gère trois états :
+ *   1. Chargement : Affiche un spinner si `isLoadingData` est true.
+ *   2. Liste des quiz : Affiche une liste interactive des quiz si `quizList` contient des éléments.
+ *   3. Liste vide : Affiche un message si `quizList` est vide.
+ *
+ * - Chaque quiz affiche :
+ *   - Son code en tant que titre.
+ *   - Son nombre total de questions.
+ *   - Sa catégorie, affichée en majuscules.
+ *
+ * @returns Un composant React contenant une liste interactive de quiz ou des messages en fonction de l'état.
+ */
+interface Props {
+    quizList: Quiz[] | null | undefined;
+    isLoadingData: boolean;
+    nextPage?: () => void;
+    onQuizPressed:(quiz: Quiz) => void;
+}
+export default function QuizList({ quizList, isLoadingData, nextPage, onQuizPressed }: Props) {
+    if (quizList) {
+    }
+    const renderQuizItem = ({ item }: { item: Quiz }) => (
+        <TouchableOpacity style={styles.quizItem} onPress={() => onQuizPressed(item)}>
+            <Text style={styles.quizTitle}>{item.name}</Text>
+            <Text style={styles.quizDetails}>
+                {item.questionCount} QUESTIONS | {item.difficulty.name} | {item.author.username}
+            </Text>
+        </TouchableOpacity>
+    );
+
+    return (
+        <View style={styles.container}>
+            {isLoadingData ? (
+                <View style={styles.loadingContainer}>
+                    <ActivityIndicator size="large" color="#2b73fe" />
+                    <Text style={styles.loadingText}>Loading quizzes...</Text>
+                </View>
+            ) : quizList && quizList.length > 0 ? (
+                <FlatList
+                    data={quizList}
+                    renderItem={renderQuizItem}
+                    keyExtractor={(item,index) => item.id+ ""+ index}
+                    showsVerticalScrollIndicator={true}
+                    contentContainerStyle={styles.listContent}
+                    onEndReached={() => {
+                        if (nextPage) {
+                            nextPage();
+                        }
+                    }}
+
+                    onEndReachedThreshold={0.5}
+                />
+            ) : (
+                <Text style={styles.emptyMessage}>No quizzes available.</Text>
+            )}
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        flex: 1,
+        backgroundColor: "white",
+        padding: 10,
+        borderRadius: 10,
+        borderColor: "#fafafa",
+        borderWidth: 3,
+        elevation: 5, // Ombre pour Android
+        shadowColor: "#000", // Ombre pour iOS
+        shadowOffset: { width: 0, height: 4 },
+        shadowOpacity: 0.25,
+        shadowRadius: 3.84,
+        width: "100%", // Assurez-vous que le conteneur occupe toute la largeur
+    },
+    listContent: {
+    },
+    quizItem: {
+        backgroundColor: "#f3f3f3",
+        padding: 15,
+        borderRadius: 10,
+        marginVertical: 5,
+        elevation: 3, // Ombre pour Android
+        shadowColor: "#000", // Ombre pour iOS
+        shadowOffset: { width: 0, height: 2 },
+        shadowOpacity: 0.2,
+        shadowRadius: 2,
+        width: "100%",
+        alignSelf: "center", // Centre les éléments dans leur conteneur
+    },
+    quizTitle: {
+        fontSize: 22,
+        fontWeight: "bold",
+        color: "#000",
+        marginBottom: 5,
+        textAlign: "center",
+    },
+    quizDetails: {
+        fontSize: 18,
+        color: "#555",
+        textAlign: "center",
+    },
+    emptyMessage: {
+        fontSize: 18,
+        color: "#888",
+        textAlign: "center",
+        marginTop: 20,
+    },
+    loadingContainer: {
+        flex: 1,
+        justifyContent: "center",
+        alignItems: "center",
+    },
+    loadingText: {
+        fontSize: 16,
+        color: "#555",
+        marginTop: 10,
+        textAlign: "center",
+    },
+});
diff --git a/components/loading/LoadingIndicator.tsx b/components/loading/LoadingIndicator.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..2520955dc86444de44ffffcfc59c6fece6e491a0
--- /dev/null
+++ b/components/loading/LoadingIndicator.tsx
@@ -0,0 +1,22 @@
+import React from "react";
+import { View, StyleSheet, ActivityIndicator } from "react-native";
+
+export default function LoadingIndicator() {
+    return (
+        <View style={styles.container}>
+            <ActivityIndicator size="large" color="#2b73fe" />
+        </View>
+    );
+}
+
+
+const styles = StyleSheet.create({
+    container: {
+        display: "flex", // Change le type de flex pour que la vue soit centrée
+        width: "100%", // Prend toute la largeur de l'écran
+        height: "100%", // Prend toute la hauteur de l'écran
+        ...StyleSheet.absoluteFillObject, // Prend toute la surface de l'écran
+        justifyContent: "center", // Centre verticalement
+        alignItems: "center", // Centre horizontalement
+    },
+});
diff --git a/components/navigation/HeaderNavigation.tsx b/components/navigation/HeaderNavigation.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..1b17e9c5d42618238fb224a081fc38f9ce5adfd2
--- /dev/null
+++ b/components/navigation/HeaderNavigation.tsx
@@ -0,0 +1,46 @@
+import { View, StyleSheet, Image, TouchableOpacity } from "react-native";
+import { NavigationProp } from "@react-navigation/native";
+import ConfirmModal from "../PlayingQuiz/ComfirmModal";
+
+interface Props {
+    navigation: NavigationProp<any>;
+    buttonGoBack: boolean
+}
+
+/**
+ * HeaderNavigation : Header qui permet de remonter à l'écran précédent
+ * @param navigation - navigation
+ * @param buttonGoBack - boolean qui dit si le bouton de retour doit être affiché
+ */
+export default function HeaderNavigation({ navigation, buttonGoBack }: Props) {
+    return (
+        <View style={styles.container}>
+            {buttonGoBack && ( // Affiche le bouton uniquement si buttonGoBack est true
+                <TouchableOpacity onPress={() => navigation.goBack()} style={styles.goBackContainer}>
+                    <Image source={require('../../assets/GoBackNavigation.png')} />
+                </TouchableOpacity>
+            )}
+            <Image source={require('../../assets/TitleApp.png')} style={styles.titleImage} />
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        flexDirection: 'row', // Alignement en ligne
+        alignItems: 'center', // Centrer les éléments verticalement
+        justifyContent: 'center', // Centrer les éléments horizontalement
+        width: '100%',
+        height: 60, // Ajustez en fonction de votre design
+        position: 'relative', // Pour positionner l'élément de gauche
+    },
+    goBackContainer: {
+        position: 'absolute', // Place l'élément indépendamment
+        left: 10, // Décalé à gauche
+    },
+    titleImage: {
+        width: 170, // Ajustez en fonction de la taille de l'image
+        height: 80,
+        resizeMode: 'contain', // Pour conserver les proportions
+    },
+});
diff --git a/components/progressBar/ProgressBar.tsx b/components/progressBar/ProgressBar.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..fbf4cb5950ec6ab8394cdc2190a6336d6ef640fd
--- /dev/null
+++ b/components/progressBar/ProgressBar.tsx
@@ -0,0 +1,45 @@
+import React from "react";
+import { View, StyleSheet } from "react-native";
+import * as Progress from "react-native-progress";
+
+interface Props {
+    progress: number; // Valeur entre 0 et 1 représentant la progression
+}
+
+export default function ProgressBar({ progress }: Props) {
+    // Limite la progression entre 0 et 1
+    const clampedProgress = Math.min(Math.max(progress, 0), 1);
+
+    // Calcul de la couleur en fonction de la progression
+    const interpolateColor = () => {
+        const startColor = { r: 43, g: 115, b: 254 }; // #45128C (bleu-violet)
+        const endColor = { r: 255, g: 0, b: 0 }; // Rouge
+
+        const r = Math.floor(startColor.r + (endColor.r - startColor.r) * clampedProgress);
+        const g = Math.floor(startColor.g + (endColor.g - startColor.g) * clampedProgress);
+        const b = Math.floor(startColor.b + (endColor.b - startColor.b) * clampedProgress);
+
+        return `rgb(${r}, ${g}, ${b})`;
+    };
+
+    return (
+        <View style={styles.container}>
+            <Progress.Bar
+                progress={clampedProgress}
+                width={null} // Occupe toute la largeur disponible
+                height={25} // Épaisseur de la barre
+                color={interpolateColor()} // Couleur dynamique
+                borderRadius={15} // Bords arrondis
+                unfilledColor="#e0e0e0" // Couleur de fond
+                borderWidth={0} // Supprime la bordure
+            />
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        width: "100%",
+        padding: 10, // Ajoute un espace autour de la barre
+    },
+});
diff --git a/eas.json b/eas.json
new file mode 100644
index 0000000000000000000000000000000000000000..5da8fba7ea28b84bd308080e969f89ea2d0195c7
--- /dev/null
+++ b/eas.json
@@ -0,0 +1,21 @@
+{
+  "cli": {
+    "version": ">= 13.4.2",
+    "appVersionSource": "remote"
+  },
+  "build": {
+    "development": {
+      "developmentClient": true,
+      "distribution": "internal"
+    },
+    "preview": {
+      "distribution": "internal"
+    },
+    "production": {
+      "autoIncrement": true
+    }
+  },
+  "submit": {
+    "production": {}
+  }
+}
diff --git a/helper/QuizHelper.ts b/helper/QuizHelper.ts
index 090314d53e2c6aebff95a5e6b772a9c5fe64e668..85b113777a44c1ab6a95d3b239b33139501226e6 100644
--- a/helper/QuizHelper.ts
+++ b/helper/QuizHelper.ts
@@ -1,50 +1,15 @@
-// src/helpers/QuizHelper.ts
+import {Question} from '../models/Question';
 
-import QuizModel from "../model/QuizModel";
-import QuestionModel from "../model/QuestionModel";
-import he from "he";
+export const shuffleAnswersOfQuiz = (question: Question): Question => {
+    const shuffledAnswers = [...question.answers];
 
-interface ApiQuestion {
-    category: string;
-    correct_answer: string;
-    difficulty: string;
-    incorrect_answers: string[];
-    question: string;
-    type: string;
-}
-
-interface ApiResponse {
-    response_code: number;
-    results: ApiQuestion[];
-}
-
-// Fonction pour transformer les données API en QuizModel
-export const transformToQuizModel = (data: ApiResponse): QuizModel => {
-    const questions: QuestionModel[] = data.results.map((item) => {
-        return {
-            question: he.decode(item.question),
-            answer: shuffleAnswers([...item.incorrect_answers.map((ans) => he.decode(ans)), he.decode(item.correct_answer)]),
-            correctAnswer: item.correct_answer,
-            multiple: item.type === "multiple",
-        };
-    });
+    for (let i = shuffledAnswers.length - 1; i > 0; i--) {
+        const j = Math.floor(Math.random() * (i + 1));
+        [shuffledAnswers[i], shuffledAnswers[j]] = [shuffledAnswers[j], shuffledAnswers[i]];
+    }
 
     return {
-        id: `quiz-${Date.now()}`, // Génère un ID unique pour chaque quiz
-        name: `Quiz - ${data.results[0]?.category || "General Knowledge"}`,
-        category: he.decode(data.results[0]?.category) || "General Knowledge",
-        questions: questions,
-        nbQuestions: questions.length,
-        nbActualQuestion: 1,
-        score: 0,
+        ...question,
+        answers: shuffledAnswers,
     };
-};
-
-// Fonction utilitaire pour mélanger les réponses
-const shuffleAnswers = (answers: string[]): string[] => {
-    for (let i = answers.length - 1; i > 0; i--) {
-        const j = Math.floor(Math.random() * (i + 1));
-        [answers[i], answers[j]] = [answers[j], answers[i]];
-    }
-    return answers;
-};
+};
\ No newline at end of file
diff --git a/helper/UserHelper.ts b/helper/UserHelper.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cfacf0f7b548d75793c77a58c98c95c154aeb5ae
--- /dev/null
+++ b/helper/UserHelper.ts
@@ -0,0 +1,10 @@
+import User from "../models/User";
+
+export const transformToUserModel = (data: any): User => {
+    const user: User = {
+        id: data.id,
+        email: data.email,
+        username: data.username,
+    }
+    return user;
+};
\ No newline at end of file
diff --git a/hooks/UseCookie.ts b/hooks/UseCookie.ts
new file mode 100644
index 0000000000000000000000000000000000000000..050d762989f50be1e63c9adbe084e684b18d0add
--- /dev/null
+++ b/hooks/UseCookie.ts
@@ -0,0 +1,55 @@
+import { useState, useEffect, useCallback } from 'react';
+import AsyncStorage from '@react-native-async-storage/async-storage';
+
+const useCookie = (cookieName: string) => {
+    const [error, setError] = useState<Error | null>(null);
+
+    // Fonction pour sauvegarder le cookie
+    const saveCookie = useCallback(async (value: string, expirationInDays = 7) => {
+        try {
+            await AsyncStorage.setItem(cookieName, value);
+            setError(null);
+        } catch (e) {
+            if(e instanceof Error) {
+                setError(e);
+            }
+            setError(new Error('An error occurred while saving the cookie'));
+        }
+    }, [cookieName]);
+
+    // Fonction pour supprimer le cookie
+    const removeCookie = useCallback(async () => {
+        try {
+            await AsyncStorage.removeItem(cookieName);
+            setError(null);
+        } catch (e) {
+            if(e instanceof Error) {
+                setError(e);
+            }
+            setError(new Error('An error occurred while removing the cookie'));
+        }
+    }, [cookieName]);
+
+    const getCookie = useCallback(async () => {
+        try {
+            const value = await AsyncStorage.getItem(cookieName);
+            setError(null);
+            return value;
+        } catch (e) {
+            if(e instanceof Error) {
+                setError(e);
+            }
+            setError(new Error('An error occurred while getting the cookie'));
+        }
+    }, [cookieName]);
+
+
+    return {
+        error,
+        saveCookie,
+        removeCookie,
+        getCookie,
+    };
+};
+
+export default useCookie;
\ No newline at end of file
diff --git a/model/QuestionModel.ts b/model/QuestionModel.ts
deleted file mode 100644
index 48893ef2af8f154e8df7104625839fd640a37da9..0000000000000000000000000000000000000000
--- a/model/QuestionModel.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export default interface QuestionModel {
-    question: string;
-    answer: string[];
-    correctAnswer: string;
-    multiple: boolean;
-}
\ No newline at end of file
diff --git a/model/QuizModel.ts b/model/QuizModel.ts
deleted file mode 100644
index fd2a7205d1203f56dc4f8af13d773a0d97ce4c43..0000000000000000000000000000000000000000
--- a/model/QuizModel.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import QuestionModel from "./QuestionModel";
-
-export default interface QuizModel {
-    id: string;
-    name: string;
-    category: string;
-    questions: QuestionModel[];
-    nbQuestions: number;
-    nbActualQuestion: number;
-    score: number;
-}
diff --git a/models/Answer.ts b/models/Answer.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9bc373ec31d61c58f42a71b207e146b3ef1f00cc
--- /dev/null
+++ b/models/Answer.ts
@@ -0,0 +1,6 @@
+export interface Answer {
+    id: number;
+    text: string;
+    isCorrect?: boolean;
+    questionId: number;
+}
\ No newline at end of file
diff --git a/models/EDifficulty.ts b/models/EDifficulty.ts
new file mode 100644
index 0000000000000000000000000000000000000000..640dee4aca4fda57bc23fe9b812c7f1bc72134dd
--- /dev/null
+++ b/models/EDifficulty.ts
@@ -0,0 +1,5 @@
+export enum EDifficulty {
+    Easy = "easy",
+    Medium = "medium",
+    Hard = "hard",
+}
\ No newline at end of file
diff --git a/models/Question.ts b/models/Question.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7b7793215a25db91f8a7ff680085eec56562a5c8
--- /dev/null
+++ b/models/Question.ts
@@ -0,0 +1,13 @@
+import {Answer} from "./Answer";
+import {Category} from "./Quiz";
+
+export interface Question {
+    id: number;
+    text: string;
+    type: string;
+    categoryId: number;
+    quizId: string;
+    order: number;
+    answers: Answer[];
+    category: Category;
+}
\ No newline at end of file
diff --git a/models/Quiz.ts b/models/Quiz.ts
new file mode 100644
index 0000000000000000000000000000000000000000..83a628419c4ef3a5d1557ef0f42d4cd17c2d40dd
--- /dev/null
+++ b/models/Quiz.ts
@@ -0,0 +1,36 @@
+import {Question} from "./Question";
+export interface QuizCommunityResponse {
+    quizzes: Quiz[];
+    total: number;
+}
+export interface Difficulty {
+    id: number;
+    name: string;
+}
+
+export interface Category {
+    id: number;
+    name: string;
+}
+
+interface Author {
+    id: number;
+    username: string;
+}
+
+
+export interface Quiz {
+    id: string;
+    name: string;
+    description: string;
+    score: number;
+    questionIndex: number;
+    questionCount: number;
+    categoryId: number;
+    difficultyId: number;
+    author: Author,
+    authorId: number,
+    category?: Category,
+    difficulty: Difficulty,
+    questions: Question[],
+}
\ No newline at end of file
diff --git a/models/QuizGenerateAnswer.ts b/models/QuizGenerateAnswer.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3992ebea68f573e857963b7c82608a8318c4bee0
--- /dev/null
+++ b/models/QuizGenerateAnswer.ts
@@ -0,0 +1,4 @@
+export interface QuizGenerateAnswer {
+    id: string;
+    quizId: string;
+}
\ No newline at end of file
diff --git a/models/QuizInformations.ts b/models/QuizInformations.ts
new file mode 100644
index 0000000000000000000000000000000000000000..32b9aed99bff2ee685625fe520a5092270172bcf
--- /dev/null
+++ b/models/QuizInformations.ts
@@ -0,0 +1,17 @@
+import {Category, Difficulty} from "./Quiz";
+import {User} from "./User";
+
+export interface QuizInformations {
+    id: number;
+    name: string;
+    description: string;
+    isCommunity: boolean;
+    questionCount: number;
+    categoryId: number;
+    difficultyId: number;
+    authorId?: User;
+    createdAt: string;
+    updatedAt: string;
+    category: Category;
+    difficulty: Difficulty;
+}
\ No newline at end of file
diff --git a/models/Response/AllRunsResponse.ts b/models/Response/AllRunsResponse.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8e7c71ceff2654461f8b9d7449932ac94daa7bfc
--- /dev/null
+++ b/models/Response/AllRunsResponse.ts
@@ -0,0 +1,5 @@
+import {RunsInformationsAllRuns} from "../RunsInformationsAllRuns";
+
+export interface AllRunsResponse{
+    runs: RunsInformationsAllRuns[];
+}
\ No newline at end of file
diff --git a/models/Response/AnswerResponse.ts b/models/Response/AnswerResponse.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ab22c33d77756549e0c94b6f824115ba22cf25ee
--- /dev/null
+++ b/models/Response/AnswerResponse.ts
@@ -0,0 +1,16 @@
+import {Answer} from "../Answer";
+import {Category} from "../Quiz";
+
+export interface AnswerResponse {
+    score: number;
+    answers:{
+        id: number;
+        text: string;
+        type:string;
+        categoryId: number;
+        quizId: string;
+        order: number;
+        answers: Answer[];
+    }
+    category: Category;
+}
\ No newline at end of file
diff --git a/models/Response/AnswerWsResponse.ts b/models/Response/AnswerWsResponse.ts
new file mode 100644
index 0000000000000000000000000000000000000000..41d72db73366819090f8461760ecc9413f3f7743
--- /dev/null
+++ b/models/Response/AnswerWsResponse.ts
@@ -0,0 +1,5 @@
+import {Answer} from "../Answer";
+
+export interface AnswerWsResponse {
+    answers: Answer[];
+}
\ No newline at end of file
diff --git a/models/Response/QuestionResponse.ts b/models/Response/QuestionResponse.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ccfd9abec3973b8482f57893f0fbae9f5a711cad
--- /dev/null
+++ b/models/Response/QuestionResponse.ts
@@ -0,0 +1,5 @@
+import {Question} from "../Question";
+
+export interface QuestionResponse {
+    question: Question;
+}
\ No newline at end of file
diff --git a/models/Response/RunsInformationResponse.ts b/models/Response/RunsInformationResponse.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a02f92a99a562756b41f5b4eb29af24628883f1f
--- /dev/null
+++ b/models/Response/RunsInformationResponse.ts
@@ -0,0 +1,5 @@
+import {RunInformations} from "../RunInformations";
+
+export interface RunsInformationResponse {
+    runs: RunInformations[];
+}
\ No newline at end of file
diff --git a/models/RunInformations.ts b/models/RunInformations.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c7b74f0e17d31a1a0346c2a4f5842fcd31a41048
--- /dev/null
+++ b/models/RunInformations.ts
@@ -0,0 +1,14 @@
+import {Category, Difficulty} from "./Quiz";
+import {User} from "./User";
+
+export interface RunInformations {
+    id: string;
+    quizId: string;
+    originalQuizId: string;
+    score: number;
+    questionIndex: number;
+    startDate: string;
+    lastChange: string;
+    quizUserId: number;
+    roomId?: number;
+}
\ No newline at end of file
diff --git a/models/RunsInformationsAllRuns.tsx b/models/RunsInformationsAllRuns.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..0022d662d4d2bca44e16e01da7ef9e9e1561c7ae
--- /dev/null
+++ b/models/RunsInformationsAllRuns.tsx
@@ -0,0 +1,21 @@
+import {Category, Difficulty} from "./Quiz";
+
+export interface QuizInfoRun{
+    category: Category;
+    difficulty: Difficulty;
+    name?: string;
+    questionCount: string;
+    description: string;
+}
+export interface RunsInformationsAllRuns{
+    id: string;
+    quizId: string;
+    originalQuizId: string;
+    score: number;
+    questionIndex: number;
+    startDate: string;
+    lastChange: string;
+    quizUserId: number;
+    roomId: number;
+    quiz: QuizInfoRun;
+}
\ No newline at end of file
diff --git a/models/SelectModeType.ts b/models/SelectModeType.ts
new file mode 100644
index 0000000000000000000000000000000000000000..826e0b8907de246d4b9839ad9632dda45b9d759d
--- /dev/null
+++ b/models/SelectModeType.ts
@@ -0,0 +1,3 @@
+export type SelectModeType = "play" | "join";
+export type ProfilSelectModeType = "login" | "signup";
+export type OnlineSelectModeType = "create" | "join";
\ No newline at end of file
diff --git a/models/User.ts b/models/User.ts
new file mode 100644
index 0000000000000000000000000000000000000000..506d8f03dd326eb6485bf2005f23c8e4887e6da5
--- /dev/null
+++ b/models/User.ts
@@ -0,0 +1,18 @@
+interface Stats {
+    quizzesCreated: number;
+    quizzesPlayed: number;
+    correctAnswers: number;
+    totalAnswers: number;
+}
+export interface User {
+    id: number;
+    email: string;
+    username: string;
+    stats?: Stats;
+}
+
+export enum UserConnectionState {
+    LOADING = "Loading",
+    NOT_CONNECTED = "NotConnected",
+    CONNECTED = "Connected",
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 02eb398dbc92836f58f81752d674cfe1e578d4ba..2a605a2226b077d10f3560a61b36c7d1b97e4f1d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,27 +8,57 @@
       "name": "vili",
       "version": "1.0.0",
       "dependencies": {
-        "@react-native-picker/picker": "2.7.5",
+        "@react-native-async-storage/async-storage": "1.23.1",
+        "@react-native-cookies/cookies": "^6.2.1",
+        "@react-native-picker/picker": "^2.9.0",
+        "@react-navigation/bottom-tabs": "^6.6.1",
         "@react-navigation/native": "^6.1.18",
         "@react-navigation/native-stack": "^6.11.0",
-        "expo": "~51.0.39",
-        "expo-status-bar": "~1.12.1",
+        "@tanstack/react-query": "^5.62.8",
+        "@tanstack/react-query-devtools": "^5.62.8",
+        "axios": "^1.7.9",
+        "dotenv": "^16.4.7",
+        "expo": "~52.0.14",
+        "expo-splash-screen": "^0.29.13",
+        "expo-status-bar": "~2.0.0",
         "he": "^1.2.0",
         "i18n-js": "^4.5.0",
         "i18next": "^23.16.5",
-        "react": "18.2.0",
+        "react": "^18.3.1",
         "react-i18next": "^15.1.1",
-        "react-native": "0.74.5",
-        "react-native-safe-area-context": "4.10.5",
-        "react-native-screens": "3.31.1"
+        "react-native": "0.76.3",
+        "react-native-dropdown-select-list": "^2.0.5",
+        "react-native-progress": "^5.0.1",
+        "react-native-safe-area-context": "^4.12.0",
+        "react-native-screens": "~4.1.0",
+        "react-native-sse": "^1.2.1",
+        "react-native-vector-icons": "^10.2.0",
+        "react-query": "^3.39.3",
+        "rxjs": "^7.8.1",
+        "socket.io-client": "^4.8.1"
       },
       "devDependencies": {
         "@babel/core": "^7.20.0",
         "@types/he": "^1.2.3",
-        "@types/react": "~18.2.45",
+        "@types/react": "~18.3.12",
+        "@types/react-native-vector-icons": "^6.4.18",
         "typescript": "~5.3.3"
       }
     },
+    "node_modules/@0no-co/graphql.web": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.11.tgz",
+      "integrity": "sha512-xuSJ9WXwTmtngWkbdEoopMo6F8NLtjy84UNAMsAr5C3/2SgAL/dEU10TMqTIsipqPQ8HA/7WzeqQ9DEQxSvPPA==",
+      "license": "MIT",
+      "peerDependencies": {
+        "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
+      },
+      "peerDependenciesMeta": {
+        "graphql": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@ampproject/remapping": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
@@ -96,13 +126,13 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.26.2",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
-      "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz",
+      "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==",
       "license": "MIT",
       "dependencies": {
-        "@babel/parser": "^7.26.2",
-        "@babel/types": "^7.26.0",
+        "@babel/parser": "^7.26.3",
+        "@babel/types": "^7.26.3",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^3.0.2"
@@ -123,20 +153,6 @@
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz",
-      "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "@babel/traverse": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
     "node_modules/@babel/helper-compilation-targets": {
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
@@ -175,13 +191,13 @@
       }
     },
     "node_modules/@babel/helper-create-regexp-features-plugin": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz",
-      "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz",
+      "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.25.9",
-        "regexpu-core": "^6.1.1",
+        "regexpu-core": "^6.2.0",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -192,9 +208,9 @@
       }
     },
     "node_modules/@babel/helper-define-polyfill-provider": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
-      "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz",
+      "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-compilation-targets": "^7.22.6",
@@ -207,18 +223,6 @@
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
       }
     },
-    "node_modules/@babel/helper-environment-visitor": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz",
-      "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/types": "^7.24.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
     "node_modules/@babel/helper-member-expression-to-functions": {
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
@@ -317,19 +321,6 @@
         "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/helper-simple-access": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz",
-      "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/traverse": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
     "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
@@ -484,12 +475,12 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.26.2",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
-      "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
+      "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
       "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.26.0"
+        "@babel/types": "^7.26.3"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -582,25 +573,6 @@
         "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz",
-      "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==",
-      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-plugin-utils": "^7.20.2",
-        "@babel/helper-remap-async-to-generator": "^7.18.9",
-        "@babel/plugin-syntax-async-generators": "^7.8.4"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
     "node_modules/@babel/plugin-proposal-class-properties": {
       "version": "7.18.6",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
@@ -650,23 +622,6 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz",
-      "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==",
-      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.20.2",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
     "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
       "version": "7.18.6",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
@@ -684,15 +639,16 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-numeric-separator": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
-      "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
-      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.",
+    "node_modules/@babel/plugin-proposal-optional-chaining": {
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
+      "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
+      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.",
       "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.18.6",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -701,19 +657,12 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
-      "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
-      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.",
+    "node_modules/@babel/plugin-proposal-private-property-in-object": {
+      "version": "7.21.0-placeholder-for-preset-env.2",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+      "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
       "license": "MIT",
-      "dependencies": {
-        "@babel/compat-data": "^7.20.5",
-        "@babel/helper-compilation-targets": "^7.20.7",
-        "@babel/helper-plugin-utils": "^7.20.2",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.20.7"
-      },
+      "peer": true,
       "engines": {
         "node": ">=6.9.0"
       },
@@ -721,61 +670,52 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-optional-catch-binding": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz",
-      "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==",
-      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.",
+    "node_modules/@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
       "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.18.6",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-optional-chaining": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
-      "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
-      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.",
+    "node_modules/@babel/plugin-syntax-bigint": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
       "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.20.2",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-private-property-in-object": {
-      "version": "7.21.0-placeholder-for-preset-env.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
-      "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+    "node_modules/@babel/plugin-syntax-class-properties": {
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
       "license": "MIT",
-      "peer": true,
-      "engines": {
-        "node": ">=6.9.0"
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-async-generators": {
-      "version": "7.8.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
-      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+    "node_modules/@babel/plugin-syntax-class-static-block": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+      "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
       "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
@@ -859,7 +799,6 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
       "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -870,6 +809,30 @@
         "@babel/core": "^7.0.0-0"
       }
     },
+    "node_modules/@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
     "node_modules/@babel/plugin-syntax-jsx": {
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
@@ -957,6 +920,36 @@
         "@babel/core": "^7.0.0-0"
       }
     },
+    "node_modules/@babel/plugin-syntax-private-property-in-object": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+      "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-top-level-await": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
     "node_modules/@babel/plugin-syntax-typescript": {
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
@@ -1009,7 +1002,6 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
       "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "@babel/helper-remap-async-to-generator": "^7.25.9",
@@ -1075,7 +1067,6 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
       "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/helper-create-class-features-plugin": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -1222,13 +1213,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz",
-      "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz",
+      "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==",
       "license": "MIT",
       "peer": true,
       "dependencies": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
       },
       "engines": {
@@ -1274,7 +1264,6 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz",
       "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
@@ -1339,7 +1328,6 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
       "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1384,14 +1372,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-commonjs": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz",
-      "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
+      "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
       "license": "MIT",
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/helper-simple-access": "^7.25.9"
+        "@babel/helper-module-transforms": "^7.26.0",
+        "@babel/helper-plugin-utils": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1473,7 +1460,6 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz",
       "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1489,7 +1475,6 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
       "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1539,7 +1524,6 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
       "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1555,7 +1539,6 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
       "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
@@ -1731,7 +1714,6 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz",
       "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "regenerator-transform": "^0.15.2"
@@ -1875,9 +1857,9 @@
       }
     },
     "node_modules/@babel/plugin-transform-typescript": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz",
-      "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz",
+      "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.25.9",
@@ -2076,9 +2058,9 @@
       }
     },
     "node_modules/@babel/preset-react": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz",
-      "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz",
+      "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
@@ -2177,10 +2159,29 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@babel/traverse--for-generate-function-map": {
+      "name": "@babel/traverse",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.3.tgz",
+      "integrity": "sha512-yTmc8J+Sj8yLzwr4PD5Xb/WF3bOYu2C2OoSZPzbuqRm4n98XirsbzaX+GloeO376UnSYIYJ4NCanwV5/ugZkwA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.26.2",
+        "@babel/generator": "^7.26.3",
+        "@babel/parser": "^7.26.3",
+        "@babel/template": "^7.25.9",
+        "@babel/types": "^7.26.3",
+        "debug": "^4.3.1",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
     "node_modules/@babel/types": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
-      "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
+      "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-string-parser": "^7.25.9",
@@ -2203,67 +2204,61 @@
       }
     },
     "node_modules/@expo/cli": {
-      "version": "0.18.31",
-      "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.31.tgz",
-      "integrity": "sha512-v9llw9fT3Uv+TCM6Xllo54t672CuYtinEQZ2LPJ2EJsCwuTc4Cd2gXQaouuIVD21VoeGQnr5JtJuWbF97sBKzQ==",
+      "version": "0.22.1",
+      "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.22.1.tgz",
+      "integrity": "sha512-tpkFzlTYb/sNh8WqeTCa2ZVKMDkPgMggvY3tZeTfxeAO5olVXddKV+0U5zhHSd7pGM2w2fhEJNKI4Ub7IfyDmA==",
       "license": "MIT",
       "dependencies": {
+        "@0no-co/graphql.web": "^1.0.8",
         "@babel/runtime": "^7.20.0",
-        "@expo/code-signing-certificates": "0.0.5",
-        "@expo/config": "~9.0.0-beta.0",
-        "@expo/config-plugins": "~8.0.8",
-        "@expo/devcert": "^1.0.0",
-        "@expo/env": "~0.3.0",
-        "@expo/image-utils": "^0.5.0",
-        "@expo/json-file": "^8.3.0",
-        "@expo/metro-config": "0.18.11",
+        "@expo/code-signing-certificates": "^0.0.5",
+        "@expo/config": "~10.0.4",
+        "@expo/config-plugins": "~9.0.10",
+        "@expo/devcert": "^1.1.2",
+        "@expo/env": "~0.4.0",
+        "@expo/image-utils": "^0.6.0",
+        "@expo/json-file": "^9.0.0",
+        "@expo/metro-config": "~0.19.0",
         "@expo/osascript": "^2.0.31",
         "@expo/package-manager": "^1.5.0",
-        "@expo/plist": "^0.1.0",
-        "@expo/prebuild-config": "7.0.9",
-        "@expo/rudder-sdk-node": "1.1.1",
+        "@expo/plist": "^0.2.0",
+        "@expo/prebuild-config": "^8.0.17",
+        "@expo/rudder-sdk-node": "^1.1.1",
         "@expo/spawn-async": "^1.7.2",
         "@expo/xcpretty": "^4.3.0",
-        "@react-native/dev-middleware": "0.74.85",
-        "@urql/core": "2.3.6",
-        "@urql/exchange-retry": "0.3.0",
+        "@react-native/dev-middleware": "0.76.3",
+        "@urql/core": "^5.0.6",
+        "@urql/exchange-retry": "^1.3.0",
         "accepts": "^1.3.8",
-        "arg": "5.0.2",
+        "arg": "^5.0.2",
         "better-opn": "~3.0.2",
         "bplist-creator": "0.0.7",
         "bplist-parser": "^0.3.1",
         "cacache": "^18.0.2",
         "chalk": "^4.0.0",
         "ci-info": "^3.3.0",
+        "compression": "^1.7.4",
         "connect": "^3.7.0",
         "debug": "^4.3.4",
         "env-editor": "^0.4.1",
         "fast-glob": "^3.3.2",
-        "find-yarn-workspace-root": "~2.0.0",
         "form-data": "^3.0.1",
-        "freeport-async": "2.0.0",
+        "freeport-async": "^2.0.0",
         "fs-extra": "~8.1.0",
         "getenv": "^1.0.0",
-        "glob": "^7.1.7",
-        "graphql": "15.8.0",
-        "graphql-tag": "^2.10.1",
-        "https-proxy-agent": "^5.0.1",
-        "internal-ip": "4.3.0",
+        "glob": "^10.4.2",
+        "internal-ip": "^4.3.0",
         "is-docker": "^2.0.0",
         "is-wsl": "^2.1.1",
-        "js-yaml": "^3.13.1",
-        "json-schema-deref-sync": "^0.13.0",
         "lodash.debounce": "^4.0.8",
-        "md5hex": "^1.0.0",
         "minimatch": "^3.0.4",
-        "node-fetch": "^2.6.7",
         "node-forge": "^1.3.1",
-        "npm-package-arg": "^7.0.0",
-        "open": "^8.3.0",
-        "ora": "3.4.0",
+        "npm-package-arg": "^11.0.0",
+        "ora": "^3.4.0",
         "picomatch": "^3.0.1",
-        "pretty-bytes": "5.6.0",
-        "progress": "2.0.3",
+        "pretty-bytes": "^5.6.0",
+        "pretty-format": "^29.7.0",
+        "progress": "^2.0.3",
         "prompts": "^2.3.2",
         "qrcode-terminal": "0.11.0",
         "require-from-string": "^2.0.2",
@@ -2272,17 +2267,17 @@
         "resolve-from": "^5.0.0",
         "resolve.exports": "^2.0.2",
         "semver": "^7.6.0",
-        "send": "^0.18.0",
+        "send": "^0.19.0",
         "slugify": "^1.3.4",
         "source-map-support": "~0.5.21",
         "stacktrace-parser": "^0.1.10",
         "structured-headers": "^0.4.1",
-        "tar": "^6.0.5",
+        "tar": "^6.2.1",
         "temp-dir": "^2.0.0",
         "tempy": "^0.7.1",
         "terminal-link": "^2.1.1",
-        "text-table": "^0.2.0",
-        "url-join": "4.0.0",
+        "undici": "^6.18.2",
+        "unique-string": "~2.0.0",
         "wrap-ansi": "^7.0.0",
         "ws": "^8.12.1"
       },
@@ -2290,6 +2285,50 @@
         "expo-internal": "build/bin/cli"
       }
     },
+    "node_modules/@expo/cli/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/@expo/cli/node_modules/glob": {
+      "version": "10.4.5",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+      "license": "ISC",
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^1.11.1"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@expo/cli/node_modules/glob/node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/@expo/cli/node_modules/semver": {
       "version": "7.6.3",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
@@ -2313,39 +2352,40 @@
       }
     },
     "node_modules/@expo/config": {
-      "version": "9.0.4",
-      "resolved": "https://registry.npmjs.org/@expo/config/-/config-9.0.4.tgz",
-      "integrity": "sha512-g5ns5u1JSKudHYhjo1zaSfkJ/iZIcWmUmIQptMJZ6ag1C0ShL2sj8qdfU8MmAMuKLOgcIfSaiWlQnm4X3VJVkg==",
+      "version": "10.0.6",
+      "resolved": "https://registry.npmjs.org/@expo/config/-/config-10.0.6.tgz",
+      "integrity": "sha512-xXkfPElrtxznkOZxFASJ7OPa6E9IHSjcZwj5BQ6XUF2dz5M7AFa2h5sXM8AalSaDU5tEBSgoUOjTh5957TlR8g==",
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "~7.10.4",
-        "@expo/config-plugins": "~8.0.8",
-        "@expo/config-types": "^51.0.3",
-        "@expo/json-file": "^8.3.0",
+        "@expo/config-plugins": "~9.0.10",
+        "@expo/config-types": "^52.0.0",
+        "@expo/json-file": "^9.0.0",
+        "deepmerge": "^4.3.1",
         "getenv": "^1.0.0",
-        "glob": "7.1.6",
+        "glob": "^10.4.2",
         "require-from-string": "^2.0.2",
         "resolve-from": "^5.0.0",
+        "resolve-workspace-root": "^2.0.0",
         "semver": "^7.6.0",
         "slugify": "^1.3.4",
-        "sucrase": "3.34.0"
+        "sucrase": "3.35.0"
       }
     },
     "node_modules/@expo/config-plugins": {
-      "version": "8.0.11",
-      "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.11.tgz",
-      "integrity": "sha512-oALE1HwnLFthrobAcC9ocnR9KXLzfWEjgIe4CPe+rDsfC6GDs8dGYCXfRFoCEzoLN4TGYs9RdZ8r0KoCcNrm2A==",
+      "version": "9.0.11",
+      "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-9.0.11.tgz",
+      "integrity": "sha512-zufuPQWkeEpXfMWFx2lWStoN43p6cO13p8n2KMIEK6jJMC/kkfldYyl8gYtEEYAL1nFfOf/W2pIXXPQ2sggnSw==",
       "license": "MIT",
       "dependencies": {
-        "@expo/config-types": "^51.0.3",
-        "@expo/json-file": "~8.3.0",
-        "@expo/plist": "^0.1.0",
+        "@expo/config-types": "^52.0.0",
+        "@expo/json-file": "~9.0.0",
+        "@expo/plist": "^0.2.0",
         "@expo/sdk-runtime-versions": "^1.0.0",
         "chalk": "^4.1.2",
-        "debug": "^4.3.1",
-        "find-up": "~5.0.0",
+        "debug": "^4.3.5",
         "getenv": "^1.0.0",
-        "glob": "7.1.6",
+        "glob": "^10.4.2",
         "resolve-from": "^5.0.0",
         "semver": "^7.5.4",
         "slash": "^3.0.0",
@@ -2354,22 +2394,45 @@
         "xml2js": "0.6.0"
       }
     },
+    "node_modules/@expo/config-plugins/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
     "node_modules/@expo/config-plugins/node_modules/glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "version": "10.4.5",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
       "license": "ISC",
       "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^1.11.1"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@expo/config-plugins/node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
       },
       "engines": {
-        "node": "*"
+        "node": ">=16 || 14 >=14.17"
       },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
@@ -2388,9 +2451,9 @@
       }
     },
     "node_modules/@expo/config-types": {
-      "version": "51.0.3",
-      "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-51.0.3.tgz",
-      "integrity": "sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==",
+      "version": "52.0.1",
+      "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-52.0.1.tgz",
+      "integrity": "sha512-vD8ZetyKV7U29lR6+NJohYeoLYTH+eNYXJeNiSOrWCz0witJYY11meMmEnpEaVbN89EfC6uauSUOa6wihtbyPQ==",
       "license": "MIT"
     },
     "node_modules/@expo/config/node_modules/@babel/code-frame": {
@@ -2402,22 +2465,45 @@
         "@babel/highlight": "^7.10.4"
       }
     },
+    "node_modules/@expo/config/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
     "node_modules/@expo/config/node_modules/glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "version": "10.4.5",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
       "license": "ISC",
       "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^1.11.1"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@expo/config/node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
       },
       "engines": {
-        "node": "*"
+        "node": ">=16 || 14 >=14.17"
       },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
@@ -2509,9 +2595,9 @@
       }
     },
     "node_modules/@expo/env": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.3.0.tgz",
-      "integrity": "sha512-OtB9XVHWaXidLbHvrVDeeXa09yvTl3+IQN884sO6PhIi2/StXfgSH/9zC7IvzrDB8kW3EBJ1PPLuCUJ2hxAT7Q==",
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.4.0.tgz",
+      "integrity": "sha512-g2JYFqck3xKIwJyK+8LxZ2ENZPWtRgjFWpeht9abnKgzXVXBeSNECFBkg+WQjQocSIdxXhEWM6hz4ZAe7Tc4ng==",
       "license": "MIT",
       "dependencies": {
         "chalk": "^4.0.0",
@@ -2521,10 +2607,43 @@
         "getenv": "^1.0.0"
       }
     },
+    "node_modules/@expo/fingerprint": {
+      "version": "0.11.3",
+      "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.11.3.tgz",
+      "integrity": "sha512-9lgXmcIePvZ7Wef63XtvuN3HfCUevF4E4tQPdEbH9/dUWwpOvvwQ3KT4OJ9jdh8JJ3nTdO9eDQ/8k8xr1aQ5Kg==",
+      "license": "MIT",
+      "dependencies": {
+        "@expo/spawn-async": "^1.7.2",
+        "arg": "^5.0.2",
+        "chalk": "^4.1.2",
+        "debug": "^4.3.4",
+        "find-up": "^5.0.0",
+        "getenv": "^1.0.0",
+        "minimatch": "^3.0.4",
+        "p-limit": "^3.1.0",
+        "resolve-from": "^5.0.0",
+        "semver": "^7.6.0"
+      },
+      "bin": {
+        "fingerprint": "bin/cli.js"
+      }
+    },
+    "node_modules/@expo/fingerprint/node_modules/semver": {
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/@expo/image-utils": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.5.1.tgz",
-      "integrity": "sha512-U/GsFfFox88lXULmFJ9Shfl2aQGcwoKPF7fawSCLixIKtMCpsI+1r0h+5i0nQnmt9tHuzXZDL8+Dg1z6OhkI9A==",
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.6.3.tgz",
+      "integrity": "sha512-v/JbCKBrHeudxn1gN1TgfPE/pWJSlLPrl29uXJBgrJFQVkViQvUHQNDhaS+UEa9wYI5HHh7XYmtzAehyG4L+GA==",
       "license": "MIT",
       "dependencies": {
         "@expo/spawn-async": "^1.7.2",
@@ -2532,20 +2651,11 @@
         "fs-extra": "9.0.0",
         "getenv": "^1.0.0",
         "jimp-compact": "0.16.1",
-        "node-fetch": "^2.6.0",
         "parse-png": "^2.1.0",
         "resolve-from": "^5.0.0",
         "semver": "^7.6.0",
-        "tempy": "0.3.0"
-      }
-    },
-    "node_modules/@expo/image-utils/node_modules/crypto-random-string": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
-      "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
+        "temp-dir": "~2.0.0",
+        "unique-string": "~2.0.0"
       }
     },
     "node_modules/@expo/image-utils/node_modules/fs-extra": {
@@ -2596,50 +2706,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/@expo/image-utils/node_modules/temp-dir": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz",
-      "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@expo/image-utils/node_modules/tempy": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz",
-      "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==",
-      "license": "MIT",
-      "dependencies": {
-        "temp-dir": "^1.0.0",
-        "type-fest": "^0.3.1",
-        "unique-string": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@expo/image-utils/node_modules/type-fest": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
-      "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
-      "license": "(MIT OR CC0-1.0)",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@expo/image-utils/node_modules/unique-string": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
-      "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==",
-      "license": "MIT",
-      "dependencies": {
-        "crypto-random-string": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/@expo/image-utils/node_modules/universalify": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
@@ -2650,13 +2716,13 @@
       }
     },
     "node_modules/@expo/json-file": {
-      "version": "8.3.3",
-      "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-8.3.3.tgz",
-      "integrity": "sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-9.0.0.tgz",
+      "integrity": "sha512-M+55xFVrFzDcgMDf+52lPDLjKB5xwRfStWlv/b/Vu2OLgxGZLWpxoPYjlRoHqxjPbCQIi2ZCbobK+0KuNhsELg==",
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "~7.10.4",
-        "json5": "^2.2.2",
+        "json5": "^2.2.3",
         "write-file-atomic": "^2.3.0"
       }
     },
@@ -2670,31 +2736,40 @@
       }
     },
     "node_modules/@expo/metro-config": {
-      "version": "0.18.11",
-      "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.11.tgz",
-      "integrity": "sha512-/uOq55VbSf9yMbUO1BudkUM2SsGW1c5hr9BnhIqYqcsFv0Jp5D3DtJ4rljDKaUeNLbwr6m7pqIrkSMq5NrYf4Q==",
+      "version": "0.19.5",
+      "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.19.5.tgz",
+      "integrity": "sha512-wl5lVgXq4FN4kBJHNyU5U9J5hH8S8rYXrp/pgbwA+J/smQfiElYKMYomTGbHUb4LQ0VnmlX6/kI4x/zJk+mq7w==",
       "license": "MIT",
       "dependencies": {
         "@babel/core": "^7.20.0",
         "@babel/generator": "^7.20.5",
         "@babel/parser": "^7.20.0",
         "@babel/types": "^7.20.0",
-        "@expo/config": "~9.0.0-beta.0",
-        "@expo/env": "~0.3.0",
-        "@expo/json-file": "~8.3.0",
+        "@expo/config": "~10.0.4",
+        "@expo/env": "~0.4.0",
+        "@expo/json-file": "~9.0.0",
         "@expo/spawn-async": "^1.7.2",
         "chalk": "^4.1.0",
         "debug": "^4.3.2",
-        "find-yarn-workspace-root": "~2.0.0",
         "fs-extra": "^9.1.0",
         "getenv": "^1.0.0",
-        "glob": "^7.2.3",
+        "glob": "^10.4.2",
         "jsc-safe-url": "^0.2.4",
-        "lightningcss": "~1.19.0",
+        "lightningcss": "~1.27.0",
+        "minimatch": "^3.0.4",
         "postcss": "~8.4.32",
         "resolve-from": "^5.0.0"
       }
     },
+    "node_modules/@expo/metro-config/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
     "node_modules/@expo/metro-config/node_modules/fs-extra": {
       "version": "9.1.0",
       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
@@ -2710,6 +2785,41 @@
         "node": ">=10"
       }
     },
+    "node_modules/@expo/metro-config/node_modules/glob": {
+      "version": "10.4.5",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+      "license": "ISC",
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^1.11.1"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@expo/metro-config/node_modules/glob/node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/@expo/metro-config/node_modules/jsonfile": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
@@ -2732,9 +2842,9 @@
       }
     },
     "node_modules/@expo/osascript": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.3.tgz",
-      "integrity": "sha512-aOEkhPzDsaAfolSswObGiYW0Pf0ROfR9J2NBRLQACdQ6uJlyAMiPF45DVEVknAU9juKh0y8ZyvC9LXqLEJYohA==",
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.4.tgz",
+      "integrity": "sha512-LcPjxJ5FOFpqPORm+5MRLV0CuYWMthJYV6eerF+lQVXKlvgSn3EOqaHC3Vf3H+vmB0f6G4kdvvFtg40vG4bIhA==",
       "license": "MIT",
       "dependencies": {
         "@expo/spawn-async": "^1.7.2",
@@ -2745,21 +2855,21 @@
       }
     },
     "node_modules/@expo/package-manager": {
-      "version": "1.5.2",
-      "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.5.2.tgz",
-      "integrity": "sha512-IuA9XtGBilce0q8cyxtWINqbzMB1Fia0Yrug/O53HNuRSwQguV/iqjV68bsa4z8mYerePhcFgtvISWLAlNEbUA==",
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.6.1.tgz",
+      "integrity": "sha512-4rT46wP/94Ll+CWXtFKok1Lbo9XncSUtErFOo/9/3FVughGbIfdG4SKZOAWIpr9wxwEfkyhHfAP9q71ONlWODw==",
       "license": "MIT",
       "dependencies": {
-        "@expo/json-file": "^8.3.0",
+        "@expo/json-file": "^9.0.0",
         "@expo/spawn-async": "^1.7.2",
         "ansi-regex": "^5.0.0",
         "chalk": "^4.0.0",
         "find-up": "^5.0.0",
-        "find-yarn-workspace-root": "~2.0.0",
         "js-yaml": "^3.13.1",
-        "micromatch": "^4.0.2",
-        "npm-package-arg": "^7.0.0",
+        "micromatch": "^4.0.8",
+        "npm-package-arg": "^11.0.0",
         "ora": "^3.4.0",
+        "resolve-workspace-root": "^2.0.0",
         "split": "^1.0.1",
         "sudo-prompt": "9.1.1"
       }
@@ -2771,9 +2881,9 @@
       "license": "MIT"
     },
     "node_modules/@expo/plist": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.1.3.tgz",
-      "integrity": "sha512-GW/7hVlAylYg1tUrEASclw1MMk9FP4ZwyFAY/SUTJIhPDQHtfOlXREyWV3hhrHdX/K+pS73GNgdfT6E/e+kBbg==",
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.2.0.tgz",
+      "integrity": "sha512-F/IZJQaf8OIVnVA6XWUeMPC3OH6MV00Wxf0WC0JhTQht2QgjyHUa3U5Gs3vRtDq8tXNsZneOQRDVwpaOnd4zTQ==",
       "license": "MIT",
       "dependencies": {
         "@xmldom/xmldom": "~0.7.7",
@@ -2782,27 +2892,30 @@
       }
     },
     "node_modules/@expo/prebuild-config": {
-      "version": "7.0.9",
-      "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.9.tgz",
-      "integrity": "sha512-9i6Cg7jInpnGEHN0jxnW0P+0BexnePiBzmbUvzSbRXpdXihYUX2AKMu73jgzxn5P1hXOSkzNS7umaY+BZ+aBag==",
+      "version": "8.0.23",
+      "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-8.0.23.tgz",
+      "integrity": "sha512-Zf01kFiN2PISmLb0DhIAJh76v3J2oYUKSjiAtGZLOH0HUz59by/qdyU4mGHWdeyRdCCrLUA21Rct2MBykvRMsg==",
       "license": "MIT",
       "dependencies": {
-        "@expo/config": "~9.0.0-beta.0",
-        "@expo/config-plugins": "~8.0.8",
-        "@expo/config-types": "^51.0.3",
-        "@expo/image-utils": "^0.5.0",
-        "@expo/json-file": "^8.3.0",
-        "@react-native/normalize-colors": "0.74.85",
+        "@expo/config": "~10.0.4",
+        "@expo/config-plugins": "~9.0.10",
+        "@expo/config-types": "^52.0.0",
+        "@expo/image-utils": "^0.6.0",
+        "@expo/json-file": "^9.0.0",
+        "@react-native/normalize-colors": "0.76.5",
         "debug": "^4.3.1",
         "fs-extra": "^9.0.0",
         "resolve-from": "^5.0.0",
         "semver": "^7.6.0",
         "xml2js": "0.6.0"
-      },
-      "peerDependencies": {
-        "expo-modules-autolinking": ">=0.8.1"
       }
     },
+    "node_modules/@expo/prebuild-config/node_modules/@react-native/normalize-colors": {
+      "version": "0.76.5",
+      "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.5.tgz",
+      "integrity": "sha512-6QRLEok1r55gLqj+94mEWUENuU5A6wsr2OoXpyq/CgQ7THWowbHtru/kRGRr6o3AQXrVnZheR60JNgFcpNYIug==",
+      "license": "MIT"
+    },
     "node_modules/@expo/prebuild-config/node_modules/fs-extra": {
       "version": "9.1.0",
       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
@@ -2897,9 +3010,9 @@
       }
     },
     "node_modules/@expo/xcpretty": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.1.tgz",
-      "integrity": "sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw==",
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz",
+      "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==",
       "license": "BSD-3-Clause",
       "dependencies": {
         "@babel/code-frame": "7.10.4",
@@ -2938,30 +3051,6 @@
         "js-yaml": "bin/js-yaml.js"
       }
     },
-    "node_modules/@graphql-typed-document-node/core": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz",
-      "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==",
-      "license": "MIT",
-      "peerDependencies": {
-        "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
-      }
-    },
-    "node_modules/@hapi/hoek": {
-      "version": "9.3.0",
-      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
-      "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/@hapi/topo": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
-      "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "@hapi/hoek": "^9.0.0"
-      }
-    },
     "node_modules/@isaacs/cliui": {
       "version": "8.0.2",
       "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -3067,101 +3156,108 @@
         "node": ">=12"
       }
     },
-    "node_modules/@jest/create-cache-key-function": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz",
-      "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==",
-      "license": "MIT",
+    "node_modules/@istanbuljs/load-nyc-config": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+      "license": "ISC",
       "dependencies": {
-        "@jest/types": "^29.6.3"
+        "camelcase": "^5.3.1",
+        "find-up": "^4.1.0",
+        "get-package-type": "^0.1.0",
+        "js-yaml": "^3.13.1",
+        "resolve-from": "^5.0.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=8"
       }
     },
-    "node_modules/@jest/create-cache-key-function/node_modules/@jest/types": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
-      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
       "license": "MIT",
       "dependencies": {
-        "@jest/schemas": "^29.6.3",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^17.0.8",
-        "chalk": "^4.0.0"
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=8"
       }
     },
-    "node_modules/@jest/create-cache-key-function/node_modules/@types/istanbul-reports": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
-      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
       "license": "MIT",
       "dependencies": {
-        "@types/istanbul-lib-report": "*"
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/@jest/create-cache-key-function/node_modules/@types/yargs": {
-      "version": "17.0.33",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
-      "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
       "license": "MIT",
       "dependencies": {
-        "@types/yargs-parser": "*"
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/@jest/environment": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
-      "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
       "license": "MIT",
       "dependencies": {
-        "@jest/fake-timers": "^29.7.0",
-        "@jest/types": "^29.6.3",
-        "@types/node": "*",
-        "jest-mock": "^29.7.0"
+        "p-limit": "^2.2.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=8"
       }
     },
-    "node_modules/@jest/environment/node_modules/@jest/types": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
-      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+    "node_modules/@istanbuljs/schema": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
       "license": "MIT",
-      "dependencies": {
-        "@jest/schemas": "^29.6.3",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^17.0.8",
-        "chalk": "^4.0.0"
-      },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=8"
       }
     },
-    "node_modules/@jest/environment/node_modules/@types/istanbul-reports": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
-      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+    "node_modules/@jest/create-cache-key-function": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz",
+      "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==",
       "license": "MIT",
       "dependencies": {
-        "@types/istanbul-lib-report": "*"
+        "@jest/types": "^29.6.3"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/@jest/environment/node_modules/@types/yargs": {
-      "version": "17.0.33",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
-      "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+    "node_modules/@jest/environment": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+      "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
       "license": "MIT",
       "dependencies": {
-        "@types/yargs-parser": "*"
+        "@jest/fake-timers": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "jest-mock": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/fake-timers": {
@@ -3181,65 +3277,72 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/@jest/fake-timers/node_modules/@jest/types": {
+    "node_modules/@jest/schemas": {
       "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
-      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+      "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
       "license": "MIT",
       "dependencies": {
-        "@jest/schemas": "^29.6.3",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^17.0.8",
-        "chalk": "^4.0.0"
+        "@sinclair/typebox": "^0.27.8"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/@jest/fake-timers/node_modules/@types/istanbul-reports": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
-      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "node_modules/@jest/fake-timers/node_modules/@types/yargs": {
-      "version": "17.0.33",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
-      "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+    "node_modules/@jest/transform": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
+      "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
       "license": "MIT",
       "dependencies": {
-        "@types/yargs-parser": "*"
+        "@babel/core": "^7.11.6",
+        "@jest/types": "^29.6.3",
+        "@jridgewell/trace-mapping": "^0.3.18",
+        "babel-plugin-istanbul": "^6.1.1",
+        "chalk": "^4.0.0",
+        "convert-source-map": "^2.0.0",
+        "fast-json-stable-stringify": "^2.1.0",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^29.7.0",
+        "jest-regex-util": "^29.6.3",
+        "jest-util": "^29.7.0",
+        "micromatch": "^4.0.4",
+        "pirates": "^4.0.4",
+        "slash": "^3.0.0",
+        "write-file-atomic": "^4.0.2"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/@jest/schemas": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
-      "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
-      "license": "MIT",
+    "node_modules/@jest/transform/node_modules/write-file-atomic": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+      "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+      "license": "ISC",
       "dependencies": {
-        "@sinclair/typebox": "^0.27.8"
+        "imurmurhash": "^0.1.4",
+        "signal-exit": "^3.0.7"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
     "node_modules/@jest/types": {
-      "version": "24.9.0",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
-      "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
       "license": "MIT",
       "dependencies": {
+        "@jest/schemas": "^29.6.3",
         "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^1.1.1",
-        "@types/yargs": "^13.0.0"
+        "@types/istanbul-reports": "^3.0.0",
+        "@types/node": "*",
+        "@types/yargs": "^17.0.8",
+        "chalk": "^4.0.0"
       },
       "engines": {
-        "node": ">= 6"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jridgewell/gen-mapping": {
@@ -3369,193 +3472,173 @@
         "node": ">=14"
       }
     },
-    "node_modules/@react-native-community/cli": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-13.6.9.tgz",
-      "integrity": "sha512-hFJL4cgLPxncJJd/epQ4dHnMg5Jy/7Q56jFvA3MHViuKpzzfTCJCB+pGY54maZbtym53UJON9WTGpM3S81UfjQ==",
+    "node_modules/@react-native-async-storage/async-storage": {
+      "version": "1.23.1",
+      "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.23.1.tgz",
+      "integrity": "sha512-Qd2kQ3yi6Y3+AcUlrHxSLlnBvpdCEMVGFlVBneVOjaFaPU61g1huc38g339ysXspwY1QZA2aNhrk/KlHGO+ewA==",
       "license": "MIT",
       "dependencies": {
-        "@react-native-community/cli-clean": "13.6.9",
-        "@react-native-community/cli-config": "13.6.9",
-        "@react-native-community/cli-debugger-ui": "13.6.9",
-        "@react-native-community/cli-doctor": "13.6.9",
-        "@react-native-community/cli-hermes": "13.6.9",
-        "@react-native-community/cli-server-api": "13.6.9",
-        "@react-native-community/cli-tools": "13.6.9",
-        "@react-native-community/cli-types": "13.6.9",
-        "chalk": "^4.1.2",
-        "commander": "^9.4.1",
-        "deepmerge": "^4.3.0",
-        "execa": "^5.0.0",
-        "find-up": "^4.1.0",
-        "fs-extra": "^8.1.0",
-        "graceful-fs": "^4.1.3",
-        "prompts": "^2.4.2",
-        "semver": "^7.5.2"
-      },
-      "bin": {
-        "rnc-cli": "build/bin.js"
+        "merge-options": "^3.0.4"
       },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@react-native-community/cli-clean": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-13.6.9.tgz",
-      "integrity": "sha512-7Dj5+4p9JggxuVNOjPbduZBAP1SUgNhLKVw5noBUzT/3ZpUZkDM+RCSwyoyg8xKWoE4OrdUAXwAFlMcFDPKykA==",
-      "license": "MIT",
-      "dependencies": {
-        "@react-native-community/cli-tools": "13.6.9",
-        "chalk": "^4.1.2",
-        "execa": "^5.0.0",
-        "fast-glob": "^3.3.2"
+      "peerDependencies": {
+        "react-native": "^0.0.0-0 || >=0.60 <1.0"
       }
     },
-    "node_modules/@react-native-community/cli-clean/node_modules/execa": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+    "node_modules/@react-native-cookies/cookies": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/@react-native-cookies/cookies/-/cookies-6.2.1.tgz",
+      "integrity": "sha512-D17wCA0DXJkGJIxkL74Qs9sZ3sA+c+kCoGmXVknW7bVw/W+Vv1m/7mWTNi9DLBZSRddhzYw8SU0aJapIaM/g5w==",
       "license": "MIT",
       "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/@react-native-community/cli-clean/node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
+        "invariant": "^2.2.4"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "peerDependencies": {
+        "react-native": ">= 0.60.2"
       }
     },
-    "node_modules/@react-native-community/cli-clean/node_modules/is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+    "node_modules/@react-native-picker/picker": {
+      "version": "2.9.0",
+      "resolved": "https://registry.npmjs.org/@react-native-picker/picker/-/picker-2.9.0.tgz",
+      "integrity": "sha512-khEhIW/uhfMqq/+tvg4rEAiPGT8GX+Y6QydlP2TSMSmRHoSJK+ShXvXZXSr4Sii4imkj4BwvLunGywwtQDODqg==",
       "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "peerDependencies": {
+        "react": "*",
+        "react-native": "*"
       }
     },
-    "node_modules/@react-native-community/cli-clean/node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+    "node_modules/@react-native/assets-registry": {
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.76.3.tgz",
+      "integrity": "sha512-7Fnc3lzCFFpnoyL1egua6d/qUp0KiIpeSLbfOMln4nI2g2BMzyFHdPjJnpLV2NehmS0omOOkrfRqK5u1F/MXzA==",
       "license": "MIT",
       "engines": {
-        "node": ">=6"
+        "node": ">=18"
       }
     },
-    "node_modules/@react-native-community/cli-clean/node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+    "node_modules/@react-native/babel-plugin-codegen": {
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.3.tgz",
+      "integrity": "sha512-mZ7jmIIg4bUnxCqY3yTOkoHvvzsDyrZgfnIKiTGm5QACrsIGa5eT3pMFpMm2OpxGXRDrTMsYdPXE2rCyDX52VQ==",
       "license": "MIT",
       "dependencies": {
-        "path-key": "^3.0.0"
+        "@react-native/codegen": "0.76.3"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=18"
       }
     },
-    "node_modules/@react-native-community/cli-clean/node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "license": "MIT",
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
+    "node_modules/@react-native/babel-preset": {
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.3.tgz",
+      "integrity": "sha512-zi2nPlQf9q2fmfPyzwWEj6DU96v8ziWtEfG7CTAX2PG/Vjfsr94vn/wWrCdhBVvLRQ6Kvd/MFAuDYpxmQwIiVQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.25.2",
+        "@babel/plugin-proposal-export-default-from": "^7.24.7",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-export-default-from": "^7.24.7",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-transform-arrow-functions": "^7.24.7",
+        "@babel/plugin-transform-async-generator-functions": "^7.25.4",
+        "@babel/plugin-transform-async-to-generator": "^7.24.7",
+        "@babel/plugin-transform-block-scoping": "^7.25.0",
+        "@babel/plugin-transform-class-properties": "^7.25.4",
+        "@babel/plugin-transform-classes": "^7.25.4",
+        "@babel/plugin-transform-computed-properties": "^7.24.7",
+        "@babel/plugin-transform-destructuring": "^7.24.8",
+        "@babel/plugin-transform-flow-strip-types": "^7.25.2",
+        "@babel/plugin-transform-for-of": "^7.24.7",
+        "@babel/plugin-transform-function-name": "^7.25.1",
+        "@babel/plugin-transform-literals": "^7.25.2",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.8",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+        "@babel/plugin-transform-numeric-separator": "^7.24.7",
+        "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+        "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.8",
+        "@babel/plugin-transform-parameters": "^7.24.7",
+        "@babel/plugin-transform-private-methods": "^7.24.7",
+        "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+        "@babel/plugin-transform-react-display-name": "^7.24.7",
+        "@babel/plugin-transform-react-jsx": "^7.25.2",
+        "@babel/plugin-transform-react-jsx-self": "^7.24.7",
+        "@babel/plugin-transform-react-jsx-source": "^7.24.7",
+        "@babel/plugin-transform-regenerator": "^7.24.7",
+        "@babel/plugin-transform-runtime": "^7.24.7",
+        "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+        "@babel/plugin-transform-spread": "^7.24.7",
+        "@babel/plugin-transform-sticky-regex": "^7.24.7",
+        "@babel/plugin-transform-typescript": "^7.25.2",
+        "@babel/plugin-transform-unicode-regex": "^7.24.7",
+        "@babel/template": "^7.25.0",
+        "@react-native/babel-plugin-codegen": "0.76.3",
+        "babel-plugin-syntax-hermes-parser": "^0.25.1",
+        "babel-plugin-transform-flow-enums": "^0.0.2",
+        "react-refresh": "^0.14.0"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=18"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-config": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-13.6.9.tgz",
-      "integrity": "sha512-rFfVBcNojcMm+KKHE/xqpqXg8HoKl4EC7bFHUrahMJ+y/tZll55+oX/PGG37rzB8QzP2UbMQ19DYQKC1G7kXeg==",
-      "license": "MIT",
-      "dependencies": {
-        "@react-native-community/cli-tools": "13.6.9",
-        "chalk": "^4.1.2",
-        "cosmiconfig": "^5.1.0",
-        "deepmerge": "^4.3.0",
-        "fast-glob": "^3.3.2",
-        "joi": "^17.2.1"
-      }
-    },
-    "node_modules/@react-native-community/cli-debugger-ui": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.9.tgz",
-      "integrity": "sha512-TkN7IdFmGPPvTpAo3nCAH9uwGCPxWBEAwpqEZDrq0NWllI7Tdie8vDpGdrcuCcKalmhq6OYnkXzeBah7O1Ztpw==",
-      "license": "MIT",
-      "dependencies": {
-        "serve-static": "^1.13.1"
+      "peerDependencies": {
+        "@babel/core": "*"
       }
     },
-    "node_modules/@react-native-community/cli-doctor": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-13.6.9.tgz",
-      "integrity": "sha512-5quFaLdWFQB+677GXh5dGU9I5eg2z6Vg4jOX9vKnc9IffwyIFAyJfCZHrxLSRPDGNXD7biDQUdoezXYGwb6P/A==",
+    "node_modules/@react-native/codegen": {
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.76.3.tgz",
+      "integrity": "sha512-oJCH/jbYeGmFJql8/y76gqWCCd74pyug41yzYAjREso1Z7xL88JhDyKMvxEnfhSdMOZYVl479N80xFiXPy3ZYA==",
       "license": "MIT",
       "dependencies": {
-        "@react-native-community/cli-config": "13.6.9",
-        "@react-native-community/cli-platform-android": "13.6.9",
-        "@react-native-community/cli-platform-apple": "13.6.9",
-        "@react-native-community/cli-platform-ios": "13.6.9",
-        "@react-native-community/cli-tools": "13.6.9",
-        "chalk": "^4.1.2",
-        "command-exists": "^1.2.8",
-        "deepmerge": "^4.3.0",
-        "envinfo": "^7.10.0",
-        "execa": "^5.0.0",
-        "hermes-profile-transformer": "^0.0.6",
-        "node-stream-zip": "^1.9.1",
-        "ora": "^5.4.1",
-        "semver": "^7.5.2",
-        "strip-ansi": "^5.2.0",
-        "wcwidth": "^1.0.1",
-        "yaml": "^2.2.1"
+        "@babel/parser": "^7.25.3",
+        "glob": "^7.1.1",
+        "hermes-parser": "0.23.1",
+        "invariant": "^2.2.4",
+        "jscodeshift": "^0.14.0",
+        "mkdirp": "^0.5.1",
+        "nullthrows": "^1.1.1",
+        "yargs": "^17.6.2"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@babel/preset-env": "^7.1.6"
       }
     },
-    "node_modules/@react-native-community/cli-doctor/node_modules/cli-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+    "node_modules/@react-native/community-cli-plugin": {
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.76.3.tgz",
+      "integrity": "sha512-vgsLixHS24jR0d0QqPykBWFaC+V8x9cM3cs4oYXw3W199jgBNGP9MWcUJLazD2vzrT/lUTVBVg0rBeB+4XR6fg==",
       "license": "MIT",
       "dependencies": {
-        "restore-cursor": "^3.1.0"
+        "@react-native/dev-middleware": "0.76.3",
+        "@react-native/metro-babel-transformer": "0.76.3",
+        "chalk": "^4.0.0",
+        "execa": "^5.1.1",
+        "invariant": "^2.2.4",
+        "metro": "^0.81.0",
+        "metro-config": "^0.81.0",
+        "metro-core": "^0.81.0",
+        "node-fetch": "^2.2.0",
+        "readline": "^1.3.0",
+        "semver": "^7.1.3"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@react-native-community/cli-server-api": "*"
+      },
+      "peerDependenciesMeta": {
+        "@react-native-community/cli-server-api": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@react-native-community/cli-doctor/node_modules/execa": {
+    "node_modules/@react-native/community-cli-plugin/node_modules/execa": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
       "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
@@ -3578,7 +3661,7 @@
         "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
-    "node_modules/@react-native-community/cli-doctor/node_modules/get-stream": {
+    "node_modules/@react-native/community-cli-plugin/node_modules/get-stream": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
       "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
@@ -3590,7 +3673,7 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/@react-native-community/cli-doctor/node_modules/is-stream": {
+    "node_modules/@react-native/community-cli-plugin/node_modules/is-stream": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
       "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
@@ -3602,23 +3685,7 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/@react-native-community/cli-doctor/node_modules/log-symbols": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
-      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
-      "license": "MIT",
-      "dependencies": {
-        "chalk": "^4.1.0",
-        "is-unicode-supported": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-doctor/node_modules/mimic-fn": {
+    "node_modules/@react-native/community-cli-plugin/node_modules/mimic-fn": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
       "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
@@ -3627,7 +3694,7 @@
         "node": ">=6"
       }
     },
-    "node_modules/@react-native-community/cli-doctor/node_modules/npm-run-path": {
+    "node_modules/@react-native/community-cli-plugin/node_modules/npm-run-path": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
       "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
@@ -3639,7 +3706,7 @@
         "node": ">=8"
       }
     },
-    "node_modules/@react-native-community/cli-doctor/node_modules/onetime": {
+    "node_modules/@react-native/community-cli-plugin/node_modules/onetime": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
       "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
@@ -3654,1136 +3721,44 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/@react-native-community/cli-doctor/node_modules/ora": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
-      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
-      "license": "MIT",
-      "dependencies": {
-        "bl": "^4.1.0",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-spinners": "^2.5.0",
-        "is-interactive": "^1.0.0",
-        "is-unicode-supported": "^0.1.0",
-        "log-symbols": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "wcwidth": "^1.0.1"
+    "node_modules/@react-native/community-cli-plugin/node_modules/semver": {
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
       },
       "engines": {
         "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-doctor/node_modules/ora/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-doctor/node_modules/restore-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
-      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-      "license": "MIT",
-      "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-doctor/node_modules/semver": {
-      "version": "7.6.3",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
-      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@react-native-community/cli-hermes": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-13.6.9.tgz",
-      "integrity": "sha512-GvwiwgvFw4Ws+krg2+gYj8sR3g05evmNjAHkKIKMkDTJjZ8EdyxbkifRUs1ZCq3TMZy2oeblZBXCJVOH4W7ZbA==",
-      "license": "MIT",
-      "dependencies": {
-        "@react-native-community/cli-platform-android": "13.6.9",
-        "@react-native-community/cli-tools": "13.6.9",
-        "chalk": "^4.1.2",
-        "hermes-profile-transformer": "^0.0.6"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-android": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.9.tgz",
-      "integrity": "sha512-9KsYGdr08QhdvT3Ht7e8phQB3gDX9Fs427NJe0xnoBh+PDPTI2BD5ks5ttsH8CzEw8/P6H8tJCHq6hf2nxd9cw==",
-      "license": "MIT",
-      "dependencies": {
-        "@react-native-community/cli-tools": "13.6.9",
-        "chalk": "^4.1.2",
-        "execa": "^5.0.0",
-        "fast-glob": "^3.3.2",
-        "fast-xml-parser": "^4.2.4",
-        "logkitty": "^0.7.1"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-android/node_modules/execa": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
-      "license": "MIT",
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-android/node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-android/node_modules/is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-android/node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-android/node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "license": "MIT",
-      "dependencies": {
-        "path-key": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-android/node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "license": "MIT",
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.9.tgz",
-      "integrity": "sha512-KoeIHfhxMhKXZPXmhQdl6EE+jGKWwoO9jUVWgBvibpVmsNjo7woaG/tfJMEWfWF3najX1EkQAoJWpCDBMYWtlA==",
-      "license": "MIT",
-      "dependencies": {
-        "@react-native-community/cli-tools": "13.6.9",
-        "chalk": "^4.1.2",
-        "execa": "^5.0.0",
-        "fast-glob": "^3.3.2",
-        "fast-xml-parser": "^4.0.12",
-        "ora": "^5.4.1"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple/node_modules/cli-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-      "license": "MIT",
-      "dependencies": {
-        "restore-cursor": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple/node_modules/execa": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
-      "license": "MIT",
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple/node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple/node_modules/is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple/node_modules/log-symbols": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
-      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
-      "license": "MIT",
-      "dependencies": {
-        "chalk": "^4.1.0",
-        "is-unicode-supported": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple/node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple/node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "license": "MIT",
-      "dependencies": {
-        "path-key": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple/node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "license": "MIT",
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple/node_modules/ora": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
-      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
-      "license": "MIT",
-      "dependencies": {
-        "bl": "^4.1.0",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-spinners": "^2.5.0",
-        "is-interactive": "^1.0.0",
-        "is-unicode-supported": "^0.1.0",
-        "log-symbols": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "wcwidth": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple/node_modules/restore-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
-      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-      "license": "MIT",
-      "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-apple/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-platform-ios": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.9.tgz",
-      "integrity": "sha512-CiUcHlGs8vE0CAB4oi1f+dzniqfGuhWPNrDvae2nm8dewlahTBwIcK5CawyGezjcJoeQhjBflh9vloska+nlnw==",
-      "license": "MIT",
-      "dependencies": {
-        "@react-native-community/cli-platform-apple": "13.6.9"
-      }
-    },
-    "node_modules/@react-native-community/cli-server-api": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-13.6.9.tgz",
-      "integrity": "sha512-W8FSlCPWymO+tlQfM3E0JmM8Oei5HZsIk5S0COOl0MRi8h0NmHI4WSTF2GCfbFZkcr2VI/fRsocoN8Au4EZAug==",
-      "license": "MIT",
-      "dependencies": {
-        "@react-native-community/cli-debugger-ui": "13.6.9",
-        "@react-native-community/cli-tools": "13.6.9",
-        "compression": "^1.7.1",
-        "connect": "^3.6.5",
-        "errorhandler": "^1.5.1",
-        "nocache": "^3.0.1",
-        "pretty-format": "^26.6.2",
-        "serve-static": "^1.13.1",
-        "ws": "^6.2.2"
-      }
-    },
-    "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-      "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^15.0.0",
-        "chalk": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 10.14.2"
-      }
-    },
-    "node_modules/@react-native-community/cli-server-api/node_modules/@types/istanbul-reports": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
-      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": {
-      "version": "15.0.19",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz",
-      "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/yargs-parser": "*"
-      }
-    },
-    "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-      "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-      "license": "MIT",
-      "dependencies": {
-        "@jest/types": "^26.6.2",
-        "ansi-regex": "^5.0.0",
-        "ansi-styles": "^4.0.0",
-        "react-is": "^17.0.1"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@react-native-community/cli-server-api/node_modules/react-is": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-      "license": "MIT"
-    },
-    "node_modules/@react-native-community/cli-server-api/node_modules/ws": {
-      "version": "6.2.3",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
-      "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
-      "license": "MIT",
-      "dependencies": {
-        "async-limiter": "~1.0.0"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-13.6.9.tgz",
-      "integrity": "sha512-OXaSjoN0mZVw3nrAwcY1PC0uMfyTd9fz7Cy06dh+EJc+h0wikABsVRzV8cIOPrVV+PPEEXE0DBrH20T2puZzgQ==",
-      "license": "MIT",
-      "dependencies": {
-        "appdirsjs": "^1.2.4",
-        "chalk": "^4.1.2",
-        "execa": "^5.0.0",
-        "find-up": "^5.0.0",
-        "mime": "^2.4.1",
-        "node-fetch": "^2.6.0",
-        "open": "^6.2.0",
-        "ora": "^5.4.1",
-        "semver": "^7.5.2",
-        "shell-quote": "^1.7.3",
-        "sudo-prompt": "^9.0.0"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/cli-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-      "license": "MIT",
-      "dependencies": {
-        "restore-cursor": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/execa": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
-      "license": "MIT",
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/is-wsl": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
-      "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/log-symbols": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
-      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
-      "license": "MIT",
-      "dependencies": {
-        "chalk": "^4.1.0",
-        "is-unicode-supported": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "license": "MIT",
-      "dependencies": {
-        "path-key": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "license": "MIT",
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/open": {
-      "version": "6.4.0",
-      "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
-      "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
-      "license": "MIT",
-      "dependencies": {
-        "is-wsl": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/ora": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
-      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
-      "license": "MIT",
-      "dependencies": {
-        "bl": "^4.1.0",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-spinners": "^2.5.0",
-        "is-interactive": "^1.0.0",
-        "is-unicode-supported": "^0.1.0",
-        "log-symbols": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "wcwidth": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/restore-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
-      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-      "license": "MIT",
-      "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/semver": {
-      "version": "7.6.3",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
-      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli-tools/node_modules/sudo-prompt": {
-      "version": "9.2.1",
-      "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz",
-      "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==",
-      "license": "MIT"
-    },
-    "node_modules/@react-native-community/cli-types": {
-      "version": "13.6.9",
-      "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-13.6.9.tgz",
-      "integrity": "sha512-RLxDppvRxXfs3hxceW/mShi+6o5yS+kFPnPqZTaMKKR5aSg7LwDpLQW4K2D22irEG8e6RKDkZUeH9aL3vO2O0w==",
-      "license": "MIT",
-      "dependencies": {
-        "joi": "^17.2.1"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/commander": {
-      "version": "9.5.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
-      "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
-      "license": "MIT",
-      "engines": {
-        "node": "^12.20.0 || >=14"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/execa": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
-      "license": "MIT",
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "license": "MIT",
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "license": "MIT",
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "license": "MIT",
-      "dependencies": {
-        "path-key": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "license": "MIT",
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "license": "MIT",
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "license": "MIT",
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native-community/cli/node_modules/semver": {
-      "version": "7.6.3",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
-      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@react-native-picker/picker": {
-      "version": "2.7.5",
-      "resolved": "https://registry.npmjs.org/@react-native-picker/picker/-/picker-2.7.5.tgz",
-      "integrity": "sha512-vhMaOLkXSUb+YKVbukMJToU4g+89VMhBG2U9+cLYF8X8HtFRidrHjohGqT8/OyesDuKIXeLIP+UFYI9Q9CRA9Q==",
-      "license": "MIT",
-      "peerDependencies": {
-        "react": "*",
-        "react-native": "*"
-      }
-    },
-    "node_modules/@react-native/assets-registry": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.74.87.tgz",
-      "integrity": "sha512-1XmRhqQchN+pXPKEKYdpJlwESxVomJOxtEnIkbo7GAlaN2sym84fHEGDXAjLilih5GVPpcpSmFzTy8jx3LtaFg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@react-native/babel-plugin-codegen": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.87.tgz",
-      "integrity": "sha512-+vJYpMnENFrwtgvDfUj+CtVJRJuUnzAUYT0/Pb68Sq9RfcZ5xdcCuUgyf7JO+akW2VTBoJY427wkcxU30qrWWw==",
-      "license": "MIT",
-      "dependencies": {
-        "@react-native/codegen": "0.74.87"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@react-native/babel-preset": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.74.87.tgz",
-      "integrity": "sha512-hyKpfqzN2nxZmYYJ0tQIHG99FQO0OWXp/gVggAfEUgiT+yNKas1C60LuofUsK7cd+2o9jrpqgqW4WzEDZoBlTg==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/core": "^7.20.0",
-        "@babel/plugin-proposal-async-generator-functions": "^7.0.0",
-        "@babel/plugin-proposal-class-properties": "^7.18.0",
-        "@babel/plugin-proposal-export-default-from": "^7.0.0",
-        "@babel/plugin-proposal-logical-assignment-operators": "^7.18.0",
-        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0",
-        "@babel/plugin-proposal-numeric-separator": "^7.0.0",
-        "@babel/plugin-proposal-object-rest-spread": "^7.20.0",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.0.0",
-        "@babel/plugin-proposal-optional-chaining": "^7.20.0",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.0",
-        "@babel/plugin-syntax-export-default-from": "^7.0.0",
-        "@babel/plugin-syntax-flow": "^7.18.0",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0",
-        "@babel/plugin-syntax-optional-chaining": "^7.0.0",
-        "@babel/plugin-transform-arrow-functions": "^7.0.0",
-        "@babel/plugin-transform-async-to-generator": "^7.20.0",
-        "@babel/plugin-transform-block-scoping": "^7.0.0",
-        "@babel/plugin-transform-classes": "^7.0.0",
-        "@babel/plugin-transform-computed-properties": "^7.0.0",
-        "@babel/plugin-transform-destructuring": "^7.20.0",
-        "@babel/plugin-transform-flow-strip-types": "^7.20.0",
-        "@babel/plugin-transform-function-name": "^7.0.0",
-        "@babel/plugin-transform-literals": "^7.0.0",
-        "@babel/plugin-transform-modules-commonjs": "^7.0.0",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0",
-        "@babel/plugin-transform-parameters": "^7.0.0",
-        "@babel/plugin-transform-private-methods": "^7.22.5",
-        "@babel/plugin-transform-private-property-in-object": "^7.22.11",
-        "@babel/plugin-transform-react-display-name": "^7.0.0",
-        "@babel/plugin-transform-react-jsx": "^7.0.0",
-        "@babel/plugin-transform-react-jsx-self": "^7.0.0",
-        "@babel/plugin-transform-react-jsx-source": "^7.0.0",
-        "@babel/plugin-transform-runtime": "^7.0.0",
-        "@babel/plugin-transform-shorthand-properties": "^7.0.0",
-        "@babel/plugin-transform-spread": "^7.0.0",
-        "@babel/plugin-transform-sticky-regex": "^7.0.0",
-        "@babel/plugin-transform-typescript": "^7.5.0",
-        "@babel/plugin-transform-unicode-regex": "^7.0.0",
-        "@babel/template": "^7.0.0",
-        "@react-native/babel-plugin-codegen": "0.74.87",
-        "babel-plugin-transform-flow-enums": "^0.0.2",
-        "react-refresh": "^0.14.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@babel/core": "*"
-      }
-    },
-    "node_modules/@react-native/codegen": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.74.87.tgz",
-      "integrity": "sha512-GMSYDiD+86zLKgMMgz9z0k6FxmRn+z6cimYZKkucW4soGbxWsbjUAZoZ56sJwt2FJ3XVRgXCrnOCgXoH/Bkhcg==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/parser": "^7.20.0",
-        "glob": "^7.1.1",
-        "hermes-parser": "0.19.1",
-        "invariant": "^2.2.4",
-        "jscodeshift": "^0.14.0",
-        "mkdirp": "^0.5.1",
-        "nullthrows": "^1.1.1"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@babel/preset-env": "^7.1.6"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.87.tgz",
-      "integrity": "sha512-EgJG9lSr8x3X67dHQKQvU6EkO+3ksVlJHYIVv6U/AmW9dN80BEFxgYbSJ7icXS4wri7m4kHdgeq2PQ7/3vvrTQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@react-native-community/cli-server-api": "13.6.9",
-        "@react-native-community/cli-tools": "13.6.9",
-        "@react-native/dev-middleware": "0.74.87",
-        "@react-native/metro-babel-transformer": "0.74.87",
-        "chalk": "^4.0.0",
-        "execa": "^5.1.1",
-        "metro": "^0.80.3",
-        "metro-config": "^0.80.3",
-        "metro-core": "^0.80.3",
-        "node-fetch": "^2.2.0",
-        "querystring": "^0.2.1",
-        "readline": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.87.tgz",
-      "integrity": "sha512-MN95DJLYTv4EqJc+9JajA3AJZSBYJz2QEJ3uWlHrOky2vKrbbRVaW1ityTmaZa2OXIvNc6CZwSRSE7xCoHbXhQ==",
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.87.tgz",
-      "integrity": "sha512-7TmZ3hTHwooYgIHqc/z87BMe1ryrIqAUi+AF7vsD+EHCGxHFdMjSpf1BZ2SUPXuLnF2cTiTfV2RwhbPzx0tYIA==",
-      "license": "MIT",
-      "dependencies": {
-        "@isaacs/ttlcache": "^1.4.1",
-        "@react-native/debugger-frontend": "0.74.87",
-        "@rnx-kit/chromium-edge-launcher": "^1.0.0",
-        "chrome-launcher": "^0.15.2",
-        "connect": "^3.6.5",
-        "debug": "^2.2.0",
-        "node-fetch": "^2.2.0",
-        "nullthrows": "^1.1.1",
-        "open": "^7.0.3",
-        "selfsigned": "^2.4.1",
-        "serve-static": "^1.13.1",
-        "temp-dir": "^2.0.0",
-        "ws": "^6.2.2"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/execa": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
-      "license": "MIT",
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "license": "MIT"
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "license": "MIT",
-      "dependencies": {
-        "path-key": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "license": "MIT",
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/open": {
-      "version": "7.4.2",
-      "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
-      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
-      "license": "MIT",
-      "dependencies": {
-        "is-docker": "^2.0.0",
-        "is-wsl": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@react-native/community-cli-plugin/node_modules/ws": {
-      "version": "6.2.3",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
-      "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
-      "license": "MIT",
-      "dependencies": {
-        "async-limiter": "~1.0.0"
       }
     },
     "node_modules/@react-native/debugger-frontend": {
-      "version": "0.74.85",
-      "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.85.tgz",
-      "integrity": "sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==",
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.76.3.tgz",
+      "integrity": "sha512-pMHQ3NpPB28RxXciSvm2yD+uDx3pkhzfuWkc7VFgOduyzPSIr0zotUiOJzsAtrj8++bPbOsAraCeQhCqoOTWQw==",
       "license": "BSD-3-Clause",
       "engines": {
         "node": ">=18"
       }
     },
     "node_modules/@react-native/dev-middleware": {
-      "version": "0.74.85",
-      "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz",
-      "integrity": "sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==",
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.76.3.tgz",
+      "integrity": "sha512-b+2IpW40z1/S5Jo5JKrWPmucYU/PzeGyGBZZ/SJvmRnBDaP3txb9yIqNZAII1EWsKNhedh8vyRO5PSuJ9Juqzw==",
       "license": "MIT",
       "dependencies": {
         "@isaacs/ttlcache": "^1.4.1",
-        "@react-native/debugger-frontend": "0.74.85",
-        "@rnx-kit/chromium-edge-launcher": "^1.0.0",
+        "@react-native/debugger-frontend": "0.76.3",
         "chrome-launcher": "^0.15.2",
+        "chromium-edge-launcher": "^0.2.0",
         "connect": "^3.6.5",
         "debug": "^2.2.0",
-        "node-fetch": "^2.2.0",
         "nullthrows": "^1.1.1",
         "open": "^7.0.3",
         "selfsigned": "^2.4.1",
         "serve-static": "^1.13.1",
-        "temp-dir": "^2.0.0",
-        "ws": "^6.2.2"
+        "ws": "^6.2.3"
       },
       "engines": {
         "node": ">=18"
@@ -4804,22 +3779,6 @@
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
       "license": "MIT"
     },
-    "node_modules/@react-native/dev-middleware/node_modules/open": {
-      "version": "7.4.2",
-      "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
-      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
-      "license": "MIT",
-      "dependencies": {
-        "is-docker": "^2.0.0",
-        "is-wsl": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/@react-native/dev-middleware/node_modules/ws": {
       "version": "6.2.3",
       "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
@@ -4830,32 +3789,32 @@
       }
     },
     "node_modules/@react-native/gradle-plugin": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.74.87.tgz",
-      "integrity": "sha512-T+VX0N1qP+U9V4oAtn7FTX7pfsoVkd1ocyw9swYXgJqU2fK7hC9famW7b3s3ZiufPGPr1VPJe2TVGtSopBjL6A==",
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.76.3.tgz",
+      "integrity": "sha512-t0aYZ8ND7+yc+yIm6Yp52bInneYpki6RSIFZ9/LMUzgMKvEB62ptt/7sfho9QkKHCNxE1DJSWIqLIGi/iHHkyg==",
       "license": "MIT",
       "engines": {
         "node": ">=18"
       }
     },
     "node_modules/@react-native/js-polyfills": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.74.87.tgz",
-      "integrity": "sha512-M5Evdn76CuVEF0GsaXiGi95CBZ4IWubHqwXxV9vG9CC9kq0PSkoM2Pn7Lx7dgyp4vT7ccJ8a3IwHbe+5KJRnpw==",
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.76.3.tgz",
+      "integrity": "sha512-pubJFArMMrdZiytH+W95KngcSQs+LsxOBsVHkwgMnpBfRUxXPMK4fudtBwWvhnwN76Oe+WhxSq7vOS5XgoPhmw==",
       "license": "MIT",
       "engines": {
         "node": ">=18"
       }
     },
     "node_modules/@react-native/metro-babel-transformer": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.87.tgz",
-      "integrity": "sha512-UsJCO24sNax2NSPBmV1zLEVVNkS88kcgAiYrZHtYSwSjpl4WZ656tIeedBfiySdJ94Hr3kQmBYLipV5zk0NI1A==",
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.76.3.tgz",
+      "integrity": "sha512-b2zQPXmW7avw/7zewc9nzMULPIAjsTwN03hskhxHUJH5pzUf7pIklB3FrgYPZrRhJgzHiNl3tOPu7vqiKzBYPg==",
       "license": "MIT",
       "dependencies": {
-        "@babel/core": "^7.20.0",
-        "@react-native/babel-preset": "0.74.87",
-        "hermes-parser": "0.19.1",
+        "@babel/core": "^7.25.2",
+        "@react-native/babel-preset": "0.76.3",
+        "hermes-parser": "0.23.1",
         "nullthrows": "^1.1.1"
       },
       "engines": {
@@ -4866,15 +3825,15 @@
       }
     },
     "node_modules/@react-native/normalize-colors": {
-      "version": "0.74.85",
-      "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz",
-      "integrity": "sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==",
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.3.tgz",
+      "integrity": "sha512-Yrpmrh4IDEupUUM/dqVxhAN8QW1VEUR3Qrk2lzJC1jB2s46hDe0hrMP2vs12YJqlzshteOthjwXQlY0TgIzgbg==",
       "license": "MIT"
     },
     "node_modules/@react-native/virtualized-lists": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.74.87.tgz",
-      "integrity": "sha512-lsGxoFMb0lyK/MiplNKJpD+A1EoEUumkLrCjH4Ht+ZlG8S0BfCxmskLZ6qXn3BiDSkLjfjI/qyZ3pnxNBvkXpQ==",
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.76.3.tgz",
+      "integrity": "sha512-wTGv9pVh3vAOWb29xFm+J9VRe9dUcUcb9FyaMLT/Hxa88W4wqa5ZMe1V9UvrrBiA1G5DKjv8/1ZcDsJhyugVKA==",
       "license": "MIT",
       "dependencies": {
         "invariant": "^2.2.4",
@@ -4894,6 +3853,24 @@
         }
       }
     },
+    "node_modules/@react-navigation/bottom-tabs": {
+      "version": "6.6.1",
+      "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.6.1.tgz",
+      "integrity": "sha512-9oD4cypEBjPuaMiu9tevWGiQ4w/d6l3HNhcJ1IjXZ24xvYDSs0mqjUcdt8SWUolCvRrYc/DmNBLlT83bk0bHTw==",
+      "license": "MIT",
+      "dependencies": {
+        "@react-navigation/elements": "^1.3.31",
+        "color": "^4.2.3",
+        "warn-once": "^0.1.0"
+      },
+      "peerDependencies": {
+        "@react-navigation/native": "^6.0.0",
+        "react": "*",
+        "react-native": "*",
+        "react-native-safe-area-context": ">= 3.0.0",
+        "react-native-screens": ">= 3.0.0"
+      }
+    },
     "node_modules/@react-navigation/core": {
       "version": "6.4.17",
       "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.17.tgz",
@@ -4965,35 +3942,6 @@
         "nanoid": "^3.1.23"
       }
     },
-    "node_modules/@rnx-kit/chromium-edge-launcher": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz",
-      "integrity": "sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@types/node": "^18.0.0",
-        "escape-string-regexp": "^4.0.0",
-        "is-wsl": "^2.2.0",
-        "lighthouse-logger": "^1.0.0",
-        "mkdirp": "^1.0.4",
-        "rimraf": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=14.15"
-      }
-    },
-    "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "license": "MIT",
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/@segment/loosely-validate-event": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz",
@@ -5003,27 +3951,6 @@
         "join-component": "^1.1.0"
       }
     },
-    "node_modules/@sideway/address": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
-      "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "@hapi/hoek": "^9.0.0"
-      }
-    },
-    "node_modules/@sideway/formula": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
-      "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/@sideway/pinpoint": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
-      "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
-      "license": "BSD-3-Clause"
-    },
     "node_modules/@sinclair/typebox": {
       "version": "0.27.8",
       "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
@@ -5048,6 +3975,115 @@
         "@sinonjs/commons": "^3.0.0"
       }
     },
+    "node_modules/@socket.io/component-emitter": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+      "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+      "license": "MIT"
+    },
+    "node_modules/@tanstack/query-core": {
+      "version": "5.62.8",
+      "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.62.8.tgz",
+      "integrity": "sha512-4fV31vDsUyvNGrKIOUNPrZztoyL187bThnoQOvAXEVlZbSiuPONpfx53634MKKdvsDir5NyOGm80ShFaoHS/mw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      }
+    },
+    "node_modules/@tanstack/query-devtools": {
+      "version": "5.61.4",
+      "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.61.4.tgz",
+      "integrity": "sha512-21Tw+u8E3IJJj4A/Bct4H0uBaDTEu7zBrR79FeSyY+mS2gx5/m316oDtJiKkILc819VSTYt+sFzODoJNcpPqZQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      }
+    },
+    "node_modules/@tanstack/react-query": {
+      "version": "5.62.8",
+      "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.62.8.tgz",
+      "integrity": "sha512-8TUstKxF/fysHonZsWg/hnlDVgasTdHx6Q+f1/s/oPKJBJbKUWPZEHwLTMOZgrZuroLMiqYKJ9w69Abm8mWP0Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@tanstack/query-core": "5.62.8"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      },
+      "peerDependencies": {
+        "react": "^18 || ^19"
+      }
+    },
+    "node_modules/@tanstack/react-query-devtools": {
+      "version": "5.62.8",
+      "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.62.8.tgz",
+      "integrity": "sha512-SwjXjQTRONd9WPeKVQQ9framG7YNqPV8PS+EGNVNXAyz2XThulMRCvZnh2+3DggnjcYM7YcpnuoZ4RH7q13p0g==",
+      "license": "MIT",
+      "dependencies": {
+        "@tanstack/query-devtools": "5.61.4"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      },
+      "peerDependencies": {
+        "@tanstack/react-query": "^5.62.8",
+        "react": "^18 || ^19"
+      }
+    },
+    "node_modules/@types/babel__core": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+      "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7",
+        "@types/babel__generator": "*",
+        "@types/babel__template": "*",
+        "@types/babel__traverse": "*"
+      }
+    },
+    "node_modules/@types/babel__generator": {
+      "version": "7.6.8",
+      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+      "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "node_modules/@types/babel__template": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+      "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "node_modules/@types/babel__traverse": {
+      "version": "7.20.6",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+      "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.20.7"
+      }
+    },
+    "node_modules/@types/graceful-fs": {
+      "version": "4.1.9",
+      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+      "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
     "node_modules/@types/he": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.3.tgz",
@@ -5071,12 +4107,11 @@
       }
     },
     "node_modules/@types/istanbul-reports": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
-      "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
       "license": "MIT",
       "dependencies": {
-        "@types/istanbul-lib-coverage": "*",
         "@types/istanbul-lib-report": "*"
       }
     },
@@ -5106,9 +4141,9 @@
       "license": "MIT"
     },
     "node_modules/@types/react": {
-      "version": "18.2.79",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz",
-      "integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==",
+      "version": "18.3.12",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz",
+      "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==",
       "devOptional": true,
       "license": "MIT",
       "dependencies": {
@@ -5116,6 +4151,27 @@
         "csstype": "^3.0.2"
       }
     },
+    "node_modules/@types/react-native": {
+      "version": "0.70.19",
+      "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.70.19.tgz",
+      "integrity": "sha512-c6WbyCgWTBgKKMESj/8b4w+zWcZSsCforson7UdXtXMecG3MxCinYi6ihhrHVPyUrVzORsvEzK8zg32z4pK6Sg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/react": "*"
+      }
+    },
+    "node_modules/@types/react-native-vector-icons": {
+      "version": "6.4.18",
+      "resolved": "https://registry.npmjs.org/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.18.tgz",
+      "integrity": "sha512-YGlNWb+k5laTBHd7+uZowB9DpIK3SXUneZqAiKQaj1jnJCZM0x71GDim5JCTMi4IFkhc9m8H/Gm28T5BjyivUw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/react": "*",
+        "@types/react-native": "^0.70"
+      }
+    },
     "node_modules/@types/stack-utils": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
@@ -5123,9 +4179,9 @@
       "license": "MIT"
     },
     "node_modules/@types/yargs": {
-      "version": "13.0.12",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz",
-      "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==",
+      "version": "17.0.33",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
+      "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
       "license": "MIT",
       "dependencies": {
         "@types/yargs-parser": "*"
@@ -5138,29 +4194,26 @@
       "license": "MIT"
     },
     "node_modules/@urql/core": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz",
-      "integrity": "sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==",
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.0.8.tgz",
+      "integrity": "sha512-1GOnUw7/a9bzkcM0+U8U5MmxW2A7FE5YquuEmcJzTtW5tIs2EoS4F2ITpuKBjRBbyRjZgO860nWFPo1m4JImGA==",
       "license": "MIT",
       "dependencies": {
-        "@graphql-typed-document-node/core": "^3.1.0",
-        "wonka": "^4.0.14"
-      },
-      "peerDependencies": {
-        "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
+        "@0no-co/graphql.web": "^1.0.5",
+        "wonka": "^6.3.2"
       }
     },
     "node_modules/@urql/exchange-retry": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-0.3.0.tgz",
-      "integrity": "sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.0.tgz",
+      "integrity": "sha512-FLt+d81gP4oiHah4hWFDApimc+/xABWMU1AMYsZ1PVB0L0YPtrMCjbOp9WMM7hBzy4gbTDrG24sio0dCfSh/HQ==",
       "license": "MIT",
       "dependencies": {
-        "@urql/core": ">=2.3.1",
-        "wonka": "^4.0.14"
+        "@urql/core": "^5.0.0",
+        "wonka": "^6.3.2"
       },
       "peerDependencies": {
-        "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
+        "@urql/core": "^5.0.0"
       }
     },
     "node_modules/@xmldom/xmldom": {
@@ -5210,18 +4263,6 @@
         "node": ">=0.4.0"
       }
     },
-    "node_modules/agent-base": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
-      "license": "MIT",
-      "dependencies": {
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6.0.0"
-      }
-    },
     "node_modules/aggregate-error": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
@@ -5256,17 +4297,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/ansi-fragments": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz",
-      "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==",
-      "license": "MIT",
-      "dependencies": {
-        "colorette": "^1.0.7",
-        "slice-ansi": "^2.0.0",
-        "strip-ansi": "^5.0.0"
-      }
-    },
     "node_modules/ansi-regex": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -5322,12 +4352,6 @@
         "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
-    "node_modules/appdirsjs": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz",
-      "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==",
-      "license": "MIT"
-    },
     "node_modules/application-config-path": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz",
@@ -5349,22 +4373,6 @@
         "sprintf-js": "~1.0.2"
       }
     },
-    "node_modules/array-buffer-byte-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
-      "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.5",
-        "is-array-buffer": "^3.0.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/array-union": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
@@ -5374,28 +4382,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/arraybuffer.prototype.slice": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
-      "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
-      "license": "MIT",
-      "dependencies": {
-        "array-buffer-byte-length": "^1.0.1",
-        "call-bind": "^1.0.5",
-        "define-properties": "^1.2.1",
-        "es-abstract": "^1.22.3",
-        "es-errors": "^1.2.1",
-        "get-intrinsic": "^1.2.3",
-        "is-array-buffer": "^3.0.4",
-        "is-shared-array-buffer": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/asap": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@@ -5414,15 +4400,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/astral-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
-      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/async-limiter": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
@@ -5444,38 +4421,100 @@
         "node": ">= 4.0.0"
       }
     },
-    "node_modules/available-typed-arrays": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
-      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
-      "license": "MIT",
+    "node_modules/axios": {
+      "version": "1.7.9",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+      "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+      "license": "MIT",
+      "dependencies": {
+        "follow-redirects": "^1.15.6",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/axios/node_modules/form-data": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+      "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+      "license": "MIT",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/babel-core": {
+      "version": "7.0.0-bridge.0",
+      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
+      "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/babel-jest": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
+      "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
+      "license": "MIT",
+      "dependencies": {
+        "@jest/transform": "^29.7.0",
+        "@types/babel__core": "^7.1.14",
+        "babel-plugin-istanbul": "^6.1.1",
+        "babel-preset-jest": "^29.6.3",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.8.0"
+      }
+    },
+    "node_modules/babel-plugin-istanbul": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+      "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+      "license": "BSD-3-Clause",
       "dependencies": {
-        "possible-typed-array-names": "^1.0.0"
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@istanbuljs/load-nyc-config": "^1.0.0",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-instrument": "^5.0.4",
+        "test-exclude": "^6.0.0"
       },
       "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "node": ">=8"
       }
     },
-    "node_modules/babel-core": {
-      "version": "7.0.0-bridge.0",
-      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
-      "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==",
+    "node_modules/babel-plugin-jest-hoist": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+      "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
       "license": "MIT",
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
+      "dependencies": {
+        "@babel/template": "^7.3.3",
+        "@babel/types": "^7.3.3",
+        "@types/babel__core": "^7.1.14",
+        "@types/babel__traverse": "^7.0.6"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/babel-plugin-polyfill-corejs2": {
-      "version": "0.4.11",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
-      "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
+      "version": "0.4.12",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz",
+      "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==",
       "license": "MIT",
       "dependencies": {
         "@babel/compat-data": "^7.22.6",
-        "@babel/helper-define-polyfill-provider": "^0.6.2",
+        "@babel/helper-define-polyfill-provider": "^0.6.3",
         "semver": "^6.3.1"
       },
       "peerDependencies": {
@@ -5496,72 +4535,47 @@
       }
     },
     "node_modules/babel-plugin-polyfill-regenerator": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
-      "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz",
+      "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==",
       "license": "MIT",
       "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.6.2"
+        "@babel/helper-define-polyfill-provider": "^0.6.3"
       },
       "peerDependencies": {
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
       }
     },
-    "node_modules/babel-plugin-react-compiler": {
-      "version": "0.0.0-experimental-592953e-20240517",
-      "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-592953e-20240517.tgz",
-      "integrity": "sha512-OjG1SVaeQZaJrqkMFJatg8W/MTow8Ak5rx2SI0ETQBO1XvOk/XZGMbltNCPdFJLKghBYoBjC+Y3Ap/Xr7B01mA==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/generator": "7.2.0",
-        "@babel/types": "^7.19.0",
-        "chalk": "4",
-        "invariant": "^2.2.4",
-        "pretty-format": "^24",
-        "zod": "^3.22.4",
-        "zod-validation-error": "^2.1.0"
-      }
+    "node_modules/babel-plugin-react-native-web": {
+      "version": "0.19.13",
+      "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.13.tgz",
+      "integrity": "sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ==",
+      "license": "MIT"
     },
-    "node_modules/babel-plugin-react-compiler/node_modules/@babel/generator": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz",
-      "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==",
+    "node_modules/babel-plugin-syntax-hermes-parser": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz",
+      "integrity": "sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==",
       "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.2.0",
-        "jsesc": "^2.5.1",
-        "lodash": "^4.17.10",
-        "source-map": "^0.5.0",
-        "trim-right": "^1.0.1"
+        "hermes-parser": "0.25.1"
       }
     },
-    "node_modules/babel-plugin-react-compiler/node_modules/jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "license": "MIT",
-      "bin": {
-        "jsesc": "bin/jsesc"
-      },
-      "engines": {
-        "node": ">=4"
-      }
+    "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-estree": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+      "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+      "license": "MIT"
     },
-    "node_modules/babel-plugin-react-compiler/node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
+    "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-parser": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+      "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
+      "license": "MIT",
+      "dependencies": {
+        "hermes-estree": "0.25.1"
       }
     },
-    "node_modules/babel-plugin-react-native-web": {
-      "version": "0.19.13",
-      "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.13.tgz",
-      "integrity": "sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ==",
-      "license": "MIT"
-    },
     "node_modules/babel-plugin-transform-flow-enums": {
       "version": "0.0.2",
       "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz",
@@ -5571,10 +4585,36 @@
         "@babel/plugin-syntax-flow": "^7.12.1"
       }
     },
+    "node_modules/babel-preset-current-node-syntax": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz",
+      "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-bigint": "^7.8.3",
+        "@babel/plugin-syntax-class-properties": "^7.12.13",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5",
+        "@babel/plugin-syntax-import-attributes": "^7.24.7",
+        "@babel/plugin-syntax-import-meta": "^7.10.4",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+        "@babel/plugin-syntax-top-level-await": "^7.14.5"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
     "node_modules/babel-preset-expo": {
-      "version": "11.0.15",
-      "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-11.0.15.tgz",
-      "integrity": "sha512-rgiMTYwqIPULaO7iZdqyL7aAff9QLOX6OWUtLZBlOrOTreGY1yHah/5+l8MvI6NVc/8Zj5LY4Y5uMSnJIuzTLw==",
+      "version": "12.0.3",
+      "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-12.0.3.tgz",
+      "integrity": "sha512-1695e8y3U/HjifKx33vcNnFMSUSXwPWwhFxRlL6NRx2TENN6gySH82gPOWgxcra6gi+EJgXx52xG3PcqTjwW6w==",
       "license": "MIT",
       "dependencies": {
         "@babel/plugin-proposal-decorators": "^7.12.9",
@@ -5583,10 +4623,37 @@
         "@babel/plugin-transform-parameters": "^7.22.15",
         "@babel/preset-react": "^7.22.15",
         "@babel/preset-typescript": "^7.23.0",
-        "@react-native/babel-preset": "0.74.87",
-        "babel-plugin-react-compiler": "0.0.0-experimental-592953e-20240517",
-        "babel-plugin-react-native-web": "~0.19.10",
+        "@react-native/babel-preset": "0.76.3",
+        "babel-plugin-react-native-web": "~0.19.13",
         "react-refresh": "^0.14.2"
+      },
+      "peerDependencies": {
+        "babel-plugin-react-compiler": "^19.0.0-beta-9ee70a1-20241017",
+        "react-compiler-runtime": "^19.0.0-beta-8a03594-20241020"
+      },
+      "peerDependenciesMeta": {
+        "babel-plugin-react-compiler": {
+          "optional": true
+        },
+        "react-compiler-runtime": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/babel-preset-jest": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+      "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+      "license": "MIT",
+      "dependencies": {
+        "babel-plugin-jest-hoist": "^29.6.3",
+        "babel-preset-current-node-syntax": "^1.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
       }
     },
     "node_modules/balanced-match": {
@@ -5627,6 +4694,23 @@
         "node": ">=12.0.0"
       }
     },
+    "node_modules/better-opn/node_modules/open": {
+      "version": "8.4.2",
+      "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+      "license": "MIT",
+      "dependencies": {
+        "define-lazy-prop": "^2.0.0",
+        "is-docker": "^2.1.1",
+        "is-wsl": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/big-integer": {
       "version": "1.6.52",
       "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
@@ -5645,30 +4729,12 @@
         "node": "*"
       }
     },
-    "node_modules/bl": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
-      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
-      "license": "MIT",
-      "dependencies": {
-        "buffer": "^5.5.0",
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.4.0"
-      }
-    },
-    "node_modules/bl/node_modules/readable-stream": {
-      "version": "3.6.2",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
+    "node_modules/boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+      "license": "ISC",
+      "peer": true
     },
     "node_modules/bplist-creator": {
       "version": "0.0.7",
@@ -5713,6 +4779,22 @@
         "node": ">=8"
       }
     },
+    "node_modules/broadcast-channel": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz",
+      "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "detect-node": "^2.1.0",
+        "js-sha3": "0.8.0",
+        "microseconds": "0.2.0",
+        "nano-time": "1.0.0",
+        "oblivious-set": "1.0.0",
+        "rimraf": "3.0.2",
+        "unload": "2.2.0"
+      }
+    },
     "node_modules/browserslist": {
       "version": "4.24.2",
       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
@@ -5806,12 +4888,6 @@
       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
       "license": "MIT"
     },
-    "node_modules/builtins": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
-      "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==",
-      "license": "MIT"
-    },
     "node_modules/bytes": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -5894,25 +4970,6 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/call-bind": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
-      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
-      "license": "MIT",
-      "dependencies": {
-        "es-define-property": "^1.0.0",
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2",
-        "get-intrinsic": "^1.2.4",
-        "set-function-length": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/caller-callsite": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
@@ -5947,15 +5004,12 @@
       }
     },
     "node_modules/camelcase": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
       "license": "MIT",
       "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=6"
       }
     },
     "node_modules/caniuse-lite": {
@@ -6030,6 +5084,32 @@
         "node": ">=12.13.0"
       }
     },
+    "node_modules/chromium-edge-launcher": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz",
+      "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/node": "*",
+        "escape-string-regexp": "^4.0.0",
+        "is-wsl": "^2.2.0",
+        "lighthouse-logger": "^1.0.0",
+        "mkdirp": "^1.0.4",
+        "rimraf": "^3.0.2"
+      }
+    },
+    "node_modules/chromium-edge-launcher/node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "license": "MIT",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/ci-info": {
       "version": "3.9.0",
       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
@@ -6105,9 +5185,9 @@
       }
     },
     "node_modules/clone": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
-      "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
       "license": "MIT",
       "engines": {
         "node": ">=0.8"
@@ -6127,6 +5207,19 @@
         "node": ">=6"
       }
     },
+    "node_modules/color": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+      "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1",
+        "color-string": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=12.5.0"
+      }
+    },
     "node_modules/color-convert": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -6145,11 +5238,15 @@
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
       "license": "MIT"
     },
-    "node_modules/colorette": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
-      "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
-      "license": "MIT"
+    "node_modules/color-string": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+      "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
     },
     "node_modules/combined-stream": {
       "version": "1.0.8",
@@ -6333,9 +5430,9 @@
       }
     },
     "node_modules/cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
       "license": "MIT",
       "dependencies": {
         "path-key": "^3.1.0",
@@ -6364,74 +5461,65 @@
         "node": ">=8"
       }
     },
-    "node_modules/csstype": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
-      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
-      "devOptional": true,
-      "license": "MIT"
-    },
-    "node_modules/dag-map": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz",
-      "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==",
-      "license": "MIT"
-    },
-    "node_modules/data-view-buffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
-      "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
-      "license": "MIT",
+    "node_modules/css-select": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+      "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+      "license": "BSD-2-Clause",
+      "peer": true,
       "dependencies": {
-        "call-bind": "^1.0.6",
-        "es-errors": "^1.3.0",
-        "is-data-view": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
+        "boolbase": "^1.0.0",
+        "css-what": "^6.1.0",
+        "domhandler": "^5.0.2",
+        "domutils": "^3.0.1",
+        "nth-check": "^2.0.1"
       },
       "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "url": "https://github.com/sponsors/fb55"
       }
     },
-    "node_modules/data-view-byte-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
-      "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+    "node_modules/css-tree": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+      "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
       "license": "MIT",
+      "peer": true,
       "dependencies": {
-        "call-bind": "^1.0.7",
-        "es-errors": "^1.3.0",
-        "is-data-view": "^1.0.1"
+        "mdn-data": "2.0.14",
+        "source-map": "^0.6.1"
       },
       "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "node": ">=8.0.0"
       }
     },
-    "node_modules/data-view-byte-offset": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
-      "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.6",
-        "es-errors": "^1.3.0",
-        "is-data-view": "^1.0.1"
-      },
+    "node_modules/css-tree/node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "license": "BSD-3-Clause",
+      "peer": true,
       "engines": {
-        "node": ">= 0.4"
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/css-what": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+      "license": "BSD-2-Clause",
+      "peer": true,
+      "engines": {
+        "node": ">= 6"
       },
       "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "url": "https://github.com/sponsors/fb55"
       }
     },
-    "node_modules/dayjs": {
-      "version": "1.11.13",
-      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
-      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+      "devOptional": true,
       "license": "MIT"
     },
     "node_modules/debug": {
@@ -6451,15 +5539,6 @@
         }
       }
     },
-    "node_modules/decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/decode-uri-component": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
@@ -6502,40 +5581,14 @@
     },
     "node_modules/defaults": {
       "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
-      "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
-      "license": "MIT",
-      "dependencies": {
-        "clone": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/defaults/node_modules/clone": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
-      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/define-data-property": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
-      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+      "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
       "license": "MIT",
       "dependencies": {
-        "es-define-property": "^1.0.0",
-        "es-errors": "^1.3.0",
-        "gopd": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
+        "clone": "^1.0.2"
       },
       "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/define-lazy-prop": {
@@ -6547,23 +5600,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/define-properties": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
-      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
-      "license": "MIT",
-      "dependencies": {
-        "define-data-property": "^1.0.1",
-        "has-property-descriptors": "^1.0.0",
-        "object-keys": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/del": {
       "version": "6.1.1",
       "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz",
@@ -6632,6 +5668,12 @@
         "node": ">=0.10"
       }
     },
+    "node_modules/detect-node": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+      "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+      "license": "MIT"
+    },
     "node_modules/dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -6644,10 +5686,69 @@
         "node": ">=8"
       }
     },
+    "node_modules/dom-serializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/domelementtype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "BSD-2-Clause",
+      "peer": true
+    },
+    "node_modules/domhandler": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+      "license": "BSD-2-Clause",
+      "peer": true,
+      "dependencies": {
+        "domelementtype": "^2.3.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/domutils": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz",
+      "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==",
+      "license": "BSD-2-Clause",
+      "peer": true,
+      "dependencies": {
+        "dom-serializer": "^2.0.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
     "node_modules/dotenv": {
-      "version": "16.4.5",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
-      "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
+      "version": "16.4.7",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
+      "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
       "license": "BSD-2-Clause",
       "engines": {
         "node": ">=12"
@@ -6657,12 +5758,12 @@
       }
     },
     "node_modules/dotenv-expand": {
-      "version": "11.0.6",
-      "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz",
-      "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==",
+      "version": "11.0.7",
+      "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz",
+      "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==",
       "license": "BSD-2-Clause",
       "dependencies": {
-        "dotenv": "^16.4.4"
+        "dotenv": "^16.4.5"
       },
       "engines": {
         "node": ">=12"
@@ -6713,25 +5814,69 @@
         "once": "^1.4.0"
       }
     },
-    "node_modules/env-editor": {
-      "version": "0.4.2",
-      "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz",
-      "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==",
+    "node_modules/engine.io-client": {
+      "version": "6.6.2",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz",
+      "integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==",
+      "license": "MIT",
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.1",
+        "engine.io-parser": "~5.2.1",
+        "ws": "~8.17.1",
+        "xmlhttprequest-ssl": "~2.1.1"
+      }
+    },
+    "node_modules/engine.io-client/node_modules/ws": {
+      "version": "8.17.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+      "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
       "license": "MIT",
       "engines": {
-        "node": ">=8"
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
       }
     },
-    "node_modules/envinfo": {
-      "version": "7.14.0",
-      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz",
-      "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==",
+    "node_modules/engine.io-parser": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+      "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
       "license": "MIT",
-      "bin": {
-        "envinfo": "dist/cli.js"
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "license": "BSD-2-Clause",
+      "peer": true,
+      "engines": {
+        "node": ">=0.12"
       },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/env-editor": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz",
+      "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==",
+      "license": "MIT",
       "engines": {
-        "node": ">=4"
+        "node": ">=8"
       }
     },
     "node_modules/eol": {
@@ -6758,143 +5903,6 @@
         "stackframe": "^1.3.4"
       }
     },
-    "node_modules/errorhandler": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz",
-      "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==",
-      "license": "MIT",
-      "dependencies": {
-        "accepts": "~1.3.7",
-        "escape-html": "~1.0.3"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/es-abstract": {
-      "version": "1.23.3",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
-      "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
-      "license": "MIT",
-      "dependencies": {
-        "array-buffer-byte-length": "^1.0.1",
-        "arraybuffer.prototype.slice": "^1.0.3",
-        "available-typed-arrays": "^1.0.7",
-        "call-bind": "^1.0.7",
-        "data-view-buffer": "^1.0.1",
-        "data-view-byte-length": "^1.0.1",
-        "data-view-byte-offset": "^1.0.0",
-        "es-define-property": "^1.0.0",
-        "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.0.0",
-        "es-set-tostringtag": "^2.0.3",
-        "es-to-primitive": "^1.2.1",
-        "function.prototype.name": "^1.1.6",
-        "get-intrinsic": "^1.2.4",
-        "get-symbol-description": "^1.0.2",
-        "globalthis": "^1.0.3",
-        "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.2",
-        "has-proto": "^1.0.3",
-        "has-symbols": "^1.0.3",
-        "hasown": "^2.0.2",
-        "internal-slot": "^1.0.7",
-        "is-array-buffer": "^3.0.4",
-        "is-callable": "^1.2.7",
-        "is-data-view": "^1.0.1",
-        "is-negative-zero": "^2.0.3",
-        "is-regex": "^1.1.4",
-        "is-shared-array-buffer": "^1.0.3",
-        "is-string": "^1.0.7",
-        "is-typed-array": "^1.1.13",
-        "is-weakref": "^1.0.2",
-        "object-inspect": "^1.13.1",
-        "object-keys": "^1.1.1",
-        "object.assign": "^4.1.5",
-        "regexp.prototype.flags": "^1.5.2",
-        "safe-array-concat": "^1.1.2",
-        "safe-regex-test": "^1.0.3",
-        "string.prototype.trim": "^1.2.9",
-        "string.prototype.trimend": "^1.0.8",
-        "string.prototype.trimstart": "^1.0.8",
-        "typed-array-buffer": "^1.0.2",
-        "typed-array-byte-length": "^1.0.1",
-        "typed-array-byte-offset": "^1.0.2",
-        "typed-array-length": "^1.0.6",
-        "unbox-primitive": "^1.0.2",
-        "which-typed-array": "^1.1.15"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/es-define-property": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
-      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
-      "license": "MIT",
-      "dependencies": {
-        "get-intrinsic": "^1.2.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-errors": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
-      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-object-atoms": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
-      "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-set-tostringtag": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
-      "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
-      "license": "MIT",
-      "dependencies": {
-        "get-intrinsic": "^1.2.4",
-        "has-tostringtag": "^1.0.2",
-        "hasown": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-to-primitive": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-      "license": "MIT",
-      "dependencies": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/escalade": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -6988,9 +5996,9 @@
       }
     },
     "node_modules/execa/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+      "version": "6.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
+      "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
       "license": "MIT",
       "dependencies": {
         "nice-try": "^1.0.4",
@@ -7055,94 +6063,126 @@
       }
     },
     "node_modules/expo": {
-      "version": "51.0.39",
-      "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.39.tgz",
-      "integrity": "sha512-Cs/9xopyzJrpXWbyVUZnr37rprdFJorRgfSp6cdBfvbjxZeKnw2MEu7wJwV/s626i5lZTPGjZPHUF9uQvt51cg==",
+      "version": "52.0.15",
+      "resolved": "https://registry.npmjs.org/expo/-/expo-52.0.15.tgz",
+      "integrity": "sha512-7eGv8y/aslaHvKH8XVvx0XpvJIQiJZ63kBHcdjtAmy+7KCMQp4lwmrnCzYhVdROe1i/GmHF2UwYfHXIYgC1WEw==",
       "license": "MIT",
       "dependencies": {
         "@babel/runtime": "^7.20.0",
-        "@expo/cli": "0.18.31",
-        "@expo/config": "9.0.4",
-        "@expo/config-plugins": "8.0.11",
-        "@expo/metro-config": "0.18.11",
-        "@expo/vector-icons": "^14.0.3",
-        "babel-preset-expo": "~11.0.15",
-        "expo-asset": "~10.0.10",
-        "expo-file-system": "~17.0.1",
-        "expo-font": "~12.0.10",
-        "expo-keep-awake": "~13.0.2",
-        "expo-modules-autolinking": "1.11.3",
-        "expo-modules-core": "1.12.26",
+        "@expo/cli": "0.22.1",
+        "@expo/config": "~10.0.6",
+        "@expo/config-plugins": "~9.0.11",
+        "@expo/fingerprint": "0.11.3",
+        "@expo/metro-config": "0.19.5",
+        "@expo/vector-icons": "^14.0.0",
+        "babel-preset-expo": "~12.0.3",
+        "expo-asset": "~11.0.1",
+        "expo-constants": "~17.0.3",
+        "expo-file-system": "~18.0.4",
+        "expo-font": "~13.0.1",
+        "expo-keep-awake": "~14.0.1",
+        "expo-modules-autolinking": "2.0.3",
+        "expo-modules-core": "2.1.1",
         "fbemitter": "^3.0.0",
+        "web-streams-polyfill": "^3.3.2",
         "whatwg-url-without-unicode": "8.0.0-3"
       },
       "bin": {
         "expo": "bin/cli"
+      },
+      "peerDependencies": {
+        "@expo/dom-webview": "*",
+        "@expo/metro-runtime": "*",
+        "react": "*",
+        "react-native": "*",
+        "react-native-webview": "*"
+      },
+      "peerDependenciesMeta": {
+        "@expo/dom-webview": {
+          "optional": true
+        },
+        "@expo/metro-runtime": {
+          "optional": true
+        },
+        "react-native-webview": {
+          "optional": true
+        }
       }
     },
     "node_modules/expo-asset": {
-      "version": "10.0.10",
-      "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-10.0.10.tgz",
-      "integrity": "sha512-0qoTIihB79k+wGus9wy0JMKq7DdenziVx3iUkGvMAy2azscSgWH6bd2gJ9CGnhC6JRd3qTMFBL0ou/fx7WZl7A==",
+      "version": "11.0.1",
+      "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-11.0.1.tgz",
+      "integrity": "sha512-WatvD7JVC89EsllXFYcS/rji3ajVzE2B/USo0TqedsETixwyVCQfrrvCdCPQyuKghrxVNEj8bQ/Qbea/RZLYjg==",
       "license": "MIT",
       "dependencies": {
-        "expo-constants": "~16.0.0",
+        "@expo/image-utils": "^0.6.0",
+        "expo-constants": "~17.0.0",
         "invariant": "^2.2.4",
         "md5-file": "^3.2.3"
       },
       "peerDependencies": {
-        "expo": "*"
+        "expo": "*",
+        "react": "*",
+        "react-native": "*"
       }
     },
     "node_modules/expo-constants": {
-      "version": "16.0.2",
-      "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-16.0.2.tgz",
-      "integrity": "sha512-9tNY3OVO0jfiMzl7ngb6IOyR5VFzNoN5OOazUWoeGfmMqVB5kltTemRvKraK9JRbBKIw+SOYLEmF0sEqgFZ6OQ==",
+      "version": "17.0.3",
+      "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-17.0.3.tgz",
+      "integrity": "sha512-lnbcX2sAu8SucHXEXxSkhiEpqH+jGrf+TF+MO6sHWIESjwOUVVYlT8qYdjR9xbxWmqFtrI4KV44FkeJf2DaFjQ==",
       "license": "MIT",
       "dependencies": {
-        "@expo/config": "~9.0.0",
-        "@expo/env": "~0.3.0"
+        "@expo/config": "~10.0.4",
+        "@expo/env": "~0.4.0"
       },
       "peerDependencies": {
-        "expo": "*"
+        "expo": "*",
+        "react-native": "*"
       }
     },
     "node_modules/expo-file-system": {
-      "version": "17.0.1",
-      "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-17.0.1.tgz",
-      "integrity": "sha512-dYpnZJqTGj6HCYJyXAgpFkQWsiCH3HY1ek2cFZVHFoEc5tLz9gmdEgTF6nFHurvmvfmXqxi7a5CXyVm0aFYJBw==",
+      "version": "18.0.4",
+      "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.0.4.tgz",
+      "integrity": "sha512-aAWEDwnu0XHOBYvQ9Q0+QIa+483vYJaC4IDsXyWQ73Rtsg273NZh5kYowY+cAocvoSmA99G6htrLBn11ax2bTQ==",
       "license": "MIT",
+      "dependencies": {
+        "web-streams-polyfill": "^3.3.2"
+      },
       "peerDependencies": {
-        "expo": "*"
+        "expo": "*",
+        "react-native": "*"
       }
     },
     "node_modules/expo-font": {
-      "version": "12.0.10",
-      "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-12.0.10.tgz",
-      "integrity": "sha512-Q1i2NuYri3jy32zdnBaHHCya1wH1yMAsI+3CCmj9zlQzlhsS9Bdwcj2W3c5eU5FvH2hsNQy4O+O1NnM6o/pDaQ==",
+      "version": "13.0.1",
+      "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-13.0.1.tgz",
+      "integrity": "sha512-8JE47B+6cLeKWr5ql8gU6YsPHjhrz1vMrTqYMm72No/8iW8Sb/uL4Oc0dpmbjq3hLLXBY0xPBQOgU7FQ6Y04Vg==",
       "license": "MIT",
       "dependencies": {
         "fontfaceobserver": "^2.1.0"
       },
       "peerDependencies": {
-        "expo": "*"
+        "expo": "*",
+        "react": "*"
       }
     },
     "node_modules/expo-keep-awake": {
-      "version": "13.0.2",
-      "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-13.0.2.tgz",
-      "integrity": "sha512-kKiwkVg/bY0AJ5q1Pxnm/GvpeB6hbNJhcFsoOWDh2NlpibhCLaHL826KHUM+WsnJRbVRxJ+K9vbPRHEMvFpVyw==",
+      "version": "14.0.1",
+      "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-14.0.1.tgz",
+      "integrity": "sha512-c5mGCAIk2YM+Vsdy90BlEJ4ZX+KG5Au9EkJUIxXWlpnuKmDAJ3N+5nEZ7EUO1ZTheqoSBeAo4jJ8rTWPU+JXdw==",
       "license": "MIT",
       "peerDependencies": {
-        "expo": "*"
+        "expo": "*",
+        "react": "*"
       }
     },
     "node_modules/expo-modules-autolinking": {
-      "version": "1.11.3",
-      "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.11.3.tgz",
-      "integrity": "sha512-oYh8EZEvYF5TYppxEKUTTJmbr8j7eRRnrIxzZtMvxLTXoujThVPMFS/cbnSnf2bFm1lq50TdDNABhmEi7z0ngQ==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.0.3.tgz",
+      "integrity": "sha512-Q/ALJ54eS7Cr7cmbP+unEDTkHFQivQerWWrqZxuXOrSFYGCYU22+/xAZXaJOpZwseOVsP74zSkoRY/wBimVs7w==",
       "license": "MIT",
       "dependencies": {
+        "@expo/spawn-async": "^1.7.2",
         "chalk": "^4.1.0",
         "commander": "^7.2.0",
         "fast-glob": "^3.2.5",
@@ -7192,19 +6232,35 @@
       }
     },
     "node_modules/expo-modules-core": {
-      "version": "1.12.26",
-      "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.12.26.tgz",
-      "integrity": "sha512-y8yDWjOi+rQRdO+HY+LnUlz8qzHerUaw/LUjKPU/mX8PRXP4UUPEEp5fjAwBU44xjNmYSHWZDwet4IBBE+yQUA==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-2.1.1.tgz",
+      "integrity": "sha512-yQzYCLR2mre4BNMXuqkeJ0oSNgmGEMI6BcmIzeNZbC2NFEjiaDpKvlV9bclYCtyVhUEVNbJcEPYMr6c1Y4eR4w==",
       "license": "MIT",
       "dependencies": {
         "invariant": "^2.2.4"
       }
     },
+    "node_modules/expo-splash-screen": {
+      "version": "0.29.18",
+      "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.29.18.tgz",
+      "integrity": "sha512-bTBY+LF6YtYen2j60yGNh2SX/tG4UXZAyBCMMriOSiZZ7LSCs3ARyEufaSiWk+ckWShTeMqItOnaAN/CAF8MJA==",
+      "license": "MIT",
+      "dependencies": {
+        "@expo/prebuild-config": "^8.0.23"
+      },
+      "peerDependencies": {
+        "expo": "*"
+      }
+    },
     "node_modules/expo-status-bar": {
-      "version": "1.12.1",
-      "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.12.1.tgz",
-      "integrity": "sha512-/t3xdbS8KB0prj5KG5w7z+wZPFlPtkgs95BsmrP/E7Q0xHXTcDcQ6Cu2FkFuRM+PKTb17cJDnLkawyS5vDLxMA==",
-      "license": "MIT"
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-2.0.0.tgz",
+      "integrity": "sha512-vxxdpvpNDMTEc5uTiIrbTvySKKUsOACmfl8OZuUdjNle05oGqwtq3v5YObwym/njSByjoyuZX8UpXBZnxvarwQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "*",
+        "react-native": "*"
+      }
     },
     "node_modules/exponential-backoff": {
       "version": "3.1.1",
@@ -7234,27 +6290,11 @@
         "node": ">=8.6.0"
       }
     },
-    "node_modules/fast-xml-parser": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz",
-      "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/NaturalIntelligence"
-        },
-        {
-          "type": "paypal",
-          "url": "https://paypal.me/naturalintelligence"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "strnum": "^1.0.5"
-      },
-      "bin": {
-        "fxparser": "src/cli/cli.js"
-      }
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "license": "MIT"
     },
     "node_modules/fastq": {
       "version": "1.17.1",
@@ -7394,15 +6434,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/find-yarn-workspace-root": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz",
-      "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "micromatch": "^4.0.2"
-      }
-    },
     "node_modules/flow-enums-runtime": {
       "version": "0.0.6",
       "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz",
@@ -7410,29 +6441,40 @@
       "license": "MIT"
     },
     "node_modules/flow-parser": {
-      "version": "0.252.0",
-      "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.252.0.tgz",
-      "integrity": "sha512-z8hKPUjZ33VLn4HVntifqmEhmolUMopysnMNzazoDqo1GLUkBsreLNsxETlKJMPotUWStQnen6SGvUNe1j4Hlg==",
+      "version": "0.255.0",
+      "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.255.0.tgz",
+      "integrity": "sha512-7QHV2m2mIMh6yIMaAPOVbyNEW77IARwO69d4DgvfDCjuORiykdMLf7XBjF7Zeov7Cpe1OXJ8sB6/aaCE3xuRBw==",
       "license": "MIT",
       "engines": {
         "node": ">=0.4.0"
       }
     },
+    "node_modules/follow-redirects": {
+      "version": "1.15.9",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/fontfaceobserver": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz",
       "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==",
       "license": "BSD-2-Clause"
     },
-    "node_modules/for-each": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
-      "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
-      "license": "MIT",
-      "dependencies": {
-        "is-callable": "^1.1.3"
-      }
-    },
     "node_modules/foreground-child": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
@@ -7533,43 +6575,16 @@
       "license": "MIT",
       "optional": true,
       "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/function.prototype.name": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
-      "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "functions-have-names": "^1.2.3"
-      },
+        "darwin"
+      ],
       "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
       }
     },
-    "node_modules/functions-have-names": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
-      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
       "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -7593,23 +6608,13 @@
         "node": "6.* || 8.* || >= 10.*"
       }
     },
-    "node_modules/get-intrinsic": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
-      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+    "node_modules/get-package-type": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
       "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2",
-        "has-proto": "^1.0.1",
-        "has-symbols": "^1.0.3",
-        "hasown": "^2.0.0"
-      },
       "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "node": ">=8.0.0"
       }
     },
     "node_modules/get-port": {
@@ -7633,23 +6638,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/get-symbol-description": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
-      "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.5",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/getenv": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz",
@@ -7701,22 +6689,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/globalthis": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
-      "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
-      "license": "MIT",
-      "dependencies": {
-        "define-properties": "^1.2.1",
-        "gopd": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/globby": {
       "version": "11.1.0",
       "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
@@ -7737,57 +6709,12 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/gopd": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
-      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
-      "license": "MIT",
-      "dependencies": {
-        "get-intrinsic": "^1.1.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
       "license": "ISC"
     },
-    "node_modules/graphql": {
-      "version": "15.8.0",
-      "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz",
-      "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 10.x"
-      }
-    },
-    "node_modules/graphql-tag": {
-      "version": "2.12.6",
-      "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz",
-      "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
-      }
-    },
-    "node_modules/has-bigints": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
-      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -7797,57 +6724,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/has-property-descriptors": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
-      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
-      "license": "MIT",
-      "dependencies": {
-        "es-define-property": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-proto": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
-      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-symbols": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
-      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-tostringtag": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
-      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
-      "license": "MIT",
-      "dependencies": {
-        "has-symbols": "^1.0.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/hasown": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -7870,60 +6746,36 @@
       }
     },
     "node_modules/hermes-estree": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.19.1.tgz",
-      "integrity": "sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz",
+      "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==",
       "license": "MIT"
     },
     "node_modules/hermes-parser": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.19.1.tgz",
-      "integrity": "sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==",
-      "license": "MIT",
-      "dependencies": {
-        "hermes-estree": "0.19.1"
-      }
-    },
-    "node_modules/hermes-profile-transformer": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz",
-      "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz",
+      "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==",
       "license": "MIT",
       "dependencies": {
-        "source-map": "^0.7.3"
-      },
-      "engines": {
-        "node": ">=8"
+        "hermes-estree": "0.23.1"
       }
     },
     "node_modules/hosted-git-info": {
-      "version": "3.0.8",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz",
-      "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==",
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
+      "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
       "license": "ISC",
       "dependencies": {
-        "lru-cache": "^6.0.0"
+        "lru-cache": "^10.0.1"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^16.14.0 || >=18.0.0"
       }
     },
     "node_modules/hosted-git-info/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/hosted-git-info/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
       "license": "ISC"
     },
     "node_modules/html-parse-stringify": {
@@ -7960,19 +6812,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/https-proxy-agent": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
-      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
-      "license": "MIT",
-      "dependencies": {
-        "agent-base": "6",
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/human-signals": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@@ -8136,20 +6975,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/internal-slot": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
-      "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "hasown": "^2.0.0",
-        "side-channel": "^1.0.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "node_modules/invariant": {
       "version": "2.2.4",
       "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@@ -8177,74 +7002,18 @@
         "node": ">= 0.10"
       }
     },
-    "node_modules/is-array-buffer": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
-      "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/is-arrayish": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
       "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
       "license": "MIT"
     },
-    "node_modules/is-bigint": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
-      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
-      "license": "MIT",
-      "dependencies": {
-        "has-bigints": "^1.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-boolean-object": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
-      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/is-buffer": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
       "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
       "license": "MIT"
     },
-    "node_modules/is-callable": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
-      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/is-core-module": {
       "version": "2.15.1",
       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
@@ -8260,36 +7029,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/is-data-view": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
-      "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
-      "license": "MIT",
-      "dependencies": {
-        "is-typed-array": "^1.1.13"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-date-object": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
-      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-      "license": "MIT",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/is-directory": {
       "version": "0.3.1",
       "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
@@ -8323,81 +7062,18 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-interactive": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
-      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-invalid-path": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz",
-      "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==",
-      "license": "MIT",
-      "dependencies": {
-        "is-glob": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-invalid-path/node_modules/is-extglob": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-      "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-invalid-path/node_modules/is-glob": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-      "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==",
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "license": "MIT",
       "dependencies": {
-        "is-extglob": "^1.0.0"
+        "is-extglob": "^2.1.1"
       },
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "node_modules/is-negative-zero": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
-      "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/is-number": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -8407,21 +7083,6 @@
         "node": ">=0.12.0"
       }
     },
-    "node_modules/is-number-object": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
-      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
-      "license": "MIT",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/is-path-cwd": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
@@ -8440,6 +7101,15 @@
         "node": ">=8"
       }
     },
+    "node_modules/is-plain-obj": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/is-plain-object": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -8452,37 +7122,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/is-regex": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
-      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-shared-array-buffer": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
-      "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.7"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/is-stream": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
@@ -8492,87 +7131,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/is-string": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
-      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
-      "license": "MIT",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-symbol": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
-      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
-      "license": "MIT",
-      "dependencies": {
-        "has-symbols": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-typed-array": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
-      "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
-      "license": "MIT",
-      "dependencies": {
-        "which-typed-array": "^1.1.14"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-unicode-supported": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
-      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-valid-path": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz",
-      "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==",
-      "license": "MIT",
-      "dependencies": {
-        "is-invalid-path": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-weakref": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
-      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/is-wsl": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
@@ -8606,6 +7164,31 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/istanbul-lib-coverage": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+      "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/istanbul-lib-instrument": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@babel/core": "^7.12.3",
+        "@babel/parser": "^7.14.7",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-coverage": "^3.2.0",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/jackspeak": {
       "version": "3.4.3",
       "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
@@ -8638,48 +7221,38 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-environment-node/node_modules/@jest/types": {
+    "node_modules/jest-get-type": {
       "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
-      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+      "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
       "license": "MIT",
-      "dependencies": {
-        "@jest/schemas": "^29.6.3",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^17.0.8",
-        "chalk": "^4.0.0"
-      },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-environment-node/node_modules/@types/istanbul-reports": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
-      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "node_modules/jest-environment-node/node_modules/@types/yargs": {
-      "version": "17.0.33",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
-      "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+    "node_modules/jest-haste-map": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
+      "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
       "license": "MIT",
       "dependencies": {
-        "@types/yargs-parser": "*"
-      }
-    },
-    "node_modules/jest-get-type": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
-      "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
-      "license": "MIT",
+        "@jest/types": "^29.6.3",
+        "@types/graceful-fs": "^4.1.3",
+        "@types/node": "*",
+        "anymatch": "^3.0.3",
+        "fb-watchman": "^2.0.0",
+        "graceful-fs": "^4.2.9",
+        "jest-regex-util": "^29.6.3",
+        "jest-util": "^29.7.0",
+        "jest-worker": "^29.7.0",
+        "micromatch": "^4.0.4",
+        "walker": "^1.0.8"
+      },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "^2.3.2"
       }
     },
     "node_modules/jest-message-util": {
@@ -8702,73 +7275,6 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-message-util/node_modules/@jest/types": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
-      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
-      "license": "MIT",
-      "dependencies": {
-        "@jest/schemas": "^29.6.3",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^17.0.8",
-        "chalk": "^4.0.0"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/@types/istanbul-reports": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
-      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/@types/yargs": {
-      "version": "17.0.33",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
-      "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/yargs-parser": "*"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/ansi-styles": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/pretty-format": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
-      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@jest/schemas": "^29.6.3",
-        "ansi-styles": "^5.0.0",
-        "react-is": "^18.0.0"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
-    "node_modules/jest-message-util/node_modules/react-is": {
-      "version": "18.3.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
-      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
-      "license": "MIT"
-    },
     "node_modules/jest-mock": {
       "version": "29.7.0",
       "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
@@ -8783,39 +7289,13 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-mock/node_modules/@jest/types": {
+    "node_modules/jest-regex-util": {
       "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
-      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+      "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
       "license": "MIT",
-      "dependencies": {
-        "@jest/schemas": "^29.6.3",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^17.0.8",
-        "chalk": "^4.0.0"
-      },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
-    "node_modules/jest-mock/node_modules/@types/istanbul-reports": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
-      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "node_modules/jest-mock/node_modules/@types/yargs": {
-      "version": "17.0.33",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
-      "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/yargs-parser": "*"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-util": {
@@ -8835,41 +7315,6 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-util/node_modules/@jest/types": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
-      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
-      "license": "MIT",
-      "dependencies": {
-        "@jest/schemas": "^29.6.3",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^17.0.8",
-        "chalk": "^4.0.0"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
-    "node_modules/jest-util/node_modules/@types/istanbul-reports": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
-      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "node_modules/jest-util/node_modules/@types/yargs": {
-      "version": "17.0.33",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
-      "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/yargs-parser": "*"
-      }
-    },
     "node_modules/jest-util/node_modules/picomatch": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
@@ -8899,73 +7344,18 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-validate/node_modules/@jest/types": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
-      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
-      "license": "MIT",
-      "dependencies": {
-        "@jest/schemas": "^29.6.3",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^17.0.8",
-        "chalk": "^4.0.0"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
-    "node_modules/jest-validate/node_modules/@types/istanbul-reports": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
-      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "node_modules/jest-validate/node_modules/@types/yargs": {
-      "version": "17.0.33",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
-      "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/yargs-parser": "*"
-      }
-    },
-    "node_modules/jest-validate/node_modules/ansi-styles": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+    "node_modules/jest-validate/node_modules/camelcase": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
       "license": "MIT",
       "engines": {
         "node": ">=10"
       },
       "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/jest-validate/node_modules/pretty-format": {
-      "version": "29.7.0",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
-      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@jest/schemas": "^29.6.3",
-        "ansi-styles": "^5.0.0",
-        "react-is": "^18.0.0"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/jest-validate/node_modules/react-is": {
-      "version": "18.3.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
-      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
-      "license": "MIT"
-    },
     "node_modules/jest-worker": {
       "version": "29.7.0",
       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
@@ -9002,25 +7392,18 @@
       "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==",
       "license": "MIT"
     },
-    "node_modules/joi": {
-      "version": "17.13.3",
-      "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
-      "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "@hapi/hoek": "^9.3.0",
-        "@hapi/topo": "^5.1.0",
-        "@sideway/address": "^4.1.5",
-        "@sideway/formula": "^3.0.1",
-        "@sideway/pinpoint": "^2.0.0"
-      }
-    },
     "node_modules/join-component": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz",
       "integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==",
       "license": "MIT"
     },
+    "node_modules/js-sha3": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+      "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==",
+      "license": "MIT"
+    },
     "node_modules/js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -9103,36 +7486,6 @@
       "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
       "license": "MIT"
     },
-    "node_modules/json-schema-deref-sync": {
-      "version": "0.13.0",
-      "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.13.0.tgz",
-      "integrity": "sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==",
-      "license": "MIT",
-      "dependencies": {
-        "clone": "^2.1.2",
-        "dag-map": "~1.0.0",
-        "is-valid-path": "^0.1.1",
-        "lodash": "^4.17.13",
-        "md5": "~2.2.0",
-        "memory-cache": "~0.2.0",
-        "traverse": "~0.6.6",
-        "valid-url": "~1.0.9"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/json-schema-deref-sync/node_modules/md5": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
-      "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "charenc": "~0.0.1",
-        "crypt": "~0.0.1",
-        "is-buffer": "~1.1.1"
-      }
-    },
     "node_modules/json5": {
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -9207,9 +7560,9 @@
       "license": "MIT"
     },
     "node_modules/lightningcss": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.19.0.tgz",
-      "integrity": "sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==",
+      "version": "1.27.0",
+      "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz",
+      "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==",
       "license": "MPL-2.0",
       "dependencies": {
         "detect-libc": "^1.0.3"
@@ -9222,20 +7575,22 @@
         "url": "https://opencollective.com/parcel"
       },
       "optionalDependencies": {
-        "lightningcss-darwin-arm64": "1.19.0",
-        "lightningcss-darwin-x64": "1.19.0",
-        "lightningcss-linux-arm-gnueabihf": "1.19.0",
-        "lightningcss-linux-arm64-gnu": "1.19.0",
-        "lightningcss-linux-arm64-musl": "1.19.0",
-        "lightningcss-linux-x64-gnu": "1.19.0",
-        "lightningcss-linux-x64-musl": "1.19.0",
-        "lightningcss-win32-x64-msvc": "1.19.0"
+        "lightningcss-darwin-arm64": "1.27.0",
+        "lightningcss-darwin-x64": "1.27.0",
+        "lightningcss-freebsd-x64": "1.27.0",
+        "lightningcss-linux-arm-gnueabihf": "1.27.0",
+        "lightningcss-linux-arm64-gnu": "1.27.0",
+        "lightningcss-linux-arm64-musl": "1.27.0",
+        "lightningcss-linux-x64-gnu": "1.27.0",
+        "lightningcss-linux-x64-musl": "1.27.0",
+        "lightningcss-win32-arm64-msvc": "1.27.0",
+        "lightningcss-win32-x64-msvc": "1.27.0"
       }
     },
     "node_modules/lightningcss-darwin-arm64": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.19.0.tgz",
-      "integrity": "sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==",
+      "version": "1.27.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz",
+      "integrity": "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==",
       "cpu": [
         "arm64"
       ],
@@ -9253,9 +7608,9 @@
       }
     },
     "node_modules/lightningcss-darwin-x64": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.19.0.tgz",
-      "integrity": "sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==",
+      "version": "1.27.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz",
+      "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==",
       "cpu": [
         "x64"
       ],
@@ -9272,10 +7627,30 @@
         "url": "https://opencollective.com/parcel"
       }
     },
+    "node_modules/lightningcss-freebsd-x64": {
+      "version": "1.27.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz",
+      "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
     "node_modules/lightningcss-linux-arm-gnueabihf": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.19.0.tgz",
-      "integrity": "sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==",
+      "version": "1.27.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz",
+      "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==",
       "cpu": [
         "arm"
       ],
@@ -9293,9 +7668,9 @@
       }
     },
     "node_modules/lightningcss-linux-arm64-gnu": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.19.0.tgz",
-      "integrity": "sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==",
+      "version": "1.27.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz",
+      "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==",
       "cpu": [
         "arm64"
       ],
@@ -9313,9 +7688,9 @@
       }
     },
     "node_modules/lightningcss-linux-arm64-musl": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.19.0.tgz",
-      "integrity": "sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==",
+      "version": "1.27.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz",
+      "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==",
       "cpu": [
         "arm64"
       ],
@@ -9333,9 +7708,9 @@
       }
     },
     "node_modules/lightningcss-linux-x64-gnu": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.19.0.tgz",
-      "integrity": "sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==",
+      "version": "1.27.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz",
+      "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==",
       "cpu": [
         "x64"
       ],
@@ -9353,9 +7728,9 @@
       }
     },
     "node_modules/lightningcss-linux-x64-musl": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.19.0.tgz",
-      "integrity": "sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==",
+      "version": "1.27.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz",
+      "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==",
       "cpu": [
         "x64"
       ],
@@ -9372,10 +7747,30 @@
         "url": "https://opencollective.com/parcel"
       }
     },
+    "node_modules/lightningcss-win32-arm64-msvc": {
+      "version": "1.27.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz",
+      "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
     "node_modules/lightningcss-win32-x64-msvc": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.19.0.tgz",
-      "integrity": "sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==",
+      "version": "1.27.0",
+      "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz",
+      "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==",
       "cpu": [
         "x64"
       ],
@@ -9479,192 +7874,39 @@
       }
     },
     "node_modules/log-symbols/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-      "license": "MIT"
-    },
-    "node_modules/log-symbols/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/log-symbols/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/log-symbols/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/logkitty": {
-      "version": "0.7.1",
-      "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz",
-      "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-fragments": "^0.2.1",
-        "dayjs": "^1.8.15",
-        "yargs": "^15.1.0"
-      },
-      "bin": {
-        "logkitty": "bin/logkitty.js"
-      }
-    },
-    "node_modules/logkitty/node_modules/camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/logkitty/node_modules/cliui": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
-      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
-      "license": "ISC",
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^6.2.0"
-      }
-    },
-    "node_modules/logkitty/node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "license": "MIT",
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/logkitty/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "license": "MIT",
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/logkitty/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "license": "MIT",
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/logkitty/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "license": "MIT",
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/logkitty/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+      "license": "MIT"
     },
-    "node_modules/logkitty/node_modules/wrap-ansi": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+    "node_modules/log-symbols/node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
       "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
       "engines": {
-        "node": ">=8"
+        "node": ">=0.8.0"
       }
     },
-    "node_modules/logkitty/node_modules/y18n": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
-      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
-      "license": "ISC"
-    },
-    "node_modules/logkitty/node_modules/yargs": {
-      "version": "15.4.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
-      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+    "node_modules/log-symbols/node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
       "license": "MIT",
-      "dependencies": {
-        "cliui": "^6.0.0",
-        "decamelize": "^1.2.0",
-        "find-up": "^4.1.0",
-        "get-caller-file": "^2.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^4.2.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^18.1.2"
-      },
       "engines": {
-        "node": ">=8"
+        "node": ">=4"
       }
     },
-    "node_modules/logkitty/node_modules/yargs-parser": {
-      "version": "18.1.3",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
-      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
-      "license": "ISC",
+    "node_modules/log-symbols/node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "license": "MIT",
       "dependencies": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
+        "has-flag": "^3.0.0"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=4"
       }
     },
     "node_modules/loose-envify": {
@@ -9731,6 +7973,16 @@
       "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==",
       "license": "Apache-2.0"
     },
+    "node_modules/match-sorter": {
+      "version": "6.3.4",
+      "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz",
+      "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.23.8",
+        "remove-accents": "0.5.0"
+      }
+    },
     "node_modules/md5": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
@@ -9757,11 +8009,12 @@
         "node": ">=0.10"
       }
     },
-    "node_modules/md5hex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz",
-      "integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==",
-      "license": "MIT"
+    "node_modules/mdn-data": {
+      "version": "2.0.14",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+      "license": "CC0-1.0",
+      "peer": true
     },
     "node_modules/memoize-one": {
       "version": "5.2.1",
@@ -9769,11 +8022,17 @@
       "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
       "license": "MIT"
     },
-    "node_modules/memory-cache": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz",
-      "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==",
-      "license": "BSD-2-Clause"
+    "node_modules/merge-options": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz",
+      "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==",
+      "license": "MIT",
+      "dependencies": {
+        "is-plain-obj": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
     },
     "node_modules/merge-stream": {
       "version": "2.0.0",
@@ -9791,18 +8050,18 @@
       }
     },
     "node_modules/metro": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.12.tgz",
-      "integrity": "sha512-1UsH5FzJd9quUsD1qY+zUG4JY3jo3YEMxbMYH9jT6NK3j4iORhlwTK8fYTfAUBhDKjgLfKjAh7aoazNE23oIRA==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/core": "^7.20.0",
-        "@babel/generator": "^7.20.0",
-        "@babel/parser": "^7.20.0",
-        "@babel/template": "^7.0.0",
-        "@babel/traverse": "^7.20.0",
-        "@babel/types": "^7.20.0",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro/-/metro-0.81.0.tgz",
+      "integrity": "sha512-kzdzmpL0gKhEthZ9aOV7sTqvg6NuTxDV8SIm9pf9sO8VVEbKrQk5DNcwupOUjgPPFAuKUc2NkT0suyT62hm2xg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.24.7",
+        "@babel/core": "^7.25.2",
+        "@babel/generator": "^7.25.0",
+        "@babel/parser": "^7.25.3",
+        "@babel/template": "^7.25.0",
+        "@babel/traverse": "^7.25.3",
+        "@babel/types": "^7.25.2",
         "accepts": "^1.3.7",
         "chalk": "^4.0.0",
         "ci-info": "^2.0.0",
@@ -9812,24 +8071,24 @@
         "error-stack-parser": "^2.0.6",
         "flow-enums-runtime": "^0.0.6",
         "graceful-fs": "^4.2.4",
-        "hermes-parser": "0.23.1",
+        "hermes-parser": "0.24.0",
         "image-size": "^1.0.2",
         "invariant": "^2.2.4",
         "jest-worker": "^29.6.3",
         "jsc-safe-url": "^0.2.2",
         "lodash.throttle": "^4.1.1",
-        "metro-babel-transformer": "0.80.12",
-        "metro-cache": "0.80.12",
-        "metro-cache-key": "0.80.12",
-        "metro-config": "0.80.12",
-        "metro-core": "0.80.12",
-        "metro-file-map": "0.80.12",
-        "metro-resolver": "0.80.12",
-        "metro-runtime": "0.80.12",
-        "metro-source-map": "0.80.12",
-        "metro-symbolicate": "0.80.12",
-        "metro-transform-plugins": "0.80.12",
-        "metro-transform-worker": "0.80.12",
+        "metro-babel-transformer": "0.81.0",
+        "metro-cache": "0.81.0",
+        "metro-cache-key": "0.81.0",
+        "metro-config": "0.81.0",
+        "metro-core": "0.81.0",
+        "metro-file-map": "0.81.0",
+        "metro-resolver": "0.81.0",
+        "metro-runtime": "0.81.0",
+        "metro-source-map": "0.81.0",
+        "metro-symbolicate": "0.81.0",
+        "metro-transform-plugins": "0.81.0",
+        "metro-transform-worker": "0.81.0",
         "mime-types": "^2.1.27",
         "nullthrows": "^1.1.1",
         "serialize-error": "^2.1.0",
@@ -9843,102 +8102,102 @@
         "metro": "src/cli.js"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-babel-transformer": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.12.tgz",
-      "integrity": "sha512-YZziRs0MgA3pzCkkvOoQRXjIoVjvrpi/yRlJnObyIvMP6lFdtyG4nUGIwGY9VXnBvxmXD6mPY2e+NSw6JAyiRg==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.81.0.tgz",
+      "integrity": "sha512-Dc0QWK4wZIeHnyZ3sevWGTnnSkIDDn/SWyfrn99zbKbDOCoCYy71PAn9uCRrP/hduKLJQOy+tebd63Rr9D8tXg==",
       "license": "MIT",
       "dependencies": {
-        "@babel/core": "^7.20.0",
+        "@babel/core": "^7.25.2",
         "flow-enums-runtime": "^0.0.6",
-        "hermes-parser": "0.23.1",
+        "hermes-parser": "0.24.0",
         "nullthrows": "^1.1.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-babel-transformer/node_modules/hermes-estree": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz",
-      "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==",
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.24.0.tgz",
+      "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==",
       "license": "MIT"
     },
     "node_modules/metro-babel-transformer/node_modules/hermes-parser": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz",
-      "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==",
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.24.0.tgz",
+      "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==",
       "license": "MIT",
       "dependencies": {
-        "hermes-estree": "0.23.1"
+        "hermes-estree": "0.24.0"
       }
     },
     "node_modules/metro-cache": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.12.tgz",
-      "integrity": "sha512-p5kNHh2KJ0pbQI/H7ZBPCEwkyNcSz7OUkslzsiIWBMPQGFJ/xArMwkV7I+GJcWh+b4m6zbLxE5fk6fqbVK1xGA==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.81.0.tgz",
+      "integrity": "sha512-DyuqySicHXkHUDZFVJmh0ygxBSx6pCKUrTcSgb884oiscV/ROt1Vhye+x+OIHcsodyA10gzZtrVtxIFV4l9I4g==",
       "license": "MIT",
       "dependencies": {
         "exponential-backoff": "^3.1.1",
         "flow-enums-runtime": "^0.0.6",
-        "metro-core": "0.80.12"
+        "metro-core": "0.81.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-cache-key": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.12.tgz",
-      "integrity": "sha512-o4BspKnugg/pE45ei0LGHVuBJXwRgruW7oSFAeSZvBKA/sGr0UhOGY3uycOgWInnS3v5yTTfiBA9lHlNRhsvGA==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.81.0.tgz",
+      "integrity": "sha512-qX/IwtknP9bQZL78OK9xeSvLM/xlGfrs6SlUGgHvrxtmGTRSsxcyqxR+c+7ch1xr05n62Gin/O44QKg5V70rNQ==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-config": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.12.tgz",
-      "integrity": "sha512-4rwOWwrhm62LjB12ytiuR5NgK1ZBNr24/He8mqCsC+HXZ+ATbrewLNztzbAZHtFsrxP4D4GLTGgh96pCpYLSAQ==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.81.0.tgz",
+      "integrity": "sha512-6CinEaBe3WLpRlKlYXXu8r1UblJhbwD6Gtnoib5U8j6Pjp7XxMG9h/DGMeNp9aGLDu1OieUqiXpFo7O0/rR5Kg==",
       "license": "MIT",
       "dependencies": {
         "connect": "^3.6.5",
         "cosmiconfig": "^5.0.5",
         "flow-enums-runtime": "^0.0.6",
         "jest-validate": "^29.6.3",
-        "metro": "0.80.12",
-        "metro-cache": "0.80.12",
-        "metro-core": "0.80.12",
-        "metro-runtime": "0.80.12"
+        "metro": "0.81.0",
+        "metro-cache": "0.81.0",
+        "metro-core": "0.81.0",
+        "metro-runtime": "0.81.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-core": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.12.tgz",
-      "integrity": "sha512-QqdJ/yAK+IpPs2HU/h5v2pKEdANBagSsc6DRSjnwSyJsCoHlmyJKCaCJ7KhWGx+N4OHxh37hoA8fc2CuZbx0Fw==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.81.0.tgz",
+      "integrity": "sha512-CVkM5YCOAFkNMvJai6KzA0RpztzfEKRX62/PFMOJ9J7K0uq/UkOFLxcgpcncMIrfy0PbfEj811b69tjULUQe1Q==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6",
         "lodash.throttle": "^4.1.1",
-        "metro-resolver": "0.80.12"
+        "metro-resolver": "0.81.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-file-map": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.12.tgz",
-      "integrity": "sha512-sYdemWSlk66bWzW2wp79kcPMzwuG32x1ZF3otI0QZTmrnTaaTiGyhE66P1z6KR4n2Eu5QXiABa6EWbAQv0r8bw==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.81.0.tgz",
+      "integrity": "sha512-zMDI5uYhQCyxbye/AuFx/pAbsz9K+vKL7h1ShUXdN2fz4VUPiyQYRsRqOoVG1DsiCgzd5B6LW0YW77NFpjDQeg==",
       "license": "MIT",
       "dependencies": {
         "anymatch": "^3.0.3",
@@ -9954,7 +8213,7 @@
         "walker": "^1.0.7"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       },
       "optionalDependencies": {
         "fsevents": "^2.3.2"
@@ -9976,81 +8235,73 @@
       "license": "MIT"
     },
     "node_modules/metro-minify-terser": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.12.tgz",
-      "integrity": "sha512-muWzUw3y5k+9083ZoX9VaJLWEV2Jcgi+Oan0Mmb/fBNMPqP9xVDuy4pOMn/HOiGndgfh/MK7s4bsjkyLJKMnXQ==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.81.0.tgz",
+      "integrity": "sha512-U2ramh3W822ZR1nfXgIk+emxsf5eZSg10GbQrT0ZizImK8IZ5BmJY+BHRIkQgHzWFpExOVxC7kWbGL1bZALswA==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6",
         "terser": "^5.15.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-resolver": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.12.tgz",
-      "integrity": "sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.81.0.tgz",
+      "integrity": "sha512-Uu2Q+buHhm571cEwpPek8egMbdSTqmwT/5U7ZVNpK6Z2ElQBBCxd7HmFAslKXa7wgpTO2FAn6MqGeERbAtVDUA==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-runtime": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.12.tgz",
-      "integrity": "sha512-LIx7+92p5rpI0i6iB4S4GBvvLxStNt6fF0oPMaUd1Weku7jZdfkCZzmrtDD9CSQ6EPb0T9NUZoyXIxlBa3wOCw==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.81.0.tgz",
+      "integrity": "sha512-6oYB5HOt37RuGz2eV4A6yhcl+PUTwJYLDlY9vhT+aVjbUWI6MdBCf69vc4f5K5Vpt+yOkjy+2LDwLS0ykWFwYw==",
       "license": "MIT",
       "dependencies": {
         "@babel/runtime": "^7.25.0",
         "flow-enums-runtime": "^0.0.6"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-source-map": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.12.tgz",
-      "integrity": "sha512-o+AXmE7hpvM8r8MKsx7TI21/eerYYy2DCDkWfoBkv+jNkl61khvDHlQn0cXZa6lrcNZiZkl9oHSMcwLLIrFmpw==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.81.0.tgz",
+      "integrity": "sha512-TzsVxhH83dyxg4A4+L1nzNO12I7ps5IHLjKGZH3Hrf549eiZivkdjYiq/S5lOB+p2HiQ+Ykcwtmcja95LIC62g==",
       "license": "MIT",
       "dependencies": {
-        "@babel/traverse": "^7.20.0",
-        "@babel/types": "^7.20.0",
+        "@babel/traverse": "^7.25.3",
+        "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3",
+        "@babel/types": "^7.25.2",
         "flow-enums-runtime": "^0.0.6",
         "invariant": "^2.2.4",
-        "metro-symbolicate": "0.80.12",
+        "metro-symbolicate": "0.81.0",
         "nullthrows": "^1.1.1",
-        "ob1": "0.80.12",
+        "ob1": "0.81.0",
         "source-map": "^0.5.6",
         "vlq": "^1.0.0"
       },
       "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/metro-source-map/node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-symbolicate": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.12.tgz",
-      "integrity": "sha512-/dIpNdHksXkGHZXARZpL7doUzHqSNxgQ8+kQGxwpJuHnDhGkENxB5PS2QBaTDdEcmyTMjS53CN1rl9n1gR6fmw==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.81.0.tgz",
+      "integrity": "sha512-C/1rWbNTPYp6yzID8IPuQPpVGzJ2rbWYBATxlvQ9dfK5lVNoxcwz77hjcY8ISLsRRR15hyd/zbjCNKPKeNgE1Q==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6",
         "invariant": "^2.2.4",
-        "metro-source-map": "0.80.12",
+        "metro-source-map": "0.81.0",
         "nullthrows": "^1.1.1",
         "source-map": "^0.5.6",
         "through2": "^2.0.1",
@@ -10060,57 +8311,48 @@
         "metro-symbolicate": "src/index.js"
       },
       "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/metro-symbolicate/node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-transform-plugins": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.12.tgz",
-      "integrity": "sha512-WQWp00AcZvXuQdbjQbx1LzFR31IInlkCDYJNRs6gtEtAyhwpMMlL2KcHmdY+wjDO9RPcliZ+Xl1riOuBecVlPA==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.81.0.tgz",
+      "integrity": "sha512-uErLAPBvttGCrmGSCa0dNHlOTk3uJFVEVWa5WDg6tQ79PRmuYRwzUgLhVzn/9/kyr75eUX3QWXN79Jvu4txt6Q==",
       "license": "MIT",
       "dependencies": {
-        "@babel/core": "^7.20.0",
-        "@babel/generator": "^7.20.0",
-        "@babel/template": "^7.0.0",
-        "@babel/traverse": "^7.20.0",
+        "@babel/core": "^7.25.2",
+        "@babel/generator": "^7.25.0",
+        "@babel/template": "^7.25.0",
+        "@babel/traverse": "^7.25.3",
         "flow-enums-runtime": "^0.0.6",
         "nullthrows": "^1.1.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro-transform-worker": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.12.tgz",
-      "integrity": "sha512-KAPFN1y3eVqEbKLx1I8WOarHPqDMUa8WelWxaJCNKO/yHCP26zELeqTJvhsQup+8uwB6EYi/sp0b6TGoh6lOEA==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.81.0.tgz",
+      "integrity": "sha512-HrQ0twiruhKy0yA+9nK5bIe3WQXZcC66PXTvRIos61/EASLAP2DzEmW7IxN/MGsfZegN2UzqL2CG38+mOB45vg==",
       "license": "MIT",
       "dependencies": {
-        "@babel/core": "^7.20.0",
-        "@babel/generator": "^7.20.0",
-        "@babel/parser": "^7.20.0",
-        "@babel/types": "^7.20.0",
+        "@babel/core": "^7.25.2",
+        "@babel/generator": "^7.25.0",
+        "@babel/parser": "^7.25.3",
+        "@babel/types": "^7.25.2",
         "flow-enums-runtime": "^0.0.6",
-        "metro": "0.80.12",
-        "metro-babel-transformer": "0.80.12",
-        "metro-cache": "0.80.12",
-        "metro-cache-key": "0.80.12",
-        "metro-minify-terser": "0.80.12",
-        "metro-source-map": "0.80.12",
-        "metro-transform-plugins": "0.80.12",
+        "metro": "0.81.0",
+        "metro-babel-transformer": "0.81.0",
+        "metro-cache": "0.81.0",
+        "metro-cache-key": "0.81.0",
+        "metro-minify-terser": "0.81.0",
+        "metro-source-map": "0.81.0",
+        "metro-transform-plugins": "0.81.0",
         "nullthrows": "^1.1.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/metro/node_modules/ci-info": {
@@ -10129,18 +8371,18 @@
       }
     },
     "node_modules/metro/node_modules/hermes-estree": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz",
-      "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==",
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.24.0.tgz",
+      "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==",
       "license": "MIT"
     },
     "node_modules/metro/node_modules/hermes-parser": {
-      "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz",
-      "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==",
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.24.0.tgz",
+      "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==",
       "license": "MIT",
       "dependencies": {
-        "hermes-estree": "0.23.1"
+        "hermes-estree": "0.24.0"
       }
     },
     "node_modules/metro/node_modules/ms": {
@@ -10149,15 +8391,6 @@
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
       "license": "MIT"
     },
-    "node_modules/metro/node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/metro/node_modules/strip-ansi": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -10216,16 +8449,22 @@
         "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
+    "node_modules/microseconds": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz",
+      "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==",
+      "license": "MIT"
+    },
     "node_modules/mime": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
-      "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
       "license": "MIT",
       "bin": {
         "mime": "cli.js"
       },
       "engines": {
-        "node": ">=4.0.0"
+        "node": ">=4"
       }
     },
     "node_modules/mime-db": {
@@ -10420,6 +8659,15 @@
         "thenify-all": "^1.0.0"
       }
     },
+    "node_modules/nano-time": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz",
+      "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==",
+      "license": "ISC",
+      "dependencies": {
+        "big-integer": "^1.6.16"
+      }
+    },
     "node_modules/nanoid": {
       "version": "3.3.7",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
@@ -10465,15 +8713,6 @@
       "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
       "license": "MIT"
     },
-    "node_modules/nocache": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz",
-      "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
     "node_modules/node-abort-controller": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
@@ -10533,19 +8772,6 @@
       "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
       "license": "MIT"
     },
-    "node_modules/node-stream-zip": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz",
-      "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/antelle"
-      }
-    },
     "node_modules/normalize-path": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -10556,24 +8782,30 @@
       }
     },
     "node_modules/npm-package-arg": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz",
-      "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==",
+      "version": "11.0.3",
+      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz",
+      "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==",
       "license": "ISC",
       "dependencies": {
-        "hosted-git-info": "^3.0.2",
-        "osenv": "^0.1.5",
-        "semver": "^5.6.0",
-        "validate-npm-package-name": "^3.0.0"
+        "hosted-git-info": "^7.0.0",
+        "proc-log": "^4.0.0",
+        "semver": "^7.3.5",
+        "validate-npm-package-name": "^5.0.0"
+      },
+      "engines": {
+        "node": "^16.14.0 || >=18.0.0"
       }
     },
     "node_modules/npm-package-arg/node_modules/semver": {
-      "version": "5.7.2",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
-      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
       "license": "ISC",
       "bin": {
-        "semver": "bin/semver"
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/npm-run-path": {
@@ -10597,6 +8829,19 @@
         "node": ">=4"
       }
     },
+    "node_modules/nth-check": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+      "license": "BSD-2-Clause",
+      "peer": true,
+      "dependencies": {
+        "boolbase": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
+      }
+    },
     "node_modules/nullthrows": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
@@ -10604,15 +8849,15 @@
       "license": "MIT"
     },
     "node_modules/ob1": {
-      "version": "0.80.12",
-      "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.12.tgz",
-      "integrity": "sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw==",
+      "version": "0.81.0",
+      "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.81.0.tgz",
+      "integrity": "sha512-6Cvrkxt1tqaRdWqTAMcVYEiO5i1xcF9y7t06nFdjFqkfPsEloCf8WwhXdwBpNUkVYSQlSGS7cDgVQR86miBfBQ==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=18.18"
       }
     },
     "node_modules/object-assign": {
@@ -10624,44 +8869,11 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/object-inspect": {
-      "version": "1.13.3",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
-      "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/object.assign": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
-      "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.5",
-        "define-properties": "^1.2.1",
-        "has-symbols": "^1.0.3",
-        "object-keys": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
+    "node_modules/oblivious-set": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz",
+      "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==",
+      "license": "MIT"
     },
     "node_modules/on-finished": {
       "version": "2.3.0",
@@ -10706,17 +8918,16 @@
       }
     },
     "node_modules/open": {
-      "version": "8.4.2",
-      "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
-      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+      "version": "7.4.2",
+      "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
       "license": "MIT",
       "dependencies": {
-        "define-lazy-prop": "^2.0.0",
-        "is-docker": "^2.1.1",
-        "is-wsl": "^2.2.0"
+        "is-docker": "^2.0.0",
+        "is-wsl": "^2.1.1"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=8"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -10810,15 +9021,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/os-tmpdir": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
@@ -10828,17 +9030,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/osenv": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
-      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
-      "deprecated": "This package is no longer supported.",
-      "license": "ISC",
-      "dependencies": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.0"
-      }
-    },
     "node_modules/p-finally": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -11166,19 +9357,10 @@
         "node": ">=4.0.0"
       }
     },
-    "node_modules/possible-typed-array-names": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
-      "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "node_modules/postcss": {
-      "version": "8.4.47",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
-      "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+      "version": "8.4.49",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
+      "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
       "funding": [
         {
           "type": "opencollective",
@@ -11196,7 +9378,7 @@
       "license": "MIT",
       "dependencies": {
         "nanoid": "^3.3.7",
-        "picocolors": "^1.1.0",
+        "picocolors": "^1.1.1",
         "source-map-js": "^1.2.1"
       },
       "engines": {
@@ -11216,56 +9398,46 @@
       }
     },
     "node_modules/pretty-format": {
-      "version": "24.9.0",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
-      "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
-      "license": "MIT",
-      "dependencies": {
-        "@jest/types": "^24.9.0",
-        "ansi-regex": "^4.0.0",
-        "ansi-styles": "^3.2.0",
-        "react-is": "^16.8.4"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/pretty-format/node_modules/ansi-regex": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/pretty-format/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
       "license": "MIT",
       "dependencies": {
-        "color-convert": "^1.9.0"
+        "@jest/schemas": "^29.6.3",
+        "ansi-styles": "^5.0.0",
+        "react-is": "^18.0.0"
       },
       "engines": {
-        "node": ">=4"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
-    },
-    "node_modules/pretty-format/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+    },
+    "node_modules/pretty-format/node_modules/ansi-styles": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
       "license": "MIT",
-      "dependencies": {
-        "color-name": "1.1.3"
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "node_modules/pretty-format/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+    "node_modules/pretty-format/node_modules/react-is": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "license": "MIT"
     },
+    "node_modules/proc-log": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz",
+      "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==",
+      "license": "ISC",
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
     "node_modules/process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -11314,6 +9486,12 @@
         "react-is": "^16.13.1"
       }
     },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "license": "MIT"
+    },
     "node_modules/pump": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
@@ -11359,16 +9537,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/querystring": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
-      "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==",
-      "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
     "node_modules/queue": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
@@ -11423,9 +9591,9 @@
       }
     },
     "node_modules/react": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
-      "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+      "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
       "license": "MIT",
       "dependencies": {
         "loose-envify": "^1.1.0"
@@ -11506,47 +9674,48 @@
       "license": "MIT"
     },
     "node_modules/react-native": {
-      "version": "0.74.5",
-      "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.74.5.tgz",
-      "integrity": "sha512-Bgg2WvxaGODukJMTZFTZBNMKVaROHLwSb8VAGEdrlvKwfb1hHg/3aXTUICYk7dwgAnb+INbGMwnF8yeAgIUmqw==",
+      "version": "0.76.3",
+      "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.76.3.tgz",
+      "integrity": "sha512-0TUhgmlouRNf6yuDIIAdbQl0g1VsONgCMsLs7Et64hjj5VLMCA7np+4dMrZvGZ3wRNqzgeyT9oWJsUm49AcwSQ==",
       "license": "MIT",
       "dependencies": {
         "@jest/create-cache-key-function": "^29.6.3",
-        "@react-native-community/cli": "13.6.9",
-        "@react-native-community/cli-platform-android": "13.6.9",
-        "@react-native-community/cli-platform-ios": "13.6.9",
-        "@react-native/assets-registry": "0.74.87",
-        "@react-native/codegen": "0.74.87",
-        "@react-native/community-cli-plugin": "0.74.87",
-        "@react-native/gradle-plugin": "0.74.87",
-        "@react-native/js-polyfills": "0.74.87",
-        "@react-native/normalize-colors": "0.74.87",
-        "@react-native/virtualized-lists": "0.74.87",
+        "@react-native/assets-registry": "0.76.3",
+        "@react-native/codegen": "0.76.3",
+        "@react-native/community-cli-plugin": "0.76.3",
+        "@react-native/gradle-plugin": "0.76.3",
+        "@react-native/js-polyfills": "0.76.3",
+        "@react-native/normalize-colors": "0.76.3",
+        "@react-native/virtualized-lists": "0.76.3",
         "abort-controller": "^3.0.0",
         "anser": "^1.4.9",
         "ansi-regex": "^5.0.0",
+        "babel-jest": "^29.7.0",
+        "babel-plugin-syntax-hermes-parser": "^0.23.1",
         "base64-js": "^1.5.1",
         "chalk": "^4.0.0",
+        "commander": "^12.0.0",
         "event-target-shim": "^5.0.1",
         "flow-enums-runtime": "^0.0.6",
+        "glob": "^7.1.1",
         "invariant": "^2.2.4",
         "jest-environment-node": "^29.6.3",
         "jsc-android": "^250231.0.0",
         "memoize-one": "^5.0.0",
-        "metro-runtime": "^0.80.3",
-        "metro-source-map": "^0.80.3",
+        "metro-runtime": "^0.81.0",
+        "metro-source-map": "^0.81.0",
         "mkdirp": "^0.5.1",
         "nullthrows": "^1.1.1",
-        "pretty-format": "^26.5.2",
+        "pretty-format": "^29.7.0",
         "promise": "^8.3.0",
-        "react-devtools-core": "^5.0.0",
+        "react-devtools-core": "^5.3.1",
         "react-refresh": "^0.14.0",
-        "react-shallow-renderer": "^16.15.0",
         "regenerator-runtime": "^0.13.2",
         "scheduler": "0.24.0-canary-efb381bbf-20230505",
+        "semver": "^7.1.3",
         "stacktrace-parser": "^0.1.10",
         "whatwg-fetch": "^3.0.0",
-        "ws": "^6.2.2",
+        "ws": "^6.2.3",
         "yargs": "^17.6.2"
       },
       "bin": {
@@ -11557,7 +9726,7 @@
       },
       "peerDependencies": {
         "@types/react": "^18.2.6",
-        "react": "18.2.0"
+        "react": "^18.2.0"
       },
       "peerDependenciesMeta": {
         "@types/react": {
@@ -11565,10 +9734,28 @@
         }
       }
     },
+    "node_modules/react-native-dropdown-select-list": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/react-native-dropdown-select-list/-/react-native-dropdown-select-list-2.0.5.tgz",
+      "integrity": "sha512-TepbcagQVUMB6nLuIlVU2ghRpQHAECOeZWe8K04ymW6NqbKbxuczZSDFfdCiABiiQ2dFD+8Dz65y4K7/uUEqGg==",
+      "license": "MIT"
+    },
+    "node_modules/react-native-progress": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/react-native-progress/-/react-native-progress-5.0.1.tgz",
+      "integrity": "sha512-TYfJ4auAe5vubDma2yfFvt7ktSI+UCfysqJnkdHEcLXqAitRFOozgF/cLgN5VNi/iLdaf3ga1ETi2RF4jVZ/+g==",
+      "license": "MIT",
+      "dependencies": {
+        "prop-types": "^15.7.2"
+      },
+      "peerDependencies": {
+        "react-native-svg": "*"
+      }
+    },
     "node_modules/react-native-safe-area-context": {
-      "version": "4.10.5",
-      "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.10.5.tgz",
-      "integrity": "sha512-Wyb0Nqw2XJ6oZxW/cK8k5q7/UAhg/wbEG6UVf89rQqecDZTDA5ic//P9J6VvJRVZerzGmxWQpVuM7f+PRYUM4g==",
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.12.0.tgz",
+      "integrity": "sha512-ukk5PxcF4p3yu6qMZcmeiZgowhb5AsKRnil54YFUUAXVIS7PJcMHGGC+q44fCiBg44/1AJk5njGMez1m9H0BVQ==",
       "license": "MIT",
       "peerDependencies": {
         "react": "*",
@@ -11576,9 +9763,9 @@
       }
     },
     "node_modules/react-native-screens": {
-      "version": "3.31.1",
-      "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.31.1.tgz",
-      "integrity": "sha512-8fRW362pfZ9y4rS8KY5P3DFScrmwo/vu1RrRMMx0PNHbeC9TLq0Kw1ubD83591yz64gLNHFLTVkTJmWeWCXKtQ==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.1.0.tgz",
+      "integrity": "sha512-tCBwe7fRMpoi/nIgZxE86N8b2SH8d5PlfGaQO8lgqlXqIyvwqm3u1HJCaA0tsacPyzhW7vVtRfQyq9e1j0S2gA==",
       "license": "MIT",
       "dependencies": {
         "react-freeze": "^1.0.0",
@@ -11589,59 +9776,110 @@
         "react-native": "*"
       }
     },
-    "node_modules/react-native/node_modules/@jest/types": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-      "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+    "node_modules/react-native-sse": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/react-native-sse/-/react-native-sse-1.2.1.tgz",
+      "integrity": "sha512-zejanlScF+IB9tYnbdry0MT34qjBXbiV/E72qGz33W/tX1bx8MXsbB4lxiuPETc9v/008vYZ60yjIstW22VlVg==",
+      "license": "MIT"
+    },
+    "node_modules/react-native-svg": {
+      "version": "15.10.1",
+      "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.10.1.tgz",
+      "integrity": "sha512-Hqz/doQciVFK/Df2v+wsW96oY5jxlta7rZ31KQYo78dlgvAHEaGr6paEOAMvlIruw7EHNQ0Vc1ZmJPJF2kfIPQ==",
       "license": "MIT",
+      "peer": true,
       "dependencies": {
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^15.0.0",
-        "chalk": "^4.0.0"
+        "css-select": "^5.1.0",
+        "css-tree": "^1.1.3",
+        "warn-once": "0.1.1"
       },
-      "engines": {
-        "node": ">= 10.14.2"
+      "peerDependencies": {
+        "react": "*",
+        "react-native": "*"
       }
     },
-    "node_modules/react-native/node_modules/@react-native/normalize-colors": {
-      "version": "0.74.87",
-      "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.87.tgz",
-      "integrity": "sha512-Xh7Nyk/MPefkb0Itl5Z+3oOobeG9lfLb7ZOY2DKpFnoCE1TzBmib9vMNdFaLdSxLIP+Ec6icgKtdzYg8QUPYzA==",
-      "license": "MIT"
-    },
-    "node_modules/react-native/node_modules/@types/istanbul-reports": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
-      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+    "node_modules/react-native-vector-icons": {
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.2.0.tgz",
+      "integrity": "sha512-n5HGcxUuVaTf9QJPs/W22xQpC2Z9u0nb0KgLPnVltP8vdUvOp6+R26gF55kilP/fV4eL4vsAHUqUjewppJMBOQ==",
       "license": "MIT",
       "dependencies": {
-        "@types/istanbul-lib-report": "*"
+        "prop-types": "^15.7.2",
+        "yargs": "^16.1.1"
+      },
+      "bin": {
+        "fa-upgrade.sh": "bin/fa-upgrade.sh",
+        "fa5-upgrade": "bin/fa5-upgrade.sh",
+        "fa6-upgrade": "bin/fa6-upgrade.sh",
+        "generate-icon": "bin/generate-icon.js"
+      }
+    },
+    "node_modules/react-native-vector-icons/node_modules/cliui": {
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+      "license": "ISC",
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
       }
     },
-    "node_modules/react-native/node_modules/@types/yargs": {
-      "version": "15.0.19",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz",
-      "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==",
+    "node_modules/react-native-vector-icons/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "license": "MIT",
       "dependencies": {
-        "@types/yargs-parser": "*"
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/react-native/node_modules/pretty-format": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-      "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
+    "node_modules/react-native-vector-icons/node_modules/yargs": {
+      "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
       "license": "MIT",
       "dependencies": {
-        "@jest/types": "^26.6.2",
-        "ansi-regex": "^5.0.0",
-        "ansi-styles": "^4.0.0",
-        "react-is": "^17.0.1"
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
       },
       "engines": {
-        "node": ">= 10"
+        "node": ">=10"
+      }
+    },
+    "node_modules/react-native-vector-icons/node_modules/yargs-parser": {
+      "version": "20.2.9",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": {
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.23.1.tgz",
+      "integrity": "sha512-uNLD0tk2tLUjGFdmCk+u/3FEw2o+BAwW4g+z2QVlxJrzZYOOPADroEcNtTPt5lNiScctaUmnsTkVEnOwZUOLhA==",
+      "license": "MIT",
+      "dependencies": {
+        "hermes-parser": "0.23.1"
+      }
+    },
+    "node_modules/react-native/node_modules/commander": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+      "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
       }
     },
     "node_modules/react-native/node_modules/promise": {
@@ -11653,18 +9891,24 @@
         "asap": "~2.0.6"
       }
     },
-    "node_modules/react-native/node_modules/react-is": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-      "license": "MIT"
-    },
     "node_modules/react-native/node_modules/regenerator-runtime": {
       "version": "0.13.11",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
       "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
       "license": "MIT"
     },
+    "node_modules/react-native/node_modules/semver": {
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/react-native/node_modules/ws": {
       "version": "6.2.3",
       "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
@@ -11674,6 +9918,32 @@
         "async-limiter": "~1.0.0"
       }
     },
+    "node_modules/react-query": {
+      "version": "3.39.3",
+      "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz",
+      "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.5.5",
+        "broadcast-channel": "^3.4.1",
+        "match-sorter": "^6.0.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "react-dom": {
+          "optional": true
+        },
+        "react-native": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/react-refresh": {
       "version": "0.14.2",
       "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
@@ -11683,19 +9953,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/react-shallow-renderer": {
-      "version": "16.15.0",
-      "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz",
-      "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==",
-      "license": "MIT",
-      "dependencies": {
-        "object-assign": "^4.1.1",
-        "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0"
-      },
-      "peerDependencies": {
-        "react": "^16.0.0 || ^17.0.0 || ^18.0.0"
-      }
-    },
     "node_modules/readable-stream": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
@@ -11776,39 +10033,20 @@
       "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
       "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/runtime": "^7.8.4"
       }
     },
-    "node_modules/regexp.prototype.flags": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
-      "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-errors": "^1.3.0",
-        "set-function-name": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/regexpu-core": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz",
-      "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==",
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
+      "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
       "license": "MIT",
       "dependencies": {
         "regenerate": "^1.4.2",
         "regenerate-unicode-properties": "^10.2.0",
         "regjsgen": "^0.8.0",
-        "regjsparser": "^0.11.0",
+        "regjsparser": "^0.12.0",
         "unicode-match-property-ecmascript": "^2.0.0",
         "unicode-match-property-value-ecmascript": "^2.1.0"
       },
@@ -11823,9 +10061,9 @@
       "license": "MIT"
     },
     "node_modules/regjsparser": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz",
-      "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==",
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
+      "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
       "license": "BSD-2-Clause",
       "dependencies": {
         "jsesc": "~3.0.2"
@@ -11834,6 +10072,12 @@
         "regjsparser": "bin/parser"
       }
     },
+    "node_modules/remove-accents": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz",
+      "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==",
+      "license": "MIT"
+    },
     "node_modules/remove-trailing-slash": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz",
@@ -11858,12 +10102,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "license": "ISC"
-    },
     "node_modules/requireg": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz",
@@ -11912,10 +10150,16 @@
         "node": ">=8"
       }
     },
+    "node_modules/resolve-workspace-root": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz",
+      "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==",
+      "license": "MIT"
+    },
     "node_modules/resolve.exports": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
-      "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz",
+      "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==",
       "license": "MIT",
       "engines": {
         "node": ">=10"
@@ -11983,30 +10227,15 @@
         "queue-microtask": "^1.2.2"
       }
     },
-    "node_modules/safe-array-concat": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
-      "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
-      "license": "MIT",
+    "node_modules/rxjs": {
+      "version": "7.8.1",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+      "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+      "license": "Apache-2.0",
       "dependencies": {
-        "call-bind": "^1.0.7",
-        "get-intrinsic": "^1.2.4",
-        "has-symbols": "^1.0.3",
-        "isarray": "^2.0.5"
-      },
-      "engines": {
-        "node": ">=0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "tslib": "^2.1.0"
       }
     },
-    "node_modules/safe-array-concat/node_modules/isarray": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
-      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
-      "license": "MIT"
-    },
     "node_modules/safe-buffer": {
       "version": "5.2.1",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -12027,23 +10256,6 @@
       ],
       "license": "MIT"
     },
-    "node_modules/safe-regex-test": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
-      "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.6",
-        "es-errors": "^1.3.0",
-        "is-regex": "^1.1.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/sax": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
@@ -12082,15 +10294,15 @@
       }
     },
     "node_modules/send": {
-      "version": "0.18.0",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
-      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz",
+      "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==",
       "license": "MIT",
       "dependencies": {
         "debug": "2.6.9",
         "depd": "2.0.0",
         "destroy": "1.2.0",
-        "encodeurl": "~1.0.2",
+        "encodeurl": "~2.0.0",
         "escape-html": "~1.0.3",
         "etag": "~1.8.1",
         "fresh": "0.5.2",
@@ -12120,16 +10332,13 @@
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
       "license": "MIT"
     },
-    "node_modules/send/node_modules/mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+    "node_modules/send/node_modules/encodeurl": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+      "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
       "license": "MIT",
-      "bin": {
-        "mime": "cli.js"
-      },
       "engines": {
-        "node": ">=4"
+        "node": ">= 0.8"
       }
     },
     "node_modules/send/node_modules/on-finished": {
@@ -12201,18 +10410,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/serve-static/node_modules/mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-      "license": "MIT",
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/serve-static/node_modules/on-finished": {
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -12267,44 +10464,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
-      "license": "ISC"
-    },
-    "node_modules/set-function-length": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
-      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
-      "license": "MIT",
-      "dependencies": {
-        "define-data-property": "^1.1.4",
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2",
-        "get-intrinsic": "^1.2.4",
-        "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/set-function-name": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
-      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
-      "license": "MIT",
-      "dependencies": {
-        "define-data-property": "^1.1.4",
-        "es-errors": "^1.3.0",
-        "functions-have-names": "^1.2.3",
-        "has-property-descriptors": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "node_modules/setimmediate": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
@@ -12359,24 +10518,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/side-channel": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
-      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.4",
-        "object-inspect": "^1.13.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/signal-exit": {
       "version": "3.0.7",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -12415,6 +10556,21 @@
         "node": ">= 5.10.0"
       }
     },
+    "node_modules/simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+      "license": "MIT",
+      "dependencies": {
+        "is-arrayish": "^0.3.1"
+      }
+    },
+    "node_modules/simple-swizzle/node_modules/is-arrayish": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+      "license": "MIT"
+    },
     "node_modules/sisteransi": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
@@ -12430,63 +10586,50 @@
         "node": ">=8"
       }
     },
-    "node_modules/slice-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
-      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+    "node_modules/slugify": {
+      "version": "1.6.6",
+      "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz",
+      "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==",
       "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^3.2.0",
-        "astral-regex": "^1.0.0",
-        "is-fullwidth-code-point": "^2.0.0"
-      },
       "engines": {
-        "node": ">=6"
+        "node": ">=8.0.0"
       }
     },
-    "node_modules/slice-ansi/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+    "node_modules/socket.io-client": {
+      "version": "4.8.1",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
+      "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
       "license": "MIT",
       "dependencies": {
-        "color-convert": "^1.9.0"
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.2",
+        "engine.io-client": "~6.6.1",
+        "socket.io-parser": "~4.2.4"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=10.0.0"
       }
     },
-    "node_modules/slice-ansi/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+    "node_modules/socket.io-parser": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+      "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
       "license": "MIT",
       "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/slice-ansi/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-      "license": "MIT"
-    },
-    "node_modules/slugify": {
-      "version": "1.6.6",
-      "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz",
-      "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==",
-      "license": "MIT",
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.1"
+      },
       "engines": {
-        "node": ">=8.0.0"
+        "node": ">=10.0.0"
       }
     },
     "node_modules/source-map": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
-      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
       "license": "BSD-3-Clause",
       "engines": {
-        "node": ">= 8"
+        "node": ">=0.10.0"
       }
     },
     "node_modules/source-map-js": {
@@ -12717,55 +10860,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/string.prototype.trim": {
-      "version": "1.2.9",
-      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
-      "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.0",
-        "es-object-atoms": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/string.prototype.trimend": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
-      "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-object-atoms": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/string.prototype.trimstart": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
-      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-object-atoms": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/strip-ansi": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
@@ -12827,12 +10921,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/strnum": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
-      "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
-      "license": "MIT"
-    },
     "node_modules/structured-headers": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz",
@@ -12840,14 +10928,14 @@
       "license": "MIT"
     },
     "node_modules/sucrase": {
-      "version": "3.34.0",
-      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
-      "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==",
+      "version": "3.35.0",
+      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+      "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
       "license": "MIT",
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.2",
         "commander": "^4.0.0",
-        "glob": "7.1.6",
+        "glob": "^10.3.10",
         "lines-and-columns": "^1.1.6",
         "mz": "^2.7.0",
         "pirates": "^4.0.1",
@@ -12858,7 +10946,16 @@
         "sucrase-node": "bin/sucrase-node"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/sucrase/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
       }
     },
     "node_modules/sucrase/node_modules/commander": {
@@ -12871,21 +10968,35 @@
       }
     },
     "node_modules/sucrase/node_modules/glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "version": "10.4.5",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
       "license": "ISC",
       "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^1.11.1"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/sucrase/node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
       },
       "engines": {
-        "node": "*"
+        "node": ">=16 || 14 >=14.17"
       },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
@@ -13096,9 +11207,9 @@
       }
     },
     "node_modules/terser": {
-      "version": "5.36.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz",
-      "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==",
+      "version": "5.37.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz",
+      "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==",
       "license": "BSD-2-Clause",
       "dependencies": {
         "@jridgewell/source-map": "^0.3.3",
@@ -13119,11 +11230,19 @@
       "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
       "license": "MIT"
     },
-    "node_modules/text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
-      "license": "MIT"
+    "node_modules/test-exclude": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+      "license": "ISC",
+      "dependencies": {
+        "@istanbuljs/schema": "^0.1.2",
+        "glob": "^7.1.4",
+        "minimatch": "^3.0.4"
+      },
+      "engines": {
+        "node": ">=8"
+      }
     },
     "node_modules/thenify": {
       "version": "3.3.1",
@@ -13213,32 +11332,6 @@
       "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
       "license": "MIT"
     },
-    "node_modules/traverse": {
-      "version": "0.6.10",
-      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.10.tgz",
-      "integrity": "sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==",
-      "license": "MIT",
-      "dependencies": {
-        "gopd": "^1.0.1",
-        "typedarray.prototype.slice": "^1.0.3",
-        "which-typed-array": "^1.1.15"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/trim-right": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
-      "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/ts-interface-checker": {
       "version": "0.1.13",
       "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
@@ -13272,99 +11365,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/typed-array-buffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
-      "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "es-errors": "^1.3.0",
-        "is-typed-array": "^1.1.13"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/typed-array-byte-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
-      "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "has-proto": "^1.0.3",
-        "is-typed-array": "^1.1.13"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/typed-array-byte-offset": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
-      "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
-      "license": "MIT",
-      "dependencies": {
-        "available-typed-arrays": "^1.0.7",
-        "call-bind": "^1.0.7",
-        "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "has-proto": "^1.0.3",
-        "is-typed-array": "^1.1.13"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/typed-array-length": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
-      "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "has-proto": "^1.0.3",
-        "is-typed-array": "^1.1.13",
-        "possible-typed-array-names": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/typedarray.prototype.slice": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz",
-      "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.0",
-        "es-errors": "^1.3.0",
-        "typed-array-buffer": "^1.0.2",
-        "typed-array-byte-offset": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/typescript": {
       "version": "5.3.3",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
@@ -13405,19 +11405,13 @@
         "node": "*"
       }
     },
-    "node_modules/unbox-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
-      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+    "node_modules/undici": {
+      "version": "6.21.0",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz",
+      "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==",
       "license": "MIT",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-bigints": "^1.0.2",
-        "has-symbols": "^1.0.3",
-        "which-boxed-primitive": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+      "engines": {
+        "node": ">=18.17"
       }
     },
     "node_modules/undici-types": {
@@ -13511,6 +11505,16 @@
         "node": ">= 4.0.0"
       }
     },
+    "node_modules/unload": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz",
+      "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@babel/runtime": "^7.6.2",
+        "detect-node": "^2.0.4"
+      }
+    },
     "node_modules/unpipe": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -13550,12 +11554,6 @@
         "browserslist": ">= 4.21.0"
       }
     },
-    "node_modules/url-join": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz",
-      "integrity": "sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==",
-      "license": "MIT"
-    },
     "node_modules/use-latest-callback": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.1.tgz",
@@ -13589,18 +11587,13 @@
         "uuid": "dist/bin/uuid"
       }
     },
-    "node_modules/valid-url": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz",
-      "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA=="
-    },
     "node_modules/validate-npm-package-name": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
-      "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz",
+      "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==",
       "license": "ISC",
-      "dependencies": {
-        "builtins": "^1.0.3"
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/vary": {
@@ -13651,6 +11644,15 @@
         "defaults": "^1.0.3"
       }
     },
+    "node_modules/web-streams-polyfill": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -13711,51 +11713,10 @@
         "node": ">= 8"
       }
     },
-    "node_modules/which-boxed-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
-      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
-      "license": "MIT",
-      "dependencies": {
-        "is-bigint": "^1.0.1",
-        "is-boolean-object": "^1.1.0",
-        "is-number-object": "^1.0.4",
-        "is-string": "^1.0.5",
-        "is-symbol": "^1.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/which-module": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
-      "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
-      "license": "ISC"
-    },
-    "node_modules/which-typed-array": {
-      "version": "1.1.15",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
-      "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
-      "license": "MIT",
-      "dependencies": {
-        "available-typed-arrays": "^1.0.7",
-        "call-bind": "^1.0.7",
-        "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "has-tostringtag": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/wonka": {
-      "version": "4.0.15",
-      "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz",
-      "integrity": "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==",
+      "version": "6.3.4",
+      "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.4.tgz",
+      "integrity": "sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg==",
       "license": "MIT"
     },
     "node_modules/wrap-ansi": {
@@ -13908,6 +11869,14 @@
         "node": ">=8.0"
       }
     },
+    "node_modules/xmlhttprequest-ssl": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
+      "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/xtend": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -13932,18 +11901,6 @@
       "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
       "license": "ISC"
     },
-    "node_modules/yaml": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz",
-      "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==",
-      "license": "ISC",
-      "bin": {
-        "yaml": "bin.mjs"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
     "node_modules/yargs": {
       "version": "17.7.2",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
@@ -13982,27 +11939,6 @@
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
-    },
-    "node_modules/zod": {
-      "version": "3.23.8",
-      "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
-      "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/colinhacks"
-      }
-    },
-    "node_modules/zod-validation-error": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-2.1.0.tgz",
-      "integrity": "sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=18.0.0"
-      },
-      "peerDependencies": {
-        "zod": "^3.18.0"
-      }
     }
   }
 }
diff --git a/package.json b/package.json
index a7b18426d17afeca9a0e8aea6933a6421ae63c75..fd3a2bf9088f4150929498d11e1f5854e6b360de 100644
--- a/package.json
+++ b/package.json
@@ -9,24 +9,40 @@
     "web": "expo start --web"
   },
   "dependencies": {
-    "@react-native-picker/picker": "2.7.5",
+    "@react-native-async-storage/async-storage": "1.23.1",
+    "@react-native-cookies/cookies": "^6.2.1",
+    "@react-native-picker/picker": "^2.9.0",
+    "@react-navigation/bottom-tabs": "^6.6.1",
     "@react-navigation/native": "^6.1.18",
     "@react-navigation/native-stack": "^6.11.0",
-    "expo": "~51.0.39",
-    "expo-status-bar": "~1.12.1",
+    "@tanstack/react-query": "^5.62.8",
+    "@tanstack/react-query-devtools": "^5.62.8",
+    "axios": "^1.7.9",
+    "dotenv": "^16.4.7",
+    "expo": "~52.0.14",
+    "expo-splash-screen": "^0.29.13",
+    "expo-status-bar": "~2.0.0",
     "he": "^1.2.0",
     "i18n-js": "^4.5.0",
     "i18next": "^23.16.5",
-    "react": "18.2.0",
+    "react": "^18.3.1",
     "react-i18next": "^15.1.1",
-    "react-native": "0.74.5",
-    "react-native-safe-area-context": "4.10.5",
-    "react-native-screens": "3.31.1"
+    "react-native": "0.76.3",
+    "react-native-dropdown-select-list": "^2.0.5",
+    "react-native-progress": "^5.0.1",
+    "react-native-safe-area-context": "^4.12.0",
+    "react-native-screens": "~4.1.0",
+    "react-native-sse": "^1.2.1",
+    "react-native-vector-icons": "^10.2.0",
+    "react-query": "^3.39.3",
+    "rxjs": "^7.8.1",
+    "socket.io-client": "^4.8.1"
   },
   "devDependencies": {
     "@babel/core": "^7.20.0",
     "@types/he": "^1.2.3",
-    "@types/react": "~18.2.45",
+    "@types/react": "~18.3.12",
+    "@types/react-native-vector-icons": "^6.4.18",
     "typescript": "~5.3.3"
   },
   "private": true
diff --git a/routes/StackNavigator.tsx b/routes/StackNavigator.tsx
index e6d9420f38e81b52dcc7b765032c40a2d6bf5f45..410e49bd0fb3790b6caa4b01fc39d0ec76a53e5f 100644
--- a/routes/StackNavigator.tsx
+++ b/routes/StackNavigator.tsx
@@ -1,20 +1,46 @@
 import {createNativeStackNavigator} from "@react-navigation/native-stack";
 import {NavigationContainer} from "@react-navigation/native";
-import Home from "../screens/Home";
-import Question from "../screens/Question/Question";
-import CreationQuiz from "../screens/CreationQuiz/CreationQuiz";
-import FinQuiz from "../screens/FinQuiz/FinQuiz";
+import Home from "../screens/Home/Home";
+import GenerateQuiz from "../screens/Home/PlayQuiz/GenerateQuiz/GenerateQuiz";
+import EndQuiz from "../screens/PlayingQuiz/EndQuiz/EndQuiz";
+import PlayingQuiz from "../screens/PlayingQuiz/PlayingQuiz";
+import TabNavigator from "./TabNavigation";
+import Multiplayer from "../screens/Multiplayer/Multiplayer";
+import MultiplayerCommunity from "../screens/Multiplayer/MultiplayerCommunity/MultiplayerCommunity";
+import OnlineQuiz from "../screens/Multiplayer/OnlineQuiz/OnlineQuiz";
+import OngoingQuizzes from "../screens/Multiplayer/OngoingQuizzes/OngoingQuizzes";
+import Lobby from "../screens/Multiplayer/Lobby/Lobby";
+import PlayQuiz from "../screens/Home/PlayQuiz/PlayQuiz";
+import MyQuizzes from "../screens/Home/MyQuizzes/MyQuizzes";
+import InformationsOfQuiz from "../screens/Community/InformationsOfQuiz/InformationsOfQuiz";
+import EndQuizMulti from "../screens/PlayingQuiz/EndQuizMulti/EndQuizMulti";
+import MultiInformationsOfQuiz from "../screens/Multiplayer/MultiplayerCommunity/InformationsOfQuiz/MultiInformationsOfQuiz";
+import InformationsOfRuns from "../screens/Home/MyQuizzes/InformationsOfRuns";
+import PlayingQuizMultiMode from "../screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiMode";
 
 const Stack = createNativeStackNavigator();
 
 export default function StackNavigator() {
     return (
         <NavigationContainer>
-            <Stack.Navigator initialRouteName="Home">
+            <Stack.Navigator initialRouteName="TabNavigator">
+                <Stack.Screen name="TabNavigator" component={TabNavigator} options={{ headerShown: false }}/>
                 <Stack.Screen name="Home" component={Home} options={{ headerShown: false }}/>
-                <Stack.Screen name="CreateQuiz" component={CreationQuiz} options={{ headerShown: false }}/>
-                <Stack.Screen name="Question" component={Question} options={{ headerShown: false }}/>
-                <Stack.Screen name="FinQuiz" component={FinQuiz} options={{ headerShown: false }}/>
+                <Stack.Screen name="GenerateQuiz" component={GenerateQuiz} options={{ headerShown: false }}/>
+                <Stack.Screen name="PlayingQuiz" component={PlayingQuiz} options={{ headerShown: false }}/>
+                <Stack.Screen name="PlayQuiz" component={PlayQuiz} options={{ headerShown: false }}/>
+                <Stack.Screen name="EndQuiz" component={EndQuiz} options={{ headerShown: false }}/>
+                <Stack.Screen name="EndQuizMulti" component={EndQuizMulti} options={{ headerShown: false }}/>
+                <Stack.Screen name="MyQuizzes" component={MyQuizzes} options={{ headerShown: false }}/>
+                <Stack.Screen name="InformationsOfQuiz" component={InformationsOfQuiz} options={{ headerShown: false }}/>
+                <Stack.Screen name="InformationsOfRuns" component={InformationsOfRuns} options={{ headerShown: false }}/>
+                <Stack.Screen name="PlayingQuizMultiMode" component={PlayingQuizMultiMode} options={{ headerShown: false }}/>
+                <Stack.Screen name="Multiplayer" component={Multiplayer} options={{ headerShown: false }}/>
+                <Stack.Screen name="MultiplayerCommunity" component={MultiplayerCommunity} options={{ headerShown: false }}/>
+                <Stack.Screen name="OnlineQuiz" component={OnlineQuiz} options={{ headerShown: false }}/>
+                <Stack.Screen name="OngoingQuizzes" component={OngoingQuizzes} options={{ headerShown: false }}/>
+                <Stack.Screen name="Lobby" component={Lobby} options={{ headerShown: false }}/>
+                <Stack.Screen name="MultiInformationsOfQuiz" component={MultiInformationsOfQuiz} options={{ headerShown: false }}/>
             </Stack.Navigator>
         </NavigationContainer>
     );
diff --git a/routes/TabNavigation.tsx b/routes/TabNavigation.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..bc58c3e2f9538893ea40e2bf156b87ddf1545d1f
--- /dev/null
+++ b/routes/TabNavigation.tsx
@@ -0,0 +1,65 @@
+import * as React from "react";
+import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
+import Home from "../screens/Home/Home";
+import Icon from "react-native-vector-icons/MaterialIcons";
+import Profil from "../screens/Profil/Profil";
+import Community from "../screens/Community/Community";
+import Multiplayer from "../screens/Multiplayer/Multiplayer";
+
+const Tab = createBottomTabNavigator();
+
+export default function TabNavigator() {
+    return (
+        <Tab.Navigator
+            initialRouteName="Home"
+            screenOptions={({ route }) => ({
+                headerShown: false,
+                tabBarActiveTintColor: "#383b41",
+                tabBarInactiveTintColor: "#c1c7d0",
+                tabBarShowLabel: false,
+                tabBarStyle: {
+                    height: 100, // Augmenter la hauteur de la barre pour plus d'espace
+                    backgroundColor: "#f4f5f7",
+                },
+                tabBarLabelStyle: {
+                    fontSize: 16, // Tu peux aussi ajuster la taille du texte ici
+                },
+                tabBarIcon: ({ color, size }) => {
+                    // Définir des icônes pour chaque route
+                    let iconName;
+                    if (route.name === "Home") {
+                        iconName = "home";
+                    } else if (route.name === "MyQuizzes") {
+                        iconName = "person"; // Icône pour Stats
+                    } else if (route.name === "Profil") {
+                        iconName = "person";
+                        iconName = "person";
+                    } else if (route.name === "Community") {
+                        iconName = "people";
+                    }
+                    // else if (route.name === "Multiplayer") {
+                    //     iconName = "diversity-2";
+                    // }
+                    return <Icon name={iconName ?? ''} size={64} color={color} />;
+                },
+            })}
+        >
+            <Tab.Screen
+                name="Home"
+                component={Home}
+            />
+            <Tab.Screen
+                name="Community"
+                component={Community}
+            />
+            {/* <Tab.Screen
+                name="Multiplayer"
+                component={Multiplayer}
+            /> */}
+            <Tab.Screen
+                name="Profil"
+                component={Profil}
+            />
+        </Tab.Navigator>
+    );
+}
diff --git a/screens/Community/Community.tsx b/screens/Community/Community.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..73afe99eec82b2eb0634d6845110e68d8629b380
--- /dev/null
+++ b/screens/Community/Community.tsx
@@ -0,0 +1,50 @@
+import {View, Text} from "react-native";
+import TemplateQuizList from "../../templates/TemplateQuizList";
+import {NavigationProp} from "@react-navigation/native";
+import {useEffect, useState} from "react";
+import {useQuizService} from "../../services/QuizService";
+import HttpError from "../../services/HttpError";
+import {useInfiniteQuery} from "@tanstack/react-query";
+import { Quiz } from "../../models/Quiz";
+
+interface Props {
+    navigation: NavigationProp<any>
+}
+export default function Community({navigation}: Props) {
+    const  {getCommunityQuiz} = useQuizService();
+    const [input, setInput] = useState<string>("")
+    const [loading, setLoading] = useState<boolean>(false)
+
+    const fetchCommunityQuizzes = async ({pageParam = 1}) => {
+        const quizzes = await getCommunityQuiz(pageParam,7);
+        if (HttpError.isHttpError(quizzes)) {
+            console.error("Error while fetching community quizzes:", quizzes);
+            return [];
+        }
+        return quizzes;
+    }
+
+    const onQuizPressed = (quiz: Quiz) => {
+        navigation.navigate("InformationsOfQuiz", { quiz: quiz });
+    };
+
+
+    const {
+        data,
+        fetchNextPage,
+    } = useInfiniteQuery({
+        queryKey: ["communityQuizzes"],
+        queryFn: fetchCommunityQuizzes,
+        initialPageParam: 0,
+        getNextPageParam: (lastPage, allPages) => {
+            // Si la dernière page a moins de 7 quizzes, il n'y a plus de page suivante
+            if (lastPage.length < 7) return undefined;
+
+            // On augmente skip de 7 pour la prochaine requête
+            return allPages.length * 7;
+        }});
+
+    return (
+        <TemplateQuizList title={"Community"} setTextInInput={setInput} quizList={data?.pages.flat() ?? []} navigation={navigation} buttonGoBack={false} isLoadingData={loading} nextPage={fetchNextPage} onQuizPressed={onQuizPressed}/>
+    );
+}
\ No newline at end of file
diff --git a/screens/Community/InformationsOfQuiz/InformationsOfQuiz.tsx b/screens/Community/InformationsOfQuiz/InformationsOfQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..379dffcd9519290924dcb7064acf124640eeaf3e
--- /dev/null
+++ b/screens/Community/InformationsOfQuiz/InformationsOfQuiz.tsx
@@ -0,0 +1,179 @@
+import React from "react";
+import {View, Text, StyleSheet, TouchableOpacity, Dimensions} from "react-native";
+import TemplateMenu from "../../../templates/TemplateMenu";
+import {NavigationProp, RouteProp} from "@react-navigation/native";
+import {Quiz} from "../../../models/Quiz";
+import { useQuizService } from "../../../services/QuizService";
+
+type RoutePropsType = {
+    InformationsOfQuiz: {
+        quiz: Quiz;
+    };
+};
+interface Props {
+    navigation: NavigationProp<any>;
+    route: RouteProp<RoutePropsType, "InformationsOfQuiz">;
+}
+const { width, height } = Dimensions.get('window');
+
+export default function InformationsOfQuiz({ navigation, route }: Props) {
+    const { quiz } = route.params;
+    const { createRun } = useQuizService();
+
+    const onPlay = async () => {
+        const quizId = quiz.id.toString();
+        const runId = await createRun(quizId);
+        navigation.navigate('PlayingQuiz', { runId: runId, quizId: quizId });
+    }
+
+    const QuizStatistic = ({ label, value }: { label: string, value: string }) => (
+        <View style={styles.statItem}>
+            <Text style={styles.statLabel}>{label}</Text>
+            <Text style={styles.statValue}>{value || "Loading..."}</Text>
+        </View>
+    );
+
+    return (
+        <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}>
+            <View style={styles.container}>
+                <Text style={styles.quizTitle}>{quiz.name}</Text>
+
+                <View style={styles.infoCard}>
+                    <View style={styles.statsContainer}>
+                        {/*<QuizStatistic*/}
+                        {/*    label="Current Score"*/}
+                        {/*    value={quiz.score ? quiz.score.toString() : "Loading..."}*/}
+                        {/*/>*/}
+                        {/*<QuizStatistic*/}
+                        {/*    label="Progress"*/}
+                        {/*    value={`${quiz.questionIndex}/${quiz.questionCount}`}*/}
+                        {/*/>*/}
+                        <QuizStatistic
+                            label="Difficulty"
+                            value={quiz.difficulty.name}
+                        />
+                    </View>
+                    <View style={styles.descriptionContainer}>
+                        <Text style={styles.descriptionLabel}>Description</Text>
+                        <Text style={styles.descriptionText}>
+                            {quiz.description}
+                        </Text>
+                    </View>
+                </View>
+
+                {/*<View style={styles.aboutContainer}>*/}
+                {/*    <Text style={styles.aboutTitle}>About this quiz :</Text>*/}
+                {/*    <Text style={styles.aboutDetails}>{quiz.questionCount} questions, {quiz.difficulty.name}</Text>*/}
+                {/*    <Text style={styles.aboutDetails}>By : {quiz.authorId && "Unknown"}</Text>*/}
+                {/*</View>*/}
+
+                <TouchableOpacity style={styles.playButton} onPress={onPlay}>
+                    <Text style={styles.playButtonText}>PLAY</Text>
+                </TouchableOpacity>
+            </View>
+        </TemplateMenu>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        flex: 1,
+        paddingHorizontal: 20,
+        paddingVertical: 20,
+        justifyContent: "flex-start",
+    },
+    descriptionContainer: {
+        marginTop: 8,
+    },
+    descriptionLabel: {
+        fontSize: 16,
+        fontWeight: "600",
+        color: "#666",
+        marginBottom: 8,
+    },
+    descriptionText: {
+        fontSize: 15,
+        color: "#4a4a4a",
+        lineHeight: 22,
+    },
+    infoCard: {
+        height: '65%',
+        backgroundColor: "white",
+        borderRadius: width * 0.04,
+        paddingHorizontal: '5%',
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: width * 0.01 },
+        shadowOpacity: 0.1,
+        shadowRadius: width * 0.03,
+        elevation: 5,
+    },
+    statsContainer: {
+        height: '15%',
+        justifyContent: 'space-around',
+    },
+    quizTitle: {
+        fontSize: 24,
+        fontWeight: "bold",
+        color: "#00b3f4",
+        marginBottom: 10,
+    },
+    quizDescription: {
+        fontSize: 16,
+        color: "#555",
+        marginBottom: 20,
+        height: "15%",
+    },
+    aboutContainer: {
+        height: "50%",
+        backgroundColor: "white",
+        borderRadius: 10,
+        padding: 15,
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: 2 },
+        shadowOpacity: 0.2,
+        shadowRadius: 3,
+        elevation: 5,
+    },
+    aboutTitle: {
+        fontSize: 18,
+        fontWeight: "bold",
+        marginBottom: 10,
+        color: "#000",
+    },
+    statItem: {
+        flexDirection: 'row',
+        justifyContent: 'space-between',
+        alignItems: 'center',
+        paddingVertical: '3%',
+        borderBottomWidth: 1,
+        borderBottomColor: '#f0f0f0',
+    },
+    statLabel: {
+        fontSize: width * 0.04,
+        color: "#666",
+        fontWeight: "500",
+    },
+    statValue: {
+        fontSize: 16,
+        color: "#2d2d2d",
+        fontWeight: "600",
+    },
+    aboutDetails: {
+        fontSize: 16,
+        color: "#555",
+        marginBottom: 10,
+    },
+    playButton: {
+        backgroundColor: "#007BFF",
+        paddingVertical: 15,
+        borderRadius: 10,
+        alignItems: "center",
+        justifyContent: "center",
+        marginTop: 20,
+    },
+    playButtonText: {
+        fontSize: 18,
+        fontWeight: "bold",
+        color: "white",
+    },
+});
diff --git a/screens/CreationQuiz/CreationQuiz.tsx b/screens/CreationQuiz/CreationQuiz.tsx
deleted file mode 100644
index 46c1061ef21b82b3055f10cacfbca2a512bee736..0000000000000000000000000000000000000000
--- a/screens/CreationQuiz/CreationQuiz.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import TemplateScreen from "../../templates/TemplateScreen";
-import CreationQuizBody from "./CreationQuizBody";
-
-export default function CreationQuiz({navigation}: any) {
-    return (
-        <TemplateScreen childrenBot={<CreationQuizBody navigation={navigation}></CreationQuizBody>}></TemplateScreen>
-    )
-}
-
diff --git a/screens/CreationQuiz/CreationQuizHeader.tsx b/screens/CreationQuiz/CreationQuizHeader.tsx
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/screens/FinQuiz/FinQuiz.tsx b/screens/FinQuiz/FinQuiz.tsx
deleted file mode 100644
index 3320e8265ea1362f33b30bccfe15004dc8fba8ff..0000000000000000000000000000000000000000
--- a/screens/FinQuiz/FinQuiz.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import { View, StyleSheet, Image, Text } from "react-native";
-import DefaultButton from "../../components/DefaultButton";
-import { TextsStyles } from "../../styles/TextsStyles";
-import { ButtonsStyles } from "../../styles/ButtonsStyles";
-
-interface Props {
-    navigation: any;
-    route: any;
-}
-
-export default function FinQuiz({ navigation, route }: Props) {
-    const { score, quiz } = route.params;
-    const handleButtonRePlayPressed = () => {
-        quiz.nbActualQuestion = 1;
-        quiz.score = 0;
-        navigation.reset({
-            index: 0,
-            routes: [
-                {
-                    name: "Question",
-                    params: {quiz: quiz},
-                },
-            ]
-        });
-    }
-
-    const handleButtonHomePressed = () => {
-        navigation.navigate('Home');
-    }
-
-    return (
-        <View style={styles.container}>
-            <Image source={require('../../assets/FondTemplate.png')} style={styles.image}/>
-            <Text style={TextsStyles.titleText}>Score : {score}</Text>
-            <Text style={TextsStyles.subtitleText}>{((score/quiz.nbQuestions)*100 > 50 ) ? "Congratulations, you won!" : "Too bad, you lost!"}</Text>
-            <View style={styles.buttonContainer}>
-                <DefaultButton text={"Play again"} handleButtonPressed={handleButtonRePlayPressed} buttonStyle={ButtonsStyles.defaultButton}></DefaultButton>
-                <DefaultButton text={"Go to home"} handleButtonPressed={handleButtonHomePressed}></DefaultButton>
-            </View>
-        </View>
-    )
-}
-
-const styles = StyleSheet.create({
-    container: {
-        display: 'flex',
-        width: '100%',
-        height: '100%',
-        alignItems: 'center',
-        justifyContent: 'center',
-        gap: 10,  
-    },
-    buttonContainer: {
-        width: '80%',
-        margin: '10%',
-        gap: 20
-    },
-    image: {
-        width: '100%',
-        height: '100%',
-        position: 'absolute',
-    },
-});
-
diff --git a/screens/Home.tsx b/screens/Home.tsx
deleted file mode 100644
index e682b2570f2ce46316cc52be14d6dd54f8a701e6..0000000000000000000000000000000000000000
--- a/screens/Home.tsx
+++ /dev/null
@@ -1,133 +0,0 @@
-import {StyleSheet, View, Text, Modal, TextInput, Image} from "react-native";
-import DefaultButton from "../components/DefaultButton";
-import {TextsStyles} from "../styles/TextsStyles";
-import {useTranslation} from "react-i18next";
-import { useState } from "react";
-import { ButtonsStyles } from "../styles/ButtonsStyles";
-
-interface Props {
-    navigation: any;
-}
-export default function Home({navigation}: Props) {
-    const [modalVisible, setModalVisible] = useState(false);
-
-    // const handleButtonPlayPressed = () => {
-    //     setModalVisible(true);
-    // }
-
-    const {t} = useTranslation();
-    const handleButtonCreateQuizPressed = () => {
-        navigation.navigate("CreateQuiz");
-    }
-
-    const handleButtonValidatePressed = () => {
-        setModalVisible(false);
-    }
-    return (
-        <View>
-            <Image source={require('../assets/FondTemplate.png')} style={styles.image}/>
-            <View style={styles.container}>
-                <View style={styles.titleContainer}>
-                    <Text style={styles.titleText}>{"SKITSKOLA"}</Text>
-                </View>
-
-                <View style={styles.buttonContainer}>
-                    <View style={styles.ButtonsStyle}>
-                        {/* <DefaultButton text={t("app.screens.home.play")} handleButtonPressed={handleButtonPlayPressed}></DefaultButton> */}
-                        <DefaultButton text={t("app.screens.home.createQuiz")} handleButtonPressed={handleButtonCreateQuizPressed} buttonStyle={ButtonsStyles.movingButton} buttonText={TextsStyles.defaultText}></DefaultButton>
-                    </View>
-                </View>
-                {/* <Modal
-                    animationType="slide"
-                    transparent={true}
-                    visible={modalVisible}
-                    onRequestClose={() => {
-                    setModalVisible(!modalVisible);
-                }}>
-                    <View style={styles.centeredView}>
-                        <View style={styles.modalView}>
-                            <Text style={TextsStyles.subtitleText}>Rejoindre Quiz</Text>
-                            <TextInput placeholder="code de la partie" style={styles.codeTextInput} keyboardType="numeric"/>
-                            <DefaultButton text="V" handleButtonPressed={handleButtonValidatePressed} buttonStyle={styles.button}></DefaultButton>
-                        </View>    
-                    </View>
-                </Modal> */}
-            </View>
-        </View>
-    )
-}
-
-const styles = StyleSheet.create({
-    container: {
-        display: 'flex',
-        alignItems: 'center',
-        justifyContent: 'center',
-        width: '100%',
-        height: '100%',
-    },
-    buttonContainer: {
-        flex: 1,
-        alignItems: 'center',
-        justifyContent: 'flex-start',
-        width: '100%',
-        paddingVertical: '5%'  
-    },
-    titleContainer: {
-        display : 'flex',
-        flexDirection: 'column',
-        justifyContent: 'flex-end',
-        alignItems: 'center',
-        width: '100%',
-        height: '40%',
-    },
-    ButtonsStyle: {
-        display : 'flex',
-        flexDirection: 'column',
-        justifyContent: 'flex-start',
-        alignItems: 'center',
-        gap: 20,
-        width: '80%',
-        height: '60%',
-        marginBottom: "20%",
-    },
-    centeredView: {
-        flex: 1,
-        justifyContent: 'center',
-        alignItems: 'center',
-    },
-    modalView: {
-        height: 250,
-        width: 320,
-        margin: 20,
-        backgroundColor: 'white',
-        borderRadius: 20,
-        padding: 35,
-        alignItems: 'center',
-        borderWidth: 2,
-        borderColor: 'black',
-        borderStyle: 'solid',  
-    },
-    codeTextInput: {
-        borderWidth: 2,
-        borderColor: 'black',
-        borderStyle: 'solid',
-        height: 40,
-        width: 200,
-        marginTop: 30,
-        marginBottom: 20,
-        padding: 10,
-    },
-    button: {
-        width: 50,
-        height: 50,
-    },
-    image: {
-        width: '100%',
-        height: '100%',
-        position: 'absolute',
-    },
-    titleText: {
-        fontSize: 30,
-        fontStyle: 'italic'
-    }
-});
\ No newline at end of file
diff --git a/screens/Home/Home.tsx b/screens/Home/Home.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4fb5203e02fd3bcdafbdc58aa594baf9e8f1f824
--- /dev/null
+++ b/screens/Home/Home.tsx
@@ -0,0 +1,32 @@
+import { View, StyleSheet, Text } from "react-native";
+import TemplateMono from "../../templates/TemplateMono";
+import HomeChild from "./HomeChild";
+import TemplateMenu from "../../templates/TemplateMenu";
+import {NavigationProp} from "@react-navigation/native";
+import {Quiz} from "../../models/Quiz";
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+
+export default function Home({navigation}: Props) {
+
+    return (
+        <View style={styles.containerGlobal}>
+                <TemplateMenu navigation={navigation} headerNavigation={false} buttonGoBack={false}>
+                    <View>
+                        <HomeChild navigation={navigation}/>
+                    </View>
+                </TemplateMenu>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+        flexDirection: 'column',
+    },
+});
\ No newline at end of file
diff --git a/screens/Home/HomeChild.tsx b/screens/Home/HomeChild.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..fa17672944597e3f9eccbfd86f29b60196aeeaa1
--- /dev/null
+++ b/screens/Home/HomeChild.tsx
@@ -0,0 +1,92 @@
+import { View, StyleSheet, Image, Modal, TextInput } from "react-native";
+import DefaultButton from "../../components/buttons/DefaultButton";
+import {useTranslation} from "react-i18next";
+import { useState } from "react";
+import { TextsStyles } from "../../styles/TextsStyles";
+import MenuButton from "../../components/buttons/MenuButton";
+import {NavigationProp} from "@react-navigation/native";
+import {useQuizService} from "../../services/QuizService";
+import HttpError from "../../services/HttpError";
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+
+/**
+ * HomeChild : Enfant de l'écran Home, il contient le menu principal
+ * @param navigation - navigation
+ */
+export default function HomeChild({navigation}: Props) {
+    const [modalVisible, setModalVisible] = useState(false);
+    const {t} = useTranslation();
+    const {getRandomQuiz} = useQuizService();
+
+    const handleButtonQuickGamePressed = async () => {
+        const quizData = await getRandomQuiz()
+        if (quizData instanceof HttpError) {
+            console.error("Error while fetching random quiz:", quizData);
+            return;
+        }
+        navigation.reset({
+            index: 0,
+            routes: [
+                {
+                    name: "PlayingQuiz",
+                    params: {runId: quizData.id, quizId: quizData.quizId},
+                },
+            ]
+
+        });
+    }
+    const handleButtonMyQuizzesPressed = () => {
+        navigation.navigate("MyQuizzes");
+        // navigation.navigate("PlayingQuiz", {runId: "1", quizId: "1"});
+    }
+
+    const handleButtonGeneratePressed = () => {
+        navigation.navigate("PlayQuiz");
+    }
+
+    return (
+        <View style={styles.containerGlobal}>
+            <View style={styles.imageContainer}>
+                <Image source={require('../../assets/TitleApp.png')} style={styles.image} />
+            </View>
+            <View style={styles.buttonContainer}>
+                <MenuButton text={"QUICK GAME"} handleButtonPressed={handleButtonQuickGamePressed}/>
+                <MenuButton text={"PLAY"} handleButtonPressed={handleButtonGeneratePressed}/>
+                <MenuButton text={"MY QUIZZES"} handleButtonPressed={handleButtonMyQuizzesPressed}/>
+            </View>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+        justifyContent: 'flex-start',
+        alignItems: 'center',
+    },
+    image: {
+    },
+    button: {
+        borderRadius: 40,
+        height: '35%',
+        marginTop: '5%'
+    },
+    imageContainer: {
+        display: 'flex',
+        alignItems: 'center',
+        marginTop: '15%',
+        marginBottom: '35%',
+    },
+    buttonContainer: {
+        width: '100%',
+        display: 'flex',
+        flexDirection: 'column',
+        paddingLeft: '8%',
+        gap: '9%',
+    }
+});
\ No newline at end of file
diff --git a/screens/Home/MyQuizzes/InformationsOfRuns.tsx b/screens/Home/MyQuizzes/InformationsOfRuns.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..6a461fdc502682ff48f9c636f8725d9548df79d1
--- /dev/null
+++ b/screens/Home/MyQuizzes/InformationsOfRuns.tsx
@@ -0,0 +1,176 @@
+import React from "react";
+import {View, Text, StyleSheet, TouchableOpacity, Dimensions} from "react-native";
+import TemplateMenu from "../../../templates/TemplateMenu";
+import {NavigationProp, RouteProp} from "@react-navigation/native";
+import {RunsInformationsAllRuns} from "../../../models/RunsInformationsAllRuns";
+
+type RoutePropsType = {
+    InformationsOfRuns: {
+        runInformations: RunsInformationsAllRuns;
+    };
+};
+interface Props {
+    navigation: NavigationProp<any>;
+    route: RouteProp<RoutePropsType, "InformationsOfRuns">;
+}
+
+const { width, height } = Dimensions.get('window');
+
+export default function InformationsOfRuns({ navigation, route }: Props) {
+    const { runInformations,  } = route.params;
+
+    const onPlay = () => {
+        navigation.reset({
+            index: 0,
+            routes: [
+                {
+                    name: "PlayingQuiz",
+                    params: {runId: runInformations?.id, quizId: runInformations?.quizId },
+                },
+            ]
+        });
+    }
+    const QuizStatistic = ({ label, value }: { label: string, value: string }) => (
+        <View style={styles.statItem}>
+            <Text style={styles.statLabel}>{label}</Text>
+            <Text style={styles.statValue}>{value || "Loading..."}</Text>
+        </View>
+    );
+
+    return (
+        <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}>
+            <View style={styles.container}>
+                <Text style={styles.quizTitle}>{runInformations.quiz.name ? runInformations.quiz.name : "Loading..."}</Text>
+                <View style={styles.infoCard}>
+                    <View style={styles.statsContainer}>
+                        <QuizStatistic
+                            label="Current Score"
+                            value={runInformations?.score.toString()}
+                        />
+                        <QuizStatistic
+                            label="Progress"
+                            value={`${runInformations.questionIndex}/${runInformations?.quiz.questionCount}`}
+                        />
+                        <QuizStatistic
+                            label="Difficulty"
+                            value={runInformations?.quiz.difficulty.name}
+                        />
+                    </View>
+                    <View style={styles.descriptionContainer}>
+                        <Text style={styles.descriptionLabel}>Description</Text>
+                        <Text style={styles.descriptionText}>
+                            {runInformations.quiz.description}
+                        </Text>
+                    </View>
+                </View>
+
+                <TouchableOpacity style={styles.playButton} onPress={onPlay}>
+                    <Text style={styles.playButtonText}>PLAY</Text>
+                </TouchableOpacity>
+            </View>
+        </TemplateMenu>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        flex: 1,
+        paddingHorizontal: 20,
+        paddingVertical: 20,
+        justifyContent: "flex-start",
+    },
+    descriptionContainer: {
+        marginTop: 8,
+    },
+    descriptionLabel: {
+        fontSize: 16,
+        fontWeight: "600",
+        color: "#666",
+        marginBottom: 8,
+    },
+    descriptionText: {
+        fontSize: 15,
+        color: "#4a4a4a",
+        lineHeight: 22,
+    },
+    quizTitle: {
+        fontSize: 24,
+        fontWeight: "bold",
+        color: "#00b3f4",
+        marginBottom: 10,
+    },
+    quizDescription: {
+        fontSize: 16,
+        color: "#555",
+        marginBottom: 20,
+        height: "15%",
+    },
+    aboutContainer: {
+        height: "50%",
+        backgroundColor: "white",
+        borderRadius: 10,
+        padding: 15,
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: 2 },
+        shadowOpacity: 0.2,
+        shadowRadius: 3,
+        elevation: 5,
+    },
+    statsContainer: {
+        height: '40%',
+        justifyContent: 'space-around',
+    },
+    statValue: {
+        fontSize: 16,
+        color: "#2d2d2d",
+        fontWeight: "600",
+    },
+    infoCard: {
+        height: '65%',
+        backgroundColor: "white",
+        borderRadius: width * 0.04,
+        padding: '5%',
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: width * 0.01 },
+        shadowOpacity: 0.1,
+        shadowRadius: width * 0.03,
+        elevation: 5,
+    },
+    statItem: {
+        flexDirection: 'row',
+        justifyContent: 'space-between',
+        alignItems: 'center',
+        paddingVertical: '3%',
+        borderBottomWidth: 1,
+        borderBottomColor: '#f0f0f0',
+    },
+    statLabel: {
+        fontSize: width * 0.04,
+        color: "#666",
+        fontWeight: "500",
+    },
+    aboutTitle: {
+        fontSize: 18,
+        fontWeight: "bold",
+        marginBottom: 10,
+        color: "#000",
+    },
+    aboutDetails: {
+        fontSize: 16,
+        color: "#555",
+        marginBottom: 10,
+    },
+    playButton: {
+        backgroundColor: "#007BFF",
+        paddingVertical: 15,
+        borderRadius: 10,
+        alignItems: "center",
+        justifyContent: "center",
+        marginTop: 20,
+    },
+    playButtonText: {
+        fontSize: 18,
+        fontWeight: "bold",
+        color: "white",
+    },
+});
diff --git a/screens/Home/MyQuizzes/MyQuizzes.tsx b/screens/Home/MyQuizzes/MyQuizzes.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d7d94bcb74781ea7bdc5d780285f2546da061fb8
--- /dev/null
+++ b/screens/Home/MyQuizzes/MyQuizzes.tsx
@@ -0,0 +1,37 @@
+import {NavigationProp} from "@react-navigation/native";
+import React, {useEffect, useState} from "react";
+import TemplateRunList from "../../../templates/TemplateRunList";
+import {useQuizService} from "../../../services/QuizService";
+import HttpError from "../../../services/HttpError";
+import {AllRunsResponse} from "../../../models/Response/AllRunsResponse";
+import {RunsInformationsAllRuns} from "../../../models/RunsInformationsAllRuns";
+
+interface Props {
+    navigation: NavigationProp<any>
+}
+export default function MyQuizzes({navigation}: Props) {
+    const [runList, setRunList] = useState<AllRunsResponse | undefined>(undefined)
+    const [input, setInput] = useState<string>("")
+    const {getAllRuns} = useQuizService();
+
+    const getRuns = async () => {
+        const runs = await getAllRuns();
+        if(HttpError.isHttpError(runs)) {
+            console.log("Error while getting runs:", runs);
+            return
+        }
+        setRunList(runs);
+    }
+
+    useEffect(() => {
+        getRuns();
+    },[]);
+
+    const onQuizPressed = (runInfo: RunsInformationsAllRuns) => {
+        navigation.navigate("InformationsOfRuns", { runInformations: runInfo });
+    };
+
+    return (
+        <TemplateRunList title={"My quizzes"} setTextInInput={setInput} runList={runList?.runs} navigation={navigation} buttonGoBack={true} isLoadingData={false} onRunPressed={onQuizPressed}/>
+    );
+}
\ No newline at end of file
diff --git a/screens/Home/PlayQuiz/GenerateQuiz/GenerateQuiz.tsx b/screens/Home/PlayQuiz/GenerateQuiz/GenerateQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..0d95d503d6e26f1942c76f46449b1f31ebdc52f8
--- /dev/null
+++ b/screens/Home/PlayQuiz/GenerateQuiz/GenerateQuiz.tsx
@@ -0,0 +1,9 @@
+import TemplateScreen from "../../../../templates/TemplateScreen";
+import GenerateQuizBody from "./GenerateQuizBody";
+
+export default function GenerateQuiz({navigation}: any) {
+    return (
+        <TemplateScreen childrenBot={<GenerateQuizBody navigation={navigation}></GenerateQuizBody>}></TemplateScreen>
+    )
+}
+
diff --git a/screens/CreationQuiz/CreationQuizBody.tsx b/screens/Home/PlayQuiz/GenerateQuiz/GenerateQuizBody.tsx
similarity index 54%
rename from screens/CreationQuiz/CreationQuizBody.tsx
rename to screens/Home/PlayQuiz/GenerateQuiz/GenerateQuizBody.tsx
index 82c00479dd0644e9ca29cd73bba53f52c08e964f..a50e17d0ea5ee1ad781f410edbf47657a99f0649 100644
--- a/screens/CreationQuiz/CreationQuizBody.tsx
+++ b/screens/Home/PlayQuiz/GenerateQuiz/GenerateQuizBody.tsx
@@ -1,7 +1,11 @@
-import ComboBox from "../../components/comboBox/ComboBox";
-import DefaultButton from "../../components/DefaultButton";
-import {StyleSheet, View, Text} from "react-native";
+import ComboBox from "../../../../components/comboBox/ComboBox";
+import DefaultButton from "../../../../components/buttons/DefaultButton";
+import {StyleSheet, View} from "react-native";
 import {useState} from "react";
+import {useTranslation} from "react-i18next";
+import {useQuizService} from "../../../../services/QuizService";
+import {EDifficulty} from "../../../../models/EDifficulty";
+import {getIdOfCategory} from "../../../../helper/QuizHelper";
 
 const optionsDifficulty = [ 'easy', 'medium', 'hard'];
 const optionsQuestions = ['1', '50'];
@@ -24,20 +28,23 @@ interface Props {
     navigation: any;
 }
 
-export default function CreationQuizBody({navigation}:Props) {
+export default function GenerateQuizBody({navigation}:Props) {
 
     const [isModalVisible, setIsModalVisible] = useState(false);
     const [difficulty, setDifficulty] = useState('easy');
     const [nbQuestions, setNbQuestions] = useState('1');
-    const [theme, setTheme] = useState('General Knowledge');
+    const [theme, setTheme] = useState<string>('General Knowledge');
+    const {t} = useTranslation();
+    const {generateQuiz} = useQuizService();
 
-    const handleAddQuizPressed = () => {
+    const handleAddQuizPressed = async () => {
+        const quizGenerated = await generateQuiz(parseInt(nbQuestions), getIdOfCategory(theme), difficulty);
         navigation.reset({
             index: 0,
             routes: [
                 {
-                    name: "Question",
-                    params: {nbQuestionParam: nbQuestions, difficultyParam: difficulty, themeParam: theme},
+                    name: "PlayingQuiz",
+                    params: {quizRecovered: quizGenerated},
                 },
             ]
         });
@@ -46,12 +53,12 @@ export default function CreationQuizBody({navigation}:Props) {
     return (
         <View style={styles.container}>
             <View style={styles.comboBoxContainer}>
-                <ComboBox title={"Difficulty"} options={optionsDifficulty} selectOption={setDifficulty} type={0}/>
-                <ComboBox title={"Nb. of questions"} options={optionsQuestions} selectOption={setNbQuestions} type={1}/>
-                <ComboBox title={"Theme"} options={optionsTheme} selectOption={setTheme} type={0}/>
+                <ComboBox title={t("app.screens.creationQuiz.difficulty")} options={optionsDifficulty} selectOption={setDifficulty} type={0}/>
+                <ComboBox title={t("app.screens.creationQuiz.nbQuestions")} options={optionsQuestions} selectOption={setNbQuestions} type={1}/>
+                <ComboBox title={t("app.screens.creationQuiz.theme")} options={optionsTheme} selectOption={setTheme} type={0}/>
             </View>
             <View style={styles.buttonContainer}>
-                <DefaultButton text={"Add Quiz "} handleButtonPressed={handleAddQuizPressed} buttonStyle={styles.buttonStyle}/>
+                <DefaultButton text={t("app.screens.creationQuiz.addQuiz")} handleButtonPressed={handleAddQuizPressed} buttonStyle={styles.buttonStyle}/>
             </View>
         </View>
 
diff --git a/screens/Home/PlayQuiz/PlayQuiz.tsx b/screens/Home/PlayQuiz/PlayQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..02c949fedd8e8a20125a2916ea953a3b945eded7
--- /dev/null
+++ b/screens/Home/PlayQuiz/PlayQuiz.tsx
@@ -0,0 +1,31 @@
+import {NavigationProp} from "@react-navigation/native";
+import TemplateMenu from "../../../templates/TemplateMenu";
+import {StyleSheet, View} from "react-native";
+import HomeChild from "../HomeChild";
+import React from "react";
+import PlayQuizChild from "./PlayQuizChild";
+
+interface Props{
+    navigation: NavigationProp<any>
+}
+export default function PlayQuiz({navigation}: Props) {
+
+    return (
+        <View style={styles.containerGlobal}>
+            <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}>
+                <View>
+                    <PlayQuizChild navigation={navigation}/>
+                </View>
+            </TemplateMenu>
+        </View>
+    )
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+        flexDirection: 'column',
+    },
+});
\ No newline at end of file
diff --git a/screens/Home/PlayQuiz/PlayQuizChild.tsx b/screens/Home/PlayQuiz/PlayQuizChild.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4c982b375672694033527e2bfdd35bf2226017f1
--- /dev/null
+++ b/screens/Home/PlayQuiz/PlayQuizChild.tsx
@@ -0,0 +1,44 @@
+import {Text, View, StyleSheet, TouchableWithoutFeedback, Keyboard} from "react-native";
+import {NavigationProp} from "@react-navigation/native";
+import SelectMode from "../../../components/PlayQuiz/SelectMode";
+import React, {useState} from "react";
+import {SelectModeType} from "../../../models/SelectModeType";
+import PlayQuizGenerateQuiz from "./PlayQuizGenerateQuiz";
+import PlayQuizJoinQuiz from "./PlayQuizJoinQuiz";
+
+interface Props {
+    navigation: NavigationProp<any>
+}
+
+export default function PlayQuizChild({navigation}: Props){
+ const [mode, setMode] = useState<SelectModeType>("play");
+
+    return (
+        <TouchableWithoutFeedback onPress={Keyboard.dismiss}>
+            <View style={styles.containerGlobal}>
+                <View style={styles.contentContainer}>
+                    <SelectMode mode={mode} setMode={setMode}/>
+                    {mode === "play" ? (
+                        <PlayQuizGenerateQuiz navigation={navigation}/>
+                    ) : (
+                        <PlayQuizJoinQuiz navigation={navigation}/>
+                    )}
+                </View>
+            </View>
+        </TouchableWithoutFeedback>
+    )
+}
+const styles = StyleSheet.create({
+    containerGlobal: {
+        width: '100%',
+        height: '100%',
+        alignItems: 'center',
+        justifyContent: 'center',
+    },
+    contentContainer: {
+        display: 'flex',
+        width: '95%',
+        height: '100%',
+        flexDirection: 'column',
+    },
+});
\ No newline at end of file
diff --git a/screens/Home/PlayQuiz/PlayQuizGenerateQuiz.tsx b/screens/Home/PlayQuiz/PlayQuizGenerateQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..8f7277583bffb79ae4b036f39cc4bcf6600fc18d
--- /dev/null
+++ b/screens/Home/PlayQuiz/PlayQuizGenerateQuiz.tsx
@@ -0,0 +1,110 @@
+import { Text,View, StyleSheet } from "react-native";
+import SelectListBoxString from "../../../components/PlayQuiz/SelectListBoxString";
+import React, {useEffect, useState} from "react";
+import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz";
+import BlueButton from "../../../components/buttons/BlueButton";
+import {useQuizService} from "../../../services/QuizService";
+import {NavigationProp} from "@react-navigation/native";
+import {Category} from "../../../models/Quiz";
+import SelectListBoxCategory from "../../../components/PlayQuiz/SelectListBoxCategory";
+import HttpError from "../../../services/HttpError";
+
+const difficulty = [
+    { key: "easy", value: "easy" },
+    { key: "medium", value: "medium" },
+    { key: "hard", value: "hard" },
+];
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+
+export default function PlayQuizGenerateQuiz({navigation}: Props) {
+    const [difficutlyChoose, setDifficutlyChoose] = React.useState("");
+    const [nbQuestions, setNbQuestions] = React.useState("10");
+    const [buttonIsDisabled, setButtonIsDisabled] = React.useState(true);
+    const [categories, setCategories] = useState<Category[]>([]);
+    const [categoryChoose, setCategoryChoose] = React.useState<Category | null>(null);
+
+    const {generateQuiz, getCategories} = useQuizService();
+    const fetchingCategories = async () => {
+        const categories = await getCategories();
+        let categoriesTemp: Category[] = [];
+        categories.map((category: Category) => {
+            categoriesTemp.push({'name': category.name, 'id': category.id});
+        });
+        setCategories(categoriesTemp);
+    }
+
+    useEffect(() => {
+        fetchingCategories();
+    }, []);
+
+    useEffect(() => {
+        if(nbQuestions === "" || difficutlyChoose === "" || categoryChoose === null)
+        {
+            setButtonIsDisabled(true);
+        }
+        else
+        {
+            setButtonIsDisabled(false);
+        }
+
+    }, [difficutlyChoose,categoryChoose,nbQuestions]);
+
+    const handlePlayButtonPress = async () => {
+        const quizGenerated = await generateQuiz(parseInt(nbQuestions), categoryChoose ? categoryChoose.id : 10 , difficutlyChoose);
+        if(HttpError.isHttpError(quizGenerated)) {
+            return;
+        }
+        navigation.reset({
+            index: 0,
+            routes: [
+                {
+                    name: "PlayingQuiz",
+                    params: {runId: quizGenerated.id, quizId: quizGenerated.quizId},
+                },
+            ]
+        });
+    };
+
+    return (
+        <View style={styles.container}>
+            <View style={styles.contentContainer}>
+                <View style={styles.fieldContainer}>
+                    <SelectListBoxString title="CHOOSE A DIFFICULTY" data={difficulty} setSelected={setDifficutlyChoose} />
+                    <SelectListBoxCategory title="CHOOSE A CATEGORY" data={categories} setSelected={setCategoryChoose} />
+                    <InputPlayQuiz title="CHOOSE A NUMBER OF QUESTIONS" setText={setNbQuestions} numeric={true} defaultValue={nbQuestions}/>
+                </View>
+                <View style={styles.buttonPlayContainer}>
+                    <BlueButton onPress={handlePlayButtonPress} text={"PLAY"} isDisabled={buttonIsDisabled}/>
+                </View>
+            </View>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        display: "flex",
+        width: "100%",
+        height: "75%",
+        justifyContent: "space-between",
+    },
+    contentContainer: {
+        flex: 1, // Prend toute la hauteur disponible
+        flexDirection: "column",
+        justifyContent: "space-between",
+    },
+    fieldContainer: {
+        width: "100%",
+        flexDirection: "column",
+        justifyContent: "space-between",
+        marginTop: 20,
+        gap: 20,
+    },
+    buttonPlayContainer: {
+        alignItems: "center",
+        paddingVertical: 20,
+    },
+});
diff --git a/screens/Home/PlayQuiz/PlayQuizJoinQuiz.tsx b/screens/Home/PlayQuiz/PlayQuizJoinQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e123a2302f4aea6df268225df83c2dc1dfdb23f6
--- /dev/null
+++ b/screens/Home/PlayQuiz/PlayQuizJoinQuiz.tsx
@@ -0,0 +1,111 @@
+import { StyleSheet, View, Text } from "react-native";
+import AboutAQuiz from "../../../components/PlayQuiz/AboutAQuiz";
+import BlueButton from "../../../components/buttons/BlueButton";
+import React, { useEffect } from "react";
+import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz";
+import {Quiz} from "../../../models/Quiz";
+import { useQuizService } from "../../../services/QuizService";
+import HttpError from "../../../services/HttpError";
+import {NavigationProp} from "@react-navigation/native";
+import {RunInformations} from "../../../models/RunInformations";
+import {QuizInformations} from "../../../models/QuizInformations";
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+export default function PlayQuizJoinQuiz({navigation}: Props) {
+    const [codeQuiz, setCodeQuiz] = React.useState("");
+    const [quiz, setQuiz] = React.useState<Quiz>();
+    const [error, setError] = React.useState<string>("");
+    const [runInformations, setRunInformations] = React.useState<RunInformations>();
+    const [quizInformations, setQuizInformations] = React.useState<QuizInformations>();
+
+    const { getRunsInfo, getQuizInformations } = useQuizService();
+
+    useEffect(() => {
+        fetchRuns();
+    }, [codeQuiz]);
+
+    const fetchRuns = async () => {
+
+        if(codeQuiz === "") return;
+        if(codeQuiz.length < 6 )
+        {
+            setError("A quiz contains 6 characters");
+            return;
+        }
+
+        const runFetched = await getRunsInfo(codeQuiz);
+        if (runFetched instanceof HttpError) {
+            setError("The quiz does not exist");
+            return;
+        }
+        const quizInformations = await getQuizInformations(runFetched.quizId);
+        if (quizInformations instanceof HttpError) {
+            setError("The quiz does not exist");
+            return;
+        }
+
+        setError("");
+        setQuizInformations(quizInformations);
+        setRunInformations(runFetched);
+    };
+
+    const handlePlayButtonPress = () => {
+        navigation.reset({
+            index: 0,
+            routes: [
+                {
+                    name: "PlayingQuiz",
+                    params: {runId: runInformations?.id, quizId: runInformations?.quizId },
+                },
+            ]
+        });
+    };
+
+    return (
+        <View style={styles.container}>
+            <View style={styles.contentContainer}>
+                <View style={styles.fieldContainer}>
+                    {error ? <Text style={styles.errorText}>{error}</Text> : null}
+                    <InputPlayQuiz placeholder={"Enter quiz ID"} setText={setCodeQuiz} noTitle={true} />
+                    <AboutAQuiz runInformations={runInformations} quizInformations={quizInformations} />
+                </View>
+                <View style={styles.buttonPlayContainer}>
+                    <BlueButton onPress={handlePlayButtonPress} text={"PLAY"} isDisabled={codeQuiz==="" || error!==""}/>
+                </View>
+            </View>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        display: "flex",
+        width: "100%",
+        height: "75%",
+        justifyContent: "space-between",
+    },
+    contentContainer: {
+        flex: 1, // Prend toute la hauteur disponible
+        flexDirection: "column",
+        justifyContent: "space-between",
+    },
+    fieldContainer: {
+        width: "100%",
+        flexDirection: "column",
+        justifyContent: "space-between",
+        marginTop: 20,
+        gap: 20,
+    },
+    buttonPlayContainer: {
+        alignItems: "center",
+        paddingVertical: 20,
+    },
+    errorText: {
+        color: "red",
+        fontSize: 16,
+        marginBottom: 5,
+        textAlign: "left", // Aligne le texte à gauche
+    },
+});
diff --git a/screens/Multiplayer/Lobby/Lobby.tsx b/screens/Multiplayer/Lobby/Lobby.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..8aaff52363402c3ce8ece045efce8350d9518ea5
--- /dev/null
+++ b/screens/Multiplayer/Lobby/Lobby.tsx
@@ -0,0 +1,207 @@
+import {View, Text, StyleSheet, Image, FlatList} from "react-native";
+import {NavigationProp, RouteProp} from "@react-navigation/native";
+import React, {useEffect, useState} from "react";
+import { TouchableOpacity } from "react-native";
+import {User} from "../../../models/User";
+import {io, Socket} from "socket.io-client";
+import useCookie from "../../../hooks/UseCookie";
+import {useMultiService} from "../../../services/MultiService";
+import HttpError from "../../../services/HttpError";
+import TemplateMenu from "../../../templates/TemplateMenu";
+import BlueButton from "../../../components/buttons/BlueButton";
+import WhiteButton from "../../../components/buttons/WhiteButton";
+import ModalInvitePlayer from "../../../components/Multiplayer/ModalInvitePlayer";
+import EventSource from "react-native-sse";
+interface Props {
+    navigation: NavigationProp<any>;
+    route: RouteProp<RoutePropsType, "Lobby">;
+}
+
+type RoutePropsType = {
+    Lobby: {
+        quizId?: string;
+        roomId?: string;
+        nbPlayers: number;
+        isHost: boolean;
+    };
+};
+
+type CustomEventType = "userJoined" | "nextQuestion"
+
+
+export default function Lobby({navigation, route}: Props) {
+    const { quizId, roomId, nbPlayers, isHost} = route.params;
+
+    const [players, setPlayers] = useState<User[]>([{ id: 0, username: 'Invite', email: 'invite@email.com'}]);
+    const [socket, setSocket] = useState<Socket | null>(null);
+    const [roomIdCreated, setRoomIdCreated] = useState<string | undefined>(roomId);
+    const [runId, setRunId] = useState<string>("");
+    const [showModal, setShowModal] = useState<boolean>(false);
+
+    const {createParty} = useMultiService();
+
+    const userInvite = { id: 0, username: 'Invite', email: 'invite@email.com'}
+    let goodId = roomId;
+    const initSSE = async () => {
+        console.log("Init SSE for quiz ID:", quizId);
+        if(isHost && quizId) {
+            const response = await createParty(quizId);
+            if (HttpError.isHttpError(response)) {
+                console.error("Failed to create party:", response.message);
+                return;
+            }
+            console.log("Created party with ID:", response);
+            goodId = response;
+            setRoomIdCreated(response);
+        }
+        console.log("User try to joined party with ID:", goodId);
+        console.log(`https://klebert-host.com:33037/party/join/${goodId}`)
+
+        const es = new EventSource<CustomEventType>(`https://klebert-host.com:33037/party/join/${goodId}`);
+
+        es.addEventListener("userJoined", (event) => {
+            console.log("User joined event data:", event.data);
+            if(!event.data) return;
+
+            const newUsers: User[] = JSON.parse(event.data);
+
+            setPlayers((prevPlayers) => {
+                const ids = new Set(prevPlayers.map((player) => player.id));
+                const filteredNewUsers = newUsers.filter((user) => !ids.has(user.id));
+                return [...prevPlayers, ...filteredNewUsers];
+            });
+
+
+        });
+
+        es.addEventListener("error", (err) => {
+            console.error("Error with SSE:", err);
+        });
+
+        return () => es.close();
+    };
+
+    useEffect(() => {
+        initSSE();
+    }, []);
+
+    const item = ({ item }: { item: User }) => {
+        return (
+            <>
+                {item.username === 'Invite' ?
+                    <View style={styles.PlayerItem}>
+                        <TouchableOpacity style={styles.imagePlayer} onPress={onInvitePressed}>
+                            <Image source={require('../../../assets/add.png')}  />
+                        </TouchableOpacity>
+                        <Text style={styles.textPlayer}>Invite</Text>
+                    </View>
+                :
+                    <View style={styles.PlayerItem}>
+                        <Image source={require('../../../assets/ProfilBaseImage.png')} style={styles.imagePlayer} />
+                        <Text style={styles.textPlayer}>{item.username}</Text>
+                    </View>
+                }
+            </>
+
+        )
+    }
+
+
+    const onLeavePressed = () => {
+        navigation.navigate("TabNavigator");
+    };
+
+    const onPlayPressed = () => {
+        navigation.navigate("PlayingQuizMultiMode", {runId: runId, socket: socket, roomId: roomIdCreated});
+    };
+
+    const onCancelPressed = () => {
+        navigation.navigate("TabNavigator");
+    };
+
+    const onInvitePressed = () => {
+        setShowModal(true);
+    };
+
+    return (
+        <View>
+            <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}>
+                <View style={styles.containerLobby}>
+                    <Text style={styles.title}>{'BMW OFFICIAL QUIZ (I’m leaking oil)'}</Text>
+                    <View style={styles.containerPlayers}>
+                        <FlatList
+                            data={players}
+                            renderItem={item}
+                            numColumns={3}
+                            keyExtractor={(item) => item.id.toString()}
+                            showsVerticalScrollIndicator={true}
+                        />
+                    </View>
+                    {isHost ?
+                        <View style={styles.buttonGroup}>
+                            <View style={styles.button}>
+                                <BlueButton text="PLAY" onPress={onPlayPressed} isDisabled={false}/>
+                            </View>
+                            <View style={styles.button}>
+                                <WhiteButton text="CANCEL" onPress={onCancelPressed} isDisabled={false}/>
+                            </View>
+                        </View>
+                    :
+                        <View style={styles.buttonGroup}>
+                            <WhiteButton text="LEAVE" onPress={onLeavePressed} isDisabled={false}/>
+                        </View>
+                    }
+                </View>
+            </TemplateMenu>
+            <ModalInvitePlayer showModal={showModal} onClosePressed={() => setShowModal(false)} roomId={roomIdCreated} />
+        </View>
+    )
+}
+
+const styles = StyleSheet.create({
+    containerPlayers: {
+        height: '65%',
+        width: '100%',
+    },
+    PlayerItem: {
+        width: '30%',
+        aspectRatio: 1,
+        justifyContent: 'center',
+        alignItems: 'center',
+        margin: 5,
+    },
+    imagePlayer: {
+        width: '80%',
+        height: '80%',
+    },
+    textPlayer: {
+        fontSize: 20,
+        textAlign: 'center',
+    },
+    container: {
+        display: "flex",
+        height: "100%",
+        width: "100%",
+        justifyContent: "center",
+        alignItems: "center",
+    },
+    title: {
+        fontSize: 32,
+        textAlign: 'center',
+        color: '#00B3F4',
+        marginBottom: 20,
+    },
+    buttonGroup: {
+        flexDirection: 'row',
+        justifyContent: 'space-evenly',
+        width: '100%',
+    },
+    button: {
+        width: '45%',
+    },
+    containerLobby: {
+        height: '87%',
+        display: 'flex',
+        justifyContent: 'space-around',
+    }
+});
diff --git a/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiMode.tsx b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiMode.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..78c1760b98b0afb0b4e00bc52ca97547349364c4
--- /dev/null
+++ b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiMode.tsx
@@ -0,0 +1,84 @@
+import {NavigationProp, RouteProp} from "@react-navigation/native";
+import {useQuizService} from "../../../../services/QuizService";
+import React, {useEffect, useState} from "react";
+import {QuizInformations} from "../../../../models/QuizInformations";
+import {Question} from "../../../../models/Question";
+import TemplateDuo from "../../../../templates/TemplateDuo";
+import HttpError from "../../../../services/HttpError";
+import PlayingQuizMultiModeHeader from "./PlayingQuizMultiModeHeader";
+import PlayingQuizMultiModeBody from "./PlayingQuizMultiModeBody";
+import {Socket} from "socket.io-client";
+import {QuestionResponse} from "../../../../models/Response/QuestionResponse";
+import {RunInformations} from "../../../../models/RunInformations";
+
+
+type RoutePropsType = {
+    PlayingQuizMultiMode: {
+        runId: string;
+        socket: Socket;
+        roomId: string;
+    };
+};
+
+interface Props {
+    route: RouteProp<RoutePropsType, "PlayingQuizMultiMode">;
+    navigation: NavigationProp<any>;
+}
+
+export default function PlayingQuizMultiMode({route, navigation}:Props) {
+    const {runId, socket, roomId} = route.params;
+    const { getQuizInformations, getRunsInfo } = useQuizService();
+    const [quizInformations, setQuizInformations] = useState<QuizInformations | undefined>(undefined);
+    const [runInformations, setRunInformations] = useState<RunInformations>();
+    const [actualQuestion, setActualQuestion] = useState<QuestionResponse | undefined>(undefined);
+    const [score, setScore] = useState(0);
+
+    const initSocket = async () => {
+        socket.on("gameStarted", (data) => {
+            console.log("Game started:", data);
+        });
+
+        socket.on("newQuestion", (data) => {
+            const question: QuestionResponse = data as QuestionResponse
+            setActualQuestion(question);
+            // console.log(JSON.stringify(question, null, 2)); // Beautifie le JSON avec 2 espaces d'indentation
+        });
+
+    }
+
+    const fetchRuns = async () => {
+        if(runId === undefined) return;
+        const runFetched = await getRunsInfo(runId);
+        if (runFetched instanceof HttpError) {
+            console.log("Error fetching runs info", runFetched);
+            return;
+        }
+        const quizInformationsFetched = await getQuizInformations(runFetched.quizId);
+        if (quizInformationsFetched instanceof HttpError) {
+            console.log("Error fetching quiz info", quizInformationsFetched);
+            return;
+        }
+        setQuizInformations(quizInformationsFetched);
+        setRunInformations(runFetched);
+    };
+
+    useEffect(() => {
+        console.log("PlayingQuizMultiMode starting");
+        initSocket();
+        fetchRuns();
+        setTimeout(() => {
+            socket.emit("startGame")
+        },500);
+
+        setTimeout(() => {
+            socket.emit("nextQuestion");
+        },2000);
+    }, []);
+
+    return (
+        <TemplateDuo
+            childrenHeader={<PlayingQuizMultiModeHeader quizInformations={quizInformations} runId={runId} actualQuestion={actualQuestion} score={score}  navigation={navigation}></PlayingQuizMultiModeHeader>}
+            childrenBody={<PlayingQuizMultiModeBody runId={runId} actualQuestion={actualQuestion} socket={socket} fetchActualQuestion={()=>{}} roomId={roomId} navigation={navigation}></PlayingQuizMultiModeBody>}
+        />
+    );
+}
\ No newline at end of file
diff --git a/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeBody.tsx b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeBody.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..f7cda1aa97ab7842d496b165befd1bafc5d4fab2
--- /dev/null
+++ b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeBody.tsx
@@ -0,0 +1,229 @@
+import {QuizInformations} from "../../../../models/QuizInformations";
+import {Question} from "../../../../models/Question";
+import {NavigationProp} from "@react-navigation/native";
+import React, {useEffect, useState} from "react";
+import {useQuizService} from "../../../../services/QuizService";
+import {Answer} from "../../../../models/Answer";
+import HttpError from "../../../../services/HttpError";
+import AnswerButton from "../../../../components/buttons/AnswerButton";
+import {ActivityIndicator, View, Text, StyleSheet} from "react-native";
+import BlueButton from "../../../../components/buttons/BlueButton";
+import {ButtonsStyles} from "../../../../styles/ButtonsStyles";
+import {QuestionResponse} from "../../../../models/Response/QuestionResponse";
+import {RunInformations} from "../../../../models/RunInformations";
+import {Socket} from "socket.io-client";
+import {AnswerWsResponse} from "../../../../models/Response/AnswerWsResponse";
+
+
+interface Props {
+    runId?: string;
+    actualQuestion?: QuestionResponse;
+    fetchActualQuestion: () => void;
+    socket: Socket;
+    roomId: string;
+    navigation: NavigationProp<any>;
+}
+
+enum QuizState {
+    ANSWERING= "Answering",
+    LOADING= "Loading",
+    SHOWING_RESULTS= "ShowingResults",
+}
+
+const getStyleOfAnswerButtonText = (answerId: number, selectedAnswerIndex: number | null, correctAnswerId: number | null, quizState: QuizState) => {
+    if(quizState === QuizState.LOADING)
+    {
+        return styles.loadingText;
+    }
+    if(quizState === QuizState.ANSWERING)
+    {
+        return styles.answerText;
+
+    }
+    if(quizState === QuizState.SHOWING_RESULTS)
+    {
+        if(answerId === correctAnswerId) return styles.correctText;
+        if(answerId !== correctAnswerId && selectedAnswerIndex === answerId) return styles.incorrectText;
+    }
+    return styles.answerText;
+}
+
+const getStyleOfAnswerButton = (answerId: number, selectedAnswerIndex: number | null, correctAnswerId: number | null, quizState: QuizState) => {
+    if(quizState === QuizState.LOADING)
+    {
+        return styles.loadingAnswer;
+    }
+    if(quizState === QuizState.ANSWERING)
+    {
+        if(selectedAnswerIndex === null) return styles.answerButton;
+        if(selectedAnswerIndex === answerId) return styles.selectedAnswer;
+
+    }
+    if(quizState === QuizState.SHOWING_RESULTS)
+    {
+        if(answerId === correctAnswerId) return styles.correctAnswer;
+        if(answerId !== correctAnswerId && selectedAnswerIndex === answerId) return styles.incorrectAnswer;
+    }
+    return styles.answerButton;
+}
+
+export default function PlayingQuizMultiModeBody({runId, actualQuestion, fetchActualQuestion, roomId, socket, navigation }: Props) {
+    const [selectedAnswerId, setSelectedAnswerId] = useState<number | null>(null);
+    const [quizState, setQuizState] = useState(QuizState.ANSWERING);
+    const [correctAnswerId, setCorrectAnswerId] = useState<number | null>(null);
+    const [isLastQuestion, setIsLastQuestion] = useState(false);
+    const [quizInformations, setQuizInformations] = useState<QuizInformations>();
+    const [runInformations, setRunInformations] = useState<RunInformations>();
+    const {answerQuestion, getRunsInfo, getQuizInformations} = useQuizService();
+    const getCorrectAnswer = (answers: Answer[]): Answer => {
+        const correctAnswer = answers.find((answer) => answer.isCorrect);
+        if (!correctAnswer) return answers[0];
+        return correctAnswer;
+    };
+
+    const initSocket = async () => {
+        console.log("init socket in body");
+        socket.on("answersRevealed", (data: AnswerWsResponse) => {
+            const correctAnswerIdFetched = getCorrectAnswer(data.answers).id;
+            console.log("correctAnswerIdFetched", correctAnswerIdFetched);
+            setCorrectAnswerId(correctAnswerIdFetched);
+            setQuizState(QuizState.SHOWING_RESULTS);
+        });
+        // socket.on("score", (data) => {
+        //     console.log("Score:", data);
+        // });
+    }
+
+    useEffect(() => {
+        initSocket();
+    }, []);
+
+
+
+    const onValidation = async () => {
+
+        if(selectedAnswerId === null || actualQuestion === undefined) return;
+        setQuizState(QuizState.LOADING);
+        socket.emit("submitAnswer", {
+            roomId,
+            runId,
+            questionId: actualQuestion.question.id,
+            answerId: selectedAnswerId,
+        });
+
+        setTimeout(() => {
+            socket.emit("revealAnswer", {runId: runId});
+        },500);
+    };
+    const onContinue = () => {
+        socket.emit("nextQuestion");
+        setQuizState(QuizState.ANSWERING);
+        setCorrectAnswerId(null);
+        setSelectedAnswerId(null);
+    }
+
+    const onAnsweredButtonClicked = (answerId: number) => {
+        if(quizState === QuizState.SHOWING_RESULTS || quizState === QuizState.LOADING) {
+            return;
+        }
+        setSelectedAnswerId(answerId);
+    }
+
+    return (
+        <View style={styles.buttonContainer}>
+            {actualQuestion ? (
+                <>
+                    {actualQuestion.question.answers.map((answer, index) => (
+                        <AnswerButton
+                            key={index}
+                            text={answer.text}
+                            handleButtonPressed={() => onAnsweredButtonClicked(answer.id)}
+                            buttonStyle={getStyleOfAnswerButton(answer.id, selectedAnswerId, correctAnswerId, quizState)}
+                            buttonText={getStyleOfAnswerButtonText(answer.id, selectedAnswerId, correctAnswerId, quizState)}
+                        />
+                    ))}
+                    <View style={styles.playButtonContainer}>
+                        <BlueButton onPress={() => quizState === QuizState.ANSWERING ? onValidation() : onContinue()} text={quizState === QuizState.ANSWERING ? "CONFIRM" : "CONTINUE"} buttonStyle={{borderRadius: 50}} isDisabled={false}/>
+                    </View>
+                </>
+            ) : (
+                <View style={styles.loadingContainer}>
+                    <ActivityIndicator size="large" color="#2b73fe" />
+                    <Text style={styles.loadingText}>Loading...</Text>
+                </View>
+            )}
+        </View>
+    );
+
+}
+
+const styles = StyleSheet.create({
+    buttonContainer: {
+        display: 'flex',
+        flex: 1,
+        alignItems: 'center',
+        justifyContent: 'flex-start',
+        width: '100%',
+        marginVertical: '3%',
+    },
+    loadingContainer: {
+        flex: 1,
+        justifyContent: "center",
+        alignItems: "center",
+    },
+    playButtonContainer: {
+        marginTop: 20, // Ajoute un espacement au-dessus du bouton Play
+        width: '80%', // S'assure que le bouton prend toute la largeur disponible
+        alignItems: 'center', // Centre le bouton horizontalement
+    },
+    correctAnswer: {
+        ...ButtonsStyles.answerButton,
+        borderColor: 'green',
+        borderWidth: 2,
+    },
+    incorrectAnswer: {
+        ...ButtonsStyles.answerButton,
+        borderColor: 'red',
+        borderWidth: 2,
+    },
+    loadingAnswer: {
+        ...ButtonsStyles.answerButton,
+        backgroundColor: '#4F6367',
+        borderWidth: 2,
+    },
+    selectedAnswer: {
+        ...ButtonsStyles.answerButton,
+        borderColor: 'grey',
+        borderWidth: 2,
+    },
+    answerText: {
+        color: 'black',
+        textAlign: 'center',
+    },
+    correctText: {
+        fontWeight: 'bold',
+        color: 'green',
+    },
+    incorrectText: {
+        fontWeight: 'bold',
+        color: 'red',
+    },
+    loadingText: {
+        color: 'black',
+        textAlign: 'center',
+    },
+    answerButton: {
+        backgroundColor: "#F3F3F3",
+        height: '15%',
+        alignItems: 'center',
+        width: '80%',
+        marginVertical: '3%',
+        justifyContent: "center",
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: 2 },
+        shadowOpacity: 0.25,
+        shadowRadius: 3.5,
+        elevation: 5,
+    },
+});
+
diff --git a/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeHeader.tsx b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeHeader.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..427c8cdf405bdc174a46e3d4c8d0d7e0360e2440
--- /dev/null
+++ b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeHeader.tsx
@@ -0,0 +1,97 @@
+import {QuizInformations} from "../../../../models/QuizInformations";
+import {Question} from "../../../../models/Question";
+import {NavigationProp} from "@react-navigation/native";
+import {useTranslation} from "react-i18next";
+import {useState} from "react";
+import {View, Text, StyleSheet} from "react-native";
+import GoHomeButton from "../../../../components/PlayingQuiz/GoHomeButton";
+import {TextsStyles} from "../../../../styles/TextsStyles";
+import ConfirmModal from "../../../../components/PlayingQuiz/ComfirmModal";
+import {QuestionResponse} from "../../../../models/Response/QuestionResponse";
+
+interface Props {
+    quizInformations?: QuizInformations;
+    runId?: string;
+    actualQuestion?: QuestionResponse;
+    score: number;
+    navigation: NavigationProp<any>
+}
+
+export default function PlayingQuizMultiModeHeader({quizInformations, runId, actualQuestion, score, navigation}: Props) {
+    const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false);
+    const {t} = useTranslation();
+
+
+    const handleConfirmModalConfirm = () => {
+        navigation.reset({
+            index: 0,
+            routes: [
+                {
+                    name: "TabNavigator",
+                },
+            ]
+        });
+    }
+
+    return (
+        <View style={styles.container}>
+            <View style={styles.header}>
+                <GoHomeButton navigation={navigation} onPress={setIsConfirmModalVisible}/>
+                <Text style={styles.codeQuizText}>ID QUIZZ : {runId}</Text>
+            </View>
+            <View style={styles.questionAndScoreContainer}>
+                <View style={styles.InformationsContainer}>
+                    <Text style={TextsStyles.titleText}>{t("app.screens.question.question")}</Text>
+                    <Text style={TextsStyles.titleText}>{actualQuestion ? actualQuestion.question.order + 1 :"?"}/{quizInformations ? quizInformations.questionCount : "?"}</Text>
+                </View>
+                <View style={styles.InformationsContainer}>
+                    <Text style={TextsStyles.titleText}>{t("app.screens.question.score")}</Text>
+                    <Text style={TextsStyles.titleText}>{score}/{quizInformations ? quizInformations.questionCount : "?"}</Text>
+                </View>
+            </View>
+            <View style={styles.QuizQuestionContainer}>
+                <Text style={TextsStyles.subtitleText}>{actualQuestion ? actualQuestion.question.text : "Loading..."}</Text>
+            </View>
+            <ConfirmModal visible={isConfirmModalVisible} onClose={()=>setIsConfirmModalVisible(false)} onConfirm={handleConfirmModalConfirm}/>
+
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        marginHorizontal: '5%',
+    },
+    questionAndScoreContainer: {
+        display: 'flex',
+        flexDirection: 'row',
+        justifyContent: 'space-around',
+        alignItems: 'center',
+        marginVertical: '2%',
+    },
+    InformationsContainer: {
+        display: 'flex',
+        flexDirection: 'column',
+        justifyContent: 'center',
+        alignItems: 'center',
+        gap: '5%',
+    },
+    QuizNumContainer: {
+    },
+    QuizQuestionContainer: {
+        marginVertical: "2.5%",
+    },
+    infoQuizContainer: {
+        marginBottom: '5%',
+    },
+    codeQuizText: {
+        fontSize: 18,
+        color: '#000000',
+    },
+    header: {
+        display: "flex",
+        flexDirection: "row",
+        justifyContent: "flex-start",
+        gap: '5%',
+    }
+});
\ No newline at end of file
diff --git a/screens/Multiplayer/Multiplayer.tsx b/screens/Multiplayer/Multiplayer.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4b406870c10ad8f88a3d65ca38aa1f2c99d3fa9f
--- /dev/null
+++ b/screens/Multiplayer/Multiplayer.tsx
@@ -0,0 +1,29 @@
+import { NavigationProp } from "@react-navigation/native";
+import { View, StyleSheet } from "react-native";
+import TemplateMenu from "../../templates/TemplateMenu";
+import MultiplayerChild from "./MultiplayerChild";
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+
+export default function Home({navigation}: Props) {
+    return (
+        <View style={styles.containerGlobal}>
+                <TemplateMenu navigation={navigation} headerNavigation={false} buttonGoBack={false}>
+                    <View>
+                        <MultiplayerChild navigation={navigation}/>
+                    </View>
+                </TemplateMenu>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+        flexDirection: 'column',
+    },
+});
\ No newline at end of file
diff --git a/screens/Multiplayer/MultiplayerChild.tsx b/screens/Multiplayer/MultiplayerChild.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..c766368440f243d60ba3af21ee80c5a078040600
--- /dev/null
+++ b/screens/Multiplayer/MultiplayerChild.tsx
@@ -0,0 +1,112 @@
+import {Image, StyleSheet, Text, View} from "react-native";
+import {useTranslation} from "react-i18next";
+import React, {useEffect, useState} from "react";
+import MenuButton from "../../components/buttons/MenuButton";
+import {NavigationProp} from "@react-navigation/native";
+import HttpError from "../../services/HttpError";
+import {useUserService} from "../../services/UserService";
+import {UserConnectionState} from "../../models/User";
+import LoadingIndicator from "../../components/loading/LoadingIndicator";
+import Connection from "../Profil/Connection/Connection";
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+
+
+/**
+ * HomeChild : Enfant de l'écran Home, il contient le menu principal
+ * @param navigation - navigation
+ */
+export default function MultiplayerChild({navigation}: Props) {
+    const [modalVisible, setModalVisible] = useState(false);
+    const {t} = useTranslation();
+    const [userConnectionState, setUserConnectionState] = useState(UserConnectionState.LOADING);
+    const { getInformationsUser, logoutUser } = useUserService();
+
+    const getUser = async () => {
+        setUserConnectionState(UserConnectionState.LOADING);
+        const user = await getInformationsUser();
+        if(user instanceof HttpError){
+            setUserConnectionState(UserConnectionState.NOT_CONNECTED);
+            return;
+        }
+        setUserConnectionState(UserConnectionState.CONNECTED);
+    }
+
+    useEffect(() => {
+        getUser();
+    }, []);
+
+    const handleButtonCommunityPressed = async () => {
+        navigation.navigate("MultiplayerCommunity");
+    }
+    
+    const handleOnlineQuizPressed = () => {
+        navigation.navigate("OnlineQuiz");
+    }
+
+    const handleButtonOngoingQuizzesPressed = () => {
+        navigation.navigate("OngoingQuizzes");
+    }
+
+    return (
+        <View style={styles.containerGlobal}>
+            {userConnectionState === UserConnectionState.LOADING && (
+                <LoadingIndicator/>
+            )}
+            {userConnectionState === UserConnectionState.CONNECTED && (
+                <>
+                <View style={styles.imageContainer}>
+                    <Image source={require('../../assets/TitleApp.png')} style={styles.image} />
+                </View>
+                <View style={styles.buttonContainer}>
+                    <MenuButton text={"COMMUNITY"} handleButtonPressed={handleButtonCommunityPressed}/>
+                    <MenuButton text={"PLAY AN ONLINE QUIZ"} handleButtonPressed={handleOnlineQuizPressed}/>
+                    <MenuButton text={"ONGOING QUIZZES"} handleButtonPressed={handleButtonOngoingQuizzesPressed}/>
+                </View>
+            </>
+            )}
+            {userConnectionState === UserConnectionState.NOT_CONNECTED && (
+                <Connection title={"Multiplayer"} navigation={navigation}/>
+            )}
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+        justifyContent: 'flex-start',
+        alignItems: 'center',
+    },
+    image: {
+    },
+    title: {
+        fontSize: 40,
+        fontWeight: "bold",
+        color: "#00b3f4",
+        marginBottom: 10,
+        alignSelf: "center", // Centre uniquement le titre
+    },
+    button: {
+        borderRadius: 40,
+        height: '35%',
+        marginTop: '5%'
+    },
+    imageContainer: {
+        display: 'flex',
+        alignItems: 'center',
+        marginTop: '15%',
+        marginBottom: '25%',
+    },
+    buttonContainer: {
+        width: '100%',
+        display: 'flex',
+        flexDirection: 'column',
+        paddingLeft: '8%',
+        gap: '9%',
+    }
+});
\ No newline at end of file
diff --git a/screens/Multiplayer/MultiplayerCommunity/InformationsOfQuiz/MultiInformationsOfQuiz.tsx b/screens/Multiplayer/MultiplayerCommunity/InformationsOfQuiz/MultiInformationsOfQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ca222f47e03c8f964d490505860612c2e9190dd4
--- /dev/null
+++ b/screens/Multiplayer/MultiplayerCommunity/InformationsOfQuiz/MultiInformationsOfQuiz.tsx
@@ -0,0 +1,112 @@
+import React, { useState } from "react";
+import { View, Text, StyleSheet, TouchableOpacity } from "react-native";
+import TemplateMenu from "../../../../templates/TemplateMenu";
+import {NavigationProp, RouteProp} from "@react-navigation/native";
+import {Quiz} from "../../../../models/Quiz";
+import ModalCreateLobby from "../../../../components/Multiplayer/ModalCreateLobby";
+
+type RoutePropsType = {
+    InformationsOfQuiz: {
+        quiz: Quiz;
+    };
+};
+interface Props {
+    navigation: NavigationProp<any>;
+    route: RouteProp<RoutePropsType, "InformationsOfQuiz">;
+}
+
+export default function MultiInformationsOfQuiz({ navigation, route }: Props) {
+    const { quiz } = route.params;
+    const [showModal, setShowModal] = useState<boolean>(false);
+
+    const onCreateLobbyPressed = () => {
+        setShowModal(true);
+    };
+
+    const onClosePressed = () => {
+        setShowModal(false);
+    };
+
+    const onPlayPressed = async (nbPlayer: number) => {
+        setShowModal(false);
+        navigation.navigate("Lobby", {quizId: quiz.id, roomId: null, nbPlayer: nbPlayer, isHost: true});
+    };
+
+    return (
+        <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}>
+            <View style={styles.container}>
+                <Text style={styles.quizTitle}>{quiz.name}</Text>
+                <Text style={styles.quizDescription}>{quiz.description && "No Description"}</Text>
+                
+
+                <View style={styles.aboutContainer}>
+                    <Text style={styles.aboutTitle}>About this quiz :</Text>
+                    <Text style={styles.aboutDetails}>{quiz.questionCount} questions, {quiz.difficulty.name}</Text>
+                    <Text style={styles.aboutDetails}>By : {quiz.authorId && "Unknown"}</Text>
+                </View>
+
+                <TouchableOpacity style={styles.playButton} onPress={onCreateLobbyPressed}>
+                    <Text style={styles.playButtonText}>CREATE LOBBY</Text>
+                </TouchableOpacity>
+            </View>
+            <ModalCreateLobby onClosePressed={onClosePressed} onPlayPressed={onPlayPressed} showModal={showModal}/>
+        </TemplateMenu>
+
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        flex: 1,
+        paddingHorizontal: 20,
+        paddingVertical: 20,
+        justifyContent: "flex-start",
+    },
+    quizTitle: {
+        fontSize: 24,
+        fontWeight: "bold",
+        color: "#00b3f4",
+        marginBottom: 10,
+    },
+    quizDescription: {
+        fontSize: 16,
+        color: "#555",
+        marginBottom: 20,
+        height: "15%",
+    },
+    aboutContainer: {
+        height: "50%",
+        backgroundColor: "white",
+        borderRadius: 10,
+        padding: 15,
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: 2 },
+        shadowOpacity: 0.2,
+        shadowRadius: 3,
+        elevation: 5,
+    },
+    aboutTitle: {
+        fontSize: 18,
+        fontWeight: "bold",
+        marginBottom: 10,
+        color: "#000",
+    },
+    aboutDetails: {
+        fontSize: 16,
+        color: "#555",
+        marginBottom: 10,
+    },
+    playButton: {
+        backgroundColor: "#007BFF",
+        paddingVertical: 15,
+        borderRadius: 10,
+        alignItems: "center",
+        justifyContent: "center",
+        marginTop: 20,
+    },
+    playButtonText: {
+        fontSize: 18,
+        fontWeight: "bold",
+        color: "white",
+    },
+});
diff --git a/screens/Multiplayer/MultiplayerCommunity/MultiplayerCommunity.tsx b/screens/Multiplayer/MultiplayerCommunity/MultiplayerCommunity.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..dbc402b7f8224dada3195d8ca4c4e8736e5d7c7b
--- /dev/null
+++ b/screens/Multiplayer/MultiplayerCommunity/MultiplayerCommunity.tsx
@@ -0,0 +1,75 @@
+import {View, Text, Modal, TextInput, StyleSheet} from "react-native";
+import TemplateQuizList from "../../../templates/TemplateQuizList";
+import {NavigationProp} from "@react-navigation/native";
+import React, {useState} from "react";
+import {useQuizService} from "../../../services/QuizService";
+import HttpError from "../../../services/HttpError";
+import {useInfiniteQuery} from "@tanstack/react-query";
+import { Quiz } from "../../../models/Quiz";
+import WhiteButton from "../../../components/buttons/WhiteButton";
+import BlueButton from "../../../components/buttons/BlueButton";
+import ModalCreateLobby from "../../../components/Multiplayer/ModalCreateLobby";
+
+interface Props {
+    navigation: NavigationProp<any>
+}
+export default function MultiplayerCommunity({navigation}: Props) {
+    const  {getCommunityQuiz, getRandomQuiz} = useQuizService();
+    const [input, setInput] = useState<string>("")
+    const [loading, setLoading] = useState<boolean>(false)
+
+    const fetchCommunityQuizzes = async ({pageParam = 1}) => {
+        const quizzes = await getCommunityQuiz(pageParam,7);//TODO: changer pour get les quiz community public
+        if (HttpError.isHttpError(quizzes)) {
+            console.error("Error while fetching community quizzes:", quizzes);
+            return [];
+        }
+        return quizzes;
+    }
+
+    const onQuizPressed = (quiz: Quiz) => {
+        navigation.navigate("MultiInformationsOfQuiz", {quiz: quiz});
+    };
+
+    const {
+        data,
+        fetchNextPage,
+    } = useInfiniteQuery({
+        queryKey: ["communityQuizzes"],
+        queryFn: fetchCommunityQuizzes,
+        initialPageParam: 0,
+        getNextPageParam: (lastPage, allPages) => {
+            // Si la dernière page a moins de 7 quizzes, il n'y a plus de page suivante
+            if (lastPage.length < 7) return undefined;
+
+            // On augmente skip de 7 pour la prochaine requête
+            return allPages.length * 7;
+        }});
+
+    
+
+    return (
+        <View style={styles.containerGlobal}>
+            {/* <View style={styles.templateQuizListContainer}> */}
+                <TemplateQuizList title={"Community"} setTextInInput={setInput} quizList={data?.pages.flat() ?? []} navigation={navigation} buttonGoBack={true} isLoadingData={loading} nextPage={fetchNextPage} onQuizPressed={onQuizPressed}/>
+            {/* </View> */}
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+        flexDirection: 'column',
+    },
+    templateQuizListContainer: {
+        height: '90%',
+    },
+    buttonContainer: {
+        height: '10%',
+        width: '95%',
+        marginLeft: '2.5%',
+    }
+});
\ No newline at end of file
diff --git a/screens/Multiplayer/OngoingQuizzes/OngoingQuizzes.tsx b/screens/Multiplayer/OngoingQuizzes/OngoingQuizzes.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..6374b8b2e05d2d02263e68269df9a2dc7f0cbdaa
--- /dev/null
+++ b/screens/Multiplayer/OngoingQuizzes/OngoingQuizzes.tsx
@@ -0,0 +1,80 @@
+import {View, StyleSheet} from "react-native";
+import TemplateQuizList from "../../../templates/TemplateQuizList";
+import {NavigationProp} from "@react-navigation/native";
+import {useEffect, useState} from "react";
+import {useQuizService} from "../../../services/QuizService";
+import HttpError from "../../../services/HttpError";
+import {useInfiniteQuery} from "@tanstack/react-query";
+import { Quiz } from "../../../models/Quiz";
+import BlueButton from "../../../components/buttons/BlueButton";
+
+interface Props {
+    navigation: NavigationProp<any>
+}
+export default function Community({navigation}: Props) {
+    const  {getCommunityQuiz} = useQuizService();
+    const [input, setInput] = useState<string>("")
+    const [loading, setLoading] = useState<boolean>(false)
+    const [CurrentQuiz, setCurrentQuiz] = useState<Quiz | null>(null);
+
+    const fetchCommunityQuizzes = async ({pageParam = 1}) => {
+        const quizzes = await getCommunityQuiz(pageParam,7);
+        if (HttpError.isHttpError(quizzes)) {
+            console.error("Error while fetching community quizzes:", quizzes);
+            return [];
+        }
+        return quizzes;
+    }
+
+    const onQuizPressed = (quiz: Quiz) => {
+        setCurrentQuiz(quiz);
+    };
+
+    const onJoinPressed = () => {
+        navigation.navigate("Lobby");
+    };
+
+    //TODO: changer la fonction de fetch
+    const {
+        data,
+        fetchNextPage,
+    } = useInfiniteQuery({
+        queryKey: ["communityQuizzes"],
+        queryFn: fetchCommunityQuizzes,
+        initialPageParam: 0,
+        getNextPageParam: (lastPage, allPages) => {
+            // Si la dernière page a moins de 7 quizzes, il n'y a plus de page suivante
+            if (lastPage.length < 7) return undefined;
+
+            // On augmente skip de 7 pour la prochaine requête
+            return allPages.length * 7;
+        }});
+
+    return (
+        <View>
+            <View style={styles.templateQuizListContainer}>
+                <TemplateQuizList title={"Ongoing Quizzes"} setTextInInput={setInput} quizList={data?.pages.flat() ?? []} navigation={navigation} buttonGoBack={true} isLoadingData={loading} nextPage={fetchNextPage} onQuizPressed={onQuizPressed}/>
+            </View>
+            <View style={styles.buttonContainer}>
+                <BlueButton text="JOINa" onPress={onJoinPressed} isDisabled={false}/>
+            </View>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+        flexDirection: 'column',
+    },
+    templateQuizListContainer: {
+        height: '90%',
+    },
+    buttonContainer: {
+        height: '10%',
+        width: '95%',
+        marginLeft: '2.5%',
+    }
+});
\ No newline at end of file
diff --git a/screens/Multiplayer/OnlineQuiz/OnlineCreateLobby.tsx b/screens/Multiplayer/OnlineQuiz/OnlineCreateLobby.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7f7e8eeb8dc8e32c94dd46d32f4be9a3f893fdfe
--- /dev/null
+++ b/screens/Multiplayer/OnlineQuiz/OnlineCreateLobby.tsx
@@ -0,0 +1,111 @@
+import { View, StyleSheet } from "react-native";
+import React, {useEffect, useState} from "react";
+import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz";
+import {useQuizService} from "../../../services/QuizService";
+import {NavigationProp} from "@react-navigation/native";
+import BlueButton from "../../../components/buttons/BlueButton";
+import SelectListBoxString from "../../../components/PlayQuiz/SelectListBoxString";
+import SelectListBoxCategory from "../../../components/PlayQuiz/SelectListBoxCategory";
+import { Category } from "../../../models/Quiz";
+import HttpError from "../../../services/HttpError";
+
+const difficulty = [
+    { key: "easy", value: "easy" },
+    { key: "medium", value: "medium" },
+    { key: "hard", value: "hard" },
+];
+
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+
+export default function OnlineCreateLobby({navigation}: Props) {
+    const [difficutlyChoose, setDifficutlyChoose] = React.useState("");
+    const [categories, setCategories] = useState<Category[]>([]);
+    const [categoryChoose, setCategoryChoose] = React.useState<Category | null>(null);
+    const [nbQuestions, setNbQuestions] = React.useState("10");
+    const [nbPlayers, setNbPlayers] = React.useState("2");
+    const [buttonIsDisabled, setButtonIsDisabled] = React.useState(true);
+    const {generateQuiz, getCategories} = useQuizService();
+
+    const fetchingCategories = async () => {
+        const categories = await getCategories();
+        let categoriesTemp: Category[] = [];
+        categories.map((category: Category) => {
+            categoriesTemp.push({'name': category.name, 'id': category.id});
+        });
+        setCategories(categoriesTemp);
+    }
+
+    useEffect(() => {
+        fetchingCategories();
+    }, []);
+
+    useEffect(() => {
+        if(nbQuestions === "" || difficutlyChoose === "" || categoryChoose === null)
+        {
+            setButtonIsDisabled(true);
+        }
+        else
+        {
+            setButtonIsDisabled(false);
+        }
+
+    }, [difficutlyChoose,categoryChoose,nbQuestions]);
+
+    const handlePlayButtonPress = async () => {
+        const quizGenerated = await generateQuiz(parseInt(nbQuestions), categoryChoose ? categoryChoose.id : 10, difficutlyChoose);
+        if(HttpError.isHttpError(quizGenerated)) {
+            return;
+        }
+
+        navigation.navigate("Lobby", {
+            quizId: quizGenerated.quizId,
+            roomId: null,
+            nbPlayers: parseInt(nbPlayers),
+            isHost: true,
+        });
+    };
+
+    return (
+        <View style={styles.container}>
+            <View style={styles.contentContainer}>
+                <View style={styles.fieldContainer}>
+                    <SelectListBoxString title="CHOOSE A DIFFICULTY" data={difficulty} setSelected={setDifficutlyChoose} />
+                    <SelectListBoxCategory title="CHOOSE A CATEGORY" data={categories} setSelected={setCategoryChoose} />
+                    <InputPlayQuiz title="CHOOSE A NUMBER OF QUESTIONS" setText={setNbQuestions} numeric={true} defaultValue={nbQuestions}/>
+                    <InputPlayQuiz title="NUMBER OF PLAYERS" setText={setNbPlayers} numeric={true} defaultValue={nbPlayers}/>
+                </View>
+                <View style={styles.buttonPlayContainer}>
+                    <BlueButton onPress={handlePlayButtonPress} text={"CREATE LOBBY"} isDisabled={buttonIsDisabled}/>
+                </View>
+            </View>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        display: "flex",
+        width: "100%",
+        height: "75%",
+        justifyContent: "space-between",
+    },
+    contentContainer: {
+        flex: 1, // Prend toute la hauteur disponible
+        flexDirection: "column",
+        justifyContent: "space-between",
+    },
+    fieldContainer: {
+        width: "100%",
+        flexDirection: "column",
+        justifyContent: "space-between",
+        marginTop: 20,
+        gap: 20,
+    },
+    buttonPlayContainer: {
+        alignItems: "center",
+        paddingVertical: 20,
+    },
+});
diff --git a/screens/Multiplayer/OnlineQuiz/OnlinePlayQuiz.tsx b/screens/Multiplayer/OnlineQuiz/OnlinePlayQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..c91647d21dd31fc2c030d1a80d1f8b78514b54aa
--- /dev/null
+++ b/screens/Multiplayer/OnlineQuiz/OnlinePlayQuiz.tsx
@@ -0,0 +1,85 @@
+import { StyleSheet, View, Text } from "react-native";
+import React from "react";
+import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz";
+import { useQuizService } from "../../../services/QuizService";
+import HttpError from "../../../services/HttpError";
+// import {getIdOfCategory} from "../../../helper/QuizHelper";
+import {NavigationProp} from "@react-navigation/native";
+import BlueButton from "../../../components/buttons/BlueButton";
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+export default function OnlinePlayQuiz({navigation}: Props) {
+    const [codeQuiz, setCodeQuiz] = React.useState("");
+    const [error, setError] = React.useState<string>("");
+    const {getRunsInfo} = useQuizService();
+
+    const checkRoomExist = async () : Promise<boolean> => {
+        const runFetched = await getRunsInfo(codeQuiz);
+        if(runFetched instanceof HttpError) {
+            return false;
+        }
+        return true;
+    }
+
+    const joinLobby = async ()  => {
+        const response = await checkRoomExist()
+        if(!response) {
+            setError("The room does not exist");
+            return;
+        }
+        setError("");
+        navigation.navigate("Lobby", {
+            quizId: null,
+            roomId: codeQuiz,
+            nbPlayers: 10,
+            isHost: false,
+        });
+    };
+
+    return (
+        <View style={styles.container}>
+            <View style={styles.contentContainer}>
+                <View style={styles.fieldContainer}>
+                    {error ? <Text style={styles.errorText}>{error}</Text> : null}
+                    <InputPlayQuiz placeholder={"Enter room ID"} setText={setCodeQuiz} noTitle={true} />
+                </View>
+                <View style={styles.buttonPlayContainer}>
+                    <BlueButton onPress={joinLobby} text={"JOIN"} isDisabled={codeQuiz==="" || error!==""}/>
+                </View>
+            </View>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        display: "flex",
+        width: "100%",
+        height: "75%",
+        justifyContent: "space-between",
+    },
+    contentContainer: {
+        flex: 1, // Prend toute la hauteur disponible
+        flexDirection: "column",
+        justifyContent: "space-between",
+    },
+    fieldContainer: {
+        width: "100%",
+        flexDirection: "column",
+        justifyContent: "space-between",
+        marginTop: 20,
+        gap: 20,
+    },
+    buttonPlayContainer: {
+        alignItems: "center",
+        paddingVertical: 20,
+    },
+    errorText: {
+        color: "red",
+        fontSize: 16,
+        marginBottom: 5,
+        textAlign: "left", // Aligne le texte à gauche
+    },
+});
diff --git a/screens/Multiplayer/OnlineQuiz/OnlineQuiz.tsx b/screens/Multiplayer/OnlineQuiz/OnlineQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7b3ce82c7d007890274026f273d037ec68fb4de6
--- /dev/null
+++ b/screens/Multiplayer/OnlineQuiz/OnlineQuiz.tsx
@@ -0,0 +1,28 @@
+import { NavigationProp } from "@react-navigation/native";
+import { View, StyleSheet } from "react-native";
+import TemplateMenu from "../../../templates/TemplateMenu";
+import OnlineQuizChild from "./OnlineQuizChild";
+
+interface Props{
+    navigation: NavigationProp<any>
+}
+export default function OnlineQuiz({navigation}: Props) {
+    return (
+        <View style={styles.containerGlobal}>
+            <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}>
+                <View>
+                    <OnlineQuizChild navigation={navigation}/>
+                </View>
+            </TemplateMenu>
+        </View>
+    )
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+        flexDirection: 'column',
+    },
+});
\ No newline at end of file
diff --git a/screens/Multiplayer/OnlineQuiz/OnlineQuizChild.tsx b/screens/Multiplayer/OnlineQuiz/OnlineQuizChild.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ce6258b0faf716885913e009cf565fb600260d9f
--- /dev/null
+++ b/screens/Multiplayer/OnlineQuiz/OnlineQuizChild.tsx
@@ -0,0 +1,44 @@
+import { NavigationProp } from "@react-navigation/native";
+import { useState } from "react";
+import { OnlineSelectModeType, SelectModeType } from "../../../models/SelectModeType";
+import { TouchableWithoutFeedback, View, StyleSheet, Keyboard } from "react-native";
+import OnlineSelectMode from "./OnlineSelectMode";
+import OnlineCreateLobby from "./OnlineCreateLobby";
+import OnlinePlayQuiz from "./OnlinePlayQuiz";
+
+interface Props {
+    navigation: NavigationProp<any>
+}
+
+export default function OnlineQuizChild({navigation}: Props){
+ const [mode, setMode] = useState<OnlineSelectModeType>("create");
+
+    return (
+        <TouchableWithoutFeedback onPress={Keyboard.dismiss}>
+            <View style={styles.containerGlobal}>
+                <View style={styles.contentContainer}>
+                    <OnlineSelectMode mode={mode} setMode={setMode}/>
+                    {mode === "create" ? (
+                        <OnlineCreateLobby navigation={navigation}/>
+                    ) : (
+                        <OnlinePlayQuiz navigation={navigation}/>
+                    )}
+                </View>
+            </View>
+        </TouchableWithoutFeedback>
+    )
+}
+const styles = StyleSheet.create({
+    containerGlobal: {
+        width: '100%',
+        height: '100%',
+        alignItems: 'center',
+        justifyContent: 'center',
+    },
+    contentContainer: {
+        display: 'flex',
+        width: '95%',
+        height: '100%',
+        flexDirection: 'column',
+    },
+});
\ No newline at end of file
diff --git a/screens/Multiplayer/OnlineQuiz/OnlineSelectMode.tsx b/screens/Multiplayer/OnlineQuiz/OnlineSelectMode.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..cc4522640d44e3d16132801687df1facc86c8c7b
--- /dev/null
+++ b/screens/Multiplayer/OnlineQuiz/OnlineSelectMode.tsx
@@ -0,0 +1,75 @@
+import { View, Text, StyleSheet, TouchableOpacity } from "react-native";
+import { OnlineSelectModeType } from "../../../models/SelectModeType";
+
+interface Props {
+    mode: OnlineSelectModeType;
+    setMode: (mode: OnlineSelectModeType) => void;
+}
+
+export default function OnlineSelectMode({ mode, setMode }: Props) {
+    return (
+        <View style={styles.container}>
+            <View style={styles.buttonContainer}>
+                <TouchableOpacity onPress={() => setMode("create")}>
+                    <Text style={[styles.text, mode === "create" && styles.activeText]}>CREATE A LOBBY</Text>
+                </TouchableOpacity>
+                <View style={[styles.bar, mode === "create" ? styles.activeBar : styles.inactiveBar]} />
+            </View>
+
+            <View style={styles.buttonContainer}>
+                <TouchableOpacity onPress={() => setMode("join")}>
+                    <Text style={[styles.text, mode === "join" && styles.activeText]}>JOIN A ROOM</Text>
+                </TouchableOpacity>
+                <View style={[styles.bar, mode === "join" ? styles.activeBar : styles.inactiveBar]} />
+            </View>
+
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        display: 'flex',
+        width: '100%',
+        height: '12%',
+        flexDirection: 'row',
+        backgroundColor: '#f3f3f3',
+        borderRadius: 10,
+        justifyContent: 'space-around',
+        alignItems: 'center',
+        // Ombre pour Android
+        elevation: 5,
+        // Ombre pour iOS
+        shadowColor: '#000',
+        shadowOffset: { width: 0, height: 4 }, // Décalage de l'ombre en bas
+        shadowOpacity: 0.25, // Opacité de l'ombre
+        shadowRadius: 3.84, // Flou de l'ombre
+    },
+    buttonContainer: {
+        display: 'flex',
+        flexDirection: 'column',
+        width: '45%',
+        alignItems: 'center',
+        gap: "2%",
+    },
+    text: {
+        fontSize: 18,
+        color: '#bebebe',
+        textAlign: 'center',
+    },
+    activeText: {
+        color: '#2ec7ff',
+    },
+    bar: {
+        width: '100%',
+        height: '4%',
+        marginTop: '4%',
+        borderRadius: 10,
+    },
+    activeBar: {
+        backgroundColor: '#2ec7ff', // Couleur pour le bouton actif
+    },
+    inactiveBar: {
+        backgroundColor: '#bebebe', // Couleur grise pour les boutons inactifs
+    },
+});
diff --git a/screens/PlayingQuiz/EndQuiz/EndQuiz.tsx b/screens/PlayingQuiz/EndQuiz/EndQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..bb73a9b5f86249c4efcdbbad26605a727d144c7f
--- /dev/null
+++ b/screens/PlayingQuiz/EndQuiz/EndQuiz.tsx
@@ -0,0 +1,39 @@
+import {NavigationProp, RouteProp} from "@react-navigation/native";
+import { View, StyleSheet, Image, Text } from "react-native";
+import EndQuizChild from "./EndQuizChild";
+import TemplateMenu from "../../../templates/TemplateMenu";
+import {Quiz} from "../../../models/Quiz";
+import {QuizInformations} from "../../../models/QuizInformations";
+
+type RoutePropsType = {
+    EndQuizChild: {
+        quizInformations: QuizInformations;
+        score: number;
+    };
+};
+interface Props {
+    route: RouteProp<RoutePropsType, "EndQuizChild">;
+    navigation: NavigationProp<any>;
+}
+
+export default function EndQuiz({route,navigation}: Props) {
+    const { quizInformations, score } = route.params;
+    return (
+        <View style={styles.containerGlobal}>
+            <TemplateMenu navigation={navigation} headerNavigation={false} buttonGoBack={false}>
+                <View>
+                    <EndQuizChild navigation={navigation} quizInformations={quizInformations} score={score}/>
+                </View>
+            </TemplateMenu>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+        flexDirection: 'column',
+    },
+});
diff --git a/screens/PlayingQuiz/EndQuiz/EndQuizChild.tsx b/screens/PlayingQuiz/EndQuiz/EndQuizChild.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..767dce5d464e3021c374d85446df81ae57f3da69
--- /dev/null
+++ b/screens/PlayingQuiz/EndQuiz/EndQuizChild.tsx
@@ -0,0 +1,117 @@
+import { View, Image, Text, StyleSheet } from "react-native";
+import DefaultButton from "../../../components/buttons/DefaultButton";
+import { NavigationProp, RouteProp } from "@react-navigation/native";
+import {Quiz} from "../../../models/Quiz";
+import {useQuizService} from "../../../services/QuizService";
+import HttpError from "../../../services/HttpError";
+import {QuizInformations} from "../../../models/QuizInformations";
+
+
+
+interface Props {
+    navigation: NavigationProp<any>;
+    quizInformations: QuizInformations;
+    score: number;
+}
+
+export default function EndQuizChild({ navigation, quizInformations, score }: Props) {
+
+    const {restartQuiz, remainingQuiz, createRun} = useQuizService()
+
+    const handleRestartPress = async () => {
+        const quizId = quizInformations.id.toString();
+        const runId = await createRun(quizId);
+        navigation.navigate('PlayingQuiz', {runId: runId, quizId: quizId});
+    };
+
+    const handleBackToMenu = () => {
+        navigation.navigate('TabNavigator');
+    };
+
+    return (
+        <View style={styles.container}>
+            <View style={styles.containerHeader}>
+                <Image source={require('../../../assets/TitleApp.png')}/>
+            </View>
+            <View style={styles.containerBody}>
+                <Text style={styles.TextBodyTitle}>{((score/quizInformations.questionCount)*100 > 50 ) ? 'Victory' : 'Defeat'}</Text>
+                <Text style={styles.TextBody}>you finish the test with a score of {`${score}/${quizInformations.questionCount}`} ! </Text>
+                <Image source={require('../../../assets/uWin.png')} />
+                <DefaultButton text="RESTART" handleButtonPressed={handleRestartPress} buttonStyle={styles.whiteButton} buttonText={styles.whiteButtonText}></DefaultButton>
+                <DefaultButton text="BACK TO MENU" handleButtonPressed={handleBackToMenu} buttonStyle={styles.blueButton} buttonText={styles.blueButtonText}></DefaultButton>
+            </View>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        height: '100%',
+        width: '100%',
+        display: 'flex',
+        flexDirection: 'column',
+        alignItems: 'center',
+        justifyContent: 'space-around'
+    },
+    containerHeader: {
+        height: '10%',
+        width: '100%',
+        alignItems: 'center',
+    },
+    containerBody: {
+        height: '80%',
+        width: '90%',
+        display: 'flex',
+        flexDirection: 'column',
+        alignItems: 'center',
+        justifyContent: 'space-around',
+        backgroundColor: '#F3F3F3',
+        borderRadius: 40,
+        padding: '10%',
+        shadowColor: "#000",
+        shadowOffset: {
+            width: 0,
+            height: 2,
+        },
+        shadowOpacity: 0.25,
+        shadowRadius: 3.84,
+
+        elevation: 5,
+    },
+    TextBodyTitle: {
+        textAlign: 'center',
+        fontSize: 24,
+        fontWeight: 'bold',
+    },
+    TextBody: {
+        textAlign: 'center',
+        fontSize: 22,
+        fontWeight: 'bold',
+    },
+    whiteButton: {
+        height: '12%',
+        width: '80%',
+        backgroundColor: '#FFFFFF',
+        borderColor: '#2B73FE',
+        borderWidth: 4,
+        borderRadius: 10,
+        padding: 0
+    },
+    whiteButtonText: {
+        fontSize: 24,
+        fontWeight: 'bold',
+        color: '#2B73FE',
+    },
+    blueButton: {
+        height: '12%',
+        width: '80%',
+        backgroundColor: '#2B73FE',
+        borderRadius: 10,
+        padding: 0
+    },
+    blueButtonText: {
+        fontSize: 24,
+        fontWeight: 'bold',
+        color: '#FFFFFF',
+    },
+});
\ No newline at end of file
diff --git a/screens/PlayingQuiz/EndQuizMulti/EndQuizMulti.tsx b/screens/PlayingQuiz/EndQuizMulti/EndQuizMulti.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..1945637e5a85c3473285e25902d0c195fcd5c9a5
--- /dev/null
+++ b/screens/PlayingQuiz/EndQuizMulti/EndQuizMulti.tsx
@@ -0,0 +1,41 @@
+import {NavigationProp, RouteProp} from "@react-navigation/native";
+import { View, StyleSheet, Image, Text } from "react-native";
+import TemplateMenu from "../../../templates/TemplateMenu";
+import {Quiz} from "../../../models/Quiz";
+import EndQuizChild from "../EndQuiz/EndQuizChild";
+import EndQuizMultiChild from "./EndQuizMultiChild";
+
+type RoutePropsType = {
+    EndQuizChild: {
+        quiz: Quiz;
+    };
+};
+interface Props {
+    route: RouteProp<RoutePropsType, "EndQuizChild">;
+    navigation: NavigationProp<any>;
+}
+
+export default function EndQuizMulti({route,navigation}: Props) {
+    const { quiz } = route.params;
+    return (
+        <View style={styles.containerGlobal}>
+            <TemplateMenu navigation={navigation} headerNavigation={false} buttonGoBack={false}>
+                <View>
+                    <EndQuizMultiChild navigation={navigation} quiz={quiz}/>
+                </View>
+            </TemplateMenu>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+        flexDirection: 'column',
+    },
+});
+
+
+
diff --git a/screens/PlayingQuiz/EndQuizMulti/EndQuizMultiChild.tsx b/screens/PlayingQuiz/EndQuizMulti/EndQuizMultiChild.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..b53eb9f21dcc69cbbfb1e87017ab6ae8b80b1152
--- /dev/null
+++ b/screens/PlayingQuiz/EndQuizMulti/EndQuizMultiChild.tsx
@@ -0,0 +1,128 @@
+import { View, Image, Text, StyleSheet } from "react-native";
+import DefaultButton from "../../../components/buttons/DefaultButton";
+import { NavigationProp, RouteProp } from "@react-navigation/native";
+import {Quiz} from "../../../models/Quiz";
+import {useQuizService} from "../../../services/QuizService";
+import HttpError from "../../../services/HttpError";
+import UserScore from "../../../components/PlayingQuiz/EndQuiz/UserScore";
+import EndQuizListPlayer from "../../../components/PlayingQuiz/EndQuiz/EndQuizListPlayer";
+
+
+
+interface Props {
+    navigation: NavigationProp<any>;
+    quiz: Quiz;
+}
+
+export default function EndQuizMultiChild({ navigation, quiz }: Props) {
+
+    const userTest = {id: 1, email: "user1@email.com", username: "user1", stats: undefined};
+
+    const handleBackToMenu = () => {
+        navigation.navigate('TabNavigator');
+    };
+
+    return (
+        <View style={styles.container}>
+            <View style={styles.containerHeader}>
+                <Image source={require('../../../assets/TitleApp.png')}/>
+            </View>
+            <View style={styles.containerBody}>
+                <Image
+                    source={require('../../../assets/stars.png')} // URL de l'avatar ou placeholder
+                    style={styles.stars}
+                />
+                <View style={styles.usersContainer}>
+                    <UserScore user={userTest} score={10} maxScore={quiz.questionCount} isFirst={false}/>
+                    <UserScore user={userTest} score={10} maxScore={quiz.questionCount} isFirst={true}/>
+                    <UserScore user={userTest} score={10} maxScore={quiz.questionCount} isFirst={false}/>
+                </View>
+                <EndQuizListPlayer users={[userTest, userTest]} maxScore={quiz.questionCount}/>
+
+                {/*<DefaultButton text="RESTART" handleButtonPressed={handleRestartPress} buttonStyle={styles.whiteButton} buttonText={styles.whiteButtonText}></DefaultButton>*/}
+                <DefaultButton text="BACK TO MENU" handleButtonPressed={handleBackToMenu} buttonStyle={styles.blueButton} buttonText={styles.blueButtonText}></DefaultButton>
+            </View>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        height: '100%',
+        width: '100%',
+        display: 'flex',
+        flexDirection: 'column',
+        alignItems: 'center',
+        justifyContent: 'space-around'
+    },
+    usersContainer: {
+        display: 'flex',
+        width: '100%',
+        flexDirection: 'row',
+        alignItems: 'center',
+        justifyContent: 'space-around',
+    },
+    containerHeader: {
+        height: '10%',
+        width: '100%',
+        alignItems: 'center',
+    },
+    containerBody: {
+        height: '80%',
+        width: '90%',
+        display: 'flex',
+        flexDirection: 'column',
+        alignItems: 'center',
+        justifyContent: 'space-around',
+        backgroundColor: '#F3F3F3',
+        borderRadius: 40,
+        padding: '5%',
+        shadowColor: "#000",
+        shadowOffset: {
+            width: 0,
+            height: 2,
+        },
+        shadowOpacity: 0.25,
+        shadowRadius: 3.84,
+        elevation: 5,
+    },
+    TextBodyTitle: {
+        textAlign: 'center',
+        fontSize: 24,
+        fontWeight: 'bold',
+    },
+    TextBody: {
+        textAlign: 'center',
+        fontSize: 22,
+        fontWeight: 'bold',
+    },
+    whiteButton: {
+        height: '12%',
+        width: '80%',
+        backgroundColor: '#FFFFFF',
+        borderColor: '#2B73FE',
+        borderWidth: 4,
+        borderRadius: 10,
+        padding: 0
+    },
+    whiteButtonText: {
+        fontSize: 24,
+        fontWeight: 'bold',
+        color: '#2B73FE',
+    },
+    blueButton: {
+        height: '12%',
+        width: '80%',
+        backgroundColor: '#2B73FE',
+        borderRadius: 10,
+        padding: 0
+    },
+    blueButtonText: {
+        fontSize: 24,
+        fontWeight: 'bold',
+        color: '#FFFFFF',
+    },
+    stars: {
+        resizeMode: "cover",
+    },
+});
\ No newline at end of file
diff --git a/screens/PlayingQuiz/PlayingQuiz.tsx b/screens/PlayingQuiz/PlayingQuiz.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..3f9134b0615578fad97fe7c688691c228204bc3b
--- /dev/null
+++ b/screens/PlayingQuiz/PlayingQuiz.tsx
@@ -0,0 +1,64 @@
+import PlayingQuizHeader from "./PlayingQuizHeader";
+import React, {useEffect, useState} from "react";
+import TemplateDuo from "../../templates/TemplateDuo";
+import {NavigationProp, RouteProp} from "@react-navigation/native";
+import {QuizInformations} from "../../models/QuizInformations";
+import {useQuizService} from "../../services/QuizService";
+import HttpError from "../../services/HttpError";
+import {Question} from "../../models/Question";
+import PlayingQuizBody from "./PlayingQuizBody";
+import { shuffleAnswersOfQuiz } from "../../helper/QuizHelper";
+
+
+type RoutePropsType = {
+    PlayingQuiz: {
+        runId: string;
+        quizId: string;
+    };
+};
+
+interface Props {
+    route: RouteProp<RoutePropsType, "PlayingQuiz">;
+    navigation: NavigationProp<any>;
+}
+
+export default function PlayingQuiz({route, navigation}:Props) {
+    const {runId, quizId} = route.params;
+    const { getQuizInformations, getActualQuestionOfAQuiz } = useQuizService();
+    const [quizInformations, setQuizInformations] = useState<QuizInformations | undefined>(undefined);
+    const [actualQuestion, setActualQuestion] = useState<Question | undefined>(undefined);
+    const [score, setScore] = useState(0);
+
+    const fetchQuizInformations = async () => {
+        const quizInformationsFetched = await getQuizInformations(quizId);
+        if (HttpError.isHttpError(quizInformationsFetched)) {
+            return;
+        }
+               
+        setQuizInformations(quizInformationsFetched);
+    }
+
+    const fetchActualQuestion = async () => {
+        const actualQuestionFetched = await getActualQuestionOfAQuiz(runId);
+        if (HttpError.isHttpError(actualQuestionFetched)) {
+            return;
+        }
+        const actualQuestionFetchedShuffle = shuffleAnswersOfQuiz(actualQuestionFetched);
+        setActualQuestion(actualQuestionFetchedShuffle);
+    }
+
+    useEffect(() => {
+        fetchQuizInformations();
+    }, []);
+
+    useEffect(() => {
+        fetchActualQuestion();
+    }, [quizId]);
+
+    return (
+        <TemplateDuo
+            childrenHeader={<PlayingQuizHeader quizInformations={quizInformations} runId={runId} actualQuestion={actualQuestion} score={score} navigation={navigation}></PlayingQuizHeader>}
+            childrenBody={<PlayingQuizBody score={score} quizInformations={quizInformations} runId={runId} actualQuestion={actualQuestion} fetchActualQuestion={fetchActualQuestion} setScore={setScore} navigation={navigation}></PlayingQuizBody>}
+        />
+    );
+}
\ No newline at end of file
diff --git a/screens/PlayingQuiz/PlayingQuizBody.tsx b/screens/PlayingQuiz/PlayingQuizBody.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..619e3b7c2e91e2879e7c388106b136af79b794c5
--- /dev/null
+++ b/screens/PlayingQuiz/PlayingQuizBody.tsx
@@ -0,0 +1,250 @@
+import {View, StyleSheet, Text, ActivityIndicator, ScrollView} from "react-native";
+import DefaultButton from "../../components/buttons/DefaultButton";
+import { ButtonsStyles } from "../../styles/ButtonsStyles";
+import React, { useState, useEffect, SetStateAction, Dispatch } from "react";
+import { useQuizService } from "../../services/QuizService";
+import {NavigationProp} from "@react-navigation/native";
+import HttpError from "../../services/HttpError";
+import BlueButton from "../../components/buttons/BlueButton";
+import {Question} from "../../models/Question";
+import {Answer} from "../../models/Answer";
+import {Quiz} from "../../models/Quiz";
+import AnswerButton from "../../components/buttons/AnswerButton";
+import {QuizInformations} from "../../models/QuizInformations";
+import AnswerButtonImage from "../../components/buttons/AnswerButtonImage";
+
+interface Props {
+    quizInformations?: QuizInformations;
+    runId?: string;
+    actualQuestion: Question;
+    fetchActualQuestion: () => void;
+    score: number;
+    setScore: (score: number) => void;
+    navigation: NavigationProp<any>;
+}
+
+enum QuizState {
+    ANSWERING= "Answering",
+    LOADING= "Loading",
+    SHOWING_RESULTS= "ShowingResults",
+}
+
+const getStyleOfAnswerButtonText = (answerId: number, selectedAnswerIndex: number | null, correctAnswerId: number | null, quizState: QuizState) => {
+    if(quizState === QuizState.LOADING)
+    {
+        return styles.loadingText;
+    }
+    if(quizState === QuizState.ANSWERING)
+    {
+        return styles.answerText;
+
+    }
+    if(quizState === QuizState.SHOWING_RESULTS)
+    {
+        if(answerId === correctAnswerId) return styles.correctText;
+        if(answerId !== correctAnswerId && selectedAnswerIndex === answerId) return styles.incorrectText;
+    }
+    return styles.answerText;
+}
+
+const getStyleOfAnswerButton = (answerId: number, selectedAnswerIndex: number | null, correctAnswerId: number | null, quizState: QuizState) => {
+    if(quizState === QuizState.LOADING)
+    {
+        return styles.loadingAnswer;
+    }
+    if(quizState === QuizState.ANSWERING)
+    {
+        if(selectedAnswerIndex === null) return styles.answerButton;
+        if(selectedAnswerIndex === answerId) return styles.selectedAnswer;
+
+    }
+    if(quizState === QuizState.SHOWING_RESULTS)
+    {
+        if(answerId === correctAnswerId) return styles.correctAnswer;
+        if(answerId !== correctAnswerId && selectedAnswerIndex === answerId) return styles.incorrectAnswer;
+    }
+    return styles.answerButton;
+}
+
+export default function PlayingQuizBody({ quizInformations, runId, actualQuestion, fetchActualQuestion, score, setScore, navigation }: Props) {
+    const [selectedAnswerId, setSelectedAnswerId] = useState<number | null>(null);
+    const [quizState, setQuizState] = useState(QuizState.ANSWERING);
+    const [correctAnswerId, setCorrectAnswerId] = useState<number | null>(null);
+    const [isLastQuestion, setIsLastQuestion] = useState(false);
+
+    const {answerQuestion} = useQuizService();
+    const getCorrectAnswer = (answers: Answer[]): Answer => {
+        const correctAnswer = answers.find((answer) => answer.isCorrect);
+        if (!correctAnswer) throw new Error("No correct answer found");
+        return correctAnswer;
+    };
+    const onValidation = async () => {
+        if(selectedAnswerId === null) return;
+        setQuizState(QuizState.LOADING);
+        const answerId = actualQuestion.answers.find((answer) => answer.id === selectedAnswerId)?.id;
+        if(!answerId || !runId) return;
+        const answereFetched = await answerQuestion(runId, actualQuestion.id, answerId);
+
+        if (HttpError.isHttpError(answereFetched)) {
+            return;
+        }
+        setScore(answereFetched.score);
+        const correctAnswerIdFetched = getCorrectAnswer(answereFetched.answers.answers).id;
+        setCorrectAnswerId(correctAnswerIdFetched);
+        setQuizState(QuizState.SHOWING_RESULTS);
+
+        if (quizInformations === undefined) return;
+        // Check si c'est la dernière question
+        if(answereFetched.answers.order === quizInformations.questionCount - 1) {
+            setIsLastQuestion(true);
+            return;
+        }
+
+    };
+    const onContinue = () => {
+        if(isLastQuestion) {
+            navigation.reset({
+                index: 0,
+                routes: [
+                    {
+                        name: "EndQuiz",
+                        params: {quizInformations: quizInformations, score: score},
+                    },
+                ]
+            });
+            return;
+        }
+        fetchActualQuestion();
+        setQuizState(QuizState.ANSWERING);
+        setSelectedAnswerId(null);
+        setCorrectAnswerId(null);
+    }
+
+    const onAnsweredButtonClicked = (answerId: number) => {
+        if(quizState === QuizState.SHOWING_RESULTS || quizState === QuizState.LOADING) {
+            return;
+        }
+        setSelectedAnswerId(answerId);
+    }
+
+    return (
+        <View style={styles.buttonContainer}>
+            {actualQuestion ? (
+                <>
+                    <ScrollView 
+                        style={styles.buttonListContainer}
+                        contentContainerStyle={styles.buttonListContentContainer}
+                    >
+                        {actualQuestion.answers.map((answer, index) => (
+                            actualQuestion.type === "image" ? 
+                                <AnswerButtonImage
+                                    key={index}
+                                    url={answer.text}
+                                    handleButtonPressed={() => onAnsweredButtonClicked(answer.id)}
+                                    buttonStyle={getStyleOfAnswerButton(answer.id, selectedAnswerId, correctAnswerId, quizState)}
+                                />
+                            :
+                                <AnswerButton
+                                    key={index}
+                                    text={answer.text}
+                                    handleButtonPressed={() => onAnsweredButtonClicked(answer.id)}
+                                    buttonStyle={getStyleOfAnswerButton(answer.id, selectedAnswerId, correctAnswerId, quizState)}
+                                    buttonText={getStyleOfAnswerButtonText(answer.id, selectedAnswerId, correctAnswerId, quizState)}
+                                />
+                        ))}
+                        {/* </View> */}
+                    </ScrollView>
+                    <View style={styles.playButtonContainer}>
+                        <BlueButton onPress={() => quizState === QuizState.ANSWERING ? onValidation() : onContinue()} text={quizState === QuizState.ANSWERING ? "CONFIRM" : "CONTINUE"} buttonStyle={{borderRadius: 50}} isDisabled={false}/>
+                    </View>
+                </>
+            ) : (
+                <View style={styles.loadingContainer}>
+                    <ActivityIndicator size="large" color="#2b73fe" />
+                    <Text style={styles.loadingText}>Loading...</Text>
+                </View>
+            )}
+        </View>
+    );
+
+}
+
+const styles = StyleSheet.create({
+    buttonContainer: {
+        display: 'flex',
+        flex: 1,
+        alignItems: 'center',
+        justifyContent: 'flex-start',
+        width: '100%',
+        marginVertical: '3%',
+    },
+    loadingContainer: {
+        flex: 1,
+        justifyContent: "center",
+        alignItems: "center",
+    },
+    playButtonContainer: {
+        marginTop: 20, // Ajoute un espacement au-dessus du bouton Play
+        width: '80%', // S'assure que le bouton prend toute la largeur disponible
+        alignItems: 'center', // Centre le bouton horizontalement
+    },
+    correctAnswer: {
+        ...ButtonsStyles.answerButton,
+        borderColor: 'green',
+        borderWidth: 2,
+    },
+    incorrectAnswer: {
+        ...ButtonsStyles.answerButton,
+        borderColor: 'red',
+        borderWidth: 2,
+    },
+    loadingAnswer: {
+        ...ButtonsStyles.answerButton,
+        backgroundColor: '#4F6367',
+        borderWidth: 2,
+    },
+    selectedAnswer: {
+        ...ButtonsStyles.answerButton,
+        borderColor: 'grey',
+        borderWidth: 2,
+    },
+    answerText: {
+        color: 'black',
+        textAlign: 'center',
+    },
+    correctText: {
+        fontWeight: 'bold',
+        color: 'green',
+    },
+    incorrectText: {
+        fontWeight: 'bold',
+        color: 'red',
+    },
+    loadingText: {
+        color: 'black',
+        textAlign: 'center',
+    },
+    answerButton: {
+        backgroundColor: "#F3F3F3",
+        height: '75%',
+        alignItems: 'center',
+        width: '80%',
+        marginVertical: '3%',
+        justifyContent: "center",
+        shadowColor: "#000",
+        shadowOffset: { width: 0, height: 2 },
+        shadowOpacity: 0.25,
+        shadowRadius: 3.5,
+        elevation: 5,
+    },
+    buttonListContainer: {
+        maxHeight: '80%',
+        width: '100%',
+    },
+    buttonListContentContainer: {
+        display: 'flex',
+        justifyContent: 'flex-start',
+        alignItems: 'center'
+    }
+});
+
diff --git a/screens/PlayingQuiz/PlayingQuizHeader.tsx b/screens/PlayingQuiz/PlayingQuizHeader.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..c03c6d08648ab9def1de43428bfb1d4a41d6605b
--- /dev/null
+++ b/screens/PlayingQuiz/PlayingQuizHeader.tsx
@@ -0,0 +1,97 @@
+import { View, StyleSheet, Text } from "react-native";
+import { TextsStyles } from "../../styles/TextsStyles";
+import  {Quiz} from "../../models/Quiz";
+import {useTranslation} from "react-i18next";
+import DefaultButton from "../../components/buttons/DefaultButton";
+import GoHomeButton from "../../components/PlayingQuiz/GoHomeButton";
+import {NavigationProp} from "@react-navigation/native";
+import ConfirmModal from "../../components/PlayingQuiz/ComfirmModal";
+import {useState} from "react";
+import {QuizInformations} from "../../models/QuizInformations";
+import {Question} from "../../models/Question";
+
+interface Props {
+    quizInformations?: QuizInformations;
+    runId?: string;
+    actualQuestion?: Question;
+    score: number;
+    navigation: NavigationProp<any>
+}
+
+export default function PlayingQuizHeader({quizInformations, runId, actualQuestion, score, navigation}: Props) {
+    const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false);
+    const {t} = useTranslation();
+
+    const handleConfirmModalConfirm = () => {
+        navigation.reset({
+            index: 0,
+            routes: [
+                {
+                    name: "TabNavigator",
+                },
+            ]
+        });
+    }
+
+    return (
+            <View style={styles.container}>
+                <View style={styles.header}>
+                    <GoHomeButton navigation={navigation} onPress={setIsConfirmModalVisible}/>
+                    <Text style={styles.codeQuizText}>ID QUIZZ : {runId}</Text>
+                </View>
+                <View style={styles.questionAndScoreContainer}>
+                    <View style={styles.InformationsContainer}>
+                        <Text style={TextsStyles.titleText}>{t("app.screens.question.question")}</Text>
+                        <Text style={TextsStyles.titleText}>{actualQuestion ? actualQuestion.order + 1 :"?"}/{quizInformations ? quizInformations.questionCount : "?"}</Text>
+                    </View>
+                    <View style={styles.InformationsContainer}>
+                        <Text style={TextsStyles.titleText}>{t("app.screens.question.score")}</Text>
+                        <Text style={TextsStyles.titleText}>{score}/{quizInformations ? quizInformations.questionCount : "?"}</Text>
+                    </View>
+                </View>
+                <View style={styles.QuizQuestionContainer}>
+                    <Text style={TextsStyles.subtitleText}>{actualQuestion ? actualQuestion.text : "Loading..."}</Text>
+                </View>
+                <ConfirmModal visible={isConfirmModalVisible} onClose={()=>setIsConfirmModalVisible(false)} onConfirm={handleConfirmModalConfirm}/>
+
+            </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        marginHorizontal: '5%',
+    },
+    questionAndScoreContainer: {
+        display: 'flex',
+        flexDirection: 'row',
+        justifyContent: 'space-around',
+        alignItems: 'center',
+        marginVertical: '2%',
+    },
+    InformationsContainer: {
+        display: 'flex',
+        flexDirection: 'column',
+        justifyContent: 'center',
+        alignItems: 'center',
+        gap: '5%',
+    },
+    QuizNumContainer: {
+    },
+    QuizQuestionContainer: {
+        marginVertical: "2.5%",
+    },    
+    infoQuizContainer: {
+        marginBottom: '5%',
+    },
+    codeQuizText: {
+        fontSize: 18,
+        color: '#000000',
+    },
+    header: {
+        display: "flex",
+        flexDirection: "row",
+        justifyContent: "flex-start",
+        gap: '5%',
+    }
+});
\ No newline at end of file
diff --git a/screens/Profil/Connection/Connection.tsx b/screens/Profil/Connection/Connection.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..34e5023ac2687f3f774f2b6cff98ed649c212375
--- /dev/null
+++ b/screens/Profil/Connection/Connection.tsx
@@ -0,0 +1,72 @@
+import {Keyboard, StyleSheet, Text, TouchableOpacity, TouchableWithoutFeedback, View} from "react-native";
+import ProfilSelectMode from "../ProfilSelectMode";
+import React, {useState} from "react";
+import {ProfilSelectModeType} from "../../../models/SelectModeType";
+import {NavigationProp} from "@react-navigation/native";
+import ConnectionLogin from "./ConnectionLogin";
+import ConnectionSignup from "./ConnectionSignup";
+
+interface Props {
+    title: string;
+    navigation: NavigationProp<any>;
+}
+
+export default function Connection({title, navigation}: Props) {
+    const [mode, setMode] = useState<ProfilSelectModeType>("login");
+
+    return (
+        <TouchableWithoutFeedback onPress={Keyboard.dismiss}>
+            <View style={styles.container}>
+                <Text style={styles.title}>{title}</Text>
+                <View style={styles.containerModal}>
+                    <ProfilSelectMode mode={mode} setMode={setMode} />
+                    {mode === "login" ? (
+                        <ConnectionLogin navigation={navigation} />
+                    ) : (
+                        <ConnectionSignup navigation={navigation} />
+                    )}
+                </View>
+            </View>
+        </TouchableWithoutFeedback>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        flex: 1,
+        justifyContent: "center",
+        alignItems: "center",
+        height: "100%",
+        width: "100%",
+    },
+    title: {
+        fontSize: 40,
+        fontWeight: "bold",
+        color: "#00b3f4",
+        marginBottom: 10,
+        alignSelf: "center", // Centre uniquement le titre
+    },
+    backgroundShadow: {
+        height: "100%",
+        width: "100%",
+        backgroundColor: "#000000",
+        opacity: 0.55,
+        position: "absolute",
+    },
+    containerModal: {
+        height: 600,
+        width: "90%",
+        backgroundColor: "#D9D9D9",
+        borderRadius: 40,
+        padding: '7%',
+    },
+    closeButton: {
+        position: "absolute",
+        top: '1%',
+        right: '1%',
+        zIndex: 1,
+        backgroundColor: "white",
+        borderRadius: 10,
+        margin: '5%',
+    },
+});
\ No newline at end of file
diff --git a/screens/Profil/Connection/ConnectionLogin.tsx b/screens/Profil/Connection/ConnectionLogin.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..0dcd82493f9d1224c74afc5da444637a4f69ae1e
--- /dev/null
+++ b/screens/Profil/Connection/ConnectionLogin.tsx
@@ -0,0 +1,84 @@
+import { TextInput, View, StyleSheet, Text } from "react-native";
+import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz";
+import React, { useState } from "react";
+import {useUserService} from "../../../services/UserService";
+import HttpError from "../../../services/HttpError";
+import {NavigationProp} from "@react-navigation/native";
+import BlueButton from "../../../components/buttons/BlueButton";
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+export default function ConnectionLogin({navigation}: Props) {
+    const [email, setEmail] = useState("");
+    const [password, setPassword] = useState("");
+    const [error, setError] = useState<string | null>(null);
+    const { loginUser } = useUserService();
+
+    const handleSubmitPressed = async () => {
+        if (email === "" || password === "") {
+            setError("Please fill in all fields");
+            return;
+        }
+        const login = await loginUser(email, password);
+        if(login instanceof HttpError){
+            setError(login.message);
+            return;
+        }
+        setError(null);
+        navigation.reset({
+            routes: [{name: "TabNavigator"}],
+        });
+    };
+
+    return (
+        <View style={styles.container}>
+            {error && <Text style={styles.errorText}>{error}</Text>}
+            <View style={styles.containerForm}>
+                <InputPlayQuiz placeholder="EMAIL..." setText={setEmail} noTitle={true} />
+                <InputPlayQuiz placeholder="PASSWORD..." setText={setPassword} noTitle={true} isSecure={true}/>
+            </View>
+            <BlueButton text="LOGIN" onPress={handleSubmitPressed} buttonStyle={styles.SubmitButton} isDisabled={false}/>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerForm: {
+        height: 'auto',
+        width: '100%',
+        display: 'flex',
+        flexDirection: 'column',
+        justifyContent: 'flex-start',
+        rowGap: '7%',
+        marginTop: "3%",
+        marginBottom: "auto", // Espacement entre le texte d'erreur et les inputs
+    },
+    container:{
+        height: 475,
+        paddingTop: '5%',
+        display: 'flex',
+        justifyContent: 'space-between'
+    },
+    textInput: {
+        height: '20%',
+        width: '100%',
+        backgroundColor: '#FFFFFF',
+        borderWidth: 4,
+        borderColor: '#1fa9ff',
+        borderRadius: 10,
+        color: '#DFDFDF',
+        fontWeight: 'bold',
+    },
+    SubmitButton: {
+        height: '15%',
+        width: '100%',
+        backgroundColor: '#2b73fe',
+        borderRadius: 10,
+    },
+    errorText: {
+        color: 'red',
+        fontSize: 16,
+        textAlign: 'center', // Centrer le message d'erreur
+    },
+});
diff --git a/screens/Profil/Connection/ConnectionSignup.tsx b/screens/Profil/Connection/ConnectionSignup.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..542012f28b24c0760ce4579e6c79f961dd0c06b1
--- /dev/null
+++ b/screens/Profil/Connection/ConnectionSignup.tsx
@@ -0,0 +1,103 @@
+import {TextInput, View, StyleSheet, Text} from "react-native";
+import DefaultButton from "../../../components/buttons/DefaultButton";
+import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz";
+import React, {useState} from "react";
+import {useUserService} from "../../../services/UserService";
+import HttpError from "../../../services/HttpError";
+import {NavigationProp} from "@react-navigation/native";
+import BlueButton from "../../../components/buttons/BlueButton";
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+export default function ConnectionSignup({navigation}: Props) {
+
+    const [email, setEmail] = useState("");
+    const [username, setUsername] = useState("");
+    const [password, setPassword] = useState("");
+    const [repeatPassword, setRepeatPassword] = useState("");
+    const [error, setError] = useState<string | null>(null);
+    const { registerUser } = useUserService();
+
+    const handleSubmitPressed = async () => {
+        if (email === "" || username === "" || password === "" || repeatPassword === "") {
+            setError("Please fill in all fields");
+            return;
+        }
+        if(password.length < 8){
+            setError("Password must be at least 8 characters long");
+            return;
+        }
+        if(password !== repeatPassword){
+            setError("Passwords do not match");
+            return;
+        }
+        const register = await registerUser(username, password, email);
+        if(register instanceof HttpError){
+            setError(register.message);
+            return;
+        }
+        setError(null);
+        navigation.reset({
+            routes: [{name: "TabNavigator"}],
+        });
+    }
+
+    return (
+        <View style={styles.container}>
+            {error && <Text style={styles.errorText}>{error}</Text>}
+            <View style={styles.containerForm}>
+                <InputPlayQuiz placeholder="USERNAME..." setText={setUsername} noTitle={true}/>
+                <InputPlayQuiz placeholder="EMAIL..." setText={setEmail} noTitle={true}/>
+                <InputPlayQuiz placeholder="PASSWORD..." setText={setPassword} noTitle={true} isSecure={true}/>
+                <InputPlayQuiz placeholder="REPEAT PASSWORD..." setText={setRepeatPassword} noTitle={true} isSecure={true}/>
+            </View>
+            <BlueButton text="SIGNUP" onPress={handleSubmitPressed} buttonStyle={styles.SubmitButton} isDisabled={false}/>
+        </View>
+    )
+}
+
+const styles = StyleSheet.create({
+    containerForm: {
+        height: 'auto',
+        width: '100%',
+        display: 'flex',
+        flexDirection: 'column',
+        justifyContent: 'flex-start',
+        rowGap: '5%',
+        marginTop: "3%",
+    },
+    container:{
+        height: 475,
+        paddingTop: '5%',
+        display: 'flex',
+        justifyContent: 'space-between'
+    },
+    textInput: {
+        height: '20%',
+        width: '100%',
+        backgroundColor: '#FFFFFF',
+        borderWidth: 4,
+        borderColor: '#1fa9ff',
+        borderRadius: 10,
+        color: '#DFDFDF',
+        fontWeight: 'bold'
+    },
+    SubmitButton: {
+        height: '15%',
+        width: '100%',
+        backgroundColor: '#2b73fe',
+        borderRadius: 10,
+    },
+    SubmitText: {
+        fontSize: 20,
+        fontWeight: 'bold',
+        color: '#FFFFFF',
+    },
+    errorText: {
+        color: 'red',
+        fontSize: 16,
+        marginBottom: 10, // Espacement entre le texte d'erreur et les inputs
+        textAlign: 'center', // Centrer le message d'erreur
+    },
+});
\ No newline at end of file
diff --git a/screens/Profil/Profil.tsx b/screens/Profil/Profil.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..87201d9a3f7e9a710d405cf8142fa7d8215a7385
--- /dev/null
+++ b/screens/Profil/Profil.tsx
@@ -0,0 +1,29 @@
+import { View, StyleSheet } from "react-native";
+import TemplateMenu from "../../templates/TemplateMenu";
+import { NavigationProp } from "@react-navigation/native";
+import ProfilChild from "./ProfilChild";
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+
+export default function Profil({navigation}: Props) {
+    return (
+        <View style={styles.containerGlobal}>
+                <TemplateMenu navigation={navigation} headerNavigation={false} buttonGoBack>
+                    <View>
+                        <ProfilChild navigation={navigation}/>
+                    </View>
+                </TemplateMenu>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+        flexDirection: 'column',
+    },
+});
\ No newline at end of file
diff --git a/screens/Profil/ProfilChild.tsx b/screens/Profil/ProfilChild.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..bb601bf40937aeb53835e4b2c7bbff197d431d68
--- /dev/null
+++ b/screens/Profil/ProfilChild.tsx
@@ -0,0 +1,138 @@
+import { NavigationProp } from "@react-navigation/native";
+import { View, StyleSheet, Image, Text, TouchableOpacity } from "react-native";
+import React, { useEffect, useState } from "react";
+import { ProfilSelectModeType } from "../../models/SelectModeType";
+import { useUserService } from "../../services/UserService";
+import HttpError from "../../services/HttpError";
+import Icon from "react-native-vector-icons/MaterialIcons";
+import {User, UserConnectionState} from "../../models/User";
+import StatsOfUsers from "../../components/Profil/StatsOfUsers";
+import LoadingIndicator from "../../components/loading/LoadingIndicator";
+import Connection from "./Connection/Connection";
+
+interface Props {
+    navigation: NavigationProp<any>;
+}
+
+
+
+export default function ProfilChild({ navigation }: Props) {
+    const [isLogged, setIsLogged] = useState(false);
+    const [modalVisible, setModalVisible] = useState(false);
+    const [mode, setMode] = useState<ProfilSelectModeType>("login");
+    const [user, setUser] = useState<User | undefined>(undefined);
+    const [userConnectionState, setUserConnectionState] = useState(UserConnectionState.LOADING);
+    const { getInformationsUser, logoutUser } = useUserService();
+
+
+    const getUser = async () => {
+        setUserConnectionState(UserConnectionState.LOADING);
+        const user = await getInformationsUser();
+        if(user instanceof HttpError){
+            setUser(undefined);
+            setUserConnectionState(UserConnectionState.NOT_CONNECTED);
+            return;
+        }
+        setUserConnectionState(UserConnectionState.CONNECTED);
+        setUser(user);
+    }
+
+    useEffect(() => {
+        getUser();
+    }, []);
+
+    // Pour s'adapter quand l'état de connexion change
+    useEffect(() => {
+        getUser();
+    }, [isLogged]);
+
+    const handleLogout = async () => {
+        const result = await logoutUser();
+        if (!(result instanceof HttpError)) {
+            setUser(undefined); // Réinitialise l'utilisateur après la déconnexion
+        }
+        navigation.reset({
+            routes: [{name: "TabNavigator"}],
+        });
+    };
+
+    return (
+        <View style={styles.containerGlobal}>
+            {userConnectionState === UserConnectionState.LOADING && (
+                <LoadingIndicator/>
+            )}
+            {userConnectionState === UserConnectionState.CONNECTED && (
+                <>
+            <View style={styles.containerPlayerInfos}>
+                <Image source={require('../../assets/TitleApp.png')} style={styles.titleImage} />
+                <Image source={require('../../assets/ProfilBaseImage.png')} style={styles.profilImage} />
+                <Text style={styles.pseudoText}>{user ? user.username : "?"}</Text>
+            </View>
+            <StatsOfUsers user={user}/>
+            <TouchableOpacity style={styles.logoutButton} onPress={handleLogout}>
+                <Icon name="logout" size={40} color="#FF0000" />
+            </TouchableOpacity>
+            </>
+        )}
+            {userConnectionState === UserConnectionState.NOT_CONNECTED && (
+                <Connection title={"Profil"} navigation={navigation}  />
+                )}
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: "flex",
+        width: "100%",
+        height: "100%",
+        justifyContent: "flex-start",
+        alignItems: "center",
+    },
+    containerPlayerInfos: {
+        width: "100%",
+        display: "flex",
+        alignItems: "center",
+    },
+    title: {
+        fontSize: 40,
+        fontWeight: "bold",
+        color: "#00b3f4",
+        marginBottom: 10,
+        alignSelf: "center", // Centre uniquement le titre
+    },
+    titleImage: {
+        width: "45%",
+        resizeMode: "contain",
+    },
+    profilImage: {
+        width: "45%",
+        aspectRatio: 1,
+    },
+    pseudoText: {
+        fontSize: 35,
+        fontWeight: "bold",
+        color: "#00B3F4",
+    },
+    containerPlayerStats: {
+        width: "100%",
+        padding: "5%",
+    },
+    statsText: {
+        fontSize: 17,
+        fontWeight: "bold",
+    },
+    logoutButton: {
+        position: "absolute",
+        bottom: 20,
+        right: 20,
+        backgroundColor: "#FFF",
+        borderRadius: 50,
+        padding: 10,
+        elevation: 5, // Ombre pour Android
+        shadowColor: "#000", // Ombre pour iOS
+        shadowOffset: { width: 0, height: 2 },
+        shadowOpacity: 0.2,
+        shadowRadius: 2,
+    },
+});
diff --git a/screens/Profil/ProfilSelectMode.tsx b/screens/Profil/ProfilSelectMode.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..0abae694d28da789c7a72b5196adebe7a4743f66
--- /dev/null
+++ b/screens/Profil/ProfilSelectMode.tsx
@@ -0,0 +1,74 @@
+import { View, Text, StyleSheet, TouchableOpacity } from "react-native";
+import { ProfilSelectModeType } from "../../models/SelectModeType";
+
+interface Props {
+    mode: ProfilSelectModeType;
+    setMode: (mode: ProfilSelectModeType) => void;
+}
+
+export default function ProfilSelectMode({ mode, setMode }: Props) {
+    return (
+        <View style={styles.container}>
+            <View style={styles.buttonContainer}>
+                <TouchableOpacity onPress={() => setMode("login")} style={{marginLeft: '10%'}}>
+                    <Text style={[styles.text, mode === "login" && styles.activeText]}>LOGIN</Text>
+                </TouchableOpacity>
+                <View style={[styles.bar, mode === "login" ? styles.activeBar : styles.inactiveBar]} />
+            </View>
+
+            <View style={styles.buttonContainer}>
+                <TouchableOpacity onPress={() => setMode("signup")} style={{marginRight: '10%'}}>
+                    <Text style={[styles.text, mode === "signup" && styles.activeText]}>SIGNUP</Text>
+                </TouchableOpacity>
+                <View style={[styles.bar, mode === "signup" ? styles.activeBar : styles.inactiveBar]} />
+            </View>
+
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    container: {
+        display: 'flex',
+        width: '100%',
+        height: '15%',
+        flexDirection: 'row',
+        backgroundColor: '#f3f3f3',
+        borderRadius: 10,
+        justifyContent: 'space-around',
+        alignItems: 'center',
+        // Ombre pour Android
+        elevation: 5,
+        // Ombre pour iOS
+        shadowColor: '#000',
+        shadowOffset: { width: 0, height: 4 }, // Décalage de l'ombre en bas
+        shadowOpacity: 0.25, // Opacité de l'ombre
+        shadowRadius: 3.84, // Flou de l'ombre
+    },
+    buttonContainer: {
+        display: 'flex',
+        flexDirection: 'column',
+        width: '40%',
+        alignItems: 'center',
+        gap: "5%",
+    },
+    text: {
+        fontSize: 25,
+        color: '#bebebe',
+    },
+    activeText: {
+        color: '#2b73fe',
+    },
+    bar: {
+        width: '100%',
+        height: '4%',
+        marginTop: '4%',
+        borderRadius: 10,
+    },
+    activeBar: {
+        backgroundColor: '#2b73fe', // Couleur pour le bouton actif
+    },
+    inactiveBar: {
+        backgroundColor: '#bebebe', // Couleur grise pour les boutons inactifs
+    },
+});
diff --git a/screens/Question/Question.tsx b/screens/Question/Question.tsx
deleted file mode 100644
index 17653978e0fe54530f5b2b64a9443f4de698b6eb..0000000000000000000000000000000000000000
--- a/screens/Question/Question.tsx
+++ /dev/null
@@ -1,116 +0,0 @@
-import TemplateScreen from "../../templates/TemplateScreen";
-import QuestionBody from "./QuestionBody";
-import QuestionHeader from "./QuestionHeader";
-import {useEffect, useState} from "react";
-import {transformToQuizModel} from "../../helper/QuizHelper";
-import QuizModel from "../../model/QuizModel";
-
-const optionsTheme = [
-    "General Knowledge",
-    "Entertainment: Books",
-    "Entertainment: Film",
-    "Entertainment: Music",
-    "Entertainment: Musicals & Theatres",
-    "Entertainment: Television",
-    "Entertainment: Video Games",
-    "Entertainment: Board Games",
-    "Science & Nature",
-    "Science: Computers",
-    "Science: Mathematics",
-    "Mythology",
-    "Sports",
-    "Geography"]
-
-interface Props {
-    route: any;
-    navigation: any;
-}
-
-export default function Question({route, navigation}:Props) {
-    const getIdOfCategory = (category: string) => {
-        for (let i = 0; i < optionsTheme.length; i++) {
-            if (optionsTheme[i] === category) {
-                return i+9;
-            }
-        }
-    }
-
-    const [isAlreadyPlayed, setIsAlreadyPlayed] = useState(false);
-    const [quiz, setQuiz] = useState<QuizModel>();
-    const nbQuestions = "10";
-    const difficulty = "easy";
-    const theme = "General Knowledge";
-
-    const {
-        nbQuestionParam = "10",
-        difficultyParam = "easy",
-        themeParam = "General Knowledge",
-        quiz: quizFromParams, // Quiz passé via la navigation
-    } = route.params || {};
-    const nbQuestionsToDisplay = nbQuestionParam ? nbQuestionParam : nbQuestions;
-    const difficultyToDisplay = difficultyParam ? difficultyParam : difficulty;
-    const themeToDisplay = themeParam ? getIdOfCategory(themeParam) : getIdOfCategory(theme);
-
-
-
-
-    const fetchQuestion = async () => {
-        try {
-            const response = await fetch(`https://opentdb.com/api.php?amount=${nbQuestionsToDisplay}&difficulty=${difficultyToDisplay}&category=${themeToDisplay}`);
-            const data = await response.json();
-            const quiz = transformToQuizModel(data);
-            setQuiz(quiz);
-        } catch (error) {
-            console.error(error);
-        }
-    };
-
-    useEffect(() => {
-        if (quizFromParams) {
-            setTimeout(() => {
-                setQuiz(quizFromParams);
-            }, 0);
-        } else {
-            fetchQuestion();
-        }
-    }, [quizFromParams]);
-
-
-    const handleAnswer = async (selectedAnswerIndex: number) => {
-        if (!quiz) return;
-
-        const currentQuestion = quiz.questions[quiz.nbActualQuestion-1];
-        const correctAnswer = currentQuestion.correctAnswer;
-        const selectedAnswer = currentQuestion.answer[selectedAnswerIndex];
-
-        // Vérifier si la réponse est correcte
-        if (selectedAnswer === correctAnswer) {
-            setQuiz((prevQuiz) => {
-                if (prevQuiz) {
-                    return { ...prevQuiz, score: prevQuiz.score + 1 };
-                }
-                return prevQuiz;
-            });
-        }
-
-        // Attendre 2 secondes avant de passer à la question suivante
-        await new Promise((resolve) => setTimeout(resolve, 2000));
-
-        // Passer à la question suivante
-        setQuiz((prevQuiz) => {
-            if (prevQuiz && prevQuiz.nbActualQuestion < prevQuiz.nbQuestions) {
-                setIsAlreadyPlayed(false);
-                return { ...prevQuiz, nbActualQuestion: prevQuiz.nbActualQuestion + 1 };
-            }
-            navigation.navigate("FinQuiz", { score: prevQuiz?.score, quiz: quiz });
-            return prevQuiz; // Fin du quiz si toutes les questions ont été posées
-        });
-    };
-
-    return (
-        <TemplateScreen
-            childrenTop={<QuestionHeader quiz={quiz} ></QuestionHeader>}
-            childrenBot={<QuestionBody quiz={quiz} onAnswerSelected={handleAnswer} isAlreadyPlayed={isAlreadyPlayed} setIsAlreadyPlayed={setIsAlreadyPlayed}></QuestionBody>}
-        />
-    );
-}
\ No newline at end of file
diff --git a/screens/Question/QuestionBody.tsx b/screens/Question/QuestionBody.tsx
deleted file mode 100644
index 26c3c2fac526e23ba7d2fedd65646a965c80cf35..0000000000000000000000000000000000000000
--- a/screens/Question/QuestionBody.tsx
+++ /dev/null
@@ -1,109 +0,0 @@
-import { View, StyleSheet } from "react-native";
-import DefaultButton from "../../components/DefaultButton";
-import { ButtonsStyles } from "../../styles/ButtonsStyles";
-import { TextsStyles } from "../../styles/TextsStyles";
-import QuizModel from "../../model/QuizModel";
-import { useState, useEffect } from "react";
-import { setEnabled } from "react-native/Libraries/Performance/Systrace";
-
-interface Props {
-    quiz?: QuizModel;
-    onAnswerSelected: (index: number) => void;
-    isAlreadyPlayed: boolean;
-    setIsAlreadyPlayed: (isAlreadyPlayed: boolean) => void;
-}
-
-export default function QuestionBody({ quiz, onAnswerSelected, isAlreadyPlayed, setIsAlreadyPlayed }: Props) {
-    const [selectedAnswerIndex, setSelectedAnswerIndex] = useState<number | null>(null);
-    const [isCorrect, setIsCorrect] = useState<boolean | null>(null);
-
-    useEffect(() => {
-        if (quiz) {
-            setSelectedAnswerIndex(null);
-            setIsCorrect(null);
-        }
-    }, [quiz?.nbActualQuestion]);
-
-    if (!quiz) return null;
-
-    const currentQuestion = quiz.questions[quiz.nbActualQuestion - 1];
-
-    const handleAnswerPress = (index: number) => {
-        if (!isAlreadyPlayed) {
-            const isAnswerCorrect = currentQuestion.correctAnswer === currentQuestion.answer[index];
-            setSelectedAnswerIndex(index);
-            setIsCorrect(isAnswerCorrect);
-
-            onAnswerSelected(index);
-
-            setIsAlreadyPlayed(true);
-        }
-    };
-
-    const getButtonStyle = (index: number) => {
-        if (selectedAnswerIndex === null) return ButtonsStyles.answerButton;
-
-        if (index === selectedAnswerIndex) {
-            return isCorrect ? styles.correctAnswer : styles.incorrectAnswer;
-        }
-        if (currentQuestion.correctAnswer === currentQuestion.answer[index]) {
-            return styles.correctAnswer;
-        }
-        return ButtonsStyles.answerButton;
-    };
-
-    const getTextStyle = (index: number) => {
-        if (selectedAnswerIndex === null) return TextsStyles.defaultText;
-
-        if (index === selectedAnswerIndex) {
-            return isCorrect ? styles.correctText : styles.incorrectText;
-        }
-        if (currentQuestion.correctAnswer === currentQuestion.answer[index]) {
-            return styles.correctText;
-        }
-        return TextsStyles.defaultText;
-    };
-
-    return (
-        <View style={styles.buttonContainer}>
-            {currentQuestion.answer.map((answer, index) => (
-                <DefaultButton
-                    key={index}
-                    text={answer}
-                    handleButtonPressed={() => handleAnswerPress(index)}
-                    buttonStyle={getButtonStyle(index)}
-                    buttonText={getTextStyle(index)} // Applique le style de texte dynamique
-                />
-            ))}
-        </View>
-    );
-}
-
-const styles = StyleSheet.create({
-    buttonContainer: {
-        display: 'flex',
-        flex: 1,
-        alignItems: 'center',
-        justifyContent: 'flex-start',
-        width: '100%',
-        marginVertical: '10%',
-    },
-    correctAnswer: {
-        ...ButtonsStyles.answerButton,
-        borderColor: 'green',
-        borderWidth: 2,
-    },
-    incorrectAnswer: {
-        ...ButtonsStyles.answerButton,
-        borderColor: 'red',
-        borderWidth: 2,
-    },
-    correctText: {
-        fontWeight: 'bold',
-        color: 'green',
-    },
-    incorrectText: {
-        fontWeight: 'bold',
-        color: 'red',
-    },
-});
diff --git a/screens/Question/QuestionHeader.tsx b/screens/Question/QuestionHeader.tsx
deleted file mode 100644
index a06798d4e456a00acce6b622eb2b856fcfdd88f3..0000000000000000000000000000000000000000
--- a/screens/Question/QuestionHeader.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { View, StyleSheet, Text } from "react-native";
-import { TextsStyles } from "../../styles/TextsStyles";
-import QuizModel from "../../model/QuizModel";
-
-interface Props {
-    quiz?: QuizModel;
-}
-
-export default function QuestionHeader({quiz}: Props) {
-    return (
-            <View style={styles.container}>
-                <View style={styles.infoQuizContainer}>
-                    <Text style={TextsStyles.infoQuizText}>SCORE : {quiz ? quiz.score : 0}</Text>
-                    <Text style={TextsStyles.infoQuizText}>CATEGORY : {quiz ? quiz.category : "?"}</Text>
-                </View>
-                <View style={styles.QuizNumContainer}>
-                    <Text style={TextsStyles.titleText}>QUESTION {quiz ? quiz.nbActualQuestion : "?"}/{quiz ? quiz.nbQuestions : "?"}</Text>
-                </View>
-                <View style={styles.QuizQuestionContainer}>
-                    <Text style={TextsStyles.subtitleText}>{quiz ? quiz.questions[quiz.nbActualQuestion - 1].question : "Loading..."}</Text>
-                </View>
-            </View>
-    );
-}
-
-const styles = StyleSheet.create({
-    container: {
-        marginVertical: "10%",
-        marginHorizontal: "5%",
-    },
-    QuizNumContainer: {
-        marginVertical: "2.5%",
-    },
-    QuizQuestionContainer: {
-        marginVertical: "2.5%",
-    },    
-    infoQuizContainer: {
-        marginBottom: '5%',
-    },
-});
\ No newline at end of file
diff --git a/services/HttpError.ts b/services/HttpError.ts
new file mode 100644
index 0000000000000000000000000000000000000000..82fd80fe26237035f4aefcdf35e5ae2033de997c
--- /dev/null
+++ b/services/HttpError.ts
@@ -0,0 +1,14 @@
+export default class HttpError extends Error {
+    statusCode: number;
+
+    constructor(statusCode: number, message: string) {
+        super(message); // Appelle le constructeur de Error
+        this.statusCode = statusCode;
+        this.name = "HttpError"; // Nom de l'erreur
+    }
+
+    // Méthode pour vérifier si une erreur est un HttpError
+    static isHttpError(error: unknown): error is HttpError {
+        return error instanceof HttpError;
+    }
+}
diff --git a/services/MultiService.ts b/services/MultiService.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f0de634c0a7254082968608c5a25bfe4fa12f067
--- /dev/null
+++ b/services/MultiService.ts
@@ -0,0 +1,36 @@
+import axios from "axios";
+import {QuestionResponse} from "../models/Response/QuestionResponse";
+import HttpError from "./HttpError";
+
+export const useMultiService = () => {
+    const url = "https://klebert-host.com:33037"
+
+    const createParty = async (quizId: string) : Promise<string | HttpError> => {
+        console.log("Create party with ID :", quizId);
+        console.log(url+"/party");
+        const requestBody = {
+            quizId: quizId,
+        };
+
+        try {
+            const response = await axios.post(`${url}/party`, requestBody, {
+                withCredentials: true,
+            });
+            console.log("Response data:", response.data.id);
+            return response.data.id;
+        } catch (error: any) {
+            console.log("Error while create party:", error);
+
+            if (error.response) {
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    }
+
+    return {
+        createParty: createParty,
+    }
+
+}
\ No newline at end of file
diff --git a/services/QuizService.ts b/services/QuizService.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f742340858a31006ceb2f82de8d951c8f8dc4b20
--- /dev/null
+++ b/services/QuizService.ts
@@ -0,0 +1,346 @@
+import HttpError from "./HttpError";
+import {QuizCommunityResponse} from "../models/Quiz";
+import axios from "axios";
+import {Answer} from "../models/Answer";
+import {Question} from "../models/Question";
+import {AnswerResponse} from "../models/Response/AnswerResponse";
+import {QuizInformations} from "../models/QuizInformations";
+import {QuestionResponse} from "../models/Response/QuestionResponse";
+import {QuizGenerateAnswer} from "../models/QuizGenerateAnswer";
+import {RunInformations} from "../models/RunInformations";
+import {AllRunsResponse} from "../models/Response/AllRunsResponse";
+
+export const useQuizService =  () => {
+    const url = "https://klebert-host.com:33037"; // Remplace par l'URL de ton endpoint API
+
+    const generateQuiz = async (amount: number, category: number, difficulty: string) : Promise<QuizGenerateAnswer | HttpError> => {
+        const requestBody = {
+            amount,
+            category,
+            difficulty: difficulty.toLowerCase(),
+        };
+
+        try {
+            const response = await axios.post<QuizGenerateAnswer>(`${url}/quiz/generate`, requestBody, {
+                headers: {
+                    "Content-Type": "application/json",
+                },
+            });
+            const runId =  response.data.id;
+            return {id: runId, quizId: response.data.quizId};
+        } catch (error: any) {
+            console.log("Error while generating quiz:", error);
+
+            if (error.response) {
+                // Gestion des erreurs HTTP
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                // Gestion des erreurs réseau ou autres
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    }
+
+    const getActualQuestionOfAQuiz = async (quizId: string): Promise<Question | HttpError> => {
+        const requestBody = {
+            id: quizId,
+        };
+
+        try {
+            const response = await axios.post<QuestionResponse>(`${url}/run/question`, requestBody, {
+                headers: {
+                    "Content-Type": "application/json",
+                },
+            });
+
+            return response.data.question;
+        } catch (error: any) {
+            console.log("Error while remaining quiz:", error);
+
+            if (error.response) {
+                // Gestion des erreurs HTTP
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                // Gestion des erreurs réseau ou autres
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    }
+
+    const getQuizInformations = async (quizId: string): Promise<QuizInformations | HttpError> => {
+
+        try {
+            const response = await axios.get<QuizInformations>(`${url}/quiz/info/`+quizId, {
+                headers: {
+                    "Content-Type": "application/json",
+                },
+            });
+            return response.data;
+        } catch (error: any) {
+            console.log("Error while getQuizInformations quiz:", error);
+
+            if (error.response) {
+                // Gestion des erreurs HTTP
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                // Gestion des erreurs réseau ou autres
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    }
+
+    const answerQuestion = async (quizId: string, questionId: number, answerId: number): Promise<AnswerResponse | HttpError> => {
+        const requestBody = {
+            id: quizId,
+            questionID: questionId,
+            answerID: answerId,
+        };
+
+        try {
+            const response = await axios.post<AnswerResponse>(`${url}/run/answer`, requestBody, {
+                headers: {
+                    "Content-Type": "application/json",
+                },
+            });
+
+            return response.data;
+        } catch (error: any) {
+            console.log("Error while remaining quiz:", error);
+
+            if (error.response) {
+                // Gestion des erreurs HTTP
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                // Gestion des erreurs réseau ou autres
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    };
+
+    // const remainingQuiz = async (id: string): Promise<Quiz | HttpError> => {
+    //     const requestBody = {
+    //         id,
+    //     };
+    //
+    //     try {
+    //         const response = await axios.post<Quiz>(`${url}/quiz/remaining`, requestBody, {
+    //             headers: {
+    //                 "Content-Type": "application/json",
+    //             },
+    //         });
+    //
+    //         // Récupération des données retournées par l'API
+    //         return shuffleAnswersOfQuiz(response.data);
+    //     } catch (error: any) {
+    //         console.log("Error while remaining quiz:", error);
+    //
+    //         if (error.response) {
+    //             // Gestion des erreurs HTTP
+    //             return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+    //         } else {
+    //             // Gestion des erreurs réseau ou autres
+    //             return new HttpError(500, "Unexpected error: " + error.message);
+    //         }
+    //     }
+    // };
+
+    const getAnswerQuiz = async (
+        codeQuiz: string,
+        questionID: number,
+        answerID: number
+    ): Promise<Answer[] | HttpError> => {
+        try {
+            const requestBody = {
+                id: codeQuiz,
+                questionID: questionID,
+                answerID: answerID,
+            };
+
+            const response = await axios.post(`${url}/quiz/answer`, requestBody, {
+                headers: {
+                    "Content-Type": "application/json",
+                },
+            });
+
+            const answers: Answer[] = response.data.answers.map((answer: any) => ({
+                id: answer.id,
+                text: answer.text,
+                isCorrect: answer.isCorrect,
+                questionId: answer.questionId,
+            }));
+
+            return answers;
+        } catch (error: any) {
+            console.log("Error while fetching answers:", error);
+
+            if (error.response) {
+                // Gestion des erreurs HTTP
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                // Gestion des erreurs réseau ou autres
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    };
+
+    const getRandomQuiz = async (): Promise<QuizGenerateAnswer | HttpError> => {
+        const categories = await getCategories();
+        const difficulties = ['easy', 'medium', 'hard'];
+        const requestBody = {
+            amount: 10,
+            category: categories[Math.floor(Math.random() * categories.length)].id,
+            difficulty: difficulties[Math.floor(Math.random() * difficulties.length)],
+        };
+
+        try {
+            const response = await axios.post<QuizGenerateAnswer>(`${url}/quiz/generate`, requestBody, {
+                headers: {
+                    "Content-Type": "application/json",
+                },
+            });
+            const runId =  response.data.id;
+            // Récupération du run ID
+            return {id: runId, quizId: response.data.quizId};
+        } catch (error: any) {
+            console.log("Error while generating random quiz:", error);
+
+            if (error.response) {
+                // Gestion des erreurs HTTP
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                // Gestion des erreurs réseau ou autres
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    };
+
+    const getCommunityQuiz = async (skip: number, take: number) => {
+        try {
+            const response = await axios.get<QuizCommunityResponse>(`${url}/quiz/paginated?skip=${skip}&take=${take}`, {
+                withCredentials: true, // Inclut les cookies pour une session authentifiée
+            });
+
+            return response.data.quizzes;
+        } catch (error: any) {
+
+            if (error.response) {
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    };
+
+    const restartQuiz = async (id: string) : Promise<boolean | HttpError> => {
+        try {
+            const requestBody = {
+                id
+            };
+
+            await axios.patch(`${url}/quiz/restart`, requestBody, {
+                withCredentials: true,
+            });
+
+            return true;
+        } catch (error: any) {
+            if (error.response) {
+                return new HttpError(error.response.status, error.response.data?.message);
+            } else {
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    }
+
+    const getCategories = async () => {
+        try {
+            const response = await axios.get(`${url}/quiz/categories`, {
+                headers: {
+                    "Content-Type": "application/json",
+                },
+            });
+            return response.data;
+        } catch (error: any) {
+            if (error.response) {
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    };
+
+    const getRunsInfo = async (id: string): Promise<RunInformations | HttpError> => {
+        try {
+            const response = await axios.get<RunInformations>(`${url}/run/info/`+id, {
+                headers: {
+                    "Content-Type": "application/json",
+                },
+            });
+            return response.data;
+        } catch (error: any) {
+            console.log("Error while getQuizInformations quiz:", error);
+
+            if (error.response) {
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    }
+    
+    const getAllRuns = async (): Promise<AllRunsResponse | HttpError> => {
+        try {
+            const response = await axios.get<AllRunsResponse>(`${url}/run/userRuns`, {
+                headers: {
+                    "Content-Type": "application/json",
+                },
+            });
+
+            return response.data;
+        } catch (error: any) {
+            console.log("Error while getAllRuns:", error);
+            if (error.response) {
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    }
+
+     const createRun = async (quizId: string): Promise<string | HttpError> => {
+        try {
+            const response = await axios.post(`${url}/run/start`, {
+                quizId: quizId,
+            }, {
+                headers: {
+                    "Content-Type": "application/json",
+                },
+            });
+
+            return response.data.id;
+        } catch (error: any) {
+            console.log("Error while getQuizInformations quiz:", error);
+
+            if (error.response) {
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    }
+
+    return {
+        generateQuiz: generateQuiz,
+        getAnswerQuiz: getAnswerQuiz,
+        // remainingQuiz: remainingQuiz,
+        getRandomQuiz: getRandomQuiz,
+        getCommunityQuiz: getCommunityQuiz,
+        restartQuiz: restartQuiz,
+        getCategories: getCategories,
+        answerQuestion: answerQuestion,
+        getActualQuestionOfAQuiz: getActualQuestionOfAQuiz,
+        getQuizInformations: getQuizInformations,
+        getRunsInfo: getRunsInfo,
+        getAllRuns: getAllRuns,
+        createRun: createRun,
+    }
+}
\ No newline at end of file
diff --git a/services/UserService.ts b/services/UserService.ts
new file mode 100644
index 0000000000000000000000000000000000000000..22675d434a9d311879d3cbdd854073d09c5f11bb
--- /dev/null
+++ b/services/UserService.ts
@@ -0,0 +1,135 @@
+import HttpError from "./HttpError";
+import axios from "axios";
+import {transformToUserModel} from "../helper/UserHelper";
+import AsyncStorage from "@react-native-async-storage/async-storage";
+import useCookie from "../hooks/UseCookie";
+import {User} from "../models/User";
+
+export const useUserService =  () => {
+    const url = "https://klebert-host.com:33037";
+    const { saveCookie, removeCookie } = useCookie('access_token');
+
+
+    const loginUser = async (login: string, password: string): Promise<boolean | HttpError> => {
+        try {
+            const requestBody = {
+                login: login,
+                password: password,
+            };
+
+            const response =await axios.post(`${url}/auth/login`, requestBody, {
+                withCredentials: true, // Autorise Axios à inclure les cookies
+            });
+
+            const cookies = response.headers['set-cookie'];
+            if (cookies) {
+                const accessToken = cookies
+                    .find(cookie => cookie.startsWith('access_token='))
+                    ?.split(';')[0]
+                    ?.split('=')[1];
+
+                if (accessToken) {
+                    saveCookie(accessToken);
+                }
+            }
+
+            return true;
+        } catch (error: any) {
+
+            if (error.response) {
+                // Si le mot de passe ou le login est incorrect
+                if (error.response.status === 401) {
+                    return new HttpError(401, "Invalid login or password");
+                }
+
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                // Erreur réseau ou autre
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    };
+
+    const getInformationsUser = async (): Promise<User | HttpError> => {
+        try {
+            const response = await axios.get<User>(`${url}/user/me`, {
+                withCredentials: true, // Inclut les cookies dans la requête
+            });
+
+            return response.data;
+        } catch (error: any) {
+            if (error.response.status === 401) {
+                return new HttpError(401, "No user logged in");
+            }
+
+            if (error.response) {
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    };
+
+    const logoutUser = async (): Promise<boolean | HttpError> => {
+        try {
+            removeCookie();
+            await axios.post(`${url}/auth/logout`, null, {
+                withCredentials: true, // Inclut les cookies dans la requête
+            });
+            return true;
+        } catch (error: any) {
+            if (error.response) {
+                return new HttpError(error.response.status, error.response.data?.message || "HTTP error");
+            } else {
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    }
+
+    const registerUser = async (
+        username: string,
+        password: string,
+        email: string
+    ): Promise<boolean | HttpError> => {
+        try {
+            const requestBody = {
+                username: username,
+                email: email,
+                password: password,
+            };
+
+            // Enregistrement de l'utilisateur
+            await axios.post(`${url}/user`, requestBody, {
+                withCredentials: true,
+            });
+
+            // Connexion après enregistrement
+            const loginResult = await loginUser(username, password);
+
+            if (loginResult instanceof HttpError) {
+                return loginResult; // Retourne l'erreur de connexion si échec
+            }
+
+            return true; // Succès
+        } catch (error: any) {
+            if(error.response.status === 400) {
+                return new HttpError(400, "User already exists");
+            }
+            if (error.response) {
+                return new HttpError(error.response.status, error.response.data?.message);
+            } else {
+                return new HttpError(500, "Unexpected error: " + error.message);
+            }
+        }
+    };
+
+
+
+
+    return {
+        loginUser: loginUser,
+        getInformationsUser: getInformationsUser,
+        logoutUser: logoutUser,
+        registerUser: registerUser
+    };
+}
diff --git a/styles/ButtonsStyles.ts b/styles/ButtonsStyles.ts
index 769f771bd0e17a544e1f01d34389d39d8c92e64e..679e720b75f7e36b6dce1b7ba21c2b23971d789d 100644
--- a/styles/ButtonsStyles.ts
+++ b/styles/ButtonsStyles.ts
@@ -1,15 +1,22 @@
 import { StyleSheet } from "react-native";
 export const ButtonsStyles = StyleSheet.create( {
     defaultButton: {
-        backgroundColor: "grey",
+        backgroundColor: "#45128C",
         padding: 10,
         alignItems: "center",
+        justifyContent: 'center',
+        borderRadius: 10,
+    },
+    whiteButton: {
+        backgroundColor: "#45128C",
+        padding: 10,
+        alignItems: "center",
+        justifyContent: 'center',
         borderRadius: 10,
-        width: "100%",
     },
     answerButton: {
         backgroundColor: "#F3F3F3",
-        height: '20%',
+        height: '75%',
         alignItems: 'center',
         width: '80%',
         marginVertical: '3%',
diff --git a/styles/TextsStyles.ts b/styles/TextsStyles.ts
index a6bdfb948ecbe5bb8451eccb167cbdaed17644d8..84e6ba3f23cff930d99054f4a364f3d716ad5f7c 100644
--- a/styles/TextsStyles.ts
+++ b/styles/TextsStyles.ts
@@ -2,18 +2,22 @@ import { StyleSheet } from "react-native";
 export const TextsStyles = StyleSheet.create( {
     defaultText: {
         color: 'black',
-        fontSize: 20,
+        fontSize: 17,
     },
     defaultButtonText: {
         color: "white",
-        fontSize: 20,
+        fontSize: 17,
+    },
+    whiteButtonText: {
+        color: "white",
+        fontSize: 17,
     },
     titleText: {
         fontSize: 24,
         fontWeight: "bold",
     },
     subtitleText: {
-        fontSize: 24,
+        fontSize: 21,
     },
     infoQuizText: {
         fontSize: 18,
diff --git a/templates/TemplateDuo.tsx b/templates/TemplateDuo.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..c347a2d41658b3bdf03fc5b9c313f700ca5dfe3f
--- /dev/null
+++ b/templates/TemplateDuo.tsx
@@ -0,0 +1,47 @@
+import {ImageBackground, Text, View, StyleSheet, SafeAreaView} from "react-native";
+
+interface Props{
+    childrenHeader?: React.ReactNode
+    childrenBody?: React.ReactNode
+}
+
+export default function TemplateDuo({childrenHeader, childrenBody}: Props) {
+    return (
+        <View style={styles.container}>
+            <ImageBackground source={require('../assets/BackgroundQuestion.png')} style={styles.image}>
+                    <SafeAreaView>
+                    <View style={styles.containerHeader}>
+                        {childrenHeader}
+                    </View>
+                    <View style={styles.containerBody}>
+                        {childrenBody}
+                    </View>
+                </SafeAreaView>
+            </ImageBackground>
+        </View>
+    );
+}
+
+
+const styles = StyleSheet.create({
+    container: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+    },
+    containerHeader: {
+        width: '100%',
+        height: '30%',
+    },
+    containerBody: {
+        width: '100%',
+        height: '70%',
+        backgroundColor: '#FFFFFF',
+        borderTopLeftRadius: 46,
+        borderTopRightRadius: 46
+    },
+    image: {
+        height: '100%',
+        width: '100%',
+    }
+});
\ No newline at end of file
diff --git a/templates/TemplateMenu.tsx b/templates/TemplateMenu.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d58ffa21ac441543347847e5fe1517c16e1a8140
--- /dev/null
+++ b/templates/TemplateMenu.tsx
@@ -0,0 +1,47 @@
+import {ImageBackground, Text, View, StyleSheet, SafeAreaView} from "react-native";
+import HeaderNavigation from "../components/navigation/HeaderNavigation";
+import {NavigationProp} from "@react-navigation/native";
+
+interface Props{
+    children: React.ReactNode
+    navigation: NavigationProp<any>;
+    headerNavigation: boolean;
+    buttonGoBack: boolean
+}
+
+/**
+ * TemplateMenu : Template du menu principal
+ * @param children - Contenu du menu
+ * @param navigation - Navigation
+ * @param headerNavigation - Si le menu est en haut de page
+ * @param buttonGoBack - boolean qui dit si le bouton de retour doit être affiché
+ */
+export default function TemplateMenu({children, navigation, headerNavigation, buttonGoBack}: Props) {
+    return (
+        <View style={styles.container}>
+
+            <ImageBackground source={require('../assets/MenuBackground.png')} style={styles.image}>
+                <SafeAreaView>
+                    {headerNavigation && <HeaderNavigation navigation={navigation} buttonGoBack={buttonGoBack}/>}
+                <View style={styles.container}>
+                    {children}
+                </View>
+                </SafeAreaView>
+            </ImageBackground>
+
+        </View>
+    );
+}
+
+
+const styles = StyleSheet.create({
+    container: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+    },
+    image: {
+        height: '100%',
+        width: '100%',
+    }
+});
\ No newline at end of file
diff --git a/templates/TemplateMono.tsx b/templates/TemplateMono.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..1c781dc80c6d1e648244da719eca9cf625a3a782
--- /dev/null
+++ b/templates/TemplateMono.tsx
@@ -0,0 +1,48 @@
+import { View, Image, StyleSheet } from "react-native";
+
+interface Props{
+    children?: React.ReactNode
+}
+
+export default function TemplateMono({children} : Props) {
+    return(
+        <View style={styles.containerGlobal}>
+            <View style={styles.containerHeader}>
+                <Image source={require('../assets/Name.png')} style={styles.image}/>
+            </View>
+            <View style={styles.containerBody}>
+                {children}
+            </View>
+        </View>
+    );
+}
+
+const styles = StyleSheet.create({
+    containerGlobal: {
+        display: 'flex',
+        width: '100%',
+        height: '100%',
+    },
+    containerHeader: {
+        height: '12%',
+        width: '100%',
+        justifyContent: 'flex-end',
+        alignItems: 'center',
+        backgroundColor: '#fff',
+        shadowColor: '#171717',
+        shadowOffset: { width: 0, height: 4 },
+        shadowOpacity: 0.2,
+        shadowRadius: 3,
+        elevation: 5,
+        zIndex: 1,
+    },
+    containerBody: {
+        height: '88%',
+        width: '100%',
+        backgroundColor: '#FFFFFF'
+    },
+    image: {
+        height: '60%',
+        width: '60%',
+    }
+});
\ No newline at end of file
diff --git a/templates/TemplateQuizList.tsx b/templates/TemplateQuizList.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..3b07229920264258b16b9a7265b3431c3ff27529
--- /dev/null
+++ b/templates/TemplateQuizList.tsx
@@ -0,0 +1,77 @@
+import React from "react";
+import {View, Text, StyleSheet} from "react-native";
+import TemplateMenu from "./TemplateMenu";
+import {NavigationProp} from "@react-navigation/native";
+import InputPlayQuiz from "../components/PlayQuiz/InputPlayQuiz";
+import QuizList from "../components/lists/QuizList";
+import {Quiz} from "../models/Quiz";
+
+interface Props {
+    navigation: NavigationProp<any>
+    title: string
+    setTextInInput: (text: string) => void
+    quizList: Quiz[] | null | undefined
+    buttonGoBack: boolean
+    isLoadingData: boolean
+}
+
+/**
+ * TemplateQuizList : Un composant principal pour afficher une liste de quiz.
+ * Il inclut un menu, un titre, un champ d'entrée pour les recherches et une liste de quiz.
+ *
+ * @param navigation - L'objet de navigation pour naviguer entre les écrans
+ * @param title - Le titre affiché en haut de la liste
+ * @param setTextInInput - Fonction pour gérer les modifications dans le champ d'entrée
+ * @param quizList - La liste des quiz à afficher
+ * @param buttonGoBack - boolean qui dit si le bouton de retour doit être affiché
+ */
+
+interface Props {
+    navigation: NavigationProp<any>
+    title: string
+    setTextInInput: (text: string) => void
+    quizList: Quiz[] | null | undefined
+    buttonGoBack: boolean
+    isLoadingData: boolean
+    nextPage?: () => void;
+    onQuizPressed:(quiz: Quiz) => void;
+}
+
+export default function TemplateQuizList({navigation, title, setTextInInput, quizList, buttonGoBack, isLoadingData, nextPage, onQuizPressed }: Props) {
+    return (
+        <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={buttonGoBack}>
+            <View style={styles.globalContainer}>
+                <Text style={styles.title}>{title}</Text>
+                <View style={styles.contentContainer}>
+                    <InputPlayQuiz setText={setTextInInput} noTitle={true} />
+                    <QuizList quizList={quizList} isLoadingData={isLoadingData} nextPage={nextPage} onQuizPressed={onQuizPressed}/>
+                </View>
+            </View>
+        </TemplateMenu>
+    );
+}
+
+const styles = StyleSheet.create({
+    globalContainer: {
+        display: "flex",
+        height: "100%",
+        width: "100%",
+        paddingHorizontal: "3%", // Ajoute une marge de 5% à gauche et à droite
+        alignItems: "center", // Centre tous les enfants horizontalement
+    },
+    title: {
+        fontSize: 40,
+        fontWeight: "bold",
+        color: "#00b3f4",
+        marginBottom: 10,
+        alignSelf: "center", // Centre uniquement le titre
+    },
+    contentContainer: {
+        display: "flex",
+        flexDirection: "column",
+        width: "100%", // Utilise tout l'espace restant à l'intérieur de `globalContainer`
+        height: "75%",
+        alignItems: "center", // Centre tous les enfants horizontalement
+        gap: "2%",
+    },
+});
diff --git a/templates/TemplateRunList.tsx b/templates/TemplateRunList.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..8a542abd5218231cf9e7fd9bb1e14f998bcf3835
--- /dev/null
+++ b/templates/TemplateRunList.tsx
@@ -0,0 +1,67 @@
+import React from "react";
+import {View, Text, StyleSheet} from "react-native";
+import TemplateMenu from "./TemplateMenu";
+import {NavigationProp} from "@react-navigation/native";
+import RunStartedList from "../components/PlayQuiz/RunStartedList";
+import {RunsInformationsAllRuns} from "../models/RunsInformationsAllRuns";
+
+
+/**
+ * TemplateQuizList : Un composant principal pour afficher une liste de quiz.
+ * Il inclut un menu, un titre, un champ d'entrée pour les recherches et une liste de quiz.
+ *
+ * @param navigation - L'objet de navigation pour naviguer entre les écrans
+ * @param title - Le titre affiché en haut de la liste
+ * @param setTextInInput - Fonction pour gérer les modifications dans le champ d'entrée
+ * @param quizList - La liste des quiz à afficher
+ * @param buttonGoBack - boolean qui dit si le bouton de retour doit être affiché
+ */
+
+interface Props {
+    navigation: NavigationProp<any>
+    title: string
+    setTextInInput: (text: string) => void
+    runList: RunsInformationsAllRuns[] | undefined
+    buttonGoBack: boolean
+    isLoadingData: boolean
+    nextPage?: () => void;
+    onRunPressed:(runInfo: RunsInformationsAllRuns) => void;
+}
+
+export default function TemplateRunList({navigation, title, setTextInInput, runList, buttonGoBack, isLoadingData, onRunPressed }: Props) {
+    return (
+        <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={buttonGoBack}>
+            <View style={styles.globalContainer}>
+                <Text style={styles.title}>{title}</Text>
+                <View style={styles.contentContainer}>
+                    <RunStartedList runList={runList} isLoadingData={isLoadingData} onRunPressed={onRunPressed}/>
+                </View>
+            </View>
+        </TemplateMenu>
+    );
+}
+
+const styles = StyleSheet.create({
+    globalContainer: {
+        display: "flex",
+        height: "100%",
+        width: "100%",
+        paddingHorizontal: "3%", // Ajoute une marge de 5% à gauche et à droite
+        alignItems: "center", // Centre tous les enfants horizontalement
+    },
+    title: {
+        fontSize: 40,
+        fontWeight: "bold",
+        color: "#00b3f4",
+        marginBottom: 10,
+        alignSelf: "center", // Centre uniquement le titre
+    },
+    contentContainer: {
+        display: "flex",
+        flexDirection: "column",
+        width: "100%", // Utilise tout l'espace restant à l'intérieur de `globalContainer`
+        height: "75%",
+        alignItems: "center", // Centre tous les enfants horizontalement
+        gap: "2%",
+    },
+});
diff --git a/translation/languages/en.json b/translation/languages/en.json
index cd0578e96078a1a0fdc382024d4c5aa9af4a44db..078e5e267c328d69ed04a14a664d3e4f480d8b9e 100644
--- a/translation/languages/en.json
+++ b/translation/languages/en.json
@@ -4,7 +4,27 @@
       "home": {
         "welcome": "Welcome to Vili",
         "play": "Play",
-        "createQuiz": "Create a Quiz"
+        "createQuiz": "Create a Quiz",
+        "joinQuiz": "Join a Quiz",
+        "codeQuiz": "Quiz Code"
+      },
+      "question": {
+        "score" : "SCORE",
+        "category" : "CATEGORY",
+        "question" : "QUESTION"
+      },
+      "endQuiz": {
+        "win": "Congratulations, you won !",
+        "lose":"Congratulations, you won !",
+        "replay": "Play again",
+        "goHome": "Go to home",
+        "score": "Score"
+      },
+      "creationQuiz": {
+        "difficulty": "Difficulty",
+        "nbQuestions": "Nb. of questions",
+        "theme": "Theme",
+        "addQuiz": "Add a Quiz"
       }
     }
   }
diff --git a/translation/languages/fr.json b/translation/languages/fr.json
index 3cd4cfe19c949731f01a0b23b580250cbdd7c4a5..0d8f29815983fd6469541e89a5cf0a2abd362f96 100644
--- a/translation/languages/fr.json
+++ b/translation/languages/fr.json
@@ -4,7 +4,27 @@
       "home": {
         "welcome": "Bienvenue sur Vili",
         "play": "Jouer",
-        "createQuiz": "Créer un Quizz"
+        "createQuiz": "Créer un Quizz",
+        "joinQuiz": "Rejoindre un Quizz",
+        "codeQuiz": "Code de la partie"
+      },
+      "question": {
+        "score" : "SCORE",
+        "category" : "CATEGORIE",
+        "question" : "QUESTION"
+      },
+      "endQuiz": {
+        "win": "Félicitations, vous avez gagné !",
+        "lose":"Dommage, tu as perdu !",
+        "replay": "Rejouer",
+        "goHome": "Retour à l'accueil",
+        "score": "Score"
+      },
+      "creationQuiz": {
+        "difficulty": "Difficulté",
+        "nbQuestions": "Nb. de questions",
+        "theme": "Thème",
+        "addQuiz": "Ajouter un Quiz"
       }
     }
   }