diff --git a/.eslintrc.js b/.eslintrc.js
index 64c6c52ccb53248e01395d32484e94017320da2a..bdf306698301433a5ac5a6cb0771997f083e5e8f 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -25,6 +25,7 @@ module.exports = {
         { "allowWholeFile": true }
       ],
     "@typescript-eslint/no-empty-interface": 1, // empty Interfaces will be only warnings for now.
+    "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }], // will only ignore variables that start with an underscore _
     "vue/multi-word-component-names": "off"
   },
 }
diff --git a/package.json b/package.json
index 13050ae8ef793f7ec7e617f05a6bb2fbcba8a7e0..159c10204bd19b74231ee34990ca888540d6a131 100644
--- a/package.json
+++ b/package.json
@@ -16,8 +16,9 @@
     "axios": "^0.26.1",
     "bootstrap": "^4.6.1",
     "bootstrap-icons": "^1.8.1",
-    "bootstrap-vue": "^2.21.2",
+    "bootstrap-vue": "^2.22.0",
     "core-js": "^3.21.1",
+    "deep-object-diff": "^1.1.7",
     "file-saver": "^2.0.5",
     "http-status-codes": "^2.2.0",
     "jose": "^4.6.0",
diff --git a/src/App.vue b/src/App.vue
index e32d09d368f9cad61691e41d3920b5361a6fe399..887be908a5acc56d7dcec4535fda0cbea84fcb98 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,7 +1,7 @@
 <template>
   <div id="app">
     <Navbar />
-    <LoadingIndicator :show="loading" />
+    <LoadingIndicator />
     <main>
       <div class="mr-0 d-flex">
         <SidebarMenu class="mr-2" />
@@ -14,7 +14,6 @@
       </div>
     </main>
     <ExpiryToast />
-    <!--DevFooter /-->
   </div>
 </template>
 
@@ -22,9 +21,9 @@
 import { defineComponent } from "vue-demi";
 
 // import the main store
-import { useMainStore } from "@/store/index";
-import { useProjectStore } from "@/modules/project/store";
-import { useUserStore } from "@/modules/user/store";
+import useMainStore from "@/store/index";
+import useProjectStore from "@/modules/project/store";
+import useUserStore from "@/modules/user/store";
 
 export default defineComponent({
   setup() {
@@ -40,10 +39,6 @@ export default defineComponent({
   },
 
   computed: {
-    loading(): boolean {
-      return this.mainStore.coscine.loading.counter > 0;
-    },
-
     loggedIn(): boolean {
       return this.mainStore.loggedIn;
     },
diff --git a/src/components.d.ts b/src/components.d.ts
index 8794e88216dc8a339deb13d95938a3a6b5270efc..e3dea2052cf883015212f42df3b8b4f3e75acfe4 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -9,7 +9,6 @@ declare module "vue" {
     CoscineFormGroup: typeof import("./components/CoscineFormGroup.vue")["default"];
     CoscineHeadline: typeof import("./components/CoscineHeadline.vue")["default"];
     CoscineModal: typeof import("./components/CoscineModal.vue")["default"];
-    DevFooter: typeof import("./components/DevFooter.vue")["default"];
     ExpiryToast: typeof import("./components/ExpiryToast.vue")["default"];
     LoadingIndicator: typeof import("./components/LoadingIndicator.vue")["default"];
     LoadingSpinner: typeof import("./components/LoadingSpinner.vue")["default"];
diff --git a/src/components/BreadCrumbs.vue b/src/components/BreadCrumbs.vue
index ba0ed448ba60dc849b9a4e1e099f7c083bced8a1..370f4d86a183b8960819fb94b54894e80732dea6 100644
--- a/src/components/BreadCrumbs.vue
+++ b/src/components/BreadCrumbs.vue
@@ -23,11 +23,11 @@
 import { defineComponent } from "vue-demi";
 
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 // import the project store
-import { useProjectStore } from "@/modules/project/store";
+import useProjectStore from "@/modules/project/store";
 // import the resource store
-import { useResourceStore } from "@/modules/resource/store";
+import useResourceStore from "@/modules/resource/store";
 
 import type {
   ProjectObject,
@@ -84,11 +84,14 @@ export default defineComponent({
                       projectName: this.project
                         ? this.project.displayName
                         : path,
-                      resourceName: this.resource
-                        ? `${this.resource.type?.displayName?.toUpperCase()}: ${
-                            this.resource.displayName
-                          }`
-                        : path,
+                      resourceName:
+                        this.resource && this.resource.type
+                          ? `${this.$t(
+                              "resourceTypes." +
+                                this.resource.type.displayName +
+                                ".displayName"
+                            )}: ${this.resource.displayName}`
+                          : path,
                     }
                   ).toString()
                 : path,
diff --git a/src/components/CoscineFormGroup.vue b/src/components/CoscineFormGroup.vue
index 626b30eb4822dbbd3bc723bfb16724c8c9abd780..89cf9b6db2b0692a5d92747e4a93ccf99504cc08 100644
--- a/src/components/CoscineFormGroup.vue
+++ b/src/components/CoscineFormGroup.vue
@@ -4,14 +4,36 @@
     :label-for="labelFor"
     :label-cols-sm="labelColsSm"
     :label-align-sm="labelAlignSm"
-    :label="label"
   >
+    <!-- Loading Skeleton -->
     <b-skeleton-wrapper :loading="isLoading">
       <template #loading>
         <b-skeleton :type="type" animation="fade"></b-skeleton>
       </template>
-      <slot></slot>
+      <slot />
     </b-skeleton-wrapper>
+
+    <!-- Label Template -->
+    <template #label>
+      <!-- Label -->
+      <span id="label" class="text-break">{{ label }}</span>
+
+      <div class="d-inline ml-1" v-if="info">
+        <!-- Information Circle Icon -->
+        <b-icon icon="info-circle" :id="labelFor" />
+
+        <!-- Popover -->
+        <b-popover
+          over
+          :target="labelFor"
+          triggers="hover focus"
+          placement="bottom"
+        >
+          <!-- Popover Contents -->
+          <slot name="popover" />
+        </b-popover>
+      </div>
+    </template>
   </b-form-group>
 </template>
 
@@ -21,6 +43,10 @@ import { defineComponent } from "vue-demi";
 export default defineComponent({
   name: "CoscineFormGroup",
   props: {
+    info: {
+      default: false,
+      type: Boolean,
+    },
     isLoading: {
       default: false,
       type: Boolean,
@@ -38,7 +64,7 @@ export default defineComponent({
       type: String,
     },
     type: {
-      default: "text",
+      default: "input",
       type: String,
     },
     labelColsSm: {
diff --git a/src/components/CoscineHeadline.vue b/src/components/CoscineHeadline.vue
index 745b908caf315ed4e35d1e3d81b7dd8205a19762..1a6a7686516c6b1f5f80df83fa26fa50b053a777 100644
--- a/src/components/CoscineHeadline.vue
+++ b/src/components/CoscineHeadline.vue
@@ -1,5 +1,5 @@
 <template>
-  <p class="h4 mt-3 text-left">{{ headline }}:</p>
+  <p :class="`${h} mt-3 text-left`">{{ headline }}:</p>
 </template>
 
 <script lang="ts">
@@ -9,6 +9,10 @@ export default {
       default: "",
       type: String,
     },
+    h: {
+      default: "h4",
+      type: String,
+    },
   },
 };
 </script>
diff --git a/src/components/DevFooter.vue b/src/components/DevFooter.vue
deleted file mode 100644
index 85d629f67cb47868f80d0adaac88186bc10b71be..0000000000000000000000000000000000000000
--- a/src/components/DevFooter.vue
+++ /dev/null
@@ -1,123 +0,0 @@
-<template>
-  <footer class="fixed-bottom mb-5">
-    <b-row align-h="center">
-      <b-card class="progress-bar-striped bg-light border-warning w-50">
-        <b-card-sub-title class="text-center">Dev-Footer:</b-card-sub-title>
-        <hr class="mt-1 mb-1 b-1" />
-        <nav
-          class="flex flex-wrap items-center justify-center text-base md:ml-auto"
-        >
-          <RouterLink
-            v-for="(route, index) in routes"
-            :key="index"
-            class="mr-4 font-semibold cursor-pointer"
-            :class="{
-              'text-blue-500 hover:blue-300': route.name === currentRoute,
-              'hover:text-gray-800 dark:text-gray-800 dark:hover:text-gray-500':
-                route.name !== currentRoute,
-            }"
-            :to="{ name: route.name }"
-          >
-            {{ route.name }}
-          </RouterLink>
-
-          <RouterLink
-            class="flex items-center justify-center mx-2 text-black w-9 dark:text-black"
-            to="/broken"
-          >
-            <b-icon icon="hammer" />
-          </RouterLink>
-          <button
-            @click="toggleLighting"
-            class="flex items-center justify-center mx-2 w-9 focus:outline-none"
-          >
-            <b-icon icon="sun" variant="warning" v-if="isDark" />
-            <b-icon icon="moon" variant="secondary" v-else />
-          </button>
-
-          <button
-            @click="toggleLoading"
-            class="flex items-center justify-center mx-2 w-9 focus:outline-none"
-          >
-            <b-icon icon="pause-fill" variant="warning" v-if="loading" />
-            <b-icon icon="skip-forward-fill" v-else />
-          </button>
-        </nav>
-      </b-card>
-    </b-row>
-  </footer>
-</template>
-
-<script lang="ts">
-import { computed, defineComponent } from "vue-demi";
-import { routes } from "@/router";
-import { useDark, useToggle } from "@vueuse/core";
-
-// import the main store
-import { useMainStore } from "@/store/index";
-
-import { RouteConfig } from "vue-router";
-
-export default defineComponent({
-  setup: (_, ctx) => {
-    // Import config from .evn
-    const appName = import.meta.env.VITE_APP_NAME;
-    let availableRoutes = [] as RouteConfig[];
-
-    let processRoutes = function (input: RouteConfig[]) {
-      let filterEntries = function (route: RouteConfig) {
-        if (
-          route.name !== undefined &&
-          route.name !== "not-found" &&
-          route.name !== "pid-page"
-        ) {
-          return route;
-        } else {
-          return undefined;
-        }
-      };
-      input.forEach((route) => {
-        if (route.children !== undefined) {
-          processRoutes(route.children);
-        } else {
-          const temp = filterEntries(route);
-          if (temp !== undefined) {
-            availableRoutes.push(temp);
-          }
-        }
-      });
-    };
-
-    const mainStore = useMainStore();
-
-    processRoutes(routes);
-    const currentRoute = computed(() => ctx.root.$route.name);
-
-    const isDark = useDark();
-    const toggleLighting = useToggle(isDark);
-
-    return {
-      appName,
-      routes: availableRoutes,
-      currentRoute,
-      toggleLighting,
-      isDark,
-      mainStore,
-    };
-  },
-  computed: {
-    loading(): boolean {
-      return this.mainStore.$state.coscine.loading.counter > 0;
-    },
-  },
-  methods: {
-    toggleLoading() {
-      if (this.loading) {
-        this.mainStore.decreasePageLoadingContent();
-      } else {
-        this.mainStore.increasePageLoadingContent();
-      }
-    },
-  },
-});
-</script>
diff --git a/src/components/ExpiryToast.vue b/src/components/ExpiryToast.vue
index 48c28960385a1937eeadce97471fa021ad00c92c..bbd03bda38831b9951f2d126bc3d719f80c3bfa5 100644
--- a/src/components/ExpiryToast.vue
+++ b/src/components/ExpiryToast.vue
@@ -28,8 +28,8 @@ import { defineComponent } from "@vue/composition-api";
 import * as jose from "jose";
 import moment from "moment";
 
-import { useMainStore } from "@/store/index";
-import { useLoginStore } from "@/modules/login/store";
+import useMainStore from "@/store/index";
+import useLoginStore from "@/modules/login/store";
 
 export default defineComponent({
   setup() {
diff --git a/src/components/LoadingIndicator.vue b/src/components/LoadingIndicator.vue
index 5f89cbbcd924fffb147f73d267b18f9ee3e09a93..ab33c3ba8b77a759b1d59862f74cce9e49d23acd 100644
--- a/src/components/LoadingIndicator.vue
+++ b/src/components/LoadingIndicator.vue
@@ -6,13 +6,38 @@
 </template>
 
 <script lang="ts">
+import useAdminStore from "@/modules/admin/store";
+import useErrorStore from "@/modules/error/store";
+import useLoginStore from "@/modules/login/store";
+import useMainStore from "@/store";
+import usePidStore from "@/modules/pid/store";
+import useProjectStore from "@/modules/project/store";
+import useResourceStore from "@/modules/resource/store";
+import useSearchStore from "@/modules/search/store";
+import useUserStore from "@/modules/user/store";
+
+import { loadingCounterEventHandler } from "@/plugins/loadingCounter";
 import { defineComponent } from "vue-demi";
 
 export default defineComponent({
-  props: {
-    show: {
-      default: false,
-      type: Boolean,
+  setup() {
+    const mainStore = useMainStore();
+
+    loadingCounterEventHandler(useAdminStore);
+    loadingCounterEventHandler(useErrorStore);
+    loadingCounterEventHandler(useLoginStore);
+    loadingCounterEventHandler(usePidStore);
+    loadingCounterEventHandler(useProjectStore);
+    loadingCounterEventHandler(useResourceStore);
+    loadingCounterEventHandler(useSearchStore);
+    loadingCounterEventHandler(useUserStore);
+
+    return { mainStore };
+  },
+
+  computed: {
+    show(): boolean {
+      return this.mainStore.isLoading;
     },
   },
 });
diff --git a/src/components/Navbar.vue b/src/components/Navbar.vue
index a352d3cb3cc73d45410d316e10fd9fde65473bf3..ffcd08c91ec4ed544633247d1958970475a013f0 100644
--- a/src/components/Navbar.vue
+++ b/src/components/Navbar.vue
@@ -118,11 +118,11 @@
 <script lang="ts">
 import { defineComponent } from "vue-demi";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 // import the login store
-import { useLoginStore } from "@/modules/login/store";
+import useLoginStore from "@/modules/login/store";
 // import the user store
-import { useUserStore } from "@/modules/user/store";
+import useUserStore from "@/modules/user/store";
 import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User";
 
 export default defineComponent({
diff --git a/src/components/SidebarMenu.vue b/src/components/SidebarMenu.vue
index bbac2c7ac60f17cce3d76143f78b11282ee178c8..38b90f02db84ef45c2ef8e681c716730e7eed6b9 100644
--- a/src/components/SidebarMenu.vue
+++ b/src/components/SidebarMenu.vue
@@ -27,11 +27,11 @@ import "bootstrap-icons/font/fonts/bootstrap-icons.woff";
 import "bootstrap-icons/font/fonts/bootstrap-icons.woff2";
 
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 // import the project store
-import { useProjectStore } from "@/modules/project/store";
+import useProjectStore from "@/modules/project/store";
 // import the resource store
-import { useResourceStore } from "@/modules/resource/store";
+import useResourceStore from "@/modules/resource/store";
 
 import type {
   ProjectObject,
@@ -149,8 +149,12 @@ export default defineComponent({
             child: this.resources.map((resource) => {
               return {
                 title:
-                  (resource.type?.displayName
-                    ? resource.type.displayName.toUpperCase() + ": "
+                  (resource.type
+                    ? `${this.$t(
+                        "resourceTypes." +
+                          resource.type.displayName +
+                          ".displayName"
+                      )}: `
                     : "") + resource.displayName,
                 href: {
                   name: "resource-page",
diff --git a/src/components/banner/Maintenance.vue b/src/components/banner/Maintenance.vue
index 9dfebc8af87a984f38eee80d58a725e5290a0fb6..da121db853479694ab7653bcb3b613b9e0aa41a7 100644
--- a/src/components/banner/Maintenance.vue
+++ b/src/components/banner/Maintenance.vue
@@ -1,9 +1,7 @@
 <template>
   <b-alert
     v-if="visibility"
-    :show="
-      visibility && maintenance.type !== undefined && maintenance.type !== null
-    "
+    :show="show"
     @dismissed="saveVisibility"
     dismissible
     variant="warning"
@@ -21,7 +19,7 @@
 <script lang="ts">
 import { defineComponent } from "vue-demi";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 import type { MaintenanceReturnObject } from "@coscine/api-client/dist/types/Coscine.Api.Notices";
 
 export default defineComponent({
@@ -44,9 +42,12 @@ export default defineComponent({
       return (
         this.mainStore.coscine.banner.maintenanceVisibility !==
           this.mainStore.coscine.banner.dateString &&
-        this.mainStore.coscine.banner.dateString !== ""
+        this.mainStore.coscine.banner.dateString.trim() !== ""
       );
     },
+    show(): boolean {
+      return this.visibility && this.maintenance.type ? true : false;
+    },
   },
 
   watch: {
diff --git a/src/components/banner/Pilot.vue b/src/components/banner/Pilot.vue
index fd537b559601cce441f51354a6ce79d6dff6ce5c..e84a8d0d1fd9285a5a6c5171b42c19ce378168ae 100644
--- a/src/components/banner/Pilot.vue
+++ b/src/components/banner/Pilot.vue
@@ -7,7 +7,7 @@
     variant="warning"
   >
     <i18n path="banner.pilot.pilotBannerText" tag="p">
-      <template v-slot:link>
+      <template #link>
         <a :href="$t('email.serviceDeskMailTo')" target="_blank">{{
           $t("email.serviceDeskName")
         }}</a>
@@ -18,7 +18,7 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 export default defineComponent({
   setup() {
     const mainStore = useMainStore();
diff --git a/src/i18n/de.ts b/src/i18n/de.ts
index c2760bfc4ec16938220d5b49d744ca7d21381824..58a8510463457f2c95469d5a30961ec72a36a17a 100644
--- a/src/i18n/de.ts
+++ b/src/i18n/de.ts
@@ -44,13 +44,17 @@ export default {
 
   buttons: {
     addUser: "Benutzer hinzufügen",
+    archive: "@:(default.archive)",
     back: "Zurück",
     cancel: "Abbrechen",
     close: "Schließen",
+    confirm: "Bestätigen",
     connect: "Verbinden",
     connected: "Verbunden",
     copyMetadata: "Metadaten kopieren",
+    create: "Erstellen",
     delete: "Löschen",
+    next: "Weiter",
     reset: "Zurücksetzen",
     import: "Importieren",
     invite: "Einladen",
@@ -61,13 +65,16 @@ export default {
     save: "Speichern",
     submit: "Abschicken",
     tokenCreate: "Zugriffstoken erstellen",
+    unarchive: "Archivieren rückgängig",
   } as VueI18n.LocaleMessageObject,
 
   default: {
-    serviceDeskEmail: "servicedesk@rwth-aachen.de",
     archive: "Archivieren",
     archived: "Archiviert",
+    help: "Hilfe",
     loading: "Laden...",
+    or: "ODER",
+    none: "k. A.",
   },
 
   toast: {
@@ -76,7 +83,7 @@ export default {
       message: "Um weiterzuarbeiten, loggen Sie sich erneut ein:",
       link: "@:(nav.userLogIn)",
     },
-    save: {
+    onSave: {
       success: {
         title: "Änderungen erfolgreich",
         message: "Die Daten wurden erfolgreich gespeichert.",
@@ -84,7 +91,18 @@ export default {
       failure: {
         title: "Fehler beim Speichern",
         message:
-          "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an @:(default.serviceDeskEmail).",
+          "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an @:(email.serviceDeskEmail).",
+      },
+    },
+    onDelete: {
+      success: {
+        title: "Löschung erfolgreich",
+        message: "Die Daten wurden erfolgreich gelöscht.",
+      },
+      failure: {
+        title: "Fehler beim Löschen",
+        message:
+          "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an @:(email.serviceDeskEmail).",
       },
     },
   },
@@ -115,7 +133,7 @@ export default {
     },
   },
 
-  ResourceTypes: {
+  resourceTypes: {
     rds: {
       displayName: "RWTH-FDS-Web",
       fullName: "Forschungsdatenspeicher (FDS)",
@@ -214,8 +232,9 @@ export default {
   },
 
   email: {
-    serviceDeskName: "Servicedesk",
+    serviceDeskEmail: "servicedesk@rwth-aachen.de",
     serviceDeskMailTo:
-      "mailto:servicedesk@itc.rwth-aachen.de?subject=CoScInE%20Pilot%20Program",
+      "mailto:servicedesk@rwth-aachen.de?subject=CoScInE%20Pilot%20Program",
+    serviceDeskName: "Servicedesk",
   },
 } as VueI18n.LocaleMessageObject;
diff --git a/src/i18n/en.ts b/src/i18n/en.ts
index e72fbedfd02380616e671b3a8317803cf7569dfb..1cf6727f4efcb3dc6343be3cef430461b1442322 100644
--- a/src/i18n/en.ts
+++ b/src/i18n/en.ts
@@ -42,13 +42,17 @@ export default {
 
   buttons: {
     addUser: "Add User",
+    archive: "@:(default.archive)",
     back: "Back",
     cancel: "Cancel",
     close: "Close",
+    confirm: "Confirm",
     connect: "Connect",
     connected: "Connected",
     copyMetadata: "Copy Metadata",
+    create: "Create",
     delete: "Delete",
+    next: "Next",
     reset: "Reset",
     import: "Import",
     invite: "Invite",
@@ -59,12 +63,16 @@ export default {
     save: "Save",
     submit: "Submit",
     tokenCreate: "Create Access Token",
+    unarchive: "Unarchive",
   } as VueI18n.LocaleMessageObject,
 
   default: {
     archive: "Archive",
     archived: "Archived",
+    help: "Help",
     loading: "Loading...",
+    or: "OR",
+    none: "n/a",
   },
 
   toast: {
@@ -81,7 +89,18 @@ export default {
       failure: {
         title: "Error on saving",
         message:
-          "An error occured. Please try again. If the error persists, please contact @:(default.serviceDeskEmail).",
+          "An error occured. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).",
+      },
+    },
+    onDelete: {
+      success: {
+        title: "Deleted successfully",
+        message: "The data has been deleted successfully.",
+      },
+      failure: {
+        title: "Error on deletion",
+        message:
+          "An error occured. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).",
       },
     },
   },
@@ -112,7 +131,7 @@ export default {
     },
   },
 
-  ResourceTypes: {
+  resourceTypes: {
     rds: {
       displayName: "RWTH-RDS-Web",
       fullName: "Research Data Storage (RDS)",
@@ -210,8 +229,9 @@ export default {
   },
 
   email: {
-    serviceDeskName: "Servicedesk",
+    serviceDeskEmail: "servicedesk@rwth-aachen.de",
     serviceDeskMailTo:
-      "mailto:servicedesk@itc.rwth-aachen.de?subject=CoScInE%20Pilot%20Program",
+      "mailto:servicedesk@rwth-aachen.de?subject=Coscine%20Pilot%20Program",
+    serviceDeskName: "Servicedesk",
   },
 } as VueI18n.LocaleMessageObject;
diff --git a/src/modules/admin/AdminModule.vue b/src/modules/admin/AdminModule.vue
index 0bcde6289101a45c3d87237d1151186f1536071d..bb98cfb53a04fb8a2cfcca9690344c63a0fd9cd1 100644
--- a/src/modules/admin/AdminModule.vue
+++ b/src/modules/admin/AdminModule.vue
@@ -6,12 +6,11 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import { AdminI18nMessages } from "./i18n";
 
 // import the store for current module
-import { useAdminStore } from "./store";
+import useAdminStore from "./store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
@@ -20,7 +19,6 @@ export default defineComponent({
 
     return { mainStore, adminStore };
   },
-  i18n: { messages: AdminI18nMessages },
 
   created() {
     this.initialize();
diff --git a/src/modules/admin/pages/Admin.vue b/src/modules/admin/pages/Admin.vue
index 8ab5b95e9e20ccba9955fbbae97661e8930970a5..5f19ae17089fab68d6251813414797d2d9a0e4a3 100644
--- a/src/modules/admin/pages/Admin.vue
+++ b/src/modules/admin/pages/Admin.vue
@@ -4,9 +4,9 @@
       class="container flex flex-col items-center px-5 py-12 mx-auto text-gray-600 body-font md:flex-row"
     >
       <div>
-        <CoscineHeadline :headline="$parent.$t('page.admin.title')" />
+        <CoscineHeadline :headline="$t('page.admin.title')" />
         <p class="mb-8 leading-relaxed dark:text-white">
-          {{ $parent.$t("page.admin.description") }}
+          {{ $t("page.admin.description") }}
         </p>
         <img alt="From Coscine Old" src="@/assets/images/Admin.png" />
       </div>
@@ -19,9 +19,9 @@ import { defineComponent } from "vue-demi";
 import CoscineHeadline from "@/components/CoscineHeadline.vue";
 
 // import the store for current module
-import { useAdminStore } from "../store";
+import useAdminStore from "../store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
diff --git a/src/modules/admin/routes.ts b/src/modules/admin/routes.ts
index 45e8e6753c33336db4df2fcf85c9906a496da988..5c4893ea379a2188de13dfd6f63fc5dc4fe6207f 100644
--- a/src/modules/admin/routes.ts
+++ b/src/modules/admin/routes.ts
@@ -3,6 +3,8 @@ import { RouteConfig } from "vue-router";
 const AdminModule = () => import("./AdminModule.vue");
 const Admin = () => import("./pages/Admin.vue");
 
+import { AdminI18nMessages } from "@/modules/admin/i18n/index";
+
 export const AdminRoutes: RouteConfig[] = [
   {
     path: "/admin",
@@ -12,6 +14,7 @@ export const AdminRoutes: RouteConfig[] = [
       breadCrumb: "admin",
       requiresAdmin: true,
       requiresAuth: true,
+      i18n: AdminI18nMessages,
     },
     children: [
       {
diff --git a/src/modules/error/ErrorModule.vue b/src/modules/error/ErrorModule.vue
index 051f34015ac7467619e62e32000dccdc6239b6e6..b0c836e15071ec59543c3d4c2cf60472db4c21a8 100644
--- a/src/modules/error/ErrorModule.vue
+++ b/src/modules/error/ErrorModule.vue
@@ -6,12 +6,11 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import { ErrorI18nMessages } from "./i18n";
 
 // import the store for current module
-import { useErrorStore } from "./store";
+import useErrorStore from "./store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
@@ -20,7 +19,6 @@ export default defineComponent({
 
     return { mainStore, errorStore };
   },
-  i18n: { messages: ErrorI18nMessages },
 
   created() {
     this.initialize();
diff --git a/src/modules/error/pages/NotFound.vue b/src/modules/error/pages/NotFound.vue
index 55316f0bcb5d565233c5a0b765618fe58b8028c9..37431cd9ed7ad6a6b9162e4a1c0e246766041d23 100644
--- a/src/modules/error/pages/NotFound.vue
+++ b/src/modules/error/pages/NotFound.vue
@@ -4,9 +4,9 @@
       class="container flex flex-col items-center px-5 py-12 mx-auto text-gray-600 body-font md:flex-row"
     >
       <div>
-        <CoscineHeadline :headline="$parent.$t('page.notFound.title')" />
+        <CoscineHeadline :headline="$t('page.notFound.title')" />
         <p class="mb-8 leading-relaxed dark:text-white">
-          {{ $parent.$t("page.notFound.description") }}
+          {{ $t("page.notFound.description") }}
         </p>
         <img alt="Oopsie!" src="@/assets/images/404.jpg" />
       </div>
@@ -19,9 +19,9 @@ import { defineComponent } from "vue-demi";
 import CoscineHeadline from "@/components/CoscineHeadline.vue";
 
 // import the store for current module
-import { useErrorStore } from "../store";
+import useErrorStore from "../store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
diff --git a/src/modules/error/routes.ts b/src/modules/error/routes.ts
index 5b8fd1ca9a596729df90450e69d0e598e66d3879..16e4d43c2896d1f5ddadef3d0f44a9a6e2aa37dc 100644
--- a/src/modules/error/routes.ts
+++ b/src/modules/error/routes.ts
@@ -3,11 +3,16 @@ import { RouteConfig } from "vue-router";
 const ErrorModule = () => import("./ErrorModule.vue");
 const NotFound = () => import("./pages/NotFound.vue");
 
+import { ErrorI18nMessages } from "@/modules/error/i18n/index";
+
 export const ErrorRoutes: RouteConfig[] = [
   // Not Found (404) Page
   {
     path: "/:path(^(?!(/coscine/api/|/coscine/apps/)))",
     component: ErrorModule,
+    meta: {
+      i18n: ErrorI18nMessages,
+    },
     children: [
       {
         path: "/",
diff --git a/src/modules/login/LoginModule.vue b/src/modules/login/LoginModule.vue
index aa378dfb4de6f08c6722a99cbdc405f7f7c88723..9e15fabc356cedc112ad3022da2e4a24c627c12e 100644
--- a/src/modules/login/LoginModule.vue
+++ b/src/modules/login/LoginModule.vue
@@ -6,12 +6,11 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import { LoginI18nMessages } from "./i18n";
 
 // import the store for current module
-import { useLoginStore } from "./store";
+import useLoginStore from "./store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
@@ -20,7 +19,6 @@ export default defineComponent({
 
     return { mainStore, loginStore };
   },
-  i18n: { messages: LoginI18nMessages },
 
   created() {
     this.initialize();
diff --git a/src/modules/login/pages/Login.vue b/src/modules/login/pages/Login.vue
index a3559fe5a945fc1c8c269eb283cde1bbba46839c..db12620ac6ab4c97163cab9cf60f40c12d2588d9 100644
--- a/src/modules/login/pages/Login.vue
+++ b/src/modules/login/pages/Login.vue
@@ -6,9 +6,9 @@
 import { defineComponent } from "vue-demi";
 
 // import the store for current module
-import { useLoginStore } from "../store";
+import useLoginStore from "../store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
diff --git a/src/modules/login/routes.ts b/src/modules/login/routes.ts
index 230b6d758249ba6597263c17a77567cbf2ec975a..5fcb379f0aad6c88e7505fc18c1ef06237ac26ab 100644
--- a/src/modules/login/routes.ts
+++ b/src/modules/login/routes.ts
@@ -3,10 +3,15 @@ import { RouteConfig } from "vue-router";
 const LoginModule = () => import("./LoginModule.vue");
 const Login = () => import("./pages/Login.vue");
 
+import { LoginI18nMessages } from "@/modules/login/i18n/index";
+
 export const LoginRoutes: RouteConfig[] = [
   {
     path: "/login",
     component: LoginModule,
+    meta: {
+      i18n: LoginI18nMessages,
+    },
     children: [
       {
         path: "/",
diff --git a/src/modules/login/store.ts b/src/modules/login/store.ts
index 42659cfee8daf791ba112740fd7e49bbf5773f5e..33ca895890673b816945f75f94878a5c644ef67f 100644
--- a/src/modules/login/store.ts
+++ b/src/modules/login/store.ts
@@ -3,7 +3,7 @@ import { LoginState } from "./types";
 import { RawLocation, Route } from "vue-router";
 
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 /*  
   Store variable name is "this.<id>Store"
diff --git a/src/modules/pid/PidModule.vue b/src/modules/pid/PidModule.vue
index c75661c458d63ed152ee4ba531a9a08ed65ef2be..8010d3fde3cbcfc7dc0a82f381886d1de1bd2ef5 100644
--- a/src/modules/pid/PidModule.vue
+++ b/src/modules/pid/PidModule.vue
@@ -6,12 +6,11 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import { PidI18nMessages } from "./i18n";
 
 // import the store for current module
-import { usePidStore } from "./store";
+import usePidStore from "./store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
@@ -20,7 +19,6 @@ export default defineComponent({
 
     return { mainStore, pidStore };
   },
-  i18n: { messages: PidI18nMessages },
 
   created() {
     this.initialize();
diff --git a/src/modules/pid/pages/Pid.vue b/src/modules/pid/pages/Pid.vue
index 2e4b3c7ed36c65a55840c78004f62745319f8f75..3e863c39311a7a757c59fda22c88e3fbe5a1d716 100644
--- a/src/modules/pid/pages/Pid.vue
+++ b/src/modules/pid/pages/Pid.vue
@@ -4,9 +4,9 @@
       class="container flex flex-col items-center px-5 py-12 mx-auto text-gray-600 body-font md:flex-row"
     >
       <div>
-        <CoscineHeadline :headline="$parent.$t('page.pid.title')" />
+        <CoscineHeadline :headline="$t('page.pid.title')" />
         <p class="mb-8 leading-relaxed dark:text-white">
-          {{ $parent.$t("page.pid.description") }}
+          {{ $t("page.pid.description") }}
         </p>
       </div>
     </section>
@@ -18,9 +18,9 @@ import { defineComponent } from "vue-demi";
 import CoscineHeadline from "@/components/CoscineHeadline.vue";
 
 // import the store for current module
-import { usePidStore } from "../store";
+import usePidStore from "../store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
diff --git a/src/modules/pid/routes.ts b/src/modules/pid/routes.ts
index 1b826cdcc0fb95c9324dea4495d4224942b54ebe..252c57d4e9ada14ebb833d5b0e13dabd59463fe0 100644
--- a/src/modules/pid/routes.ts
+++ b/src/modules/pid/routes.ts
@@ -3,10 +3,15 @@ import { RouteConfig } from "vue-router";
 const PidModule = () => import("./PidModule.vue");
 const Pid = () => import("./pages/Pid.vue");
 
+import { PidI18nMessages } from "@/modules/pid/i18n/index";
+
 export const PidRoutes: RouteConfig[] = [
   {
     path: "/pid/:pid",
     component: PidModule,
+    meta: {
+      i18n: PidI18nMessages,
+    },
     children: [
       {
         path: "/",
diff --git a/src/modules/project/ProjectModule.vue b/src/modules/project/ProjectModule.vue
index dd57b6002ce6323491250944caf36ede1121baec..3666440bc4ab0fe54f51c7c0957d01cff67a0fcc 100644
--- a/src/modules/project/ProjectModule.vue
+++ b/src/modules/project/ProjectModule.vue
@@ -6,13 +6,12 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import { ProjectI18nMessages } from "./i18n";
 
 // import the store for current module
-import { useProjectStore } from "./store";
-import { useResourceStore } from "@/modules/resource/store";
+import useProjectStore from "./store";
+import useResourceStore from "@/modules/resource/store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 import type { Route } from "vue-router";
@@ -25,7 +24,6 @@ export default defineComponent({
 
     return { mainStore, projectStore, resourceStore };
   },
-  i18n: { messages: ProjectI18nMessages },
 
   created() {
     this.initialize();
diff --git a/src/modules/project/RootProjectModule.vue b/src/modules/project/RootProjectModule.vue
index bf17c26cd05c086685c5d2f809bb6834fc4a2caa..47570e87ca1bfc0f0433ae24abf27c00d7c6a426 100644
--- a/src/modules/project/RootProjectModule.vue
+++ b/src/modules/project/RootProjectModule.vue
@@ -6,12 +6,11 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import { ProjectI18nMessages } from "./i18n";
 
 // import the store for current module
-import { useProjectStore } from "./store";
+import useProjectStore from "./store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
@@ -20,7 +19,6 @@ export default defineComponent({
 
     return { mainStore, projectStore };
   },
-  i18n: { messages: ProjectI18nMessages },
 
   created() {
     this.initialize();
diff --git a/src/modules/project/i18n/de.ts b/src/modules/project/i18n/de.ts
index 860a8fc5cabc5ee8ee951cc4945a60277d461046..c455e76fbd750d337405d455fde78b45a0f233e7 100644
--- a/src/modules/project/i18n/de.ts
+++ b/src/modules/project/i18n/de.ts
@@ -232,9 +232,9 @@ export default {
         "@:(form.project.projectKeywords)@:(form.project.labelSymbol)",
       tagPlaceholder: "Sie können diesen Tag hinzufügen",
 
-      projectVisibility: "Sichtbarkeit",
-      projectVisibilityLabel:
-        "@:(form.project.projectVisibility)@:(form.project.labelSymbol)",
+      projectMetadataVisibility: "Sichtbarkeit der Metadaten",
+      projectMetadataVisibilityLabel:
+        "@:(form.project.projectMetadataVisibility)@:(form.project.labelSymbol)",
 
       projectGrantId: "Grant ID",
       projectGrantIdHelp:
diff --git a/src/modules/project/i18n/en.ts b/src/modules/project/i18n/en.ts
index 3b0a52dfc0119de6382b917150d5cd35cbbc8c34..308050af07536f9f8e620342263f9c058fa60bb4 100644
--- a/src/modules/project/i18n/en.ts
+++ b/src/modules/project/i18n/en.ts
@@ -136,7 +136,7 @@ export default {
 
       connectionErrorTitle: "Resource quota retrieval not successfull",
       connectionErrorBody:
-        "An error occured while retrieving the resource type quota. Please try again. If the error persists, contact us at servicedesk@itc.rwth-aachen.de",
+        "An error occured while retrieving the resource type quota. Please try again. If the error persists, contact us at servicedesk@rwth-aachen.de",
 
       resourceTypeQuotaChangedSuccessTitle: "Quota extended successfully",
       resourceTypeQuotaChangedSuccessBody:
@@ -144,14 +144,14 @@ export default {
       resourceTypeQuotaChangedFailureTitle:
         "Resource quota extension not successfull",
       resourceTypeQuotaChangedFailureBody:
-        "An error occured while extending the resource type quota. Please try again. If the error persists, contact us at servicedesk@itc.rwth-aachen.de",
+        "An error occured while extending the resource type quota. Please try again. If the error persists, contact us at servicedesk@rwth-aachen.de",
 
       resourceQuotaChangedSuccessTitle: "Quota extended successfully",
       resourceQuotaChangedSuccessBody:
         "The quota for resource {ResourceName} was successfully extended to {AmountInGB} GB.",
       resourceQuotaChangedFailureTitle: "Quota extension not successfull",
       resourceQuotaChangedFailureBody:
-        "An error occured while extending the quota. Please try again. If the error persists, contact us at servicedesk@itc.rwth-aachen.de",
+        "An error occured while extending the quota. Please try again. If the error persists, contact us at servicedesk@rwth-aachen.de",
     },
 
     // Settíngs.vue
@@ -227,9 +227,9 @@ export default {
         "@:(form.project.projectKeywords)@:(form.project.labelSymbol)",
       tagPlaceholder: "You can add this tag",
 
-      projectVisibility: "Visibility",
-      projectVisibilityLabel:
-        "@:(form.project.projectVisibility)@:(form.project.labelSymbol)",
+      projectMetadataVisibility: "Metadata Visibility",
+      projectMetadataVisibilityLabel:
+        "@:(form.project.projectMetadataVisibility)@:(form.project.labelSymbol)",
 
       projectGrantId: "Grant ID",
       projectGrantIdHelp:
diff --git a/src/modules/project/pages/CreateProject.vue b/src/modules/project/pages/CreateProject.vue
index ae2dd23ffc8a3cd4ed59b2ce1991864ff069cb37..a138e27cec9b37090c100af1eb695c8bbaf7b14f 100644
--- a/src/modules/project/pages/CreateProject.vue
+++ b/src/modules/project/pages/CreateProject.vue
@@ -1,6 +1,6 @@
 <template>
-  <div id="project">
-    <CoscineHeadline :headline="$parent.$t('page.createProject.title')" />
+  <div id="createProject">
+    <CoscineHeadline :headline="$t('page.createProject.title')" />
     <b-row>
       <div class="col-sm-2" />
       <div class="col-sm-8">
@@ -13,7 +13,7 @@
             class="m-0"
           >
             <b-form-text id="AffiliationMessage">
-              {{ $parent.$t("page.createProject.affiliationMessage") }}
+              {{ $t("page.createProject.affiliationMessage") }}
             </b-form-text>
           </b-form-group>
 
@@ -47,15 +47,15 @@
                 isWaitingForResponse
               "
             >
-              {{ $parent.$t("buttons.submit") }}</b-button
+              {{ $t("buttons.submit") }}</b-button
             >
           </b-form-group>
         </b-form>
+
+        <!-- Loading Spinner on Submit -->
         <LoadingSpinner
           :isWaitingForResponse="isWaitingForResponse"
-          :textAfter="
-            $parent.$t('page.createProject.loadingSpinnerProjectCreation')
-          "
+          :textAfter="$t('page.createProject.loadingSpinnerProjectCreation')"
         />
       </div>
       <div class="col-sm-2" />
@@ -80,10 +80,10 @@ import type {
 } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 
 // import the store for current module
-import { useProjectStore } from "../store";
+import useProjectStore from "../store";
 // import the main store
-import { useMainStore } from "@/store/index";
-import { useResourceStore } from "@/modules/resource/store";
+import useMainStore from "@/store/index";
+import useResourceStore from "@/modules/resource/store";
 import { navigateToProject } from "@/router";
 
 export default defineComponent({
@@ -158,7 +158,7 @@ export default defineComponent({
       givenTitle = "Title",
       variant: string | undefined = undefined
     ) {
-      this.$bvToast.toast(text, {
+      this.$root.$bvToast.toast(text, {
         title: givenTitle,
         autoHideDelay: 5000,
         toaster: "b-toaster-bottom-right",
@@ -198,8 +198,8 @@ export default defineComponent({
         this.isWaitingForResponse = false;
         // On Failure
         this.makeToast(
-          this.$parent.$t("toast.onSave.failure.message").toString(),
-          this.$parent.$t("toast.onSave.failure.title").toString(),
+          this.$t("toast.onSave.failure.message").toString(),
+          this.$t("toast.onSave.failure.title").toString(),
           "danger"
         );
       }
diff --git a/src/modules/project/pages/ListProjects.vue b/src/modules/project/pages/ListProjects.vue
index aeb91ad6b8201bf62c8858c1e2fa0800792386af..536f2e4e90d26918cb6139c54e012b64e4ae1aca 100644
--- a/src/modules/project/pages/ListProjects.vue
+++ b/src/modules/project/pages/ListProjects.vue
@@ -1,10 +1,10 @@
 <template>
   <div id="project">
-    <CoscineHeadline :headline="$parent.$tc('page.listProjects.title', 0)" />
+    <CoscineHeadline :headline="$tc('page.listProjects.title', 0)" />
     <div class="list">
       <b-card-group deck>
         <CoscineCard
-          :title="$parent.$t('page.listProjects.addProject')"
+          :title="$t('page.listProjects.addProject')"
           type="create"
           :to="toCreateProject()"
           @open-card="openCreateProject($event)"
@@ -28,9 +28,9 @@ import { RawLocation } from "vue-router";
 import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 
 // import the store for current module
-import { useProjectStore } from "../store";
+import useProjectStore from "../store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
diff --git a/src/modules/project/pages/Members.vue b/src/modules/project/pages/Members.vue
index 57cd4a6b1ce0671f610c5899be25e9c2ff66c066..0791f1e36c677b10be76a3c3d627ee331cd9ecfb 100644
--- a/src/modules/project/pages/Members.vue
+++ b/src/modules/project/pages/Members.vue
@@ -1,6 +1,6 @@
 <template>
   <div id="users">
-    <CoscineHeadline :headline="$parent.$t('page.members.title')" />
+    <CoscineHeadline :headline="$t('page.members.title')" />
 
     <div class="UserManagement">
       <!-- Search Row  -->
@@ -17,7 +17,7 @@
         <b-col>
           <b-tabs content-class="mt-2">
             <!-- Project Members  -->
-            <b-tab :title="$parent.$t('page.members.membersTabTitle')">
+            <b-tab :title="$t('page.members.membersTabTitle')">
               <MembersTable
                 id="userTable"
                 :headers="memberHeaders"
@@ -25,10 +25,10 @@
                 :filter="filter"
                 :busy="isBusy"
                 :roles="roles"
-                :emptyText="$parent.$t('page.members.emptyTableText')"
-                :emptyFilteredText="$parent.$t('page.members.emptyFilterText')"
-                :deleteText="$parent.$t('buttons.delete')"
-                :removeText="$parent.$t('buttons.remove')"
+                :emptyText="$t('page.members.emptyTableText')"
+                :emptyFilteredText="$t('page.members.emptyFilterText')"
+                :deleteText="$t('buttons.delete')"
+                :removeText="$t('buttons.remove')"
                 :ownerCount="ownerCount"
                 :ownerRole="ownerRole"
                 @tableFilteredRows="onFilteredRows"
@@ -38,7 +38,7 @@
             </b-tab>
 
             <!-- Invited Users  -->
-            <b-tab :title="$parent.$t('page.members.externalUsersTabTitle')">
+            <b-tab :title="$t('page.members.externalUsersTabTitle')">
               <MembersTable
                 id="invitationTable"
                 :headers="invitationHeaders"
@@ -46,10 +46,10 @@
                 :filter="filter"
                 :busy="isBusy"
                 :roles="roles"
-                :emptyText="$parent.$t('page.members.emptyTableText')"
-                :emptyFilteredText="$parent.$t('page.members.emptyFilterText')"
-                :deleteText="$parent.$t('buttons.delete')"
-                :removeText="$parent.$t('buttons.remove')"
+                :emptyText="$t('page.members.emptyTableText')"
+                :emptyFilteredText="$t('page.members.emptyFilterText')"
+                :deleteText="$t('buttons.delete')"
+                :removeText="$t('buttons.remove')"
                 :ownerCount="ownerCount"
                 :ownerRole="ownerRole"
                 sort-by="email"
@@ -120,10 +120,10 @@ import InvitationPendingModal from "./components/modals/InvitationPendingModal.v
 import InviteUserModal from "./components/modals/InviteUserModal.vue";
 
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 // import the store for current module
-import { useProjectStore } from "../store";
-import { useUserStore } from "@/modules/user/store";
+import useProjectStore from "../store";
+import useUserStore from "@/modules/user/store";
 
 import type {
   InvitationReturnObject,
@@ -197,27 +197,27 @@ export default defineComponent({
       // header text react on language changes.
       return [
         {
-          label: this.$parent.$t("page.members.firstName"),
+          label: this.$t("page.members.firstName"),
           key: "user.givenname",
           sortable: true,
         },
         {
-          label: this.$parent.$t("page.members.lastName"),
+          label: this.$t("page.members.lastName"),
           key: "user.surname",
           sortable: true,
         },
         {
-          label: this.$parent.$t("page.members.email"),
+          label: this.$t("page.members.email"),
           key: "user.emailAddress",
           sortable: true,
         },
         {
-          label: this.$parent.$t("page.members.role"),
+          label: this.$t("page.members.role"),
           key: "role",
           sortable: true,
         },
         {
-          label: this.$parent.$t("page.members.actions"),
+          label: this.$t("page.members.actions"),
           key: "memberActions",
           sortable: true,
         },
@@ -228,22 +228,22 @@ export default defineComponent({
       // header text react on language changes.
       return [
         {
-          label: this.$parent.$t("page.members.email"),
+          label: this.$t("page.members.email"),
           key: "userMail",
           sortable: true,
         },
         {
-          label: this.$parent.$t("page.members.role"),
+          label: this.$t("page.members.role"),
           key: "roleId",
           sortable: true,
         },
         {
-          label: this.$parent.$t("page.members.status"),
+          label: this.$t("page.members.status"),
           key: "expiration",
           sortable: true,
         },
         {
-          label: this.$parent.$t("page.members.actions"),
+          label: this.$t("page.members.actions"),
           key: "invitationActions",
           sortable: true,
         },
@@ -284,12 +284,12 @@ export default defineComponent({
         await this.projectStore.retrieveInvitations(this.project);
         this.makeToast(
           toastText,
-          this.$parent.$t("page.members.userManagement").toString()
+          this.$t("page.members.userManagement").toString()
         );
       } catch {
         this.makeToast(
           errorText,
-          this.$parent.$t("page.members.userManagement").toString(),
+          this.$t("page.members.userManagement").toString(),
           "danger"
         );
       }
@@ -339,7 +339,7 @@ export default defineComponent({
           await this.projectStore.retrieveInvitations(this.project);
           this.makeToast(
             text,
-            this.$parent.$t("page.members.userManagement").toString()
+            this.$t("page.members.userManagement").toString()
           );
         } else {
           const errorMsg = this.$parent
@@ -350,7 +350,7 @@ export default defineComponent({
 
           this.makeToast(
             errorMsg,
-            this.$parent.$t("page.members.userManagement").toString(),
+            this.$t("page.members.userManagement").toString(),
             "danger"
           );
         }
@@ -396,10 +396,7 @@ export default defineComponent({
 
       await this.projectStore.storeProjectRole(projectRole);
       await this.getProjectRoles();
-      this.makeToast(
-        text,
-        this.$parent.$t("page.members.userManagement").toString()
-      );
+      this.makeToast(text, this.$t("page.members.userManagement").toString());
     },
 
     getRoleNameFromId(roleId: string): string | null | undefined {
@@ -435,10 +432,7 @@ export default defineComponent({
 
       await this.projectStore.storeProjectRole(projectRole);
       await this.getProjectRoles();
-      this.makeToast(
-        text,
-        this.$parent.$t("page.members.userManagement").toString()
-      );
+      this.makeToast(text, this.$t("page.members.userManagement").toString());
       if (callback) {
         callback();
       }
@@ -493,10 +487,7 @@ export default defineComponent({
         .toString();
       await this.projectStore.deleteProjectRole(this.candidateForDeletion);
       await this.getProjectRoles();
-      this.makeToast(
-        text,
-        this.$parent.$t("page.members.userManagement").toString()
-      );
+      this.makeToast(text, this.$t("page.members.userManagement").toString());
       this.isDeleteUserModalVisible = false;
     },
 
@@ -513,7 +504,7 @@ export default defineComponent({
     },
 
     makeToast(text = "Message", givenTitle = "Title", toastVariant = "") {
-      this.$bvToast.toast(text, {
+      this.$root.$bvToast.toast(text, {
         title: givenTitle,
         autoHideDelay: 5000,
         variant: toastVariant,
diff --git a/src/modules/project/pages/ProjectPage.vue b/src/modules/project/pages/ProjectPage.vue
index 1a8fa516e5d7cf9410dc848eeaef232e3ff798cc..a122dd17a8f01f3ee2f2bad8fa08bf331f34c51a 100644
--- a/src/modules/project/pages/ProjectPage.vue
+++ b/src/modules/project/pages/ProjectPage.vue
@@ -3,12 +3,12 @@
     <b-row align-h="between">
       <!-- Resources -->
       <b-col id="resources">
-        <CoscineHeadline :headline="$parent.$tc('page.project.resource', 2)" />
+        <CoscineHeadline :headline="$tc('page.project.resource', 2)" />
 
         <div class="list">
           <b-card-group deck>
             <CoscineCard
-              :title="$parent.$t('page.project.addResource')"
+              :title="$t('page.project.addResource')"
               type="create"
               :to="toCreateResource()"
               @open-card="openCreateResource($event)"
@@ -37,12 +37,12 @@
 
     <!-- Sub-Projects -->
     <div id="sub-projects">
-      <CoscineHeadline :headline="$parent.$tc('page.project.subProject', 0)" />
+      <CoscineHeadline :headline="$tc('page.project.subProject', 0)" />
 
       <div class="list">
         <b-card-group deck>
           <CoscineCard
-            :title="$parent.$t('page.listProjects.addProject')"
+            :title="$t('page.listProjects.addProject')"
             type="create"
             :to="toCreateSubProject()"
             @open-card="openCreateProject($event)"
@@ -71,10 +71,10 @@ import type {
 } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 
 // import the store for current module
-import { useProjectStore } from "../store";
+import useProjectStore from "../store";
 // import the main store
-import { useMainStore } from "@/store/index";
-import { useResourceStore } from "@/modules/resource/store";
+import useMainStore from "@/store/index";
+import useResourceStore from "@/modules/resource/store";
 
 export default defineComponent({
   setup() {
diff --git a/src/modules/project/pages/Quota.vue b/src/modules/project/pages/Quota.vue
index 6889db2bf3ad739174e98642e41c390c1e621347..2b1374e840835510660165ae109faa8695cbe2cf 100644
--- a/src/modules/project/pages/Quota.vue
+++ b/src/modules/project/pages/Quota.vue
@@ -3,14 +3,14 @@
     <b-row>
       <b-col>
         <!-- Quota Management -->
-        <CoscineHeadline :headline="$parent.$t('page.quota.headline')" />
+        <CoscineHeadline :headline="$t('page.quota.headline')" />
 
         <!-- Dropdowns Row -->
         <coscine-form-group>
           <b-row>
             <!-- Project Dropdown -->
             <b-col>
-              {{ $parent.$t("page.quota.projectLabel") }}
+              {{ $t("page.quota.projectLabel") }}
               <b-form-select
                 :options="projects"
                 value-field="id"
@@ -20,7 +20,7 @@
               >
                 <template #first>
                   <b-form-select-option :value="null" disabled>{{
-                    $parent.$t("page.quota.emptyProjectSelect")
+                    $t("page.quota.emptyProjectSelect")
                   }}</b-form-select-option>
                 </template>
               </b-form-select>
@@ -28,7 +28,7 @@
 
             <!-- Resource Type Dropdown -->
             <b-col>
-              {{ $parent.$t("page.quota.resourceTypeLabel") }}
+              {{ $t("page.quota.resourceTypeLabel") }}
               <b-form-select
                 v-model="selectedResourceTypeId"
                 :options="resourceTypesSorted"
@@ -37,7 +37,7 @@
               >
                 <template #first>
                   <b-form-select-option :value="null" disabled>{{
-                    $parent.$t("page.quota.emptyResourceTypeSelect")
+                    $t("page.quota.emptyResourceTypeSelect")
                   }}</b-form-select-option>
                 </template>
               </b-form-select>
@@ -50,9 +50,9 @@
           class="projectQuotaSlider"
           :label="
             selectedQuota.allocated +
-            $parent.$t('page.quota.rangeText1').toString() +
+            $t('page.quota.rangeText1').toString() +
             selectedQuota.maximum +
-            $parent.$t('page.quota.rangeText2').toString()
+            $t('page.quota.rangeText2').toString()
           "
           :disabled="
             selectedResourceTypeInformation &&
@@ -60,7 +60,7 @@
           "
         >
           <div class="rangeVisual">
-            {{ totalAllocatedSpace }}{{ $parent.$t("page.quota.gb") }}
+            {{ totalAllocatedSpace }}{{ $t("page.quota.gb") }}
             <b-form-input
               v-model="selectedQuota.allocated"
               type="range"
@@ -69,7 +69,7 @@
               :disabled="storingQuota"
               @change="changeProjectQuota"
             ></b-form-input>
-            {{ selectedQuota.maximum }}{{ $parent.$t("page.quota.gb") }}
+            {{ selectedQuota.maximum }}{{ $t("page.quota.gb") }}
           </div>
         </coscine-form-group>
 
@@ -78,17 +78,17 @@
           <b-col>
             <b-button
               class="float-right"
-              :href="$parent.$t('page.quota.moreHelpLink')"
+              :href="$t('page.quota.moreHelpLink')"
               target="_blank"
             >
-              {{ $parent.$t("page.quota.moreHelp") }}
+              {{ $t("page.quota.moreHelp") }}
             </b-button>
           </b-col>
         </b-row>
         <div class="h-divider" />
 
         <!-- Resources -->
-        <CoscineHeadline :headline="$parent.$t('page.quota.resources')" />
+        <CoscineHeadline :headline="$t('page.quota.resources')" />
 
         <!-- Resources Table -->
         <coscine-form-group>
@@ -99,33 +99,33 @@
             show-empty
             :empty-text="
               selectedResourceTypeId !== ''
-                ? $parent.$t('page.quota.emptyTableText')
-                : $parent.$t('page.quota.noResourceTypeChoosen')
+                ? $t('page.quota.emptyTableText')
+                : $t('page.quota.noResourceTypeChoosen')
             "
           >
             <!-- Resource (Name) Column Header -->
             <template #head(name)>
-              <span>{{ $parent.$t("page.quota.resource") }}</span>
+              <span>{{ $t("page.quota.resource") }}</span>
             </template>
 
             <!-- Reserved Column Header -->
             <template #head(allocated)>
-              <span>{{ $parent.$t("page.quota.allocated") }}</span>
+              <span>{{ $t("page.quota.allocated") }}</span>
             </template>
 
             <!-- Used Column Header -->
             <template #head(used)>
-              <span>{{ $parent.$t("page.quota.used") }}</span>
+              <span>{{ $t("page.quota.used") }}</span>
             </template>
 
             <!-- Adjust Quota Column Header -->
             <template #head(adjust)>
-              <span>{{ $parent.$t("page.quota.adjustQuota") }}</span>
+              <span>{{ $t("page.quota.adjustQuota") }}</span>
             </template>
 
             <!-- Reserved Cell Contents  -->
             <template #cell(allocated)="data">
-              {{ data.item.allocated }}{{ $parent.$t("page.quota.gb") }}
+              {{ data.item.allocated }}{{ $t("page.quota.gb") }}
             </template>
 
             <!-- Used Cell Contents -->
@@ -136,7 +136,7 @@
             <!-- Adjust Quota Slider Contents -->
             <template #cell(adjust)="data">
               <div class="rangeVisual">
-                {{ data.item.used }}{{ $parent.$t("page.quota.gb") }}
+                {{ data.item.used }}{{ $t("page.quota.gb") }}
                 <b-form-input
                   v-model="data.item.allocated"
                   type="range"
@@ -145,7 +145,7 @@
                   :disabled="storingQuota"
                   @change="changeResourceQuota(data.item)"
                 />
-                {{ data.item.maximum }}{{ $parent.$t("page.quota.gb") }}
+                {{ data.item.maximum }}{{ $t("page.quota.gb") }}
               </div>
             </template>
 
@@ -153,7 +153,7 @@
             <template #table-busy>
               <div class="text-center text-danger my-2">
                 <b-spinner class="align-middle"></b-spinner>
-                <strong>{{ $parent.$t("page.quota.loading") }}</strong>
+                <strong>{{ $t("page.quota.loading") }}</strong>
               </div>
             </template>
           </b-table>
@@ -167,10 +167,10 @@
 import { defineComponent } from "vue-demi";
 
 // import the store for current module
-import { useProjectStore } from "../store";
-import { useResourceStore } from "@/modules/resource/store";
+import useProjectStore from "../store";
+import useResourceStore from "@/modules/resource/store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 import type {
   ProjectObject,
@@ -221,7 +221,7 @@ export default defineComponent({
         // Ensure DisplayName
         sortedResourceTypes.forEach((resourceType) => {
           resourceType.displayName = this.$t(
-            "ResourceTypes." + resourceType.displayName + ".displayName"
+            "resourceTypes." + resourceType.displayName + ".displayName"
           ).toString();
         });
         sortedResourceTypes.sort(
@@ -304,12 +304,12 @@ export default defineComponent({
             this.project,
             this.selectedResourceTypeInformation
           );
-          if (result !== undefined) {
+          if (result) {
             this.resourceQuotas = result;
             this.calculateSpaceNeeds();
           }
         } catch {
-          console.error("Quotas cannot be received!");
+          console.error("Quotas cannot be retrieved!");
         } finally {
           this.loadingData = false;
         }
@@ -404,14 +404,14 @@ export default defineComponent({
     },
     makeToast(givenTitle = "Title", text = "Message", error = false) {
       if (error) {
-        this.$bvToast.toast(text, {
+        this.$root.$bvToast.toast(text, {
           title: givenTitle,
           noAutoHide: true,
           variant: "warning",
           toaster: "b-toaster-bottom-right",
         });
       } else {
-        this.$bvToast.toast(text, {
+        this.$root.$bvToast.toast(text, {
           title: givenTitle,
           toaster: "b-toaster-bottom-right",
           noCloseButton: true,
diff --git a/src/modules/project/pages/Settings.vue b/src/modules/project/pages/Settings.vue
index f2b73c51228b748a569801c5b775383e1d9cb447..a9fd4a1f15911bc5ab89b6237aa9ae37d33a3d5d 100644
--- a/src/modules/project/pages/Settings.vue
+++ b/src/modules/project/pages/Settings.vue
@@ -1,6 +1,6 @@
 <template>
   <div id="project">
-    <CoscineHeadline :headline="$parent.$t('sidebar.projectSettings')" />
+    <CoscineHeadline :headline="$t('sidebar.projectSettings')" />
     <b-row>
       <div class="col-sm-2" />
       <div class="col-sm-8">
@@ -38,7 +38,7 @@
                 isWaitingForResponse
               "
             >
-              {{ $parent.$t("buttons.submit") }}</b-button
+              {{ $t("buttons.submit") }}</b-button
             >
 
             <!-- Delete Button -->
@@ -48,7 +48,7 @@
               class="float-left"
               @click.prevent="isDeleteModalVisible = true"
             >
-              {{ $parent.$t("buttons.delete") }}</b-button
+              {{ $t("buttons.delete") }}</b-button
             >
           </b-form-group>
         </b-form>
@@ -57,8 +57,8 @@
         <DeleteProjectModal
           v-if="project"
           :open="isDeleteModalVisible"
-          @close="isDeleteModalVisible = false"
           :displayName="project.displayName"
+          @close="isDeleteModalVisible = false"
           @clickDelete="clickDelete"
         />
 
@@ -79,9 +79,9 @@ import FormMetadata from "./components/FormMetadata.vue";
 import DeleteProjectModal from "./components/modals/DeleteProjectModal.vue";
 
 // import the store for current module
-import { useProjectStore } from "../store";
+import useProjectStore from "../store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 import type {
   ProjectObject,
@@ -195,7 +195,7 @@ export default defineComponent({
       givenTitle = "Title",
       variant: string | undefined = undefined
     ) {
-      this.$bvToast.toast(text, {
+      this.$root.$bvToast.toast(text, {
         title: givenTitle,
         autoHideDelay: 5000,
         toaster: "b-toaster-bottom-right",
@@ -213,22 +213,19 @@ export default defineComponent({
           const parentProject = this.projectStore.currentParentProjects
             ? this.projectStore.currentParentProjects[0]
             : null;
-          // On Success
-          this.formValidations.naming.$reset();
-          this.formValidations.metadata.$reset();
           // Refresh the project information in the store
           await this.projectStore.refreshProjectInformation(parentProject);
           // Replace the current location with parent project or project list
-          navigateToProject(parentProject);
           this.makeToast(
-            this.$parent.$t("toast.onSave.success.message").toString(),
-            this.$parent.$t("toast.onSave.success.title").toString()
+            this.$t("toast.onDelete.success.message").toString(),
+            this.$t("toast.onDelete.success.title").toString()
           );
+          navigateToProject(parentProject);
         } else {
           // On Failure
           this.makeToast(
-            this.$parent.$t("toast.onSave.failure.message").toString(),
-            this.$parent.$t("toast.onSave.failure.title").toString(),
+            this.$t("toast.onDelete.failure.message").toString(),
+            this.$t("toast.onDelete.failure.title").toString(),
             "danger"
           );
         }
@@ -259,14 +256,14 @@ export default defineComponent({
         // Refresh the project information in the store
         await this.projectStore.refreshProjectInformation(this.project);
         this.makeToast(
-          this.$parent.$t("toast.onSave.success.message").toString(),
-          this.$parent.$t("toast.onSave.success.title").toString()
+          this.$t("toast.onSave.success.message").toString(),
+          this.$t("toast.onSave.success.title").toString()
         );
       } else {
         // On Failure
         this.makeToast(
-          this.$parent.$t("toast.onSave.failure.message").toString(),
-          this.$parent.$t("toast.onSave.failure.title").toString(),
+          this.$t("toast.onSave.failure.message").toString(),
+          this.$t("toast.onSave.failure.title").toString(),
           "danger"
         );
       }
diff --git a/src/modules/project/pages/components/FormMetadata.vue b/src/modules/project/pages/components/FormMetadata.vue
index 047a155660e52865ba616b9553ec369daf5b8aae..af92c2fc22390a1038fced1c16a33440d5a9e1e3 100644
--- a/src/modules/project/pages/components/FormMetadata.vue
+++ b/src/modules/project/pages/components/FormMetadata.vue
@@ -1,9 +1,7 @@
 <template>
   <div>
     <!-- Project Metadata Section -->
-    <CoscineHeadline
-      :headline="$parent.$parent.$t('form.project.activatedImportFromParent')"
-    />
+    <CoscineHeadline :headline="$t('form.project.activatedImportFromParent')" />
 
     <!-- Copy Metadata -->
     <coscine-form-group
@@ -11,7 +9,7 @@
       :mandatory="false"
       labelFor="CopyData"
       :label="
-        $parent.$parent.$t('form.project.copyMetadataLabel', {
+        $t('form.project.copyMetadataLabel', {
           project: parentProject.projectName,
         })
       "
@@ -26,7 +24,7 @@
         @click.prevent="copyMetadataFromParent"
         :disabled="disabled"
       >
-        {{ $parent.$parent.$t("buttons.copyMetadata") }}</b-button
+        {{ $t("buttons.copyMetadata") }}</b-button
       >
     </coscine-form-group>
 
@@ -34,9 +32,7 @@
     <coscine-form-group
       :mandatory="true"
       labelFor="PrincipleInvestigators"
-      :label="
-        $parent.$parent.$t('form.project.projectPrincipleInvestigatorsLabel')
-      "
+      :label="$t('form.project.projectPrincipleInvestigatorsLabel')"
       :isLoading="isLoading"
       type="input"
     >
@@ -48,9 +44,7 @@
             ? !$v.projectForm.principleInvestigators.$error
             : null
         "
-        :placeholder="
-          $parent.$parent.$t('form.project.projectPrincipleInvestigators')
-        "
+        :placeholder="$t('form.project.projectPrincipleInvestigators')"
         :maxlength="
           maxLengthFromValidation($v.projectForm.principleInvestigators)
         "
@@ -59,7 +53,7 @@
       />
       <div class="invalid-tooltip">
         {{
-          $parent.$parent.$t("form.project.projectPrincipleInvestigatorsHelp", {
+          $t("form.project.projectPrincipleInvestigatorsHelp", {
             maxLength: maxLengthFromValidation(
               $v.projectForm.principleInvestigators
             ),
@@ -72,7 +66,7 @@
     <coscine-form-group
       :mandatory="true"
       labelFor="StartDate"
-      :label="$parent.$parent.$t('form.project.projectStartLabel')"
+      :label="$t('form.project.projectStartLabel')"
       :isLoading="isLoading"
       type="input"
     >
@@ -89,7 +83,7 @@
         required
         calendar-width="100%"
         start-weekday="1"
-        :placeholder="$parent.$parent.$t('form.project.projectStart')"
+        :placeholder="$t('form.project.projectStart')"
       />
     </coscine-form-group>
 
@@ -97,7 +91,7 @@
     <coscine-form-group
       :mandatory="true"
       labelFor="EndDate"
-      :label="$parent.$parent.$t('form.project.projectEndLabel')"
+      :label="$t('form.project.projectEndLabel')"
       :isLoading="isLoading"
       type="input"
     >
@@ -113,7 +107,7 @@
         required
         calendar-width="100%"
         start-weekday="1"
-        :placeholder="$parent.$parent.$t('form.project.projectEnd')"
+        :placeholder="$t('form.project.projectEnd')"
       />
     </coscine-form-group>
 
@@ -121,7 +115,7 @@
     <coscine-form-group
       :mandatory="true"
       labelFor="Discipline"
-      :label="$parent.$parent.$t('form.project.projectDisciplineLabel')"
+      :label="$t('form.project.projectDisciplineLabel')"
       :isLoading="isLoading"
       type="input"
     >
@@ -134,7 +128,7 @@
         :hide-selected="true"
         :label="disciplineLabel"
         :track-by="disciplineLabel"
-        :placeholder="$parent.$parent.$t('form.project.projectDiscipline')"
+        :placeholder="$t('form.project.projectDiscipline')"
       >
         <template #singleLabel(props)>
           <div :disabled="disabled">
@@ -153,7 +147,7 @@
     <coscine-form-group
       :mandatory="true"
       labelFor="Organization"
-      :label="$parent.$parent.$t('form.project.projectOrganizationLabel')"
+      :label="$t('form.project.projectOrganizationLabel')"
       :isLoading="isLoading"
       type="input"
     >
@@ -167,7 +161,7 @@
         :hide-selected="true"
         label="displayName"
         track-by="url"
-        :placeholder="$parent.$parent.$t('form.project.projectOrganization')"
+        :placeholder="$t('form.project.projectOrganization')"
         @search-change="retrieveOrganizations"
       >
         <template #singleLabel(props)>
@@ -181,10 +175,10 @@
           </div>
         </template>
         <template #noOptions>
-          {{ $parent.$parent.$t("form.project.projectOrganizationNoOptions") }}
+          {{ $t("form.project.projectOrganizationNoOptions") }}
         </template>
         <template #noResult>
-          {{ $parent.$parent.$t("form.project.projectOrganizationNoResult") }}
+          {{ $t("form.project.projectOrganizationNoResult") }}
         </template>
       </multiselect>
     </coscine-form-group>
@@ -192,7 +186,7 @@
     <!-- Project Keywords -->
     <coscine-form-group
       labelFor="Keywords"
-      :label="$parent.$parent.$t('form.project.projectKeywordsLabel')"
+      :label="$t('form.project.projectKeywordsLabel')"
       :isLoading="isLoading"
       type="input"
     >
@@ -201,26 +195,24 @@
         v-model="selectedKeyword"
         :disabled="disabled"
         :options="selectedKeyword"
-        :placeholder="
-          $parent.$parent.$t('form.project.projectKeywordsPlaceholder')
-        "
+        :placeholder="$t('form.project.projectKeywordsPlaceholder')"
         :multiple="true"
         :taggable="true"
         :max="limitKeywords(selectedKeyword)"
-        :tag-placeholder="$parent.$parent.$t('form.project.tagPlaceholder')"
+        :tag-placeholder="$t('form.project.tagPlaceholder')"
         @tag="addTag"
         @remove="$v.projectForm.keywords.$touch()"
       >
         <template #maxElements>
           {{
-            $parent.$parent.$t("form.project.projectKeywordsHelp", {
+            $t("form.project.projectKeywordsHelp", {
               maxLength: maxLengthFromValidation($v.projectForm.keywords),
             })
           }}
         </template>
         <template #noOptions>
           {{
-            $parent.$parent.$t("form.project.projectKeywordsEmpty", {
+            $t("form.project.projectKeywordsEmpty", {
               maxLength: maxLengthFromValidation($v.projectForm.keywords),
             })
           }}
@@ -232,7 +224,7 @@
     <coscine-form-group
       :mandatory="true"
       labelFor="Visibility"
-      :label="$parent.$parent.$t('form.project.projectVisibilityLabel')"
+      :label="$t('form.project.projectMetadataVisibilityLabel')"
       :isLoading="isLoading"
       type="input"
     >
@@ -245,13 +237,13 @@
         value-field="id"
         stacked
         :disabled="disabled"
-      ></b-form-radio-group>
+      />
     </coscine-form-group>
 
     <!-- Grant ID -->
     <coscine-form-group
       labelFor="GrantId"
-      :label="$parent.$parent.$t('form.project.projectGrantIdLabel')"
+      :label="$t('form.project.projectGrantIdLabel')"
       :isLoading="isLoading"
       type="input"
     >
@@ -261,14 +253,14 @@
         :state="
           $v.projectForm.grantId.$dirty ? !$v.projectForm.grantId.$error : null
         "
-        :placeholder="$parent.$parent.$t('form.project.projectGrantId')"
+        :placeholder="$t('form.project.projectGrantId')"
         :maxlength="maxLengthFromValidation($v.projectForm.grantId)"
         required
         :disabled="disabled"
       />
       <div class="invalid-tooltip">
         {{
-          $parent.$parent.$t("form.project.projectGrantIdHelp", {
+          $t("form.project.projectGrantIdHelp", {
             maxLength: maxLengthFromValidation($v.projectForm.grantId),
           })
         }}
@@ -292,9 +284,9 @@ import type {
 } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 
 // import the store for current module
-import { useProjectStore } from "../../store";
+import useProjectStore from "../../store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
@@ -367,7 +359,6 @@ export default defineComponent({
     return {
       projectForm: this.value,
       isLoadingOrganizations: false,
-      disciplineLabel: "displayNameEn",
       selectedKeyword: [] as Array<string>,
       selectedVisibility: "" as string | undefined,
       queryTimer: 0,
@@ -387,6 +378,11 @@ export default defineComponent({
     disciplines(): DisciplineObject[] {
       return this.projectStore.disciplines ?? [];
     },
+    disciplineLabel(): string {
+      let locale = this.$root.$i18n.locale;
+      locale = locale.charAt(0).toUpperCase() + locale.slice(1);
+      return `displayName${locale}`;
+    },
   },
 
   emits: {
@@ -400,7 +396,7 @@ export default defineComponent({
       this.onProjectLoaded();
     },
     visibilities() {
-      // Used in Create Project
+      // Used in Project Create
       if (!this.currentProject) {
         this.setDefaultVisibility();
       }
@@ -428,7 +424,7 @@ export default defineComponent({
     "projectForm.organizations"() {
       this.getLabels();
     },
-    value: {
+    projectForm: {
       handler() {
         this.$emit("validation", this.$v.projectForm);
       },
diff --git a/src/modules/project/pages/components/FormNaming.vue b/src/modules/project/pages/components/FormNaming.vue
index e37d477417ceb5ce522465e06ccac9cc3c8ec045..e2be4519bdb0f1fe21f6473ffdb35f21b264de7a 100644
--- a/src/modules/project/pages/components/FormNaming.vue
+++ b/src/modules/project/pages/components/FormNaming.vue
@@ -4,7 +4,7 @@
     <CoscineFormGroup
       :mandatory="true"
       labelFor="ProjectName"
-      :label="$parent.$parent.$t('form.project.projectNameLabel')"
+      :label="$t('form.project.projectNameLabel')"
       :isLoading="isLoading"
       type="input"
     >
@@ -17,14 +17,14 @@
             ? !$v.projectForm.projectName.$error
             : null
         "
-        :placeholder="$parent.$parent.$t('form.project.projectName')"
+        :placeholder="$t('form.project.projectName')"
         :maxlength="maxLengthFromValidation($v.projectForm.projectName)"
         required
         :disabled="disabled"
       />
       <div class="invalid-tooltip">
         {{
-          $parent.$parent.$t("form.project.projectNameHelp", {
+          $t("form.project.projectNameHelp", {
             maxLength: maxLengthFromValidation($v.projectForm.projectName),
           })
         }}
@@ -35,7 +35,7 @@
     <CoscineFormGroup
       :mandatory="true"
       labelFor="DisplayName"
-      :label="$parent.$parent.$t('form.project.displayNameLabel')"
+      :label="$t('form.project.displayNameLabel')"
       :isLoading="isLoading"
       type="input"
     >
@@ -48,14 +48,14 @@
             ? !$v.projectForm.displayName.$error
             : null
         "
-        :placeholder="$parent.$parent.$t('form.project.displayName')"
+        :placeholder="$t('form.project.displayName')"
         :maxlength="maxLengthFromValidation($v.projectForm.displayName)"
         required
         :disabled="disabled"
       />
       <div class="invalid-tooltip">
         {{
-          $parent.$parent.$t("form.project.displayNameHelp", {
+          $t("form.project.displayNameHelp", {
             maxLength: maxLengthFromValidation($v.projectForm.displayName),
           })
         }}
@@ -66,7 +66,7 @@
     <CoscineFormGroup
       :mandatory="true"
       labelFor="Description"
-      :label="$parent.$parent.$t('form.project.projectDescriptionLabel')"
+      :label="$t('form.project.projectDescriptionLabel')"
       :isLoading="isLoading"
       type="input"
     >
@@ -78,14 +78,14 @@
             ? !$v.projectForm.description.$error
             : null
         "
-        :placeholder="$parent.$parent.$t('form.project.projectDescription')"
+        :placeholder="$t('form.project.projectDescription')"
         :maxlength="maxLengthFromValidation($v.projectForm.description)"
         required
         :disabled="disabled"
       />
       <div class="invalid-tooltip">
         {{
-          $parent.$parent.$t("form.project.projectDescriptionHelp", {
+          $t("form.project.projectDescriptionHelp", {
             maxLength: maxLengthFromValidation($v.projectForm.description),
           })
         }}
diff --git a/src/modules/project/pages/components/MembersList.vue b/src/modules/project/pages/components/MembersList.vue
index e8c2fe8b1fced3a008a4314a54c09cd6fda9c113..540f88afbc6ec61b94c7fa7dd4530dbb8aeeeb65 100644
--- a/src/modules/project/pages/components/MembersList.vue
+++ b/src/modules/project/pages/components/MembersList.vue
@@ -1,8 +1,6 @@
 <template>
   <div>
-    <CoscineHeadline
-      :headline="$parent.$parent.$tc('page.project.member', 2)"
-    />
+    <CoscineHeadline :headline="$tc('page.project.member', 2)" />
     <!-- Members -->
     <div class="list">
       <div class="user-complete-name-list container-fluid">
@@ -37,8 +35,8 @@
               v-b-tooltip.hover.bottom
               :title="
                 ownerCount < 2 && isOwner
-                  ? $parent.$parent.$t('page.project.members.tooltipDisabled')
-                  : $parent.$parent.$t('page.project.members.tooltip')
+                  ? $t('page.project.members.tooltipDisabled')
+                  : $t('page.project.members.tooltip')
               "
               >{{ $t("buttons.leave") }}</b-button
             >
@@ -49,7 +47,7 @@
       <!-- Manage Members Link -->
       <div v-if="isOwner" class="mt-2">
         <router-link :to="{ name: 'project-members' }">
-          {{ $parent.$parent.$t("page.project.members.toProjectMembers") }}
+          {{ $t("page.project.members.toProjectMembers") }}
         </router-link>
       </div>
 
@@ -59,7 +57,7 @@
         v-model="leaveModal"
         hide-footer
         :title="
-          $parent.$parent.$t('page.project.members.modal.title', {
+          $t('page.project.members.modal.title', {
             name: project.displayName,
           })
         "
@@ -67,7 +65,7 @@
         <!-- Leave Modal Body -->
         <div class="mb-3">
           {{
-            $parent.$parent.$t("page.project.members.modal.body", {
+            $t("page.project.members.modal.body", {
               name: project.displayName,
             })
           }}
@@ -80,10 +78,10 @@
           @click="leaveModal = false"
           ref="modalLeaveProjectCancel"
           autofocus
-          >{{ $parent.$parent.$t("buttons.cancel") }}</b-button
+          >{{ $t("buttons.cancel") }}</b-button
         >
         <b-button class="float-Left" variant="danger" @click="leaveProject">{{
-          $parent.$parent.$t("buttons.leave")
+          $t("buttons.leave")
         }}</b-button>
       </b-modal>
     </div>
@@ -100,10 +98,10 @@ import type {
 } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 
 // import the store for current module
-import { useProjectStore } from "../../store";
+import useProjectStore from "../../store";
 // import the main store
-import { useMainStore } from "@/store/index";
-import { useUserStore } from "@/modules/user/store";
+import useMainStore from "@/store/index";
+import useUserStore from "@/modules/user/store";
 
 export default defineComponent({
   setup() {
diff --git a/src/modules/project/pages/components/MembersTable.vue b/src/modules/project/pages/components/MembersTable.vue
index c8106b8ece61fd5380534085d68c72ec634af260..29d748c6a610bd95f52b483f754afed10efaa3e3 100644
--- a/src/modules/project/pages/components/MembersTable.vue
+++ b/src/modules/project/pages/components/MembersTable.vue
@@ -99,7 +99,7 @@
             size="sm"
             @click="resendInvitation(selectedInvitation.item)"
             :disabled="!checkExpiration(selectedInvitation.item.expiration)"
-            >{{ $parent.$parent.$parent.$parent.$t("buttons.resend") }}
+            >{{ $t("buttons.resend") }}
           </b-button>
         </div>
       </template>
@@ -205,13 +205,9 @@ export default defineComponent({
     },
     getStatus(expiration: string) {
       if (this.checkExpiration(expiration)) {
-        return this.$parent.$parent.$parent.$parent.$t(
-          "page.members.expiredStatus"
-        );
+        return this.$t("page.members.expiredStatus");
       } else {
-        return this.$parent.$parent.$parent.$parent.$t(
-          "page.members.pendingStatus"
-        );
+        return this.$t("page.members.pendingStatus");
       }
     },
     revokeInvitation(selectedInvitation: InvitationReturnObject) {
diff --git a/src/modules/project/pages/components/UserSearchRow.vue b/src/modules/project/pages/components/UserSearchRow.vue
index 2dfe5c9388d76d4fd8fb68b03aafeaae864254ea..180d78e32b52416b2ee15acb97a4e3e5d783604b 100644
--- a/src/modules/project/pages/components/UserSearchRow.vue
+++ b/src/modules/project/pages/components/UserSearchRow.vue
@@ -7,9 +7,7 @@
           <b-col sm="5" @keydown.enter.prevent.self="" id="firstCol">
             <v-select
               v-model="selectedAddingUser"
-              :placeholder="
-                $parent.$parent.$t('page.members.searchUserPlaceholder')
-              "
+              :placeholder="$t('page.members.searchUserPlaceholder')"
               :class="{
                 adaptSelect: true,
                 'no-results': queriedUsers.length === 0,
@@ -22,24 +20,22 @@
               label="displayName"
             >
               <template v-if="searchString === ''" slot="no-options">
-                {{ $parent.$parent.$t("page.members.pleaseTypeSomething") }}
+                {{ $t("page.members.pleaseTypeSomething") }}
               </template>
               <template v-else-if="validEmail" slot="no-options">
-                {{ $parent.$parent.$t("page.members.searchEmailInvite") }}
+                {{ $t("page.members.searchEmailInvite") }}
               </template>
               <template v-else-if="searchString.length < 3" slot="no-options">
-                {{
-                  $parent.$parent.$t("page.members.searchNotEnoughCharacters")
-                }}
+                {{ $t("page.members.searchNotEnoughCharacters") }}
               </template>
               <template v-else slot="no-options">
-                {{ $parent.$parent.$t("page.members.noUserOptions") }}
+                {{ $t("page.members.noUserOptions") }}
               </template>
               <template slot="option" slot-scope="option">
                 <div class="d-center">
                   <span v-if="validEmail">
                     {{
-                      $parent.$parent.$t("page.members.inviteUserCaption", {
+                      $t("page.members.inviteUserCaption", {
                         displayName: option.displayName,
                       })
                     }}
@@ -48,7 +44,7 @@
                     {{ option.displayName }}
                   </span>
                   <span v-if="option.hasProjectRole">{{
-                    $parent.$parent.$t("page.members.alreadyGotRole")
+                    $t("page.members.alreadyGotRole")
                   }}</span>
                 </div>
               </template>
@@ -86,7 +82,7 @@
               name="inviteUserToProject"
               @click="prepareInvitation(newUserRole)"
               :disabled="!validInvitation"
-              >{{ $parent.$parent.$t("buttons.invite") }}</b-button
+              >{{ $t("buttons.invite") }}</b-button
             >
             <!-- Import -->
             <b-button
@@ -94,12 +90,12 @@
               name="addUserToProject"
               @click="addUser(newUserRole)"
               :disabled="!validSelection"
-              >{{ $parent.$parent.$t("buttons.addUser") }}</b-button
+              >{{ $t("buttons.addUser") }}</b-button
             >
             <b-button
               name="importUser"
               @click="$bvModal.show('importUserModal')"
-              >{{ $parent.$parent.$t("buttons.import") }}</b-button
+              >{{ $t("buttons.import") }}</b-button
             >
           </b-col>
         </b-row>
@@ -118,7 +114,7 @@
           type="search"
           id="filterInput"
           @input="setFilter"
-          :placeholder="$parent.$parent.$t('page.members.typeToSearch')"
+          :placeholder="$t('page.members.typeToSearch')"
         ></b-form-input>
       </b-input-group>
     </b-col>
@@ -134,7 +130,7 @@ import "vue-select/dist/vue-select.css";
 
 Vue.component("v-select", vSelect);
 
-import { useUserStore } from "@/modules/user/store";
+import useUserStore from "@/modules/user/store";
 
 import type {
   ProjectObject,
diff --git a/src/modules/project/pages/components/modals/DeleteModal.vue b/src/modules/project/pages/components/modals/DeleteModal.vue
index 6456c1d7881ace53cfa8a94badfc98aec3d190a1..75518c90d7c26595c40809850bc864d74080dbf5 100644
--- a/src/modules/project/pages/components/modals/DeleteModal.vue
+++ b/src/modules/project/pages/components/modals/DeleteModal.vue
@@ -2,17 +2,17 @@
   <div>
     <b-modal
       :visible="visible"
-      :title="$parent.$parent.$t(titleKey)"
+      :title="$t(titleKey)"
       ok-variant="danger"
-      :ok-title="$parent.$parent.$t('buttons.delete')"
-      :cancel-title="$parent.$parent.$t('buttons.cancel')"
+      :ok-title="$t('buttons.delete')"
+      :cancel-title="$t('buttons.cancel')"
       @hidden="$emit('close', $event.target.value)"
       @ok="$emit('ok', $event.target.value)"
       @cancel="$emit('close', $event.target.value)"
     >
       <div
         v-html="
-          $parent.$parent.$t(descriptionKey, {
+          $t(descriptionKey, {
             user: selectedUser,
             projectName: selectedProject,
           })
diff --git a/src/modules/project/pages/components/modals/DeleteProjectModal.vue b/src/modules/project/pages/components/modals/DeleteProjectModal.vue
index 78f7e70e505778faea5847135c4c5e1620f0f831..e5963bb0fd315806629a84ae678812f2d4de2f92 100644
--- a/src/modules/project/pages/components/modals/DeleteProjectModal.vue
+++ b/src/modules/project/pages/components/modals/DeleteProjectModal.vue
@@ -6,10 +6,15 @@
     @close="close"
     @hidden="hidden"
     :hide-footer="true"
-    :title="$parent.$parent.$t(titleKey)"
   >
+    <!-- Title -->
+    <template #modal-title>
+      <span class="h6"> {{ $t(titleKey) }} </span>
+    </template>
+
+    <!-- Body -->
     <div>
-      {{ $parent.$parent.$t(descriptionKey) }}
+      {{ $t(descriptionKey) }}
     </div>
 
     <b-form-group>
@@ -21,13 +26,13 @@
       <!-- Modal Input Text Field -->
       <b-form-input
         v-model="deleteName"
-        :state="deleteName ? deleteName === displayName : null"
+        :state="nameValid"
         :placeholder="displayName"
         required
         @keyup.enter.prevent="clickDelete"
       ></b-form-input>
       <div class="invalid-tooltip">
-        {{ $parent.$parent.$t("page.settings.modal.deleteModalHelp") }}
+        {{ $t("page.settings.modal.deleteModalHelp") }}
       </div>
     </b-form-group>
 
@@ -39,7 +44,7 @@
         @click="clickDelete"
         variant="danger"
         class="float-right"
-        :disabled="deleteName !== displayName"
+        :disabled="!nameValid"
         >{{ $t("buttons.delete") }}</b-button
       >
     </template>
@@ -79,6 +84,14 @@ export default defineComponent({
     };
   },
 
+  computed: {
+    nameValid(): boolean | null {
+      return this.deleteName && this.displayName
+        ? this.deleteName.trim() === this.displayName.trim()
+        : null;
+    },
+  },
+
   watch: {
     open() {
       this.isOpen = this.open;
@@ -93,11 +106,16 @@ export default defineComponent({
       this.$emit("close");
     },
     clickDelete() {
-      if (this.deleteName === this.displayName) {
+      if (this.nameValid) {
         this.$emit("clickDelete");
       }
     },
   },
+
+  emits: {
+    clickDelete: null,
+    close: null,
+  },
 });
 </script>
 
diff --git a/src/modules/project/pages/components/modals/ImportUserModal.vue b/src/modules/project/pages/components/modals/ImportUserModal.vue
index 08c55e0898c6037275ccab95ee8893b460873e7e..148ab409092bf2b7d8d64dacbf3890ba39c74326 100644
--- a/src/modules/project/pages/components/modals/ImportUserModal.vue
+++ b/src/modules/project/pages/components/modals/ImportUserModal.vue
@@ -1,7 +1,7 @@
 <template>
   <b-modal
     id="importUserModal"
-    :title="$parent.$parent.$t('page.members.importUserTitle')"
+    :title="$t('page.members.importUserTitle')"
     @hidden="resetModal"
     size="lg"
     hide-footer
@@ -12,7 +12,7 @@
         <b-form-select v-model="selectedProject" @change="getProjectRoles">
           <template #first>
             <b-form-select-option :value="null" disabled>{{
-              $parent.$parent.$t("page.members.searchProjectPlaceholder")
+              $t("page.members.searchProjectPlaceholder")
             }}</b-form-select-option>
           </template>
           <b-form-select-option
@@ -37,11 +37,9 @@
             :headers="memberHeaders"
             :items="additionalMembers"
             :roles="roles"
-            :emptyText="$parent.$parent.$t('page.members.emptyImportTableText')"
-            :emptyFilteredText="
-              $parent.$parent.$t('page.members.emptyImportTableFilterText')
-            "
-            :removeText="$parent.$parent.$t('page.members.removeUser')"
+            :emptyText="$t('page.members.emptyImportTableText')"
+            :emptyFilteredText="$t('page.members.emptyImportTableFilterText')"
+            :removeText="$t('page.members.removeUser')"
             @selectedItem="removeSelectedRow"
           />
         </div>
@@ -58,7 +56,7 @@
             name="importUsers"
             @click="importUser"
             :disabled="additionalMembers.length === 0"
-            >{{ $parent.$parent.$t("buttons.import") }}</b-button
+            >{{ $t("buttons.import") }}</b-button
           >
         </div>
       </b-col>
@@ -71,7 +69,7 @@
 <script lang="ts">
 import { defineComponent, PropType } from "vue-demi";
 
-import { useProjectStore } from "../../../store";
+import useProjectStore from "../../../store";
 
 import MembersTable from "../MembersTable.vue";
 
diff --git a/src/modules/project/pages/components/modals/InvitationPendingModal.vue b/src/modules/project/pages/components/modals/InvitationPendingModal.vue
index 82c7142cb6a5d412f1cc96b6a71b9a29110f5bf2..74493cec37b047e37e4905a75885b31cc6c068c7 100644
--- a/src/modules/project/pages/components/modals/InvitationPendingModal.vue
+++ b/src/modules/project/pages/components/modals/InvitationPendingModal.vue
@@ -1,24 +1,24 @@
 <template>
   <b-modal
     id="invitationPendingModal"
-    :title="$parent.$parent.$t('page.members.inviteUserTitle')"
+    :title="$t('page.members.inviteUserTitle')"
     :hide-footer="true"
   >
     <ul>
       <li
         v-html="
-          $parent.$parent.$t('page.members.invitationPendingTextTop', {
+          $t('page.members.invitationPendingTextTop', {
             email: candidateForInvitation.email,
           })
         "
       ></li>
       <li>
-        {{ $parent.$parent.$t("page.members.invitationPendingTextBottom") }}
+        {{ $t("page.members.invitationPendingTextBottom") }}
       </li>
     </ul>
     <br />
     <b-button @click="$bvModal.hide('invitationPendingModal')">{{
-      $parent.$parent.$t("buttons.cancel")
+      $t("buttons.cancel")
     }}</b-button>
   </b-modal>
 </template>
diff --git a/src/modules/project/pages/components/modals/InviteUserModal.vue b/src/modules/project/pages/components/modals/InviteUserModal.vue
index d14bef5f832041b838feb92e0aa7a2b530b43c8a..0854a6a00d04e0cecbd3bc7742dd19eb8e2516fc 100644
--- a/src/modules/project/pages/components/modals/InviteUserModal.vue
+++ b/src/modules/project/pages/components/modals/InviteUserModal.vue
@@ -1,14 +1,14 @@
 <template>
   <b-modal
     id="inviteUserModal"
-    :title="$parent.$parent.$t('page.members.inviteUserTitle')"
+    :title="$t('page.members.inviteUserTitle')"
     :hide-footer="true"
   >
     <!-- Body Text - New Invitation -->
     <div
       v-if="candidateForInvitation && !candidateForInvitation.invited"
       v-html="
-        $parent.$parent.$t('page.members.inviteUserText', {
+        $t('page.members.inviteUserText', {
           email: candidateForInvitation.email,
           role: getRoleNameFromId(candidateForInvitation.role),
           projectName: projectName,
@@ -20,7 +20,7 @@
     <div
       v-else-if="candidateForInvitation && candidateForInvitation.invited"
       v-html="
-        $parent.$parent.$t('page.members.existingEmailInvitation', {
+        $t('page.members.existingEmailInvitation', {
           email: candidateForInvitation.email,
         })
       "
@@ -37,8 +37,8 @@
       >
         {{
           !candidateForInvitation.invited
-            ? $parent.$parent.$t("page.members.inviteUser")
-            : $parent.$parent.$t("page.members.reInviteUser")
+            ? $t("page.members.inviteUser")
+            : $t("page.members.reInviteUser")
         }}
       </b-button>
 
@@ -48,7 +48,7 @@
         variant="secondary"
         @click="$bvModal.hide('inviteUserModal')"
       >
-        {{ $parent.$parent.$t("buttons.cancel") }}
+        {{ $t("buttons.cancel") }}
       </b-button>
     </div>
   </b-modal>
@@ -86,7 +86,7 @@ export default defineComponent({
       }
     },
     inviteUser() {
-      const text = this.$parent.$parent
+      const text = this.$parent
         .$t("page.members.invitedUserText", {
           email: this.candidateForInvitation.email,
           role: this.candidateForInvitation.role
@@ -95,7 +95,7 @@ export default defineComponent({
           projectName: this.projectName,
         })
         .toString();
-      const errorText = this.$parent.$parent
+      const errorText = this.$parent
         .$t("page.members.invitedUserError", {
           email: this.candidateForInvitation.email,
         })
diff --git a/src/modules/project/routes.ts b/src/modules/project/routes.ts
index 52b2a179fb1afb648cbf311dc36104245d331f8a..8a9c82bb01ce28afb98eaf8555b78e28a3de56d9 100644
--- a/src/modules/project/routes.ts
+++ b/src/modules/project/routes.ts
@@ -10,11 +10,15 @@ const Members = () => import("./pages/Members.vue");
 const Settings = () => import("./pages/Settings.vue");
 
 import { ResourceRoutes } from "@/modules/resource/routes";
+import { ProjectI18nMessages } from "@/modules/project/i18n/index";
 
 export const ProjectRoutes: RouteConfig[] = [
   {
     path: "/",
     component: RootProjectModule,
+    meta: {
+      i18n: ProjectI18nMessages,
+    },
     children: [
       {
         path: "/",
@@ -41,6 +45,7 @@ export const ProjectRoutes: RouteConfig[] = [
     meta: {
       breadCrumb: "project.page",
       default: "project-page",
+      i18n: ProjectI18nMessages,
     },
     children: [
       {
diff --git a/src/modules/project/store.ts b/src/modules/project/store.ts
index 66b5b07de3953ee2d1456188647ae2490e545fe5..78d963ef0556f2c60ecd4f6a0a054ea75712b353 100644
--- a/src/modules/project/store.ts
+++ b/src/modules/project/store.ts
@@ -14,6 +14,7 @@ import {
   RoleApi,
   SubProjectApi,
   VisibilityApi,
+  LicenseApi,
 } from "@coscine/api-client";
 import type {
   OrganizationObject,
@@ -32,6 +33,7 @@ import type {
   UpdateResourceObject,
 } from "@coscine/api-client/dist/types/Coscine.Api.Quota";
 import type { Route } from "vue-router";
+import { updatedDiff } from "deep-object-diff";
 
 import useUserStore from "../user/store";
 
@@ -54,6 +56,7 @@ export const useProjectStore = defineStore({
     topLevelProjects: null,
 
     disciplines: null,
+    licenses: null,
     organizations: null,
     roles: null,
     visibilities: null,
@@ -70,11 +73,8 @@ export const useProjectStore = defineStore({
   */
   getters: {
     currentProject(): ProjectObject | null {
-      if (this.currentSlug && this.allProjects) {
-        const project = this.allProjects?.find(
-          (p) => p.slug === this.currentSlug
-        );
-        return project ? project : null;
+      if (this.currentSlug && this.visitedProjects[this.currentSlug]) {
+        return this.visitedProjects[this.currentSlug];
       } else {
         return null;
       }
@@ -256,7 +256,9 @@ export const useProjectStore = defineStore({
       if (project && project.id && project.slug) {
         const apiResponse = await ProjectApi.projectGetResources(project.id);
         if (apiResponse.status === StatusCodes.OK) {
-          this.visitedProjects[project.slug].resources = apiResponse.data;
+          this.visitedProjects[project.slug].resources = reactive(
+            apiResponse.data
+          );
         } else {
           // Handle other Status Codes
         }
@@ -291,7 +293,7 @@ export const useProjectStore = defineStore({
     async getResourceQuotas(
       project: ProjectObject,
       resourceType: ResourceTypeInformation
-    ) {
+    ): Promise<ResourceQuota[] | undefined> {
       if (project.id && resourceType.id) {
         const apiResponse = await QuotaApi.quotaGetResourceQuotas(
           project.id,
@@ -303,9 +305,27 @@ export const useProjectStore = defineStore({
           // Handle other Status Codes
         }
       } else {
-        console.error(
-          "Selected project's or resource types' e.g. ID is undefined."
+        console.error("Selected project's or resource types' ID is undefined.");
+      }
+    },
+
+    // ToDo: Consider removing if unused in coscine/issues#2003
+    async getResourceTypeQuota(
+      project: ProjectObject,
+      resourceType: ResourceTypeInformation
+    ): Promise<ProjectQuotaReturnObject | undefined> {
+      if (project.id && resourceType.id) {
+        const apiResponse = await ProjectApi.projectQuota(
+          project.id,
+          resourceType.id
         );
+        if (apiResponse.status === StatusCodes.OK) {
+          return apiResponse.data;
+        } else {
+          // Handle other Status Codes
+        }
+      } else {
+        console.error("Selected project's or resource types' ID is undefined.");
       }
     },
 
@@ -360,6 +380,15 @@ export const useProjectStore = defineStore({
       }
     },
 
+    async retrieveLicenses() {
+      const apiResponse = await LicenseApi.licenseIndex();
+      if (apiResponse.status === StatusCodes.OK) {
+        this.licenses = apiResponse.data;
+      } else {
+        // Handle other Status Codes
+      }
+    },
+
     async retrieveDisciplines() {
       const apiResponse = await DisciplineApi.disciplineIndex();
       if (apiResponse.status === StatusCodes.OK) {
@@ -460,26 +489,38 @@ export const useProjectStore = defineStore({
 
     async refreshProjectInformation(parentProject: ProjectObject | null) {
       await Promise.all([
-        this.retrieveAllProjects(), // Please make that method obsolete...
+        this.retrieveAllProjects(),
         this.retrieveTopLevelProjects(),
       ]);
       if (parentProject && parentProject.slug) {
         await this.retrieveProjectBySlug(parentProject.slug);
+        await Promise.all([
+          this.retrieveSubProjects(parentProject),
+          this.retrieveResources(parentProject),
+        ]);
       }
     },
 
     addProjectAsVisited(project: ProjectObject | null) {
       if (project && project.slug) {
-        // Important! Keep object assignment reactive()
-        const visitedProject: VisitedProjectObject = reactive({
-          ...project,
-          invitations: null,
-          resources: null,
-          subProjects: null,
-          roles: null,
-          quotas: null,
-        });
-        this.visitedProjects[project.slug] = visitedProject;
+        const updatedKeys = updatedDiff(
+          this.visitedProjects[project.slug],
+          project
+        );
+        if (!this.visitedProjects[project.slug]) {
+          // Important! Keep object assignment reactive()
+          const visitedProject: VisitedProjectObject = reactive({
+            ...project,
+            invitations: null,
+            resources: null,
+            subProjects: null,
+            roles: null,
+            quotas: null,
+          });
+          this.visitedProjects[project.slug] = visitedProject;
+        } else if (updatedKeys && Object.keys(updatedKeys).length > 0) {
+          Object.assign(this.visitedProjects[project.slug], updatedKeys);
+        }
       }
     },
 
@@ -530,6 +571,14 @@ export const useProjectStore = defineStore({
       });
     },
 
+    async createApplicationProfileAnalytics(project: ProjectObject | null) {
+      if (project && project.id) {
+        await ProjectApi.projectCreateApplicationProfile(project.id);
+      } else {
+        console.error("Selected project is null or its ID is undefined.");
+      }
+    },
+
     async deleteInvitation(invitationId: string) {
       try {
         await ProjectApi.projectDeleteInvitation(invitationId);
diff --git a/src/modules/project/types.d.ts b/src/modules/project/types.d.ts
index 36614cf98894d5ca00d8b3933c227fecd588b3b7..ad3a8f4db4e1917de56a02cd41fd5b53411a14c3 100644
--- a/src/modules/project/types.d.ts
+++ b/src/modules/project/types.d.ts
@@ -1,6 +1,7 @@
 import type {
   DisciplineObject,
   InvitationReturnObject,
+  LicenseObject,
   OrganizationObject,
   ProjectObject,
   ProjectQuotaReturnObject,
@@ -36,6 +37,7 @@ export interface ProjectState {
   topLevelProjects: ProjectObject[] | null;
 
   disciplines: DisciplineObject[] | null;
+  licenses: LicenseObject[] | null;
   organizations: OrganizationObject[] | null;
   roles: RoleObject[] | null;
   visibilities: VisibilityObject[] | null;
diff --git a/src/modules/resource/ResourceModule.vue b/src/modules/resource/ResourceModule.vue
index ffbc91c75fcf4d3b02025712cee35bf5fa25618b..d1d2f808b5d5719e2dd4ba9bf8f695ce51352529 100644
--- a/src/modules/resource/ResourceModule.vue
+++ b/src/modules/resource/ResourceModule.vue
@@ -9,10 +9,10 @@ import { defineComponent } from "vue-demi";
 import { ResourceI18nMessages } from "./i18n";
 
 // import the store for current module
-import { useResourceStore } from "./store";
-import { useProjectStore } from "@/modules/project/store";
+import useResourceStore from "./store";
+import useProjectStore from "@/modules/project/store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 import type { VisitedResourceObject } from "./types";
 import type { ResourceTypeInformation } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
@@ -27,7 +27,6 @@ export default defineComponent({
 
     return { mainStore, resourceStore, projectStore };
   },
-  i18n: { messages: cloneDeep(ResourceI18nMessages) },
 
   created() {
     this.initialize();
@@ -52,6 +51,7 @@ export default defineComponent({
 
   watch: {
     resourceTypeInformation() {
+      this.retrieveUsedQuota();
       this.setI18n();
     },
   },
@@ -67,15 +67,23 @@ export default defineComponent({
         if (!this.resourceStore.currentFullApplicationProfile) {
           this.resourceStore.retrieveApplicationProfile(this.resource);
         }
+      }
+      // Extract Quota Retrieval, resourceTypeInformation is not loaded yet on direct links and is undefined
+      this.retrieveUsedQuota();
+      this.setI18n();
+    },
+
+    retrieveUsedQuota() {
+      if (this.resource) {
         if (
           !this.resourceStore.currentUsedQuota &&
-          this.resourceTypeInformation?.isQuotaAdjustable
+          this.resourceTypeInformation?.isQuotaAvailable
         ) {
           this.resourceStore.retrieveUsedQuota(this.resource);
         }
       }
-      this.setI18n();
     },
+
     setI18n() {
       this.$i18n.mergeLocaleMessage("de", cloneDeep(ResourceI18nMessages.de));
       this.$i18n.mergeLocaleMessage("en", cloneDeep(ResourceI18nMessages.en));
diff --git a/src/modules/resource/components/create-resource/Configuration.vue b/src/modules/resource/components/create-resource/Configuration.vue
new file mode 100644
index 0000000000000000000000000000000000000000..621822ffbc3ba4f888a35d5f884a4bb127c6a6c3
--- /dev/null
+++ b/src/modules/resource/components/create-resource/Configuration.vue
@@ -0,0 +1,281 @@
+<template>
+  <div class="setup">
+    <!-- Resource Type Dropdown -->
+    <div v-if="resourceTypes && resourceTypes.length > 0">
+      <coscine-form-group
+        :mandatory="true"
+        labelFor="ResourceTypes"
+        :label="$t('page.createResource.configuration.labels.resourceType')"
+        :isLoading="isLoading"
+      >
+        <multiselect
+          v-if="resourceTypes.length > 1"
+          id="ResourceTypes"
+          v-model="selectedResourceType"
+          :options="resourceTypes"
+          @input="setSelectedResourceTypeInformation"
+          :multiple="false"
+          :hide-selected="false"
+          label="iDisplayName"
+          track-by="iDisplayName"
+          :placeholder="
+            $t('page.createResource.multiselect.placeholderResourceText')
+          "
+          select-label=""
+          selected-label=""
+          deselect-label=""
+        >
+          <span slot="noResult">{{
+            $t("page.createResource.multiselect.noResults")
+          }}</span>
+          <span slot="noOptions">{{
+            $t("page.createResource.multiselect.noOptions")
+          }}</span>
+        </multiselect>
+
+        <!-- Resource Text Field (see condition) -->
+        <b-input
+          v-else-if="resourceTypes.length === 1"
+          id="ResourceType"
+          v-model="selectedResourceType.iDisplayName"
+          disabled
+        />
+      </coscine-form-group>
+
+      <!-- Resource Description -->
+      <coscine-form-group
+        v-if="selectedResourceType"
+        :label="`${selectedResourceType.iFullName}:`"
+      >
+        <p>{{ selectedResourceType.iDescription }}</p>
+      </coscine-form-group>
+    </div>
+
+    <!-- Setup Slider -->
+    <ConfigurationSizeSlider v-if="resourceTypeHasSize" v-model="resource" />
+
+    <!-- Button Next (wrapper needed for Popover) -->
+    <div id="divButtonNext" class="float-right">
+      <b-button
+        @click.prevent="next"
+        variant="outline-primary"
+        :disabled="!valid"
+        >{{ $t("buttons.next") }}
+      </b-button>
+    </div>
+
+    <!-- Popover -->
+    <b-popover
+      v-if="
+        resource.resourceTypeOption &&
+        resource.resourceTypeOption.Size <= 0 &&
+        resourceTypeHasSize
+      "
+      target="divButtonNext"
+      :title="$t('page.createResource.configuration.popover.title')"
+      placement="top"
+      triggers="hover"
+      :delay="{ show: 0, hide: 500 }"
+    >
+      {{ $t("page.createResource.configuration.popover.body") }}
+
+      <!-- Router Link -->
+      <router-link v-if="isOwner" :to="{ name: 'project-quota' }">
+        {{ $t("page.createResource.configuration.needMore") }}
+      </router-link>
+    </b-popover>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from "vue-demi";
+// import the store for current module
+import useResourceStore from "../../store";
+import useProjectStore from "@/modules/project/store";
+// import the main store
+import useMainStore from "@/store/index";
+import ConfigurationSizeSlider from "./ConfigurationSizeSlider.vue";
+import "@/plugins/deprecated/vue-multiselect";
+import type {
+  ResourceCreateObject,
+  ResourceObject,
+  ResourceTypeInformation,
+  ResourceTypeObject,
+} from "@coscine/api-client/dist/types/Coscine.Api.Resources";
+import type { LabeledResourceObject, ResourceTypeOption } from "../../types";
+
+export default defineComponent({
+  setup() {
+    const mainStore = useMainStore();
+    const projectStore = useProjectStore();
+    const resourceStore = useResourceStore();
+
+    return { mainStore, projectStore, resourceStore };
+  },
+
+  components: {
+    ConfigurationSizeSlider,
+  },
+
+  data() {
+    return {
+      resource: this.value,
+      selectedResourceType: null as LabeledResourceObject | null,
+    };
+  },
+
+  props: {
+    value: {
+      type: Object as PropType<ResourceObject>,
+      required: true,
+    },
+    isLoading: {
+      default: false,
+      type: Boolean,
+    },
+  },
+
+  computed: {
+    isOwner(): boolean | undefined {
+      return this.projectStore.currentUserRoleIsOwner;
+    },
+    resourceTypes(): LabeledResourceObject[] | null {
+      let labeledResourceTypes: LabeledResourceObject[] = [];
+      const resourceTypes = this.resourceStore.resourceTypes;
+      if (resourceTypes) {
+        resourceTypes.forEach((r) => {
+          let labeledResourceType: LabeledResourceObject = {
+            iDisplayName: this.$t(
+              "resourceTypes." + r.displayName + ".displayName"
+            ).toString(),
+            iFullName: this.$t(
+              "resourceTypes." + r.displayName + ".fullName"
+            ).toString(),
+            iDescription: this.$t(
+              "resourceTypes." + r.displayName + ".description"
+            ).toString(),
+          };
+          Object.assign(labeledResourceType, r);
+          labeledResourceTypes.push(labeledResourceType);
+        });
+        return labeledResourceTypes.sort((a, b) => {
+          const valueA = a.iDisplayName.toUpperCase();
+          const valueB = b.iDisplayName.toUpperCase();
+          return valueA < valueB ? -1 : valueA > valueB ? 1 : 0;
+        });
+      } else {
+        return null;
+      }
+    },
+    resourceTypeHasSize(): boolean {
+      if (
+        this.selectedResourceType &&
+        this.selectedResourceType.resourceCreate &&
+        this.selectedResourceType.resourceCreate.components
+      ) {
+        return (
+          this.selectedResourceType.resourceCreate.components.flatMap((e) =>
+            e.filter((z) => z === "Size")
+          ).length > 0
+        );
+      } else {
+        return false;
+      }
+    },
+    valid(): boolean {
+      return !(
+        !this.selectedResourceType ||
+        (this.resource.resourceTypeOption as ResourceTypeOption).Size <= 0
+      );
+    },
+  },
+
+  watch: {
+    resource: {
+      handler() {
+        this.$emit("input", this.resource);
+      },
+      deep: true,
+    },
+    resourceTypes() {
+      this.onResourceTypesLoaded();
+      this.initTabContent();
+    },
+    valid() {
+      this.$emit("valid", this.valid);
+    },
+  },
+
+  created() {
+    this.onResourceTypesLoaded();
+    this.initTabContent();
+
+    this.mainStore.$subscribe((mutation) => {
+      if (mutation.type == "patch function") {
+        this.initTabContent();
+      }
+    });
+  },
+
+  methods: {
+    next() {
+      this.$emit("next");
+    },
+
+    initTabContent() {
+      if (this.resourceTypes && this.resource.type && this.resource.type.id) {
+        // A resource type has been selected, but the dropdown is empty. Set selection in dropdown.
+        const selection = this.resourceTypes.find(
+          (r) => r.id === this.resource.type?.id
+        );
+        if (selection) {
+          this.selectedResourceType = selection;
+        }
+      }
+    },
+
+    onResourceTypesLoaded() {
+      if (this.resourceTypes && this.resourceTypes.length === 1) {
+        this.setSelectedResourceTypeInformation(this.resourceTypes[0]);
+      }
+    },
+
+    setSelectedResourceTypeInformation(
+      resourceTypeInformation: ResourceTypeInformation | null
+    ) {
+      if (resourceTypeInformation) {
+        // Set Resource Type
+        const type: ResourceTypeObject = {
+          id: resourceTypeInformation.id,
+          displayName: resourceTypeInformation.displayName,
+        };
+        this.$set(this.resource, "type", type);
+
+        // Set Resource Type Options
+        let resourceTypeOptions: ResourceCreateObject = {};
+        if (
+          resourceTypeInformation.resourceCreate &&
+          resourceTypeInformation.resourceCreate.components
+        ) {
+          for (const key of resourceTypeInformation.resourceCreate
+            .components[0]) {
+            Object.assign(resourceTypeOptions, { [key]: undefined });
+          }
+          this.$set(this.resource, "resourceTypeOption", resourceTypeOptions);
+        }
+      } else {
+        this.$set(this.resource, "type", undefined);
+        this.$set(this.resource, "resourceTypeOption", undefined);
+      }
+    },
+  },
+
+  emits: {
+    valid: (_: boolean) => null,
+    next: null,
+    input: (_: ResourceObject) => null,
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/modules/resource/components/create-resource/ConfigurationSizeSlider.vue b/src/modules/resource/components/create-resource/ConfigurationSizeSlider.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8ef0793a2db2e0d530d28002ff63171b0d577f65
--- /dev/null
+++ b/src/modules/resource/components/create-resource/ConfigurationSizeSlider.vue
@@ -0,0 +1,162 @@
+<template>
+  <div class="SetupPageRds">
+    <coscine-form-group
+      :mandatory="true"
+      :label="$t('page.createResource.configuration.labels.size')"
+    >
+      <!-- Slider -->
+      <b-form-input
+        id="slider"
+        :disabled="!sliderValue || max < min"
+        @change="update"
+        type="range"
+        :min="min"
+        :max="max"
+        :value="sliderValue"
+      />
+      <div>
+        {{ sliderText }}
+
+        <!-- Router Link -->
+        <router-link v-if="isOwner" :to="{ name: 'project-quota' }">
+          {{ $t("page.createResource.configuration.needMore") }}
+        </router-link>
+      </div>
+    </coscine-form-group>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from "vue-demi";
+import useProjectStore from "@/modules/project/store";
+import { isNumber } from "lodash";
+import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
+import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
+import { ResourceTypeOption } from "../../types";
+
+export default defineComponent({
+  setup() {
+    const projectStore = useProjectStore();
+
+    return { projectStore };
+  },
+
+  data() {
+    return {
+      resource: this.value,
+      min: 1,
+      max: 1,
+      sliderValue: 0, // used to set the Resource Size
+    };
+  },
+
+  props: {
+    value: {
+      type: Object as PropType<ResourceObject>,
+      required: true,
+    },
+  },
+
+  computed: {
+    project(): ProjectObject | null {
+      return this.projectStore.currentProject;
+    },
+    isOwner(): boolean | undefined {
+      return this.projectStore.currentUserRoleIsOwner;
+    },
+    sliderText(): string {
+      const formatNumber = (num: number) => {
+        if (isNaN(num)) {
+          return num;
+        }
+        const locale = this.$root.$i18n.locale;
+        return num.toLocaleString(locale);
+      };
+      const text = this.$t("page.createResource.configuration.bucketSize", {
+        size: formatNumber(this.sliderValue),
+        files: formatNumber(this.sliderValue * 2048),
+      }).toString();
+      return text;
+    },
+  },
+
+  watch: {
+    resource: {
+      handler() {
+        this.$emit("input", this.resource);
+      },
+      deep: true,
+    },
+    "resource.resourceTypeOption": {
+      handler() {
+        this.initTabContent();
+        this.retrieveQuota();
+        this.setResourceSize(this.sliderValue);
+      },
+      deep: true,
+    },
+  },
+
+  created() {
+    this.initTabContent();
+    this.retrieveQuota();
+    this.setResourceSize(this.sliderValue);
+  },
+
+  methods: {
+    update(value: string) {
+      const pos = parseInt(value, 10);
+      this.sliderValue = pos;
+      this.setResourceSize(pos);
+    },
+
+    retrieveQuota() {
+      if (this.projectStore.currentQuotas && this.resource.type) {
+        const resourceDisplayName = this.resource.type.displayName;
+        const quota = this.projectStore.currentQuotas.find(
+          (q) => q.name === resourceDisplayName
+        );
+        if (quota) {
+          // Calculate slider maximum from Reserved and Used
+          if (isNumber(quota.allocated) && isNumber(quota.used)) {
+            this.max = quota.allocated - quota.used; // allocated == reserved
+            // Prevent negative maximum values
+            if (this.max < 0) {
+              this.max = 0;
+            }
+            // Prevent above maximum values
+            if (this.sliderValue > this.max) {
+              this.sliderValue = this.max;
+            }
+            // Set slider to 1 when maximum is available
+            if (this.max > 0 && this.sliderValue === 0) {
+              this.sliderValue = 1;
+            }
+          }
+        }
+      }
+    },
+    initTabContent() {
+      if (
+        this.sliderValue == 0 &&
+        this.resource.resourceTypeOption &&
+        isNumber((this.resource.resourceTypeOption as ResourceTypeOption).Size)
+      ) {
+        // A resource type has been selected, but the slider's value is unset. Set slider value.
+        this.sliderValue = (
+          this.resource.resourceTypeOption as ResourceTypeOption
+        ).Size;
+      }
+    },
+    setResourceSize(size: number) {
+      this.$set(this.resource.resourceTypeOption, "Size", size);
+    },
+  },
+
+  emits: {
+    input: (_: ResourceObject) => null,
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/modules/resource/components/create-resource/General.vue b/src/modules/resource/components/create-resource/General.vue
new file mode 100644
index 0000000000000000000000000000000000000000..6f7c98c1227a4192ed1e1b28d5f905b2483c311a
--- /dev/null
+++ b/src/modules/resource/components/create-resource/General.vue
@@ -0,0 +1,526 @@
+<template>
+  <div class="general">
+    <!-- Form -->
+    <b-form id="edit_form" @submit.stop.prevent="next">
+      <!-- Resource Name -->
+      <coscine-form-group
+        :mandatory="true"
+        labelFor="ResourceName"
+        :label="$t('form.resource.resourceNameLabel')"
+        :isLoading="isLoading"
+      >
+        <b-form-input
+          id="ResourceName"
+          v-model="$v.resourceForm.resourceName.$model"
+          @input="translateResourceNameToDisplayName"
+          :state="
+            $v.resourceForm.resourceName.$dirty
+              ? !$v.resourceForm.resourceName.$error
+              : null
+          "
+          :placeholder="$t('form.resource.resourceName')"
+          :maxlength="maxLengthFromValidation($v.resourceForm.resourceName)"
+          required
+          :readonly="readonly"
+        />
+        <div class="invalid-tooltip">
+          {{
+            $t("form.resource.resourceNameHelp", {
+              maxLength: maxLengthFromValidation($v.resourceForm.resourceName),
+            })
+          }}
+        </div>
+      </coscine-form-group>
+
+      <!-- Display Name -->
+      <coscine-form-group
+        :mandatory="true"
+        labelFor="DisplayName"
+        :label="$t('form.resource.displayNameLabel')"
+        :isLoading="isLoading"
+      >
+        <b-form-input
+          id="DisplayName"
+          v-model="$v.resourceForm.displayName.$model"
+          @input="isLockedDisplayName = true"
+          :state="
+            $v.resourceForm.displayName.$dirty
+              ? !$v.resourceForm.displayName.$error
+              : null
+          "
+          :placeholder="$t('form.resource.displayName')"
+          :maxlength="maxLengthFromValidation($v.resourceForm.displayName)"
+          required
+          :readonly="readonly"
+        />
+        <div class="invalid-tooltip">
+          {{
+            $t("form.resource.displayNameHelp", {
+              maxLength: maxLengthFromValidation($v.resourceForm.displayName),
+            })
+          }}
+        </div>
+      </coscine-form-group>
+
+      <!-- Description -->
+      <coscine-form-group
+        :mandatory="true"
+        labelFor="Description"
+        :label="$t('form.resource.resourceDescriptionLabel')"
+        :isLoading="isLoading"
+      >
+        <b-form-textarea
+          id="Description"
+          v-model="$v.resourceForm.description.$model"
+          :state="
+            $v.resourceForm.description.$dirty
+              ? !$v.resourceForm.description.$error
+              : null
+          "
+          :placeholder="$t('form.resource.resourceDescription')"
+          :maxlength="maxLengthFromValidation($v.resourceForm.description)"
+          required
+          :readonly="readonly"
+        />
+        <div class="invalid-tooltip">
+          {{
+            $t("form.resource.resourceDescriptionHelp", {
+              maxLength: maxLengthFromValidation($v.resourceForm.description),
+            })
+          }}
+        </div>
+      </coscine-form-group>
+
+      <!-- Discipline -->
+      <coscine-form-group
+        :mandatory="true"
+        labelFor="Discipline"
+        :label="$t('form.resource.resourceDisciplineLabel')"
+        :isLoading="isLoading"
+      >
+        <multiselect
+          id="Discipline"
+          v-model="$v.resourceForm.disciplines.$model"
+          :options="disciplines"
+          :multiple="true"
+          :hide-selected="true"
+          :label="disciplineLabel"
+          :track-by="disciplineLabel"
+          :placeholder="$t('form.resource.resourceDiscipline')"
+          :disabled="readonly"
+        >
+          <template #singleLabel(props)>
+            <div>
+              {{ props.option[disciplineLabel] }}
+            </div>
+          </template>
+          <template #option(props)>
+            <div>
+              {{ props.option[disciplineLabel] }}
+            </div>
+          </template>
+        </multiselect>
+      </coscine-form-group>
+
+      <!-- Keywords -->
+      <coscine-form-group
+        labelFor="Keywords"
+        :label="$t('form.resource.resourceKeywordsLabel')"
+        :isLoading="isLoading"
+      >
+        <multiselect
+          id="Keywords"
+          v-model="selectedKeyword"
+          :options="selectedKeyword"
+          :placeholder="$t('form.resource.resourceKeywordsPlaceholder')"
+          :multiple="true"
+          :taggable="true"
+          :max="limitKeywords(selectedKeyword)"
+          :tag-placeholder="$t('form.resource.tagPlaceholder')"
+          @tag="addTag"
+          @remove="$v.resourceForm.keywords.$touch()"
+          :disabled="readonly"
+        >
+          <template #maxElements>
+            {{
+              $t("form.resource.resourceKeywordsHelp", {
+                maxLength: maxLengthFromValidation($v.resourceForm.keywords),
+              })
+            }}
+          </template>
+          <template #noOptions>
+            {{
+              $t("form.resource.resourceKeywordsEmpty", {
+                maxLength: maxLengthFromValidation($v.resourceForm.keywords),
+              })
+            }}
+          </template>
+        </multiselect>
+      </coscine-form-group>
+
+      <!-- Visibility -->
+      <coscine-form-group
+        :mandatory="true"
+        labelFor="Visibility"
+        :label="$t('form.resource.resourceMetadataVisibilityLabel')"
+        :isLoading="isLoading"
+      >
+        <b-form-radio-group
+          name="radios-stacked"
+          v-model="selectedVisibility"
+          @change="setVisibility(selectedVisibility)"
+          :options="visibilities"
+          text-field="displayName"
+          value-field="id"
+          stacked
+          :disabled="readonly"
+        />
+      </coscine-form-group>
+
+      <!-- License -->
+      <coscine-form-group
+        labelFor="ResourceLicense"
+        :label="$t('form.resource.resourceLicenseLabel')"
+        :isLoading="isLoading"
+        :info="true"
+      >
+        <template #popover>
+          {{ $t("form.resource.resourceLicensePopover") }}
+          <b-link
+            :href="$t('form.resource.resourceLicensePopoverUrl').toString()"
+            target="_blank"
+            >{{ $t("default.help") }}
+          </b-link>
+        </template>
+        <b-form-select
+          id="ResourceLicense"
+          v-model="selectedLicense"
+          @change="setLicense(selectedLicense)"
+          :options="licenses"
+          text-field="displayName"
+          value-field="id"
+          :state="
+            $v.resourceForm.license.$dirty
+              ? !$v.resourceForm.license.$error
+              : null
+          "
+          :placeholder="$t('form.resource.resourceLicense')"
+          :disabled="readonly"
+        >
+          <template #first>
+            <option :value="null" disabled>
+              {{ $t("form.resource.resourceLicenseSelect") }}
+            </option>
+          </template>
+        </b-form-select>
+      </coscine-form-group>
+
+      <!-- Internal Rules for Reuse -->
+      <coscine-form-group
+        labelFor="InternalRulesForReuse"
+        :label="$t('form.resource.resourceReuseLabel')"
+        :isLoading="isLoading"
+        :info="true"
+      >
+        <template #popover>
+          {{ $t("form.resource.resourceReusePopover") }}
+          <b-link
+            :href="$t('form.resource.resourceReusePopoverUrl').toString()"
+            target="_blank"
+            >{{ $t("default.help") }}
+          </b-link>
+        </template>
+        <b-form-input
+          id="InternalRulesForReuse"
+          v-model="$v.resourceForm.usageRights.$model"
+          :state="
+            $v.resourceForm.usageRights.$dirty
+              ? !$v.resourceForm.usageRights.$error
+              : null
+          "
+          :placeholder="$t('form.resource.resourceReuse')"
+          :maxlength="maxLengthFromValidation($v.resourceForm.usageRights)"
+          required
+          :readonly="readonly"
+        />
+        <div class="invalid-tooltip">
+          {{
+            $t("form.resource.resourceReuseHelp", {
+              maxLength: maxLengthFromValidation($v.resourceForm.usageRights),
+            })
+          }}
+        </div>
+      </coscine-form-group>
+    </b-form>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from "vue-demi";
+// import the store for current module
+import useResourceStore from "../../store";
+import useProjectStore from "@/modules/project/store";
+// import the main store
+import useMainStore from "@/store/index";
+import { Validation, validationMixin } from "vuelidate";
+import { required, maxLength } from "vuelidate/lib/validators";
+import "@/plugins/deprecated/vue-multiselect";
+import type {
+  DisciplineObject,
+  LicenseObject,
+  ResourceObject,
+  VisibilityObject,
+} from "@coscine/api-client/dist/types/Coscine.Api.Resources";
+import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
+
+export default defineComponent({
+  setup() {
+    const mainStore = useMainStore();
+    const projectStore = useProjectStore();
+    const resourceStore = useResourceStore();
+
+    return { mainStore, projectStore, resourceStore };
+  },
+
+  mixins: [validationMixin],
+
+  validations: {
+    resourceForm: {
+      resourceName: {
+        required,
+        maxLength: maxLength(200),
+      },
+      displayName: {
+        required,
+        maxLength: maxLength(25),
+      },
+      description: {
+        required,
+        maxLength: maxLength(5000),
+      },
+      disciplines: {
+        required,
+      },
+      license: {},
+      keywords: {
+        maxLength: maxLength(1000),
+      },
+      visibility: {
+        required,
+      },
+      usageRights: {
+        maxLength: maxLength(500),
+      },
+    },
+  },
+
+  props: {
+    value: {
+      type: Object as PropType<ResourceObject>,
+      required: true,
+    },
+    isLoading: {
+      default: false,
+      type: Boolean,
+    },
+    readonly: {
+      default: false,
+      type: Boolean,
+    },
+  },
+
+  data() {
+    return {
+      resourceForm: this.value,
+      selectedKeyword: [] as Array<string>,
+      selectedLicense: null as string | null,
+      selectedVisibility: "" as string | undefined,
+      isLockedDisplayName: false,
+    };
+  },
+
+  computed: {
+    project(): ProjectObject | null {
+      return this.projectStore.currentProject;
+    },
+    resource(): ResourceObject | null {
+      return this.resourceStore.currentResource;
+    },
+    visibilities(): VisibilityObject[] | null {
+      return this.projectStore.visibilities;
+    },
+    licenses(): LicenseObject[] {
+      return this.projectStore.licenses ?? [];
+    },
+    disciplines(): DisciplineObject[] {
+      return this.projectStore.disciplines ?? [];
+    },
+    disciplineLabel(): string {
+      let locale = this.$root.$i18n.locale;
+      locale = locale.charAt(0).toUpperCase() + locale.slice(1);
+      return `displayName${locale}`;
+    },
+    valid(): boolean {
+      return !this.$v.resourceForm.$invalid;
+    },
+  },
+
+  watch: {
+    project() {
+      this.initTabContent();
+    },
+    resource() {
+      this.initTabContent();
+    },
+    visibilities() {
+      // Used in Create Resource
+      if (!this.resourceForm.visibility) {
+        this.setDefaultVisibility();
+      }
+    },
+    selectedKeyword() {
+      const delimiter = ";";
+      let keywords = "";
+      this.selectedKeyword.forEach((element) => {
+        keywords += `${element}${delimiter}`;
+      });
+      if (keywords.charAt(keywords.length - 1) === delimiter) {
+        keywords = keywords.substring(0, keywords.length - 1);
+      }
+      this.resourceForm.keywords = keywords;
+    },
+    resourceForm: {
+      handler() {
+        this.$emit("input", this.resourceForm);
+      },
+      deep: true,
+    },
+    "$v.resourceForm": {
+      handler() {
+        this.$emit("validation", this.$v.resourceForm);
+      },
+      deep: true,
+    },
+    valid() {
+      this.$emit("valid", this.valid);
+    },
+  },
+
+  created() {
+    this.initTabContent();
+  },
+
+  methods: {
+    initTabContent() {
+      if (this.project) {
+        this.loadDisciplines(this.project);
+        this.loadKeywords();
+      }
+      if (this.resourceForm.license && this.resourceForm.license.id) {
+        this.selectedLicense = this.resourceForm.license.id;
+      }
+      if (this.resourceForm.visibility && this.resourceForm.visibility.id) {
+        this.selectedVisibility = this.resourceForm.visibility.id;
+      } else {
+        this.setDefaultVisibility();
+      }
+    },
+
+    maxLengthFromValidation(validation: Validation): string {
+      let value = "";
+      try {
+        const prop: string = validation.$params.maxLength.max.toString();
+        if (prop) {
+          value = prop;
+        }
+      } catch (error) {
+        return value;
+      }
+      return value;
+    },
+
+    limitKeywords(values: []): number | null {
+      // Should the max number of allowed characters is exceeded, prevent the addition of further tags
+      if (this.$v.resourceForm.keywords?.$invalid) {
+        return values.length;
+      } else {
+        return null;
+      }
+    },
+
+    addTag(newTag: string) {
+      this.selectedKeyword.push(newTag);
+      this.$v.resourceForm.keywords?.$touch();
+    },
+
+    loadDisciplines(project: ProjectObject) {
+      let fromProject = [] as DisciplineObject[];
+      // When there are no disciplines selected, take the disciplines provided by the project
+      if (
+        !this.resourceForm.disciplines ||
+        this.resourceForm.disciplines.length == 0
+      ) {
+        fromProject = project.disciplines ? project.disciplines : [];
+      }
+      let fromResource: DisciplineObject[] = this.resourceForm.disciplines
+        ? this.resourceForm.disciplines
+        : [];
+      this.resourceForm.disciplines = [...fromProject, ...fromResource];
+    },
+
+    loadKeywords() {
+      let fromResource = this.resourceForm.keywords
+        ? this.resourceForm.keywords.split(";")
+        : [];
+      let keywords = fromResource;
+      this.selectedKeyword = [...new Set(keywords)]; // get only unique values
+    },
+
+    setVisibility(id: string) {
+      if (this.visibilities) {
+        const visibility = this.visibilities.find(
+          (entry) => entry.id === id
+        ) as VisibilityObject;
+        this.resourceForm.visibility = visibility;
+        this.$v.resourceForm.visibility?.$touch();
+      }
+    },
+
+    setLicense(id: string) {
+      if (this.licenses) {
+        const license = this.licenses.find(
+          (entry) => entry.id === id
+        ) as LicenseObject;
+        this.resourceForm.license = license;
+        this.$v.resourceForm.license?.$touch();
+      }
+    },
+
+    setDefaultVisibility() {
+      if (this.visibilities) {
+        const visibility = this.visibilities.find(
+          (entry) => entry.displayName === "Project Members"
+        ) as VisibilityObject;
+        this.selectedVisibility = visibility.id;
+        this.resourceForm.visibility = visibility;
+      }
+    },
+
+    translateResourceNameToDisplayName() {
+      if (!this.isLockedDisplayName && this.resourceForm.resourceName) {
+        this.resourceForm.displayName =
+          this.resourceForm.resourceName.substring(0, 25);
+        this.$v.resourceForm.displayName?.$touch();
+      }
+    },
+  },
+
+  emits: {
+    valid: (_: boolean) => null,
+    validation: (_: Validation) => null,
+    input: (_: ResourceObject) => null,
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/modules/resource/components/create-resource/Metadata.vue b/src/modules/resource/components/create-resource/Metadata.vue
new file mode 100644
index 0000000000000000000000000000000000000000..02887dd7a69638e8527df7038599e563c50e1a53
--- /dev/null
+++ b/src/modules/resource/components/create-resource/Metadata.vue
@@ -0,0 +1,202 @@
+<template>
+  <div class="metadata">
+    <div>
+      <!-- Application Profile Dropdown -->
+      <coscine-form-group
+        labelFor="ApplicationProfiles"
+        :mandatory="true"
+        :label="$t('page.createResource.metadata.applicationProfileLabel')"
+      >
+        <div class="d-flex align-items-center">
+          <b-form-select
+            id="ApplicationProfiles"
+            v-model="selectedApplicationProfile"
+            :options="applicationProfileList"
+            @change="notifyFormGenerator"
+            :placeholder="
+              $t('page.createResource.metadata.selectApplicationProfile')
+            "
+          >
+            <template #first>
+              <b-form-select-option :value="null" disabled>
+                {{
+                  $t("page.createResource.metadata.selectApplicationProfile")
+                }}
+              </b-form-select-option>
+            </template>
+          </b-form-select>
+
+          <span class="font-weight-bold mx-1">
+            {{ $t("default.or") }}
+          </span>
+
+          <!-- Create Button -->
+          <span id="createButton">
+            <b-button
+              variant="outline-primary"
+              name="createAP"
+              :disabled="!isEmailValid"
+              @click="$bvModal.show('createAPModal')"
+              >{{ $t("buttons.create") }}
+            </b-button>
+          </span>
+        </div>
+
+        <b-tooltip target="createButton" triggers="hover">
+          <i18n
+            v-if="!isEmailValid"
+            path="page.createResource.metadata.createAp.tooltipDisabled"
+          >
+            <template #linkToUserProfile>
+              <router-link
+                :to="{ name: 'userprofile' }"
+                class="font-weight-bold"
+              >
+                {{ $t("page.createResource.metadata.createAp.tooltipHere") }}
+              </router-link>
+            </template>
+          </i18n>
+          <i18n v-else path="page.createResource.metadata.createAp.tooltip" />
+        </b-tooltip>
+      </coscine-form-group>
+    </div>
+
+    <!-- Create Application Profile Modal -->
+    <CreateAPModal id="createAPModal" />
+
+    <!-- Form Generator -->
+    <b-row v-if="isLoadingFormGenerator" align-h="center" class="my-2">
+      <b-spinner variant="secondary" />
+    </b-row>
+    <FormGenerator
+      v-else
+      :key="resource.applicationProfile"
+      :fixedValueMode="fixedValueMode"
+      :fixedValues="resource.fixedValues"
+      :applicationProfileId="resource.applicationProfile"
+      :SHACLDefinition="applicationProfileString"
+      :classReceiver="receiveClass"
+      :userReceiver="async () => user"
+      mimeType="application/ld+json"
+    />
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from "vue-demi";
+// import the store for current module
+import useResourceStore from "../../store";
+import useUserStore from "@/modules/user/store";
+import "@/plugins/form-generator";
+import CreateAPModal from "./modals/CreateAPModal.vue";
+import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
+import type { GroupedApplicationProfiles } from "../../types";
+import type { BilingualLabels } from "@coscine/api-client/dist/types/Coscine.Api.Metadata";
+import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User";
+
+export default defineComponent({
+  setup() {
+    const resourceStore = useResourceStore();
+    const userStore = useUserStore();
+
+    return { resourceStore, userStore };
+  },
+
+  components: {
+    CreateAPModal,
+  },
+
+  props: {
+    value: {
+      type: Object as PropType<ResourceObject>,
+      required: true,
+    },
+    applicationProfileList: {
+      type: Array as PropType<GroupedApplicationProfiles[]>,
+      required: true,
+    },
+    applicationProfileString: {
+      type: [String, null] as PropType<string | null>,
+      default: null,
+    },
+    isLoadingFormGenerator: {
+      type: Boolean,
+      required: true,
+    },
+  },
+
+  data() {
+    return {
+      resource: this.value,
+      selectedApplicationProfile: null as string | null,
+      fixedValueMode: true,
+      showModal: false,
+    };
+  },
+
+  computed: {
+    isEmailValid(): boolean {
+      if (
+        this.user &&
+        this.user.emailAddress &&
+        this.user.emailAddress.trim() !== ""
+      ) {
+        // Assume API contains only valid email addresses
+        return true;
+      } else {
+        return false;
+      }
+    },
+    user(): UserObject | null {
+      return this.userStore.user;
+    },
+    valid(): boolean {
+      return !(
+        !this.resource.applicationProfile ||
+        this.resource.applicationProfile.trim() === ""
+      );
+    },
+  },
+
+  watch: {
+    resource: {
+      handler() {
+        this.$emit("input", this.resource);
+      },
+      deep: true,
+    },
+    valid() {
+      this.$emit("valid", this.valid);
+    },
+  },
+
+  created() {
+    if (this.resource && this.resource.applicationProfile) {
+      this.selectedApplicationProfile = this.resource.applicationProfile;
+    }
+  },
+
+  methods: {
+    async receiveClass(className: string): Promise<BilingualLabels> {
+      return await this.resourceStore.getClass(className);
+    },
+    notifyFormGenerator() {
+      if (!this.resource.fixedValues) {
+        this.$set(this.resource, "fixedValues", {});
+      }
+      this.$set(
+        this.resource,
+        "applicationProfile",
+        this.selectedApplicationProfile
+      );
+    },
+  },
+
+  emits: {
+    valid: (_: boolean) => null,
+    input: (_: ResourceObject) => null,
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/modules/resource/components/create-resource/Overview.vue b/src/modules/resource/components/create-resource/Overview.vue
new file mode 100644
index 0000000000000000000000000000000000000000..4911072f22f59bce641024b95af6e5ad4b1f6acf
--- /dev/null
+++ b/src/modules/resource/components/create-resource/Overview.vue
@@ -0,0 +1,224 @@
+<template>
+  <div class="overview">
+    <!-- Resource Configuration -->
+    <b-card @click.prevent="toTab(tabs[0])" class="my-2">
+      <CoscineHeadline :headline="$t('form.steps.first')" h="h5" />
+
+      <coscine-form-group
+        v-if="resource && resource.resourceTypeOption"
+        :mandatory="true"
+        :label="$t('page.createResource.configuration.labels.resourceType')"
+      >
+        <b-form-input
+          readonly
+          :value="
+            $t('resourceTypes.' + resource.type.displayName + '.displayName')
+          "
+        />
+      </coscine-form-group>
+
+      <coscine-form-group
+        v-if="resource && resource.resourceTypeOption"
+        :mandatory="true"
+        :label="$t('page.createResource.configuration.labels.size')"
+      >
+        <b-form-input readonly :value="resourceSizeText" />
+      </coscine-form-group>
+    </b-card>
+
+    <!-- General Information -->
+    <b-card @click.prevent="toTab(tabs[1])" class="my-2">
+      <CoscineHeadline :headline="$t('form.steps.second')" h="h5" />
+
+      <!-- General -->
+      <General v-model="resource" :readonly="true" />
+    </b-card>
+
+    <!-- Metadata -->
+    <b-card @click.prevent="toTab(tabs[2])" class="my-2 p-0">
+      <CoscineHeadline :headline="$t('form.steps.third')" h="h5" />
+
+      <!-- Form Generator -->
+      <b-row v-if="isLoadingFormGenerator" align-h="center" class="my-2">
+        <b-spinner variant="secondary" />
+      </b-row>
+      <FormGenerator
+        v-else
+        :key="resource.applicationProfile"
+        :projectId="project.id"
+        :fixedValueMode="fixedValueMode"
+        :fixedValues="resource.fixedValues"
+        :applicationProfileId="resource.applicationProfile"
+        :disabledMode="true"
+        :SHACLDefinition="applicationProfileString"
+        :classReceiver="receiveClass"
+        :userReceiver="async () => user"
+        mimeType="application/ld+json"
+      />
+    </b-card>
+
+    <!-- Buttons -->
+    <b-form-group>
+      <!-- Button Back -->
+      <b-button @click.prevent="back" variant="outline-primary"
+        >{{ $t("buttons.back") }}
+      </b-button>
+
+      <!-- Button Confirm -->
+      <b-button
+        @click.prevent="clickSave"
+        :disabled="isUploadInProgress || isLoadingFormGenerator"
+        class="float-right"
+        variant="outline-primary"
+        >{{ $t("buttons.confirm") }}
+      </b-button>
+    </b-form-group>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from "vue-demi";
+// import the store for current module
+import useResourceStore from "@/modules/resource/store";
+import useProjectStore from "@/modules/project/store";
+import useUserStore from "@/modules/user/store";
+import "@/plugins/form-generator";
+import General from "./General.vue";
+import { navigateToProject } from "@/router";
+import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
+import type { ResourceCreationTab, ResourceTypeOption } from "../../types";
+import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
+import type { BilingualLabels } from "@coscine/api-client/dist/types/Coscine.Api.Metadata";
+import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User";
+
+export default defineComponent({
+  components: { General },
+  setup() {
+    const projectStore = useProjectStore();
+    const resourceStore = useResourceStore();
+    const userStore = useUserStore();
+
+    return { projectStore, resourceStore, userStore };
+  },
+
+  data() {
+    return {
+      resource: this.value,
+      fixedValueMode: true,
+      isUploadInProgress: false,
+    };
+  },
+
+  props: {
+    value: {
+      type: Object as PropType<ResourceObject>,
+      required: true,
+    },
+    tabs: {
+      type: Array as PropType<ResourceCreationTab[]>,
+      required: true,
+    },
+    applicationProfileString: {
+      type: [String, null] as PropType<string | null>,
+      default: null,
+    },
+    isLoadingFormGenerator: {
+      type: Boolean,
+      required: true,
+    },
+  },
+
+  computed: {
+    project(): ProjectObject | null {
+      return this.projectStore.currentProject;
+    },
+    user(): null | UserObject {
+      return this.userStore.user;
+    },
+    resourceSizeText(): string {
+      if ((this.resource.resourceTypeOption as ResourceTypeOption).Size) {
+        return (
+          (this.resource.resourceTypeOption as ResourceTypeOption).Size + " GB"
+        );
+      } else {
+        return this.$t("default.none").toString();
+      }
+    },
+  },
+
+  watch: {
+    resource: {
+      handler() {
+        this.$emit("input", this.resource);
+      },
+      deep: true,
+    },
+  },
+
+  methods: {
+    async receiveClass(className: string): Promise<BilingualLabels> {
+      return await this.resourceStore.getClass(className);
+    },
+
+    back() {
+      this.$emit("back");
+    },
+
+    toTab(tab: ResourceCreationTab) {
+      this.$emit("toTab", tab);
+    },
+
+    async clickSave() {
+      if (this.project) {
+        this.$emit("waitingForResponse", true);
+        this.isUploadInProgress = true;
+        const createdResource = await this.resourceStore.createResource(
+          this.project,
+          this.resource
+        );
+
+        if (createdResource) {
+          // On Success
+          // Refresh the project information in the store
+          await this.projectStore.refreshProjectInformation(this.project);
+          // Navigate inside the parent project
+          navigateToProject(this.project);
+        } else {
+          this.$emit("waitingForResponse", false);
+          // On Failure
+          this.makeToast(
+            this.$t("toast.onSave.failure.message").toString(),
+            this.$t("toast.onSave.failure.title").toString(),
+            "danger"
+          );
+        }
+
+        this.isUploadInProgress = false;
+      }
+    },
+
+    makeToast(
+      text = "Message",
+      givenTitle = "Title",
+      variant: string | undefined = undefined
+    ) {
+      this.$root.$bvToast.toast(text, {
+        title: givenTitle,
+        autoHideDelay: 5000,
+        toaster: "b-toaster-bottom-right",
+        variant: variant,
+        noCloseButton: true,
+      });
+    },
+  },
+
+  emits: {
+    back: null,
+    toTab: (_: ResourceCreationTab) => null,
+    waitingForResponse: (_: boolean) => null,
+    input: (_: ResourceObject) => null,
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/modules/resource/components/create-resource/modals/CreateAPModal.vue b/src/modules/resource/components/create-resource/modals/CreateAPModal.vue
new file mode 100644
index 0000000000000000000000000000000000000000..827f9335c4ef6d376e32cee6043e78a7659316d8
--- /dev/null
+++ b/src/modules/resource/components/create-resource/modals/CreateAPModal.vue
@@ -0,0 +1,70 @@
+<template>
+  <div class="modal">
+    <b-modal
+      id="createAPModal"
+      :title="$t('page.createResource.metadata.createAp.title')"
+      :hide-footer="true"
+    >
+      <!-- Body -->
+      <i18n path="page.createResource.metadata.createAp.body" tag="p">
+        <template #br><br /></template>
+      </i18n>
+
+      <!-- Buttons -->
+      <div class="mt-3">
+        <!-- Confirm Button -->
+        <b-button
+          class="createAPModalRightBtn float-right"
+          variant="primary"
+          @click="toAIMS"
+          >{{ $t("buttons.confirm") }}
+        </b-button>
+
+        <!-- Cancel Button -->
+        <b-button
+          class="createAPModalLeftBtn"
+          variant="secondary"
+          @click="$bvModal.hide('createAPModal')"
+          >{{ $t("buttons.cancel") }}
+        </b-button>
+      </div>
+    </b-modal>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from "vue-demi";
+import useProjectStore from "@/modules/project/store";
+// import the main store
+import useMainStore from "@/store/index";
+import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
+
+export default defineComponent({
+  setup() {
+    const mainStore = useMainStore();
+    const projectStore = useProjectStore();
+
+    return { mainStore, projectStore };
+  },
+
+  computed: {
+    project(): ProjectObject | null {
+      return this.projectStore.currentProject;
+    },
+  },
+
+  methods: {
+    async toAIMS() {
+      this.projectStore.createApplicationProfileAnalytics(this.project);
+      const accessToken = this.mainStore.coscine.authorization.bearer;
+      const url = this.$router.resolve({
+        path: "/coscine/apps/aimsfrontend/",
+        query: { token: accessToken },
+      }).href;
+      window.open(url);
+    },
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/modules/resource/components/FilesView.vue b/src/modules/resource/components/resource-page/FilesView.vue
similarity index 95%
rename from src/modules/resource/components/FilesView.vue
rename to src/modules/resource/components/resource-page/FilesView.vue
index 32f1f895fdf981d897e0713a9a7ee0b10a73697b..3f96e72dbcff8b47a5a81b2a08177235f7f49780 100644
--- a/src/modules/resource/components/FilesView.vue
+++ b/src/modules/resource/components/resource-page/FilesView.vue
@@ -26,15 +26,13 @@
         ref="adaptTable"
         @row-selected="onRowSelected"
         show-empty
-        :empty-text="$parent.$parent.$t('page.resource.emptyTableText')"
-        :empty-filtered-text="
-          $parent.$parent.$t('page.resource.emptyFilterText')
-        "
+        :empty-text="$t('page.resource.emptyTableText')"
+        :empty-filtered-text="$t('page.resource.emptyFilterText')"
       >
         <div slot="table-busy" class="text-center text-danger my-2">
           <b-spinner class="align-middle"></b-spinner>
           <strong style="margin-left: 1%">{{
-            $parent.$parent.$t("page.resource.loading")
+            $t("page.resource.loading")
           }}</strong>
         </div>
         <template v-slot:head(name)="row">
@@ -42,7 +40,7 @@
             v-model="selectAll"
             @change="allSelect(row)"
           ></b-form-checkbox>
-          <span>{{ $parent.$parent.$t("page.resource.fileName") }}</span>
+          <span>{{ $t("page.resource.fileName") }}</span>
         </template>
         <template v-slot:head(lastModified)="row">
           <span>{{ row.label }}</span>
@@ -111,7 +109,7 @@
                 row.item.isFolder ? openFolder(row.item) : openFile(row.item)
               "
               >{{
-                $parent.$parent.$t("page.resource.metadataManagerBtnDownload")
+                $t("page.resource.metadataManagerBtnDownload")
               }}</b-dropdown-item
             >
             <b-dropdown-item
@@ -136,10 +134,10 @@
 import { defineComponent, PropType, reactive } from "vue-demi";
 
 // import the store for current module
-import { useResourceStore } from "../store";
-import { useProjectStore } from "@/modules/project/store";
+import useResourceStore from "../../store";
+import useProjectStore from "@/modules/project/store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 import FilesViewHeader from "./FilesViewHeader.vue";
 
@@ -148,9 +146,9 @@ import type {
   FolderContent,
   FolderInformation,
   ReadOnlyFolderInformation,
-} from "../utils/EntryDefinition";
+} from "../../utils/EntryDefinition";
 
-import MetadataManagerUtil from "../utils/MetadataManagerUtil";
+import MetadataManagerUtil from "../../utils/MetadataManagerUtil";
 
 import fileSaver from "file-saver";
 
@@ -159,9 +157,9 @@ import type {
   ApplicationProfile,
   Metadata,
   VisitedResourceObject,
-} from "../types";
+} from "../../types";
 import type { BFormRow, BTable, BvTableField } from "bootstrap-vue";
-import { FileUtil } from "../utils/FileUtil";
+import { FileUtil } from "../../utils/FileUtil";
 
 import { v4 as uuidv4 } from "uuid";
 
@@ -251,21 +249,19 @@ export default defineComponent({
     return {
       defaultHeaders: [
         {
-          label: this.$parent.$parent.$t("page.resource.fileName").toString(),
+          label: this.$t("page.resource.fileName").toString(),
           key: "name",
           sortable: true,
           active: true,
         },
         {
-          label: this.$parent.$parent
-            .$t("page.resource.lastModified")
-            .toString(),
+          label: this.$parent.$t("page.resource.lastModified").toString(),
           key: "lastModified",
           sortable: true,
           active: true,
         },
         {
-          label: this.$parent.$parent.$t("page.resource.size").toString(),
+          label: this.$t("page.resource.size").toString(),
           key: "size",
           sortable: true,
           active: true,
diff --git a/src/modules/resource/components/FilesViewHeader.vue b/src/modules/resource/components/resource-page/FilesViewHeader.vue
similarity index 79%
rename from src/modules/resource/components/FilesViewHeader.vue
rename to src/modules/resource/components/resource-page/FilesViewHeader.vue
index 56ce5d8ebaaa3a8a6564bc09e9d97f40f5d1a454..61a580dc994932133d67a0cec166a20b82d42e4f 100644
--- a/src/modules/resource/components/FilesViewHeader.vue
+++ b/src/modules/resource/components/resource-page/FilesViewHeader.vue
@@ -12,16 +12,14 @@
           "
         >
           {{
-            $parent.$parent.$parent.$t(
-              "ResourceTypes." + resource.type.displayName + ".displayName"
-            )
+            $t("resourceTypes." + resource.type.displayName + ".displayName")
           }}: {{ resource.displayName }}
         </p>
       </span>
       <b-icon
         id="resourceDetails"
         icon="info-circle"
-        :title="$parent.$parent.$parent.$t('page.resource.info')"
+        :title="$t('page.resource.info')"
       />
       <b-popover
         v-if="resource"
@@ -36,31 +34,23 @@
         >
         <div v-if="resource.displayName">
           <span
-            ><b
-              >{{ $parent.$parent.$parent.$t("page.resource.displayName") }}:
-            </b> </span
+            ><b>{{ $t("page.resource.displayName") }}: </b> </span
           ><span>{{ resource.displayName }}</span>
         </div>
         <div v-if="resource.pid">
           <span
-            ><b
-              >{{ $parent.$parent.$parent.$t("page.resource.PID") }}:
-            </b> </span
+            ><b>{{ $t("page.resource.PID") }}: </b> </span
           ><span>{{ resource.pid }}</span>
         </div>
         <div v-if="resource.description">
           <span
-            ><b
-              >{{ $parent.$parent.$parent.$t("page.resource.description") }}:
-            </b> </span
+            ><b>{{ $t("page.resource.description") }}: </b> </span
           ><span>{{ resource.description }}</span
           ><br />
         </div>
         <div v-if="resource.disciplines && resource.disciplines.length > 0">
           <span
-            ><b
-              >{{ $parent.$parent.$parent.$t("page.resource.disciplines") }}:
-            </b>
+            ><b>{{ $t("page.resource.disciplines") }}: </b>
           </span>
           <ul>
             <li
@@ -78,9 +68,7 @@
         </div>
         <div v-if="resource.keywords && resource.keywords.length > 0">
           <span
-            ><b
-              >{{ $parent.$parent.$parent.$t("page.resource.keywords") }}:
-            </b> </span
+            ><b>{{ $t("page.resource.keywords") }}: </b> </span
           ><br />
           <ul>
             <li v-for="keyword in resource.keywords" v-bind:key="keyword">
@@ -90,52 +78,38 @@
         </div>
         <div v-if="resource.visibility">
           <span
-            ><b
-              >{{ $parent.$parent.$parent.$t("page.resource.visibility") }}:
-            </b> </span
+            ><b>{{ $t("page.resource.visibility") }}: </b> </span
           ><span>{{ resource.visibility.displayName }}</span
           ><br />
         </div>
         <div v-if="resource.license">
           <span
-            ><b
-              >{{
-                $parent.$parent.$parent.$t("page.resource.resourceLicense")
-              }}:
-            </b> </span
+            ><b>{{ $t("page.resource.resourceLicense") }}: </b> </span
           ><span>{{ resource.license.displayName }}</span
           ><br />
         </div>
         <div v-if="resource.usageRights">
           <span
-            ><b
-              >{{ $parent.$parent.$parent.$t("page.resource.usageRights") }}:
-            </b> </span
+            ><b>{{ $t("page.resource.usageRights") }}: </b> </span
           ><span>{{ resource.usageRights }}</span
           ><br />
         </div>
       </b-popover>
       <b-button
         @click="edit"
-        :title="$parent.$parent.$parent.$t('page.resource.edit')"
+        :title="$t('page.resource.edit')"
         class="btn btn-sm"
         v-if="canEditResource"
       >
-        <b-icon
-          icon="pencil-fill"
-          :title="$parent.$parent.$parent.$t('page.resource.edit')"
-        />
+        <b-icon icon="pencil-fill" :title="$t('page.resource.edit')" />
       </b-button>
       <b-button
         @click="upload"
-        :title="$parent.$parent.$parent.$t('page.resource.upload')"
+        :title="$t('page.resource.upload')"
         class="btn btn-sm"
         :disabled="isUploading || readOnly || (resource && resource.archived)"
       >
-        <b-icon
-          icon="plus"
-          :title="$parent.$parent.$parent.$t('page.resource.upload')"
-        />
+        <b-icon icon="plus" :title="$t('page.resource.upload')" />
       </b-button>
       <span v-if="resource && resource.archived" class="badgeWrap">
         <b-badge pill variant="warning">{{ $t("default.archived") }}</b-badge>
@@ -170,9 +144,7 @@
         <b-form-input
           type="search"
           id="filterInput"
-          :placeholder="
-            $parent.$parent.$parent.$t('page.resource.typeToSearch')
-          "
+          :placeholder="$t('page.resource.typeToSearch')"
           :value="value"
           @input="$emit('input', $event)"
         ></b-form-input>
@@ -185,23 +157,22 @@
 import { defineComponent } from "vue-demi";
 
 // import the store for current module
-import { useResourceStore } from "../store";
-import { useProjectStore } from "@/modules/project/store";
+import useResourceStore from "../../store";
+import useProjectStore from "@/modules/project/store";
 // import the user store
-import { useUserStore } from "@/modules/user/store";
+import useUserStore from "@/modules/user/store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
-import { FileUtil } from "../utils/FileUtil";
-import {
+import { FileUtil } from "../../utils/FileUtil";
+import router from "@/router";
+import type {
   ProjectObject,
   ProjectQuotaReturnObject,
   UserObject,
 } from "@coscine/api-client/dist/types/Coscine.Api.Project";
-import router from "@/router";
-
 import type { ResourceTypeInformation } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
-import type { VisitedResourceObject } from "../types";
+import type { VisitedResourceObject } from "../../types";
 
 export default defineComponent({
   setup() {
diff --git a/src/modules/resource/components/MetadataManager.vue b/src/modules/resource/components/resource-page/MetadataManager.vue
similarity index 95%
rename from src/modules/resource/components/MetadataManager.vue
rename to src/modules/resource/components/resource-page/MetadataManager.vue
index ea7d5ff2c02a6d56464af0c535145f0019134cf1..c9a221543194bf9769f91f6db06043638aec460a 100644
--- a/src/modules/resource/components/MetadataManager.vue
+++ b/src/modules/resource/components/resource-page/MetadataManager.vue
@@ -101,15 +101,15 @@
 import { defineComponent, PropType, VNode } from "vue-demi";
 
 // import the store for current module
-import { useResourceStore } from "../store";
-import { useProjectStore } from "@/modules/project/store";
-import { useUserStore } from "@/modules/user/store";
+import useResourceStore from "../../store";
+import useProjectStore from "@/modules/project/store";
+import useUserStore from "@/modules/user/store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 import fileSaver from "file-saver";
 
-import MetadataManagerUtil from "../utils/MetadataManagerUtil";
+import MetadataManagerUtil from "../../utils/MetadataManagerUtil";
 
 import MetadataManagerHeader from "./metadata/MetadataManagerHeader.vue";
 import MetadataManagerTable from "./metadata/MetadataManagerTable.vue";
@@ -121,7 +121,10 @@ import DeleteFolderContentsModal from "./modals/DeleteFolderContentsModal.vue";
 import SaveDuplicateFilesModal from "./modals/SaveDuplicateFilesModal.vue";
 import ValidationPopover from "./popovers/ValidationPopover.vue";
 
-import type { FileInformation, FolderContent } from "../utils/EntryDefinition";
+import type {
+  FileInformation,
+  FolderContent,
+} from "../../utils/EntryDefinition";
 
 import "@/plugins/form-generator";
 import { cloneDeep } from "lodash";
@@ -137,7 +140,7 @@ import type ValidationReport from "rdf-validate-shacl/src/validation-report";
 
 import { v4 as uuidv4 } from "uuid";
 import type { ValidationResult } from "rdf-validate-shacl/src/validation-report";
-import type { ApplicationProfile, Metadata } from "../types";
+import type { ApplicationProfile, Metadata } from "../../types";
 
 export default defineComponent({
   setup() {
@@ -175,7 +178,6 @@ export default defineComponent({
     user(): null | UserObject {
       return this.userStore.user;
     },
-
     resourceTypeInformation(): null | undefined | ResourceTypeInformation {
       if (this.resourceStore.resourceTypes && this.resource) {
         return this.resourceStore.resourceTypes.find(
@@ -394,10 +396,7 @@ export default defineComponent({
             const h = this.$createElement;
             const content = [];
             content.push(
-              "" +
-                this.$parent.$parent.$t(
-                  "page.resource.toastSavingFailedBodyTop"
-                )
+              "" + this.$t("page.resource.toastSavingFailedBodyTop")
             );
             content.push(h("br"));
 
@@ -407,30 +406,21 @@ export default defineComponent({
             }
 
             content.push(
-              "" +
-                this.$parent.$parent.$t(
-                  "page.resource.toastSavingFailedBodyBottom"
-                )
+              "" + this.$t("page.resource.toastSavingFailedBodyBottom")
             );
 
             const vNodesMsg = h("span", {}, content);
             this.makeToast(
-              "" +
-                this.$parent.$parent.$t("page.resource.toastSavingFailedTitle"),
+              "" + this.$t("page.resource.toastSavingFailedTitle"),
               vNodesMsg,
               true
             );
           }
           if (numberOfSuccessfulUploadedFiles > 0) {
             this.makeToast(
+              "" + this.$t("page.resource.toastSavingSuccessfulTitle"),
               "" +
-                this.$parent.$parent.$t(
-                  "page.resource.toastSavingSuccessfulTitle"
-                ),
-              "" +
-                this.$parent.$parent.$t(
-                  "page.resource.toastSavingSuccessfulBody"
-                ) +
+                this.$t("page.resource.toastSavingSuccessfulBody") +
                 numberOfSuccessfulUploadedFiles
             );
           }
diff --git a/src/modules/resource/components/metadata/MetadataManagerFileInformation.vue b/src/modules/resource/components/resource-page/metadata/MetadataManagerFileInformation.vue
similarity index 64%
rename from src/modules/resource/components/metadata/MetadataManagerFileInformation.vue
rename to src/modules/resource/components/resource-page/metadata/MetadataManagerFileInformation.vue
index ab0a60141612e744207d21080287c8a62f7c7dac..b899014670fbfa74ce68d7abe1c1e5e20bee005d 100644
--- a/src/modules/resource/components/metadata/MetadataManagerFileInformation.vue
+++ b/src/modules/resource/components/resource-page/metadata/MetadataManagerFileInformation.vue
@@ -1,50 +1,42 @@
 <template>
   <span>
-    <coscine-form-group
-      :label="$parent.$parent.$parent.$t('page.resource.infoFileName')"
-    >
+    <coscine-form-group :label="$t('page.resource.infoFileName')">
       <div class="fileInfoField">
         {{
           !fileListEdit[currentFileId].name
-            ? $parent.$parent.$parent.$t("page.resource.infoFileNoInformation")
+            ? $t("page.resource.infoFileNoInformation")
             : fileListEdit[currentFileId].name
         }}
       </div>
     </coscine-form-group>
-    <coscine-form-group
-      :label="$parent.$parent.$parent.$t('page.resource.infoFileLastModified')"
-    >
+    <coscine-form-group :label="$t('page.resource.infoFileLastModified')">
       <div class="fileInfoField">
         {{
           !fileListEdit[currentFileId].lastModified
-            ? $parent.$parent.$parent.$t("page.resource.infoFileNoInformation")
+            ? $t("page.resource.infoFileNoInformation")
             : new Date(
                 fileListEdit[currentFileId].lastModified
               ).toLocaleDateString($i18n.locale)
         }}
       </div>
     </coscine-form-group>
-    <coscine-form-group
-      :label="$parent.$parent.$parent.$t('page.resource.infoFileCreated')"
-    >
+    <coscine-form-group :label="$t('page.resource.infoFileCreated')">
       <div class="fileInfoField">
         {{
           !fileListEdit[currentFileId].created
-            ? $parent.$parent.$parent.$t("page.resource.infoFileNoInformation")
+            ? $t("page.resource.infoFileNoInformation")
             : new Date(fileListEdit[currentFileId].created).toLocaleDateString(
                 $i18n.locale
               )
         }}
       </div>
     </coscine-form-group>
-    <coscine-form-group
-      :label="$parent.$parent.$parent.$t('page.resource.infoFileSize')"
-    >
+    <coscine-form-group :label="$t('page.resource.infoFileSize')">
       <div class="fileInfoField">
         {{
           fileListEdit[currentFileId].size === undefined ||
           fileListEdit[currentFileId].size === null
-            ? $parent.$parent.$parent.$t("page.resource.infoFileNoInformation")
+            ? $t("page.resource.infoFileNoInformation")
             : fileListEdit[currentFileId].size + " Bytes"
         }}
       </div>
@@ -55,7 +47,7 @@
 <script lang="ts">
 import { defineComponent, PropType } from "vue-demi";
 
-import type { FolderContent } from "../../utils/EntryDefinition";
+import type { FolderContent } from "../../../utils/EntryDefinition";
 
 export default defineComponent({
   props: {
diff --git a/src/modules/resource/components/metadata/MetadataManagerFooter.vue b/src/modules/resource/components/resource-page/metadata/MetadataManagerFooter.vue
similarity index 88%
rename from src/modules/resource/components/metadata/MetadataManagerFooter.vue
rename to src/modules/resource/components/resource-page/metadata/MetadataManagerFooter.vue
index d689a450d44c51dad3c1a018fbed578807ca0ec1..e3c3e7f5e2a11841e13c23e3212ae3d1ff36d1f9 100644
--- a/src/modules/resource/components/metadata/MetadataManagerFooter.vue
+++ b/src/modules/resource/components/resource-page/metadata/MetadataManagerFooter.vue
@@ -35,16 +35,10 @@
           ><b-spinner label="Spinning" v-show="isUploading"></b-spinner
           >{{
             isUploading
-              ? $parent.$parent.$parent.$t(
-                  "page.resource.metadataManagerBtnSaving"
-                )
+              ? $t("page.resource.metadataManagerBtnSaving")
               : !showDetail
-              ? $parent.$parent.$parent.$t(
-                  "page.resource.metadataManagerBtnUpload"
-                )
-              : $parent.$parent.$parent.$t(
-                  "page.resource.metadataManagerBtnUpdate"
-                )
+              ? $t("page.resource.metadataManagerBtnUpload")
+              : $t("page.resource.metadataManagerBtnUpdate")
           }}</b-button
         >
       </b-col>
diff --git a/src/modules/resource/components/metadata/MetadataManagerHeader.vue b/src/modules/resource/components/resource-page/metadata/MetadataManagerHeader.vue
similarity index 80%
rename from src/modules/resource/components/metadata/MetadataManagerHeader.vue
rename to src/modules/resource/components/resource-page/metadata/MetadataManagerHeader.vue
index 746a6866a72f143f38a831be80c0bd6b3a15b42d..7d13b717768a380e040ce9a8638ebe13092c3a46 100644
--- a/src/modules/resource/components/metadata/MetadataManagerHeader.vue
+++ b/src/modules/resource/components/resource-page/metadata/MetadataManagerHeader.vue
@@ -5,18 +5,10 @@
         id="buttonSelectFiles"
         variant="secondary"
         @click="$emit('selectFiles')"
-        :placeholder="
-          $parent.$parent.$parent.$t(
-            'page.resource.metadataManagerBtnSelectFiles'
-          )
-        "
+        :placeholder="$t('page.resource.metadataManagerBtnSelectFiles')"
         :disabled="isUploading || readOnly || (resource && resource.archived)"
         autofocus
-        >{{
-          $parent.$parent.$parent.$t(
-            "page.resource.metadataManagerBtnSelectFiles"
-          )
-        }}
+        >{{ $t("page.resource.metadataManagerBtnSelectFiles") }}
       </b-button>
     </b-col>
     <b-col>
@@ -42,11 +34,7 @@
           v-if="!editableDataUrl"
           @click="$emit('download')"
           :disabled="!showDetail || shownFiles.length === 0"
-          >{{
-            $parent.$parent.$parent.$t(
-              "page.resource.metadataManagerBtnDownload"
-            )
-          }}</b-button
+          >{{ $t("page.resource.metadataManagerBtnDownload") }}</b-button
         >
       </b-input-group>
     </b-col>
@@ -57,7 +45,7 @@
 import { defineComponent, PropType } from "vue-demi";
 
 import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
-import type { FolderContent } from "../../utils/EntryDefinition";
+import type { FolderContent } from "../../../utils/EntryDefinition";
 
 export default defineComponent({
   props: {
diff --git a/src/modules/resource/components/metadata/MetadataManagerSpecialProperties.vue b/src/modules/resource/components/resource-page/metadata/MetadataManagerSpecialProperties.vue
similarity index 90%
rename from src/modules/resource/components/metadata/MetadataManagerSpecialProperties.vue
rename to src/modules/resource/components/resource-page/metadata/MetadataManagerSpecialProperties.vue
index 73837dde786e970b98198ead2cce6334d1b4e842..680b65b57ee87720f93b8be8591099558527b14a 100644
--- a/src/modules/resource/components/metadata/MetadataManagerSpecialProperties.vue
+++ b/src/modules/resource/components/resource-page/metadata/MetadataManagerSpecialProperties.vue
@@ -4,14 +4,14 @@
       <coscine-form-group
         :mandatory="true"
         labelFor="dataUrl"
-        :label="$parent.$parent.$parent.$t('page.resource.dataUrl')"
+        :label="$t('page.resource.dataUrl')"
       >
         <b-input-group>
           <b-form-input
             id="dataUrl"
             @input="updateDataUrl(currentFolderContent, $event)"
             :value="currentFolderContent.dataUrl"
-            :placeholder="$parent.$parent.$parent.$t('page.resource.dataUrl')"
+            :placeholder="$t('page.resource.dataUrl')"
             :disabled="resource.archived || readOnly"
           />
           <b-button id="URLBtn" @click="openURL" :disabled="!isValidUrl"
@@ -24,12 +24,12 @@
       <coscine-form-group
         :mandatory="true"
         labelFor="metadataKey"
-        :label="$parent.$parent.$parent.$t('page.resource.metadataKey')"
+        :label="$t('page.resource.metadataKey')"
       >
         <b-form-input
           @change="updateAbsolutePath(currentFolderContent, $event)"
           :value="currentFolderContent.name"
-          :placeholder="$parent.$parent.$parent.$t('page.resource.metadataKey')"
+          :placeholder="$t('page.resource.metadataKey')"
           :disabled="resource.archived || readOnly"
         />
       </coscine-form-group>
@@ -43,7 +43,7 @@ import { defineComponent, PropType } from "vue-demi";
 import type {
   FileInformation,
   FolderContent,
-} from "../../utils/EntryDefinition";
+} from "../../../utils/EntryDefinition";
 import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
 
 export default defineComponent({
diff --git a/src/modules/resource/components/metadata/MetadataManagerTable.vue b/src/modules/resource/components/resource-page/metadata/MetadataManagerTable.vue
similarity index 95%
rename from src/modules/resource/components/metadata/MetadataManagerTable.vue
rename to src/modules/resource/components/resource-page/metadata/MetadataManagerTable.vue
index c3a8b940ac30cb5a2b55f2d2c2205749c21ed372..abc8293c7b6fc0e1e1c2018b43b0d23d310116b9 100644
--- a/src/modules/resource/components/metadata/MetadataManagerTable.vue
+++ b/src/modules/resource/components/resource-page/metadata/MetadataManagerTable.vue
@@ -36,7 +36,7 @@
           @click="$emit('loadAllFilesTab')"
           :pressed="currentFileId === -1"
           variant="outline-secondary"
-          >{{ $parent.$parent.$t("page.resource.allFiles") }}</b-button
+          >{{ $t("page.resource.allFiles") }}</b-button
         >
         <span v-if="shownFiles.length > 1 && shownFiles.length <= 10">
           <b-button
@@ -64,7 +64,7 @@
           {{ currentFolderContent.name }}
         </span>
         <span v-else-if="shownFiles.length > 0">{{
-          $parent.$parent.$t("page.resource.allFiles")
+          $t("page.resource.allFiles")
         }}</span>
       </b-col>
     </b-row>
@@ -74,7 +74,7 @@
 <script lang="ts">
 import { defineComponent, PropType } from "vue-demi";
 
-import type { FolderContent } from "../../utils/EntryDefinition";
+import type { FolderContent } from "../../../utils/EntryDefinition";
 
 export default defineComponent({
   props: {
diff --git a/src/modules/resource/components/modals/DeleteFolderContentsModal.vue b/src/modules/resource/components/resource-page/modals/DeleteFolderContentsModal.vue
similarity index 82%
rename from src/modules/resource/components/modals/DeleteFolderContentsModal.vue
rename to src/modules/resource/components/resource-page/modals/DeleteFolderContentsModal.vue
index 45fca191cbc596b1b7c71adcf584e7ca65e6f2e8..066826c37f0d4bafa49e33086eb05e195c97273d 100644
--- a/src/modules/resource/components/modals/DeleteFolderContentsModal.vue
+++ b/src/modules/resource/components/resource-page/modals/DeleteFolderContentsModal.vue
@@ -4,22 +4,14 @@
     :visible="visible"
     size="lg"
     hide-footer
-    :title="
-      $parent.$parent.$parent.$t(
-        'page.resource.modalDeleteFolderContentsHeader'
-      )
-    "
+    :title="$t('page.resource.modalDeleteFolderContentsHeader')"
     @hidden="$emit('close', $event.target.value)"
     @ok="$emit('ok', $event.target.value)"
     @cancel="$emit('close', $event.target.value)"
     @shown="$emit('shown', $event.target.value)"
   >
     <div>
-      {{
-        $parent.$parent.$parent.$t(
-          "page.resource.modalDeleteFolderContentsBody"
-        )
-      }}
+      {{ $t("page.resource.modalDeleteFolderContentsBody") }}
     </div>
     <br />
     <div
diff --git a/src/modules/resource/components/modals/SaveDuplicateFilesModal.vue b/src/modules/resource/components/resource-page/modals/SaveDuplicateFilesModal.vue
similarity index 67%
rename from src/modules/resource/components/modals/SaveDuplicateFilesModal.vue
rename to src/modules/resource/components/resource-page/modals/SaveDuplicateFilesModal.vue
index ed5efa652338537f3bb19b5399bedb57b27e0c78..c8e42d4612089fe16aa4b10ca97e7ead38b95185 100644
--- a/src/modules/resource/components/modals/SaveDuplicateFilesModal.vue
+++ b/src/modules/resource/components/resource-page/modals/SaveDuplicateFilesModal.vue
@@ -4,18 +4,14 @@
     :visible="visible"
     size="lg"
     hide-footer
-    :title="
-      $parent.$parent.$parent.$t('page.resource.modalSaveDuplicateFilesHeader')
-    "
+    :title="$t('page.resource.modalSaveDuplicateFilesHeader')"
     @hidden="$emit('close', $event.target.value)"
     @ok="$emit('ok', $event.target.value)"
     @cancel="$emit('close', $event.target.value)"
     @shown="$emit('shown', $event.target.value)"
   >
     <div>
-      {{
-        $parent.$parent.$parent.$t("page.resource.modalSaveDuplicateFilesBody")
-      }}
+      {{ $t("page.resource.modalSaveDuplicateFilesBody") }}
     </div>
     <br />
     <div
@@ -31,30 +27,18 @@
         class="float-left"
         @click="$emit('close', $event.target.value)"
         autofocus
-        >{{
-          $parent.$parent.$parent.$t(
-            "page.resource.modalSaveDuplicateFilesBtnCancel"
-          )
-        }}</b-button
+        >{{ $t("page.resource.modalSaveDuplicateFilesBtnCancel") }}</b-button
       >
       <b-button
         class="modalButtonFloatCenter"
         @click="$emit('skip', $event.target.value)"
-        >{{
-          $parent.$parent.$parent.$t(
-            "page.resource.modalSaveDuplicateFilesBtnSkip"
-          )
-        }}</b-button
+        >{{ $t("page.resource.modalSaveDuplicateFilesBtnSkip") }}</b-button
       >
       <b-button
         class="float-right"
         style="justify-content: flex-end"
         @click="$emit('ok', $event.target.value)"
-        >{{
-          $parent.$parent.$parent.$t(
-            "page.resource.modalSaveDuplicateFilesBtnOverwrite"
-          )
-        }}</b-button
+        >{{ $t("page.resource.modalSaveDuplicateFilesBtnOverwrite") }}</b-button
       >
     </div>
   </b-modal>
diff --git a/src/modules/resource/components/popovers/ValidationPopover.vue b/src/modules/resource/components/resource-page/popovers/ValidationPopover.vue
similarity index 91%
rename from src/modules/resource/components/popovers/ValidationPopover.vue
rename to src/modules/resource/components/resource-page/popovers/ValidationPopover.vue
index b077902d39ec1f93b41f5b323e99ffb3a58c1d83..5a3c5e4308a20bd144f1edff823be47e29808eac 100644
--- a/src/modules/resource/components/popovers/ValidationPopover.vue
+++ b/src/modules/resource/components/resource-page/popovers/ValidationPopover.vue
@@ -8,9 +8,7 @@
     placement="top"
   >
     <template v-slot:title
-      ><b>{{
-        $parent.$parent.$parent.$t("page.resource.validationErrors")
-      }}</b></template
+      ><b>{{ $t("page.resource.validationErrors") }}</b></template
     >
     <div>
       <ul>
diff --git a/src/modules/resource/components/settings/Actions.vue b/src/modules/resource/components/settings/Actions.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ff0aeed9fd8044668ab4e5415f8441d2a8880772
--- /dev/null
+++ b/src/modules/resource/components/settings/Actions.vue
@@ -0,0 +1,143 @@
+<template>
+  <div>
+    <!-- Archive -->
+    <coscine-form-group
+      labelFor="Archive"
+      :label="$t('page.settings.actions.resourceArchiveLabel')"
+      :isLoading="isLoading"
+      class="d-flex align-items-center"
+    >
+      <b-form-checkbox
+        id="Archive"
+        v-model="resourceForm.archived"
+        :disabled="!(isOwner || isResourceCreator) || !resourceForm"
+        @click.native.prevent="isArchiveModalVisible = true"
+        switch
+        size="lg"
+      />
+    </coscine-form-group>
+
+    <!-- Delete Resource -->
+    <coscine-form-group
+      labelFor="DeleteResource"
+      :label="$t('page.settings.actions.resourceDeleteLabel')"
+      :isLoading="isLoading"
+      class="d-flex align-items-center"
+    >
+      <!-- Delete Button -->
+      <b-button
+        id="DeleteResource"
+        type="delete"
+        variant="danger"
+        :disabled="!resourceForm"
+        @click.prevent="isDeleteModalVisible = true"
+      >
+        {{ $t("buttons.delete") }}</b-button
+      >
+    </coscine-form-group>
+
+    <!-- Archive Resource Modal -->
+    <ArchiveResourceModal
+      :open="isArchiveModalVisible"
+      :archived="resourceForm.archived"
+      @close="isArchiveModalVisible = false"
+      @toggleArchive="toggleArchive"
+    />
+
+    <!-- Delete Resource Modal -->
+    <DeleteResourceModal
+      :open="isDeleteModalVisible"
+      :displayName="resourceForm.displayName"
+      @close="isDeleteModalVisible = false"
+      @clickDelete="clickDelete"
+    />
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from "vue-demi";
+import useProjectStore from "@/modules/project/store";
+import useUserStore from "@/modules/user/store";
+import ArchiveResourceModal from "./modals/ArchiveResourceModal.vue";
+import DeleteResourceModal from "./modals/DeleteResourceModal.vue";
+import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
+import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User";
+
+export default defineComponent({
+  setup() {
+    const projectStore = useProjectStore();
+    const userStore = useUserStore();
+
+    return { projectStore, userStore };
+  },
+
+  components: {
+    ArchiveResourceModal,
+    DeleteResourceModal,
+  },
+
+  props: {
+    value: {
+      type: Object as PropType<ResourceObject>,
+      required: true,
+    },
+    isLoading: {
+      default: false,
+      type: Boolean,
+    },
+  },
+
+  data() {
+    return {
+      resourceForm: this.value,
+      isArchiveModalVisible: false,
+      isDeleteModalVisible: false,
+    };
+  },
+
+  computed: {
+    isOwner(): boolean | undefined {
+      return this.projectStore.currentUserRoleIsOwner;
+    },
+    user(): UserObject | null {
+      return this.userStore.user;
+    },
+    isResourceCreator(): boolean | undefined {
+      if (this.resourceForm.creator && this.user && this.user.id) {
+        return this.resourceForm.creator === this.user.id;
+      } else {
+        return undefined;
+      }
+    },
+  },
+
+  watch: {
+    resource: {
+      handler() {
+        this.$emit("input", this.resourceForm);
+      },
+      deep: true,
+    },
+  },
+
+  methods: {
+    toggleArchive() {
+      this.$emit("toggleArchive");
+      this.isArchiveModalVisible = false;
+    },
+
+    clickDelete() {
+      this.$emit("clickDelete");
+      this.isDeleteModalVisible = false;
+    },
+  },
+
+  emits: {
+    toggleArchive: null,
+    clickDelete: null,
+    input: (_: ResourceObject) => null,
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/modules/resource/components/settings/Configuration.vue b/src/modules/resource/components/settings/Configuration.vue
new file mode 100644
index 0000000000000000000000000000000000000000..35a7866020c55ae83dbc2980139178210ffe3077
--- /dev/null
+++ b/src/modules/resource/components/settings/Configuration.vue
@@ -0,0 +1,120 @@
+<template>
+  <div>
+    <!-- Content -->
+    <div v-if="resource">
+      <!-- Individual Fields -->
+      <div
+        v-for="(resourceOption, index) of Object.keys(
+          resource.resourceTypeOption
+        )"
+        :key="index"
+      >
+        <!-- Field Definition -->
+        <coscine-form-group
+          v-if="resourceOption !== 'Id'"
+          :labelFor="resourceOption"
+          :label="
+            $t(
+              'page.settings.configuration.resource' + resourceOption + 'Label'
+            )
+          "
+        >
+          <!-- Resource Size Field -->
+          <b-form-input
+            v-if="resourceOption === 'Size'"
+            :value="resourceSizeText"
+            :readonly="readonly"
+          />
+
+          <!-- Other Fields -->
+          <b-button-group v-else class="w-100">
+            <!-- Text Field -->
+            <b-form-input
+              v-model="resource.resourceTypeOption[resourceOption]"
+              :readonly="readonly"
+            />
+
+            <!-- Copy Button -->
+            <b-button
+              :id="`copyButton${index}`"
+              @click="
+                copyText(resource.resourceTypeOption[resourceOption], index)
+              "
+            >
+              <b-icon icon="clipboard" />
+            </b-button>
+
+            <!-- Copied Tooltip -->
+            <b-tooltip
+              :id="`copyTooltip${index}`"
+              :target="`copyButton${index}`"
+              placement="top"
+              triggers="blur"
+            >
+              {{
+                $t("page.settings.configuration.toClipboard", {
+                  resourceOption: $t(
+                    "page.settings.configuration.resource" + resourceOption
+                  ),
+                })
+              }}
+            </b-tooltip>
+          </b-button-group>
+        </coscine-form-group>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from "vue-demi";
+// import the store for current module
+import useResourceStore from "../../store";
+import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
+import type { ResourceTypeOption } from "../../types";
+
+export default defineComponent({
+  setup() {
+    const resourceStore = useResourceStore();
+
+    return { resourceStore };
+  },
+
+  components: {},
+
+  data() {
+    return {
+      readonly: true,
+    };
+  },
+
+  computed: {
+    resource(): ResourceObject | null {
+      return this.resourceStore.currentResource;
+    },
+    resourceSizeText(): string {
+      if (
+        this.resource &&
+        (this.resource.resourceTypeOption as ResourceTypeOption).Size
+      ) {
+        return (
+          (this.resource.resourceTypeOption as ResourceTypeOption).Size + " GB"
+        );
+      } else {
+        return this.$t("default.none").toString();
+      }
+    },
+  },
+
+  methods: {
+    copyText(value: string, index: number) {
+      if (this.resource) {
+        navigator.clipboard.writeText(value);
+        this.$root.$emit("bv::show::tooltip", `copyTooltip${index}`);
+      }
+    },
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/modules/resource/components/settings/Metadata.vue b/src/modules/resource/components/settings/Metadata.vue
new file mode 100644
index 0000000000000000000000000000000000000000..87a7d3e0ab2b403f963c1b9eff9d50cd40d9d6ab
--- /dev/null
+++ b/src/modules/resource/components/settings/Metadata.vue
@@ -0,0 +1,96 @@
+<template>
+  <div>
+    <!-- Form Generator -->
+    <b-row v-if="isLoadingFormGenerator" align-h="center" class="my-2">
+      <b-spinner variant="secondary" />
+    </b-row>
+    <FormGenerator
+      v-else
+      :key="resourceForm.applicationProfile"
+      :disabledMode="!isOwner || resource.archived"
+      :fixedValueMode="true"
+      :fixedValues="resourceForm.fixedValues"
+      :applicationProfileId="resourceForm.applicationProfile"
+      :SHACLDefinition="applicationProfileString"
+      :classReceiver="receiveClass"
+      :userReceiver="async () => user"
+      mimeType="application/ld+json"
+    />
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from "vue-demi";
+// import the store for current module
+import useResourceStore from "../../store";
+import useProjectStore from "@/modules/project/store";
+import useUserStore from "@/modules/user/store";
+import "@/plugins/form-generator";
+import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
+import type { BilingualLabels } from "@coscine/api-client/dist/types/Coscine.Api.Metadata";
+import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User";
+
+export default defineComponent({
+  setup() {
+    const resourceStore = useResourceStore();
+    const projectStore = useProjectStore();
+    const userStore = useUserStore();
+
+    return { resourceStore, projectStore, userStore };
+  },
+
+  props: {
+    value: {
+      type: Object as PropType<ResourceObject>,
+      required: true,
+    },
+    applicationProfileString: {
+      type: [String, null] as PropType<string | null>,
+      default: null,
+    },
+    isLoadingFormGenerator: {
+      type: Boolean,
+      required: true,
+    },
+  },
+
+  data() {
+    return {
+      resourceForm: this.value,
+    };
+  },
+
+  computed: {
+    resource(): ResourceObject | null {
+      return this.resourceStore.currentResource;
+    },
+    isOwner(): boolean | undefined {
+      return this.projectStore.currentUserRoleIsOwner;
+    },
+    user(): UserObject | null {
+      return this.userStore.user;
+    },
+  },
+
+  watch: {
+    resourceForm: {
+      handler() {
+        this.$emit("input", this.resourceForm);
+      },
+      deep: true,
+    },
+  },
+
+  methods: {
+    async receiveClass(className: string): Promise<BilingualLabels> {
+      return await this.resourceStore.getClass(className);
+    },
+  },
+
+  emits: {
+    input: (_: ResourceObject) => null,
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/modules/resource/components/settings/Overview.vue b/src/modules/resource/components/settings/Overview.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d01f1079a4cf884edae201a373ef46466969e2af
--- /dev/null
+++ b/src/modules/resource/components/settings/Overview.vue
@@ -0,0 +1,277 @@
+<template>
+  <div class="overview">
+    <!-- First Row -->
+    <b-row id="selectBoxes">
+      <!-- Project -->
+      <b-col>
+        <coscine-form-group
+          labelFor="ProjectName"
+          :label="$t('form.project.projectNameLabel')"
+          :isLoading="!project"
+          type="input"
+        >
+          <b-form-input
+            v-if="project"
+            id="ProjectName"
+            v-model="project.displayName"
+            :readonly="readonly"
+            required
+          />
+        </coscine-form-group>
+      </b-col>
+
+      <!-- Resource Dropdown -->
+      <b-col>
+        <coscine-form-group
+          labelFor="Resource"
+          :label="$t('page.settings.overview.resourceLabel')"
+          :isLoading="!resource"
+        >
+          <b-form-select
+            v-if="resource"
+            id="Resource"
+            v-model="selectedResource"
+            :options="allResources"
+            value-field="id"
+            text-field="displayName"
+            @change="switchResource"
+          >
+            <template #first>
+              <b-form-select-option :value="undefined" disabled>
+                {{ $t("page.settings.overview.resourceSelect") }}
+              </b-form-select-option>
+            </template>
+          </b-form-select>
+        </coscine-form-group>
+      </b-col>
+    </b-row>
+
+    <!-- Second Row -->
+    <b-row>
+      <!-- Display Name -->
+      <b-col>
+        <coscine-form-group
+          labelFor="DisplayName"
+          :label="$t('form.resource.resourceNameLabel')"
+          :isLoading="!resource"
+        >
+          <b-form-input
+            v-if="resource"
+            id="DisplayName"
+            v-model="resource.displayName"
+            required
+            :readonly="readonly"
+          />
+        </coscine-form-group>
+      </b-col>
+
+      <!-- Persistent ID -->
+      <b-col>
+        <coscine-form-group
+          labelFor="PersistentId"
+          :label="$t('page.settings.overview.persistentIdLabel')"
+          :isLoading="!resource"
+        >
+          <b-button-group class="w-100">
+            <!-- Text Field -->
+            <b-form-input
+              v-if="resource"
+              id="PersistentId"
+              v-model="resource.pid"
+              required
+              :readonly="readonly"
+            />
+
+            <!-- Copy Button -->
+            <b-button id="copyPidButton" @click="copyPID()">
+              <b-icon icon="clipboard" />
+            </b-button>
+
+            <!-- Copied Tooltip -->
+            <b-tooltip
+              id="copyPidTooltip"
+              target="copyPidButton"
+              placement="top"
+              triggers="blur"
+            >
+              {{
+                $t("page.settings.configuration.toClipboard", {
+                  resourceOption: $t("page.settings.overview.persistentId"),
+                })
+              }}
+            </b-tooltip>
+          </b-button-group>
+        </coscine-form-group>
+      </b-col>
+    </b-row>
+
+    <!-- Third Row -->
+    <b-row>
+      <!-- Resource Type -->
+      <b-col>
+        <coscine-form-group
+          labelFor="ResourceType"
+          :label="$t('page.settings.overview.resourceTypeLabel')"
+          :isLoading="!resource"
+          type="input"
+        >
+          <b-form-input
+            v-if="resource"
+            id="ResourceType"
+            :value="
+              $t('resourceTypes.' + resource.type.displayName + '.displayName')
+            "
+            required
+            :readonly="readonly"
+          />
+        </coscine-form-group>
+      </b-col>
+
+      <!-- Resource Quota -->
+      <b-col>
+        <coscine-form-group
+          v-if="resource && resource.resourceTypeOption.Size"
+          labelFor="Quota"
+          :label="$t('page.settings.overview.quotaLabel')"
+          :isLoading="!(resource && quotaCurrent >= 0 && quotaCurrent !== null)"
+        >
+          <b-button-group class="progressContainer h-100 w-100">
+            <!-- Progress Bar -->
+            <b-progress
+              :max="quotaMaximum"
+              height="inherit"
+              class="w-100 border-1 light"
+            >
+              <b-progress-bar
+                :value="quotaCurrent"
+                :variant="
+                  quotaCurrent / quotaMaximum >= 0.8 ? 'danger' : 'primary'
+                "
+              >
+                <span>
+                  <strong
+                    :class="
+                      quotaCurrent / quotaMaximum < 0.5
+                        ? 'justify-content-center d-flex position-absolute w-100 text-body'
+                        : ''
+                    "
+                  >
+                    {{ formatBytes(quotaCurrent) }} /
+                    {{ formatBytes(quotaMaximum) }}
+                  </strong>
+                </span>
+              </b-progress-bar>
+            </b-progress>
+
+            <!-- Quota Page -->
+            <b-button v-if="isOwner" :to="{ name: 'project-quota' }">
+              <b-icon icon="gear" />
+            </b-button>
+          </b-button-group>
+        </coscine-form-group>
+      </b-col>
+    </b-row>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from "vue-demi";
+// import the store for current module
+import useResourceStore from "../../store";
+import useProjectStore from "@/modules/project/store";
+import { FileUtil } from "../../utils/FileUtil";
+import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
+import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
+import type { RawLocation } from "vue-router";
+
+export default defineComponent({
+  setup() {
+    const resourceStore = useResourceStore();
+    const projectStore = useProjectStore();
+
+    return { resourceStore, projectStore };
+  },
+
+  components: {},
+
+  props: {
+    value: {
+      type: Object as PropType<ResourceObject>,
+      required: false,
+    },
+  },
+
+  data() {
+    return {
+      readonly: true,
+      selectedResource: undefined as string | undefined,
+      conversionFactor: Math.pow(1024, 3), // Byte <-> GB
+    };
+  },
+
+  created() {
+    // Fill the resource form
+    this.onResourceLoaded();
+  },
+
+  computed: {
+    project(): ProjectObject | null {
+      return this.projectStore.currentProject;
+    },
+    resource(): ResourceObject | null {
+      return this.resourceStore.currentResource;
+    },
+    isOwner(): boolean | undefined {
+      return this.projectStore.currentUserRoleIsOwner;
+    },
+    allResources(): ResourceObject[] | null {
+      return this.projectStore.currentResources;
+    },
+    quotaCurrent(): number | null {
+      return this.resourceStore.currentUsedQuota; // value is in Bytes
+    },
+    quotaMaximum(): number | null {
+      if (this.resource) {
+        return this.resource.resourceTypeOption.Size * this.conversionFactor; // GB to Byte
+      } else {
+        return null;
+      }
+    },
+  },
+
+  watch: {
+    resource() {
+      this.onResourceLoaded();
+    },
+  },
+
+  methods: {
+    onResourceLoaded() {
+      if (this.resource) {
+        this.selectedResource = this.resource.id;
+      }
+    },
+    copyPID() {
+      if (this.resource) {
+        navigator.clipboard.writeText(
+          "http://hdl.handle.net/" + this.resource.pid
+        );
+        this.$root.$emit("bv::show::tooltip", "copyPidTooltip");
+      }
+    },
+    switchResource(id: string) {
+      const route = {
+        name: "resource-settings",
+        params: { guid: id },
+      } as RawLocation;
+      const url = this.$router.resolve(route).href;
+      window.location.href = url;
+    },
+    formatBytes(bytes: number) {
+      return FileUtil.formatBytes(bytes);
+    },
+  },
+});
+</script>
+
+<style scoped></style>
diff --git a/src/modules/resource/components/settings/modals/ArchiveResourceModal.vue b/src/modules/resource/components/settings/modals/ArchiveResourceModal.vue
new file mode 100644
index 0000000000000000000000000000000000000000..fcbe449b46fe7f03f1fd7f5fb4f12e2a73a3955f
--- /dev/null
+++ b/src/modules/resource/components/settings/modals/ArchiveResourceModal.vue
@@ -0,0 +1,87 @@
+<template>
+  <!-- Archive Resource Modal -->
+  <b-modal v-model="isOpen" @close="close" @hidden="hidden" :hide-footer="true">
+    <!-- Title -->
+    <template #modal-title>
+      <span class="h6">
+        {{ $t(`page.settings.actions.${action}.modal.title`) }}
+      </span>
+    </template>
+
+    <!-- Body -->
+    <i18n
+      :path="`page.settings.actions.${action}.modal.body`"
+      tag="p"
+      class="mb-3"
+    >
+      <template #br><br /></template>
+    </i18n>
+
+    <template>
+      <!-- Modal Cancel Button -->
+      <b-button @click="close">{{ $t("buttons.cancel") }}</b-button>
+      <!-- Modal Delete Button -->
+      <b-button @click="toggleArchive" variant="primary" class="float-right">
+        {{ $t(`buttons.${action}`) }}
+      </b-button>
+    </template>
+  </b-modal>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType } from "vue-demi";
+
+export default defineComponent({
+  props: {
+    archived: {
+      type: [Boolean, null] as PropType<boolean | null>,
+      default: null,
+    },
+    open: {
+      required: true,
+      default: () => false,
+      type: Boolean,
+    },
+  },
+
+  data() {
+    return {
+      isOpen: false,
+      deleteName: "",
+      inputState: false,
+      showHelp: false,
+    };
+  },
+
+  computed: {
+    action(): string {
+      return this.archived ? "unarchive" : "archive";
+    },
+  },
+
+  watch: {
+    open() {
+      this.isOpen = this.open;
+    },
+  },
+
+  methods: {
+    close() {
+      this.isOpen = false;
+    },
+    hidden() {
+      this.$emit("close");
+    },
+    toggleArchive() {
+      this.$emit("toggleArchive");
+    },
+  },
+
+  emits: {
+    toggleArchive: null,
+    close: null,
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/modules/resource/components/settings/modals/DeleteResourceModal.vue b/src/modules/resource/components/settings/modals/DeleteResourceModal.vue
new file mode 100644
index 0000000000000000000000000000000000000000..4da11940a68ad0d677419f97e661f2c292bcf902
--- /dev/null
+++ b/src/modules/resource/components/settings/modals/DeleteResourceModal.vue
@@ -0,0 +1,115 @@
+<template>
+  <!-- Delete Resource Modal -->
+  <b-modal v-model="isOpen" @close="close" @hidden="hidden" :hide-footer="true">
+    <!-- Title -->
+    <template #modal-title>
+      <span class="h6"> {{ $t(titleKey) }} </span>
+    </template>
+
+    <div>
+      {{ $t(descriptionKey) }}
+    </div>
+
+    <b-form-group>
+      <!-- Modal Resource Display Name -->
+      <p class="h6 my-2">
+        {{ displayName }}
+      </p>
+
+      <!-- Modal Input Text Field -->
+      <b-form-input
+        v-model="deleteName"
+        :state="nameValid"
+        :placeholder="displayName"
+        required
+        @keyup.enter.prevent="clickDelete"
+      ></b-form-input>
+      <div class="invalid-tooltip">
+        {{ $t("page.settings.actions.delete.modal.help") }}
+      </div>
+    </b-form-group>
+
+    <template>
+      <!-- Modal Cancel Button -->
+      <b-button @click="close">{{ $t("buttons.cancel") }}</b-button>
+      <!-- Modal Delete Button -->
+      <b-button
+        @click="clickDelete"
+        variant="danger"
+        class="float-right"
+        :disabled="!nameValid"
+        >{{ $t("buttons.delete") }}</b-button
+      >
+    </template>
+  </b-modal>
+</template>
+
+<script lang="ts">
+import { defineComponent } from "vue-demi";
+
+export default defineComponent({
+  props: {
+    descriptionKey: {
+      default: "page.settings.actions.delete.modal.body",
+      type: String,
+    },
+    titleKey: {
+      default: "page.settings.actions.delete.modal.title",
+      type: String,
+    },
+    open: {
+      required: true,
+      default: () => false,
+      type: Boolean,
+    },
+    displayName: {
+      default: "",
+      type: String,
+    },
+  },
+
+  data() {
+    return {
+      isOpen: false,
+      deleteName: "",
+      inputState: false,
+      showHelp: false,
+    };
+  },
+
+  computed: {
+    nameValid(): boolean | null {
+      return this.deleteName && this.displayName
+        ? this.deleteName.trim() === this.displayName.trim()
+        : null;
+    },
+  },
+
+  watch: {
+    open() {
+      this.isOpen = this.open;
+    },
+  },
+
+  methods: {
+    close() {
+      this.isOpen = false;
+    },
+    hidden() {
+      this.$emit("close");
+    },
+    clickDelete() {
+      if (this.nameValid) {
+        this.$emit("clickDelete");
+      }
+    },
+  },
+
+  emits: {
+    clickDelete: null,
+    close: null,
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/modules/resource/i18n/de.ts b/src/modules/resource/i18n/de.ts
index ba14de5cdfccf1205e869cc74d952fddd87acd32..83cbe6ddd81ba0b82c2960994df8407d982edab4 100644
--- a/src/modules/resource/i18n/de.ts
+++ b/src/modules/resource/i18n/de.ts
@@ -8,9 +8,54 @@ export default {
   */
   page: {
     createResource: {
-      title: "Create-Resource-Seite",
-      description:
-        "Das ist die @:page.createResource.title des Coscine UIv2 Apps",
+      title: "Ressource hinzufügen",
+      configuration: {
+        title: "Schritt 1: @:(form.steps.first)",
+        needMore: "Benötigen Sie mehr Speicher?",
+        bucketSize: "{size} GB, dies entspricht circa {files} Dateien.",
+        labels: {
+          resourceType: "Ressourcentyp:",
+          size: "Ressourcengröße:",
+        },
+        popover: {
+          title: "Quota nicht ausreichend",
+          body: "Dieses Projekt hat nicht genug Quota um weitere Ressourcen anlegen zu können. Im Quotamanagement können Sie zusätzlichen Speicher beantragen.",
+        },
+        validation: {
+          errorMessage:
+            "Es konnte keine Verbindung zur Ressource hergestellt werden. Bitte überprüfen Sie die Eingaben.",
+        },
+      },
+      general: {
+        title: "Schritt 2: @:(form.steps.second)",
+      },
+      metadata: {
+        title: "Schritt 3: @:(form.steps.third)",
+        createAp: {
+          tooltip: "Anfrage zur Erstellung eines Applikationsprofils",
+          tooltipDisabled:
+            "Fügen Sie bitte {linkToUserProfile} Ihre Emailadresse hinzu und verfizieren Sie diese, um eine Anfrage zur Erstellung von neuen Applikationsprofilen senden zu können",
+          tooltipHere: "hier",
+          title: "Erstellung von Applikationsprofilen:",
+          body: "Zur Konfiguration und Erstellung eines individuellen Applikationsprofils werden Sie auf eine andere Webseite umgeleitet. {br}{br}Der Review-Prozess für die Bereitstellung des Profils dauert für gewöhnlich einige Tage. Falls nötig, werden Sie von unserem Consulting-Team kontaktiert, um Sie in diesem Prozess zu unterstützen. {br}{br}Möchten Sie zur Webseite zur Erstellung eines Applikationsprofils weiterleitet werden?",
+        },
+        applicationProfileLabel: "Applikationsprofil:",
+        selectApplicationProfile: "Bitte wählen sie ein Applikationsprofil aus",
+      },
+      overview: {
+        title: "Schritt 4: @:(form.steps.fourth)",
+        resourceConfiguration: "Ressourcen Konfiguration",
+      },
+      multiselect: {
+        placeholderResourceText: "Bitte wählen Sie einen Ressourcentyp aus.",
+        placeholderApplicationProfileText:
+          "Bitte wählen Sie ein Applikationsprofil aus.",
+
+        selectEnter: "Zum Auswählen Enter drücken.",
+        noResults:
+          "Keine Ergebnisse verfügbar. Bitte passen Sie die Suchanfrage an.",
+        noOptions: "Die Liste ist leer.",
+      },
     },
     resource: {
       resources: "Ressourcen",
@@ -37,7 +82,7 @@ export default {
       description: "Ressourcenbeschreibung",
       disciplines: "Disziplin",
       keywords: "Ressourcenschlagwörter",
-      visibility: "Sichtbarkeit",
+      visibility: "Sichtbarkeit der Metadaten",
       license: "Lizenz",
       usageRights: "Verwendungsrechte",
 
@@ -119,8 +164,108 @@ export default {
       size: "Dateigröße",
     },
     settings: {
-      title: "Settings-Seite",
-      description: "Das ist die @:page.settings.title des Coscine UIv2 Apps",
+      title: "@:(breadcrumbs.resource.settings)",
+      overview: {
+        resource: "Ressource",
+        resourceLabel:
+          "@:(page.settings.overview.resource)@:(form.labelSymbol)",
+        resourceSelect: "Bitte wählen Sie eine Ressource aus",
+
+        resourceTypeLabel:
+          "@:(page.createResource.configuration.labels.resourceType)",
+
+        persistentId: "Persistent Identifier (PID)",
+        persistentIdLabel:
+          "@:(page.settings.overview.persistentId)@:(form.labelSymbol)",
+
+        quota: "Quota",
+        quotaLabel: "@:(page.settings.overview.quota)@:(form.labelSymbol)",
+      },
+      configuration: {
+        resourceBucketName: "Bucket-Name",
+        resourceBucketNameLabel:
+          "@:(page.settings.configuration.resourceBucketName)@:(form.labelSymbol)",
+
+        resourceSize: "Ressourcengröße",
+        resourceSizeLabel:
+          "@:(page.settings.configuration.resourceSize)@:(form.labelSymbol)",
+
+        resourceAccessKey: "Access Key",
+        resourceReadAccessKey:
+          "@:(page.settings.configuration.resourceAccessKey) (Lesen)",
+        resourceReadAccessKeyLabel:
+          "@:(page.settings.configuration.resourceReadAccessKey)@:(form.labelSymbol)",
+
+        resourceWriteAccessKey:
+          "@:(page.settings.configuration.resourceAccessKey) (Schreiben)",
+        resourceWriteAccessKeyLabel:
+          "@:(page.settings.configuration.resourceWriteAccessKey)@:(form.labelSymbol)",
+
+        resourceSecretKey: "Secret Key",
+        resourceReadSecretKey:
+          "@:(page.settings.configuration.resourceSecretKey) (Lesen)",
+        resourceReadSecretKeyLabel:
+          "@:(page.settings.configuration.resourceReadSecretKey)@:(form.labelSymbol)",
+
+        resourceWriteSecretKey:
+          "@:(page.settings.configuration.resourceSecretKey) (Schreiben)",
+        resourceWriteSecretKeyLabel:
+          "@:(page.settings.configuration.resourceWriteSecretKey)@:(form.labelSymbol)",
+
+        resourceEndpoint: "End Point",
+        resourceEndpointLabel:
+          "@:(page.settings.configuration.resourceEndpoint)@:(form.labelSymbol)",
+
+        resourceResourceUrl: "Ressourcen-URL",
+        resourceResourceUrlLabel:
+          "@:(page.settings.configuration.resourceResourceUrl)@:(form.labelSymbol)",
+
+        resourceRepositoryNumber: "Repository ID",
+        resourceRepositoryNumberLabel:
+          "@:(page.settings.configuration.resourceRepositoryNumber)@:(form.labelSymbol)",
+
+        resourceRepositoryUrl: "Repository URL",
+        resourceRepositoryUrlLabel:
+          "@:(page.settings.configuration.resourceRepositoryUrl)@:(form.labelSymbol)",
+
+        toClipboard: "{resourceOption} wurde in der Zwischenablage kopiert",
+      },
+      actions: {
+        resourceArchive: "Ressource archivieren",
+        resourceArchiveLabel:
+          "@:(page.settings.actions.resourceArchive)@:(form.labelSymbol)",
+
+        resourceDelete: "Ressource löschen",
+        resourceDeleteLabel:
+          "@:(page.settings.actions.resourceDelete)@:(form.labelSymbol)",
+        archive: {
+          modal: {
+            title: "Ressource archivieren",
+            body: "Wenn der Status einer Ressource auf archiviert gesetzt wird, können Daten und Metadaten von Benutzern nicht mehr geändert werden. Das Lesen der Daten und das Herunterladen von Dateien ist jedoch weiterhin möglich. {br}{br}Der Status kann von Projektbesitzern zurückgesetzt werden, wenn die Daten ergänzt oder aktualisiert werden sollen.",
+          },
+          toast: {
+            title: "Ressource archiviert",
+            body: "Die Ressource wurde erfolgreich archiviert.",
+          },
+        },
+        unarchive: {
+          modal: {
+            title: "Aufheben des archivierten Status",
+            body: "Wenn der archivierte Status nicht mehr gesetzt ist, kehren die Ressourcen zur normalen Funktionalität zurück (z.B. Hinzufügen neuer Dateien und Aktualisieren von Metadaten). {br}{br}Der Status kann von Projektbesitzern wieder gesetzt werden, um zu verhindern, dass Benutzer Daten bearbeiten.",
+          },
+          toast: {
+            title: "Ressourcenstatus zurückgesetzt",
+            body: "Der Archivierungsstatus der Ressource wurde erfolgreich zurückgesetzt.",
+          },
+        },
+        delete: {
+          modal: {
+            title: "Ressource wirklich entfernen?",
+            body: "Wenn Sie sicher sind, dass Sie diese Ressource entfernen möchten, wiederholen Sie bitte den Ressourcennamen:",
+            help: "Der angegebene Name stimmt nicht mit dem Ressourcenname überein.",
+          },
+        },
+      },
     },
   },
 
@@ -182,5 +327,74 @@ export default {
         },
       },
     },
-  } as VueI18n.LocaleMessageObject,
+  },
+
+  form: {
+    labelSymbol: ":",
+    project: {
+      projectName: "Projektname",
+      projectNameLabel: "@:(form.project.projectName)@:(form.labelSymbol)",
+    },
+    resource: {
+      resourceName: "Ressourcenname",
+      resourceNameHelp:
+        "Dieses Feld ist erforderlich und besitzt eine Maximallänge von {maxLength} Zeichen.",
+      resourceNameLabel: "@:(form.resource.resourceName)@:(form.labelSymbol)",
+
+      displayName: "Anzeigename",
+      displayNameHelp:
+        "Dieses Feld ist erforderlich und besitzt eine Maximallänge von {maxLength} Zeichen.",
+      displayNameLabel: "@:(form.resource.displayName)@:(form.labelSymbol)",
+
+      resourceDescription: "Ressourcenbeschreibung",
+      resourceDescriptionHelp:
+        "Dieses Feld ist erforderlich und besitzt eine Maximallänge von {maxLength} Zeichen.",
+      resourceDescriptionLabel:
+        "@:(form.resource.resourceDescription)@:(form.labelSymbol)",
+
+      resourceDiscipline: "Disziplin",
+      resourceDisciplineLabel:
+        "@:(form.resource.resourceDiscipline)@:(form.labelSymbol)",
+
+      resourceKeywords: "Ressourcenschlagwörter",
+      resourceKeywordsPlaceholder:
+        'Tippen und drücken Sie "Enter", um ein Schlagwort einzufügen.',
+      resourceKeywordsHelp:
+        "Dieses Feld besitzt eine Maximallänge von {maxLength} Zeichen.",
+      resourceKeywordsEmpty: "Die Liste ist leer.",
+      resourceKeywordsLabel:
+        "@:(form.resource.resourceKeywords)@:(form.labelSymbol)",
+      tagPlaceholder: "Sie können diesen Tag hinzufügen",
+
+      resourceMetadataVisibility: "Sichtbarkeit der Metadaten",
+      resourceMetadataVisibilityLabel:
+        "@:(form.resource.resourceMetadataVisibility)@:(form.labelSymbol)",
+
+      resourceLicense: "Lizenz",
+      resourceLicenseLabel:
+        "@:(form.resource.resourceLicense)@:(form.labelSymbol)",
+      resourceLicensePopover: "Für weitere Informationen zu Lizenzen siehe ",
+      resourceLicensePopoverUrl:
+        "https://help.itc.rwth-aachen.de/service/b2b7729fd93f4c7080b475776f6b5d87/article/7812e3fcd3a241808f5b91e11b6ca3a9/",
+      resourceLicenseSelect: "Bitte wählen Sie eine Lizenz aus",
+      resourceLicenseHelp:
+        "Dieses Feld besitzt eine Maximallänge von {maxLength} Zeichen.",
+
+      resourceReuse: "Interne Regeln zur Nachnutzung",
+      resourceReuseLabel: "@:(form.resource.resourceReuse)@:(form.labelSymbol)",
+      resourceReusePopover:
+        "Für weitere Informationen zu internen Regeln zur Nachnutzung siehe ",
+      resourceReusePopoverUrl:
+        "https://help.itc.rwth-aachen.de/service/b2b7729fd93f4c7080b475776f6b5d87/article/7812e3fcd3a241808f5b91e11b6ca3a9/",
+      resourceReuseHelp:
+        "Dieses Feld besitzt eine Maximallänge von {maxLength} Zeichen.",
+    },
+    steps: {
+      first: "Ressourcen-Konfiguration",
+      second: "Generelle Informationen",
+      third: "Metadaten der Ressource",
+      fourth: "Übersicht & Bestätigung",
+      fifth: "Aktionen",
+    },
+  },
 } as VueI18n.LocaleMessageObject;
diff --git a/src/modules/resource/i18n/en.ts b/src/modules/resource/i18n/en.ts
index 21b970b4f9be6986dac515ffe44c9f95306ec5a1..39c2f3ae188dff91c0087bd79d417076d708705c 100644
--- a/src/modules/resource/i18n/en.ts
+++ b/src/modules/resource/i18n/en.ts
@@ -8,9 +8,53 @@ export default {
   */
   page: {
     createResource: {
-      title: "Create Resource Page",
-      description:
-        "This is the @:page.createResource.title for the Coscine UIv2 App",
+      title: "Add Resource",
+      configuration: {
+        title: "Step 1: @:(form.steps.first)",
+        needMore: "Need more?",
+        bucketSize: "{size} GB, this equals approximately {files} files.",
+        labels: {
+          resourceType: "Resource Type:",
+          size: "Resource Size:",
+        },
+        popover: {
+          title: "Quota not sufficient",
+          body: "This project does not have sufficient quota to create more resources. You can apply for more storage space in the quota management.",
+        },
+        validation: {
+          errorMessage:
+            "No connection with the resource is possible. Please check the provided data.",
+        },
+      },
+      general: {
+        title: "Step 2: @:(form.steps.second)",
+      },
+      metadata: {
+        title: "Step 3: @:(form.steps.third)",
+        createAp: {
+          tooltip: "Request for creation of application profiles",
+          tooltipDisabled:
+            "Please add and verify your email address {linkToUserProfile} to request for creation of application profiles",
+          tooltipHere: "here",
+          title: "Creation of Application Profiles:",
+          body: "You are going to get redirected to another page to configure and create a customized application profile. {br}{br}The review process for provisioning submissions usually takes a few days. If required, you will be contacted by our consulting team to support you with the process. {br}{br}Do you want to get redirected to the application profile creation page?",
+        },
+        applicationProfileLabel: "Application Profile:",
+        selectApplicationProfile: "Please select an application profile",
+      },
+      overview: {
+        title: "Step 4: @:(form.steps.fourth)",
+        resourceConfiguration: "Resource Configuration",
+      },
+      multiselect: {
+        placeholderResourceText: "Please select a resource type.",
+        placeholderApplicationProfileText:
+          "Please select an application profile.",
+
+        selectEnter: "Press enter to select.",
+        noResults: "No elements found. Consider changing the search query.",
+        noOptions: "List is empty.",
+      },
     },
     resource: {
       resources: "Resources",
@@ -37,7 +81,7 @@ export default {
       description: "Resource Description",
       disciplines: "Discipline",
       keywords: "Resource Keywords",
-      visibility: "Visibility",
+      visibility: "Metadata Visibility",
       license: "License",
       usageRights: "Usage Rights",
 
@@ -117,8 +161,108 @@ export default {
       size: "File Size",
     },
     settings: {
-      title: "Settings Page",
-      description: "This is the @:page.settings.title for the Coscine UIv2 App",
+      title: "@:(breadcrumbs.resource.settings)",
+      overview: {
+        resource: "Resource",
+        resourceLabel:
+          "@:(page.settings.overview.resource)@:(form.labelSymbol)",
+        resourceSelect: "Please select a resource",
+
+        resourceTypeLabel:
+          "@:(page.createResource.configuration.labels.resourceType)",
+
+        persistentId: "Persistent Identifier (PID)",
+        persistentIdLabel:
+          "@:(page.settings.overview.persistentId)@:(form.labelSymbol)",
+
+        quota: "Quota",
+        quotaLabel: "@:(page.settings.overview.quota)@:(form.labelSymbol)",
+      },
+      configuration: {
+        resourceBucketName: "Bucket Name",
+        resourceBucketNameLabel:
+          "@:(page.settings.configuration.resourceBucketName)@:(form.labelSymbol)",
+
+        resourceSize: "Resource Size",
+        resourceSizeLabel:
+          "@:(page.settings.configuration.resourceSize)@:(form.labelSymbol)",
+
+        resourceAccessKey: "Access Key",
+        resourceReadAccessKey:
+          "@:(page.settings.configuration.resourceAccessKey) (Reading)",
+        resourceReadAccessKeyLabel:
+          "@:(page.settings.configuration.resourceReadAccessKey)@:(form.labelSymbol)",
+
+        resourceWriteAccessKey:
+          "@:(page.settings.configuration.resourceAccessKey) (Writing)",
+        resourceWriteAccessKeyLabel:
+          "@:(page.settings.configuration.resourceWriteAccessKey)@:(form.labelSymbol)",
+
+        resourceSecretKey: "Secret Key",
+        resourceReadSecretKey:
+          "@:(page.settings.configuration.resourceSecretKey) (Reading)",
+        resourceReadSecretKeyLabel:
+          "@:(page.settings.configuration.resourceReadSecretKey)@:(form.labelSymbol)",
+
+        resourceWriteSecretKey:
+          "@:(page.settings.configuration.resourceSecretKey) (Writing)",
+        resourceWriteSecretKeyLabel:
+          "@:(page.settings.configuration.resourceWriteSecretKey)@:(form.labelSymbol)",
+
+        resourceEndpoint: "End Point",
+        resourceEndpointLabel:
+          "@:(page.settings.configuration.resourceEndpoint)@:(form.labelSymbol)",
+
+        resourceResourceUrl: "Resource Url",
+        resourceResourceUrlLabel:
+          "@:(page.settings.configuration.resourceResourceUrl)@:(form.labelSymbol)",
+
+        resourceRepositoryNumber: "Repository ID",
+        resourceRepositoryNumberLabel:
+          "@:(page.settings.configuration.resourceRepositoryNumber)@:(form.labelSymbol)",
+
+        resourceRepositoryUrl: "Repository URL",
+        resourceRepositoryUrlLabel:
+          "@:(page.settings.configuration.resourceRepositoryUrl)@:(form.labelSymbol)",
+
+        toClipboard: "{resourceOption} has been copied to clipboard",
+      },
+      actions: {
+        resourceArchive: "Archive Resource",
+        resourceArchiveLabel:
+          "@:(page.settings.actions.resourceArchive)@:(form.labelSymbol)",
+
+        resourceDelete: "Delete Resource",
+        resourceDeleteLabel:
+          "@:(page.settings.actions.resourceDelete)@:(form.labelSymbol)",
+        archive: {
+          modal: {
+            title: "Archive resource",
+            body: "If the status of a resource is set to archived, data and metadata can not be changed by users any longer. However, reading the data and downloading files is still possible. {br}{br}The status can be unset by project owners if the data has to be extended or updated.",
+          },
+          toast: {
+            title: "Resource archived",
+            body: "The resource was successfully set to archived.",
+          },
+        },
+        unarchive: {
+          modal: {
+            title: "Unset archived status",
+            body: "If the archived-status is unset, resources return to normal functionality (e.g. adding new files and updating metadata). {br}{br}The archived status can be set again by project owners to prevent users from editing data.",
+          },
+          toast: {
+            title: "Resource status reset",
+            body: "The resource archived status was successfully set to normal.",
+          },
+        },
+        delete: {
+          modal: {
+            title: "Do you really want to delete this resource?",
+            body: "If you are sure you really want to delete this resource, please type its name:",
+            help: "The entered name does not match the resource name.",
+          },
+        },
+      },
     },
   },
 
@@ -175,5 +319,74 @@ export default {
         },
       },
     },
-  } as VueI18n.LocaleMessageObject,
+  },
+
+  form: {
+    labelSymbol: ":",
+    project: {
+      projectName: "Project Name",
+      projectNameLabel: "@:(form.project.projectName)@:(form.labelSymbol)",
+    },
+    resource: {
+      resourceName: "Resource Name",
+      resourceNameHelp:
+        "This is a required field and can only contain up to {maxLength} characters.",
+      resourceNameLabel: "@:(form.resource.resourceName)@:(form.labelSymbol)",
+
+      displayName: "Display Name",
+      displayNameHelp:
+        "This is a required field and can only contain up to {maxLength} characters.",
+      displayNameLabel: "@:(form.resource.displayName)@:(form.labelSymbol)",
+
+      resourceDescription: "Resource Description",
+      resourceDescriptionHelp:
+        "This is a required field and can only contain up to {maxLength} characters.",
+      resourceDescriptionLabel:
+        "@:(form.resource.resourceDescription)@:(form.labelSymbol)",
+
+      resourceDiscipline: "Discipline",
+      resourceDisciplineLabel:
+        "@:(form.resource.resourceDiscipline)@:(form.labelSymbol)",
+
+      resourceKeywords: "Resource Keywords",
+      resourceKeywordsPlaceholder:
+        'Type, then press "Enter" to insert a Keyword.',
+      resourceKeywordsHelp:
+        "This field can only contain up to {maxLength} characters.",
+      resourceKeywordsEmpty: "The list of keywords is empty.",
+      resourceKeywordsLabel:
+        "@:(form.resource.resourceKeywords)@:(form.labelSymbol)",
+      tagPlaceholder: "You can add this tag",
+
+      resourceMetadataVisibility: "Metadata Visibility",
+      resourceMetadataVisibilityLabel:
+        "@:(form.resource.resourceMetadataVisibility)@:(form.labelSymbol)",
+
+      resourceLicense: "License",
+      resourceLicenseLabel:
+        "@:(form.resource.resourceLicense)@:(form.labelSymbol)",
+      resourceLicensePopover: "For more information on licenses see ",
+      resourceLicensePopoverUrl:
+        "https://help.itc.rwth-aachen.de/en/service/b2b7729fd93f4c7080b475776f6b5d87/article/7812e3fcd3a241808f5b91e11b6ca3a9/",
+      resourceLicenseSelect: "Please select a License",
+      resourceLicenseHelp:
+        "This field can only contain up to {maxLength} characters.",
+
+      resourceReuse: "Internal Rules for Reuse",
+      resourceReuseLabel: "@:(form.resource.resourceReuse)@:(form.labelSymbol)",
+      resourceReusePopover:
+        "For more information on internal rules for reuse see ",
+      resourceReusePopoverUrl:
+        "https://help.itc.rwth-aachen.de/en/service/b2b7729fd93f4c7080b475776f6b5d87/article/7812e3fcd3a241808f5b91e11b6ca3a9/",
+      resourceReuseHelp:
+        "This field can only contain up to {maxLength} characters.",
+    },
+    steps: {
+      first: "Resource Configuration",
+      second: "General Information",
+      third: "Resource Metadata",
+      fourth: "Overview & Confirm",
+      fifth: "Actions",
+    },
+  },
 } as VueI18n.LocaleMessageObject;
diff --git a/src/modules/resource/pages/CreateResource.vue b/src/modules/resource/pages/CreateResource.vue
index bec8fe652681b91a56c15db72c5231e33b08147f..b2e8f0aa14b480ff8661fb8240f28b8832a0ea1d 100644
--- a/src/modules/resource/pages/CreateResource.vue
+++ b/src/modules/resource/pages/CreateResource.vue
@@ -1,43 +1,276 @@
 <template>
-  <div>
-    <section
-      class="container flex flex-col items-center px-5 py-12 mx-auto text-gray-600 body-font md:flex-row"
-    >
-      <div>
-        <CoscineHeadline :headline="$parent.$t('page.createResource.title')" />
-        <p class="mb-8 leading-relaxed dark:text-white">
-          {{ $parent.$t("page.createResource.description") }}
-        </p>
-        <img
-          alt="From Coscine Old"
-          src="@/assets/images/Project-Id-CreateResource.png"
+  <div id="createResource">
+    <CoscineHeadline :headline="$t('page.createResource.title')" />
+
+    <!-- Navigation Tabs -->
+    <b-tabs justified v-model="currentTab" class="mb-4">
+      <b-tab
+        v-for="(tab, index) in tabs"
+        :key="index"
+        :disabled="!tab.active"
+        @click.prevent="toTab(tab)"
+        :title="tab.title"
+      />
+    </b-tabs>
+
+    <!-- Tab Content -->
+    <b-row>
+      <div class="col-sm-2" />
+      <div class="col-sm-8">
+        <Configuration
+          v-if="currentTab === 0"
+          v-model="resource"
+          :isLoading="isLoading"
+          @valid="setNextTab"
+          @next="next"
+        />
+        <General
+          v-else-if="currentTab === 1"
+          v-model="resource"
+          :isLoading="isLoading"
+          :readonly="false"
+          @valid="setNextTab"
         />
+        <Metadata
+          v-else-if="currentTab === 2"
+          v-model="resource"
+          :applicationProfileList="groupedAPList"
+          :applicationProfileString="applicationProfileString"
+          :isLoadingFormGenerator="isLoadingFormGenerator"
+          @valid="setNextTab"
+        />
+        <Overview
+          v-else-if="currentTab === 3"
+          v-model="resource"
+          :tabs="tabs"
+          :applicationProfileString="applicationProfileString"
+          :isLoadingFormGenerator="isLoadingFormGenerator"
+          @back="back"
+          @toTab="toTab"
+          @waitingForResponse="isWaitingForResponse = $event"
+        />
+
+        <b-form-group v-if="currentTab > 0 && currentTab < tabs.length - 1">
+          <!-- Button Back -->
+          <b-button @click.prevent="back" variant="outline-primary"
+            >{{ $t("buttons.back") }}
+          </b-button>
+
+          <!-- Button Next -->
+          <b-button
+            @click.prevent="next"
+            class="float-right"
+            variant="outline-primary"
+            :disabled="!tabs[currentTab + 1].active"
+            >{{ $t("buttons.next") }}
+          </b-button>
+        </b-form-group>
       </div>
-    </section>
+      <div class="col-sm-2" />
+    </b-row>
+
+    <!-- Loading Spinner on Submit -->
+    <LoadingSpinner :isWaitingForResponse="isWaitingForResponse" />
   </div>
 </template>
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import CoscineHeadline from "@/components/CoscineHeadline.vue";
-
 // import the store for current module
-import { useResourceStore } from "../store";
-import { useProjectStore } from "@/modules/project/store";
-// import the main store
-import { useMainStore } from "@/store/index";
+import useResourceStore from "../store";
+import useProjectStore from "@/modules/project/store";
+import Configuration from "../components/create-resource/Configuration.vue";
+import General from "../components/create-resource/General.vue";
+import Metadata from "../components/create-resource/Metadata.vue";
+import Overview from "../components/create-resource/Overview.vue";
+import type {
+  DisciplineObject,
+  ResourceObject,
+  VisibilityObject,
+} from "@coscine/api-client/dist/types/Coscine.Api.Resources";
+import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
+import type {
+  GroupedApplicationProfiles,
+  ResourceCreationTab,
+  ResourceTypeOption,
+} from "../types";
 
 export default defineComponent({
+  components: { Configuration, General, Metadata, Overview },
   setup() {
-    const mainStore = useMainStore();
-    const resourceStore = useResourceStore();
     const projectStore = useProjectStore();
+    const resourceStore = useResourceStore();
 
-    return { mainStore, resourceStore, projectStore };
+    return { projectStore, resourceStore };
   },
 
-  components: {
-    CoscineHeadline,
+  data() {
+    return {
+      currentTab: 0,
+      tabsStatus: [true, false, false, false],
+      resource: {
+        description: "",
+        displayName: "",
+        resourceName: "",
+        keywords: "",
+        license: "",
+        usageRights: "",
+        disciplines: [] as DisciplineObject[],
+        visibility: {} as VisibilityObject,
+        resourceTypeOption: {} as ResourceTypeOption,
+      } as ResourceObject,
+      groupedAPList: [] as GroupedApplicationProfiles[],
+      applicationProfileString: null as string | null,
+      isLoadingFormGenerator: false,
+      isWaitingForResponse: false,
+      isLoading: false,
+    };
+  },
+
+  computed: {
+    project(): ProjectObject | null {
+      return this.projectStore.currentProject;
+    },
+    tabs(): ResourceCreationTab[] {
+      // Order does matter
+      return [
+        {
+          title: this.$t("page.createResource.configuration.title").toString(),
+          active: true,
+          step: "configuration",
+        },
+        {
+          title: this.$t("page.createResource.general.title").toString(),
+          active: this.tabsStatus[1],
+          step: "general",
+        },
+        {
+          title: this.$t("page.createResource.metadata.title").toString(),
+          active: this.tabsStatus[2],
+          step: "metadata",
+        },
+        {
+          title: this.$t("page.createResource.overview.title").toString(),
+          active: this.tabsStatus[3],
+          step: "overview",
+        },
+      ];
+    },
+  },
+
+  watch: {
+    project() {
+      if (this.project && this.project.id) {
+        this.isLoadingFormGenerator = false;
+      }
+    },
+    "resource.applicationProfile"() {
+      this.getApplicationProfile();
+    },
+  },
+
+  async created() {
+    this.isLoading = true;
+    this.getGroupedApplicationProfilesList();
+
+    // Load Project Visibilities if not present
+    if (this.projectStore.visibilities === null) {
+      await this.projectStore.retrieveVisibilities();
+    }
+    // Load Project Disciplines if not present
+    if (this.projectStore.disciplines === null) {
+      await this.projectStore.retrieveDisciplines();
+    }
+    // Load Project Licenses if not present
+    if (this.projectStore.licenses === null) {
+      await this.projectStore.retrieveLicenses();
+    }
+    this.isLoading = false;
+  },
+
+  methods: {
+    async getGroupedApplicationProfilesList() {
+      let list = await this.resourceStore.getApplicationProfilesList();
+      if (list) {
+        for (const applicationProfile of list.sort()) {
+          // Extract AP hierarchy from URIs
+          let text = applicationProfile.replace(
+            "https://purl.org/coscine/ap/",
+            ""
+          );
+          if (text.charAt(text.length - 1) === "/") {
+            text = text.substring(0, text.lastIndexOf("/"));
+          }
+          if (text.lastIndexOf("/") !== -1) {
+            // The Application Profile has a dedicated group
+            let indexOfSlash = text.lastIndexOf("/");
+            let groupName = text.substring(0, indexOfSlash).toUpperCase();
+            let optionName = text.substring(indexOfSlash + 1);
+            optionName =
+              optionName.charAt(0).toUpperCase() + optionName.slice(1);
+            let option = {
+              value: applicationProfile.toString(),
+              text: optionName,
+            };
+            let groupEntry = this.groupedAPList.find(
+              (element) => element.label === groupName
+            );
+            if (groupEntry && groupEntry.options) {
+              let indexOfGroupEntry = this.groupedAPList.indexOf(groupEntry);
+              groupEntry.options.push(option);
+              this.groupedAPList.splice(indexOfGroupEntry, 1, groupEntry);
+            } else {
+              this.groupedAPList.push({
+                label: groupName,
+                options: [option],
+              });
+            }
+          } else {
+            // The Application Profile does not have a dedicated group
+            text = text.charAt(0).toUpperCase() + text.slice(1);
+            this.groupedAPList.push({
+              value: applicationProfile.toString(),
+              text: text,
+            });
+          }
+        }
+
+        // Assign the application profile directly to the resource, if only one AP is found
+        if (this.groupedAPList.length === 1) {
+          // Use .$set() to ensure property reactivity
+          this.$set(
+            this.resource,
+            "applicationProfile",
+            this.groupedAPList[0].value
+          );
+        }
+      }
+    },
+    async getApplicationProfile() {
+      if (this.resource && this.resource.applicationProfile) {
+        this.isLoadingFormGenerator = true;
+        const applicationProfile =
+          await this.resourceStore.getApplicationProfile(
+            this.resource.applicationProfile
+          );
+        this.applicationProfileString = JSON.stringify(applicationProfile);
+        this.isLoadingFormGenerator = false;
+      } else {
+        this.applicationProfileString = null;
+      }
+    },
+    back() {
+      this.currentTab -= 1;
+    },
+    next() {
+      this.currentTab += 1;
+    },
+    toTab(tab: ResourceCreationTab) {
+      this.currentTab = this.tabs.indexOf(tab);
+    },
+    setNextTab(active: boolean) {
+      this.$set(this.tabsStatus, this.currentTab + 1, active);
+    },
   },
 });
 </script>
diff --git a/src/modules/resource/pages/ResourcePage.vue b/src/modules/resource/pages/ResourcePage.vue
index ee3ac29c33dc8095638a5325c490d96f5e0770db..2817eaf19ed6e31ce1d9f75650ba9c8bb150b0eb 100644
--- a/src/modules/resource/pages/ResourcePage.vue
+++ b/src/modules/resource/pages/ResourcePage.vue
@@ -8,11 +8,11 @@
     @drop.prevent="uploadDrop"
   >
     <div class="droppable" v-if="showDroppable && fileAddable">
-      <p class="droppableText">{{ $parent.$t("page.resource.canDropFile") }}</p>
+      <p class="droppableText">{{ $t("page.resource.canDropFile") }}</p>
     </div>
     <coscine-headline
       v-show="!isFullscreen"
-      :headline="$parent.$t('page.resource.resources')"
+      :headline="$t('page.resource.resources')"
     />
     <b-form-file
       ref="fileTrigger"
@@ -49,9 +49,7 @@
         squared
         id="metadataManagerToggleFullscreen"
         @click="toggleMenu()"
-        ><span>{{
-          $parent.$t("page.resource.metadataManager")
-        }}</span></b-button
+        ><span>{{ $t("page.resource.metadataManager") }}</span></b-button
       >
       <div class="card">
         <div class="card-body">
@@ -104,13 +102,13 @@ import { defineComponent } from "vue-demi";
 import type Vue from "vue";
 
 // import the store for current module
-import { useResourceStore } from "../store";
-import { useProjectStore } from "@/modules/project/store";
+import useResourceStore from "../store";
+import useProjectStore from "@/modules/project/store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
-import FilesView from "../components/FilesView.vue";
-import MetadataManager from "../components/MetadataManager.vue";
+import FilesView from "../components/resource-page/FilesView.vue";
+import MetadataManager from "../components/resource-page/MetadataManager.vue";
 
 import type {
   FileInformation,
diff --git a/src/modules/resource/pages/Settings.vue b/src/modules/resource/pages/Settings.vue
index 67e7e983021bf5689f404b9e8917d05e2c0c9fe3..de0b6837c685ea748f9cc23bd3644a9bb349cb32 100644
--- a/src/modules/resource/pages/Settings.vue
+++ b/src/modules/resource/pages/Settings.vue
@@ -1,43 +1,341 @@
 <template>
-  <div>
-    <section
-      class="container flex flex-col items-center px-5 py-12 mx-auto text-gray-600 body-font md:flex-row"
-    >
-      <div>
-        <CoscineHeadline :headline="$parent.$t('page.settings.title')" />
-        <p class="mb-8 leading-relaxed dark:text-white">
-          {{ $parent.$t("page.settings.description") }}
-        </p>
-        <img
-          alt="From Coscine Old"
-          src="@/assets/images/Project-Id-R-Guid-Settings.png"
-        />
-      </div>
-    </section>
+  <div id="settings">
+    <CoscineHeadline :headline="$t('page.settings.title')" />
+
+    <!-- Overview -->
+    <Overview />
+
+    <!-- Navigation Tabs -->
+    <b-tabs justified v-model="currentTab" class="my-4" v-if="resource">
+      <b-tab
+        v-for="(tab, index) in tabs"
+        :key="index"
+        :disabled="!tab.active"
+        @click.prevent="toTab(tab)"
+        :title="tab.title"
+      />
+    </b-tabs>
+    <b-row v-else align-h="center" class="my-4">
+      <b-spinner variant="secondary" />
+    </b-row>
+
+    <!-- Configuration -->
+    <Configuration v-show="tabs[currentTab].step === 'configuration'" />
+
+    <!-- General Overview from Create Resource -->
+    <General
+      v-show="tabs[currentTab].step === 'general'"
+      v-model="resourceForm"
+      :isLoading="isLoading"
+      :readonly="false"
+      @validation="validation = $event"
+    />
+
+    <!-- Metadata -->
+    <Metadata
+      v-show="tabs[currentTab].step === 'metadata'"
+      v-model="resourceForm"
+      :applicationProfileString="applicationProfileString"
+      :isLoadingFormGenerator="isLoading"
+      @clickSave="clickSave"
+    />
+
+    <!-- Actions -->
+    <Actions
+      v-if="resource"
+      v-show="tabs[currentTab].step === 'action'"
+      v-model="resource"
+      @toggleArchive="toggleArchive"
+      @clickDelete="clickDelete"
+    />
+
+    <!-- Button Confirm -->
+    <b-form-group>
+      <b-button
+        v-if="confirmButtonVisibility"
+        @click.prevent="clickSave"
+        :disabled="!validResourceForm"
+        class="float-right"
+        variant="primary"
+      >
+        {{ $t("buttons.confirm") }}
+      </b-button>
+    </b-form-group>
+
+    <!-- Loading Spinner on Submit -->
+    <LoadingSpinner :isWaitingForResponse="isWaitingForResponse" />
   </div>
 </template>
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import CoscineHeadline from "@/components/CoscineHeadline.vue";
-
 // import the store for current module
-import { useResourceStore } from "../store";
-import { useProjectStore } from "@/modules/project/store";
-// import the main store
-import { useMainStore } from "@/store/index";
+import useResourceStore from "../store";
+import useProjectStore from "@/modules/project/store";
+import { navigateToProject } from "@/router";
+import General from "../components/create-resource/General.vue";
+import Metadata from "../components/settings/Metadata.vue";
+import Actions from "../components/settings/Actions.vue";
+import Overview from "../components/settings/Overview.vue";
+import Configuration from "../components/settings/Configuration.vue";
+import type {
+  DisciplineObject,
+  ResourceObject,
+  VisibilityObject,
+} from "@coscine/api-client/dist/types/Coscine.Api.Resources";
+import type { ResourceCreationTab, ResourceTypeOption } from "../types";
+import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
+import type { Validation } from "vuelidate";
 
 export default defineComponent({
   setup() {
-    const mainStore = useMainStore();
     const resourceStore = useResourceStore();
     const projectStore = useProjectStore();
 
-    return { mainStore, resourceStore, projectStore };
+    return { resourceStore, projectStore };
   },
 
   components: {
-    CoscineHeadline,
+    Overview,
+    Configuration,
+    General,
+    Metadata,
+    Actions,
+  },
+
+  data() {
+    return {
+      currentTab: 0,
+      resourceForm: {
+        description: "",
+        displayName: "",
+        resourceName: "",
+        keywords: "",
+        license: "",
+        usageRights: "",
+        disciplines: [] as DisciplineObject[],
+        visibility: {} as VisibilityObject,
+        resourceTypeOption: {} as ResourceTypeOption,
+      } as ResourceObject,
+      applicationProfileString: null as string | null,
+      validation: {} as Validation,
+      isWaitingForResponse: false,
+      isLoading: false,
+    };
+  },
+
+  computed: {
+    project(): ProjectObject | null {
+      return this.projectStore.currentProject;
+    },
+    resource(): ResourceObject | null {
+      return this.resourceStore.currentResource;
+    },
+    validResourceForm(): boolean {
+      if (this.resource && this.resource.archived) {
+        // Limit button to only changes in the "general" tab, when the resource is archived.
+        return !this.validation.$invalid && this.validation.$anyDirty;
+      } else {
+        // Button should always be enabled; Alternatively make the validation check here.
+        return true;
+      }
+    },
+    confirmButtonVisibility(): boolean {
+      if (this.resource && this.resource.archived) {
+        // Limit button to only be visible in the "general" tab, when the resource is archived.
+        return this.tabs[this.currentTab].step === "general";
+      } else {
+        return (
+          this.tabs[this.currentTab].step === "general" ||
+          this.tabs[this.currentTab].step === "metadata"
+        );
+      }
+    },
+    tabs(): ResourceCreationTab[] {
+      // Order does matter
+      const tabs = [
+        {
+          title: this.$t("form.steps.first").toString(),
+          active: true,
+          step: "configuration",
+        },
+        {
+          title: this.$t("form.steps.second").toString(),
+          active: true,
+          step: "general",
+        },
+        {
+          title: this.$t("form.steps.third").toString(),
+          active: true,
+          step: "metadata",
+        },
+        {
+          title: this.$t("form.steps.fifth").toString(),
+          active: true,
+          step: "action",
+        },
+      ];
+      if (this.resource && this.resource.resourceTypeOption) {
+        const keys = Object.keys(this.resource.resourceTypeOption);
+        if (keys.length === 0 || keys.filter((e) => e !== "Id").length === 0) {
+          return tabs.splice(1);
+        }
+      }
+      return tabs;
+    },
+  },
+
+  watch: {
+    resource() {
+      // Filling the form requires a watcher for the cases
+      // when resource may be unset (e.g. when entering from a direct link)
+      this.onResourceLoaded();
+    },
+  },
+
+  async created() {
+    this.isLoading = true;
+
+    // Load Project Visibilities if not present
+    if (this.projectStore.visibilities === null) {
+      await this.projectStore.retrieveVisibilities();
+    }
+    // Load Project Disciplines if not present
+    if (this.projectStore.disciplines === null) {
+      await this.projectStore.retrieveDisciplines();
+    }
+    // Load Project Licenses if not present
+    if (this.projectStore.licenses === null) {
+      await this.projectStore.retrieveLicenses();
+    }
+    this.onResourceLoaded();
+    this.isLoading = false;
+  },
+
+  methods: {
+    onResourceLoaded() {
+      if (this.resource) {
+        // Fill the form. Note that regular assignment makes this.resource react on this.resourceForm changes!
+        Object.assign(this.resourceForm, this.resource); // Use this to only copy the properties
+        this.getApplicationProfile();
+      }
+    },
+
+    toTab(tab: ResourceCreationTab) {
+      this.currentTab = this.tabs.indexOf(tab);
+    },
+
+    async getApplicationProfile() {
+      if (this.resource && this.resource.applicationProfile) {
+        this.isLoading = true;
+        const applicationProfile =
+          await this.resourceStore.getApplicationProfile(
+            this.resource.applicationProfile
+          );
+        this.applicationProfileString = JSON.stringify(applicationProfile);
+        this.isLoading = false;
+      } else {
+        this.applicationProfileString = null;
+      }
+    },
+
+    makeToast(
+      text = "Message",
+      givenTitle = "Title",
+      variant: string | undefined = undefined
+    ) {
+      this.$root.$bvToast.toast(text, {
+        title: givenTitle,
+        autoHideDelay: 5000,
+        toaster: "b-toaster-bottom-right",
+        variant: variant,
+        noCloseButton: true,
+      });
+    },
+
+    async clickSave() {
+      this.isWaitingForResponse = true;
+      const success = await this.resourceStore.updateResource(
+        this.resourceForm
+      );
+      if (success) {
+        // On Success
+        // Refresh the project information in the store
+        await this.projectStore.refreshProjectInformation(this.project);
+        if (this.resource && this.resource.id) {
+          await this.resourceStore.retrieveResource(this.resource.id);
+        }
+        this.makeToast(
+          this.$t("toast.onSave.success.message").toString(),
+          this.$t("toast.onSave.success.title").toString()
+        );
+      } else {
+        // On Failure
+        this.makeToast(
+          this.$t("toast.onSave.failure.message").toString(),
+          this.$t("toast.onSave.failure.title").toString(),
+          "danger"
+        );
+      }
+      this.isWaitingForResponse = false;
+    },
+
+    async toggleArchive() {
+      if (this.resource) {
+        this.isWaitingForResponse = true;
+        const success = await this.resourceStore.setResourceArchiveStatus(
+          this.resource,
+          !this.resource.archived
+        );
+        if (success) {
+          // On Success
+          // Refresh the project information in the store
+          await this.projectStore.refreshProjectInformation(this.project);
+          if (this.resource && this.resource.id) {
+            await this.resourceStore.retrieveResource(this.resource.id);
+          }
+          const action = !this.resource.archived ? "unarchive" : "archive";
+          this.makeToast(
+            this.$t(`page.settings.actions.${action}.toast.body`).toString(),
+            this.$t(`page.settings.actions.${action}.toast.title`).toString()
+          );
+        } else {
+          // On Failure
+          this.makeToast(
+            this.$t("toast.onSave.failure.message").toString(),
+            this.$t("toast.onSave.failure.title").toString(),
+            "danger"
+          );
+        }
+        this.isWaitingForResponse = false;
+      }
+    },
+
+    async clickDelete() {
+      this.isWaitingForResponse = true;
+      const success = await this.resourceStore.deleteResource(
+        this.resourceForm
+      );
+      if (success) {
+        // On Success
+        const parentProject = this.project;
+        // Refresh the project information in the store
+        await this.projectStore.refreshProjectInformation(parentProject);
+        this.makeToast(
+          this.$t("toast.onDelete.success.message").toString(),
+          this.$t("toast.onDelete.success.title").toString()
+        );
+        navigateToProject(parentProject);
+      } else {
+        // On Failure
+        this.makeToast(
+          this.$t("toast.onDelete.failure.message").toString(),
+          this.$t("toast.onDelete.failure.title").toString(),
+          "danger"
+        );
+      }
+      this.isWaitingForResponse = false;
+    },
   },
 });
 </script>
diff --git a/src/modules/resource/routes.ts b/src/modules/resource/routes.ts
index fa652fbb899f2f0a3c121a35fbe6560ef97b8a8c..27947b5ad9bdcbb36e32f4706dd31707cccf585b 100644
--- a/src/modules/resource/routes.ts
+++ b/src/modules/resource/routes.ts
@@ -5,18 +5,25 @@ const ResourceModule = () => import("./ResourceModule.vue");
 const ResourcePage = () => import("./pages/ResourcePage.vue");
 const Settings = () => import("./pages/Settings.vue");
 
+import { ResourceI18nMessages } from "@/modules/resource/i18n/index";
+
 export const ResourceRoutes: RouteConfig[] = [
   {
     // Omit the slash "/" at the start of "path" to not reference "root". Nested under module "projects".
     path: "create-resource",
     component: ResourceModule,
+    meta: {
+      i18n: ResourceI18nMessages,
+      breadCrumb: "resource.create",
+      requiresAuth: true,
+    },
     children: [
       {
         path: "/",
+        alias: "",
         name: "create-resource",
         component: CreateResource,
         meta: {
-          breadCrumb: "resource.create",
           requiresAuth: true,
         },
       },
@@ -28,6 +35,7 @@ export const ResourceRoutes: RouteConfig[] = [
     meta: {
       breadCrumb: "resource.page",
       default: "resource-page",
+      i18n: ResourceI18nMessages,
     },
     children: [
       {
diff --git a/src/modules/resource/store.ts b/src/modules/resource/store.ts
index b5c0852f4bcab0f472b57ea57ec0c780cab2f11e..4725aaeaac3d348e10e4c8b366e98ff95c3a8c6a 100644
--- a/src/modules/resource/store.ts
+++ b/src/modules/resource/store.ts
@@ -18,7 +18,8 @@ import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.
 import type { Route } from "vue-router/types/router";
 import { useLocalStorage } from "@vueuse/core";
 import type { BilingualLabels } from "@coscine/api-client/dist/types/Coscine.Api.Metadata";
-
+import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
+import { updatedDiff } from "deep-object-diff";
 /*  
   Store variable name is "this.<id>Store"
     id: "resource" --> this.resourceStore
@@ -106,6 +107,29 @@ export const useResourceStore = defineStore({
       }
     },
 
+    async getApplicationProfile(
+      applicationProfile: string
+    ): Promise<ApplicationProfile> {
+      const apiResponse = await MetadataApi.metadataGetProfile(
+        applicationProfile
+      );
+      if (apiResponse.status === StatusCodes.OK) {
+        return apiResponse.data;
+      } else {
+        // Handle other Status Codes
+        return [];
+      }
+    },
+
+    async getApplicationProfilesList(): Promise<string[] | undefined> {
+      const apiResponse = await MetadataApi.metadataGetProfiles();
+      if (apiResponse.status === StatusCodes.OK) {
+        return apiResponse.data;
+      } else {
+        // Handle other Status Codes
+      }
+    },
+
     async retrieveUsedQuota(resource: VisitedResourceObject) {
       if (resource.id) {
         const apiResponse = await BlobApi.blobGetQuota(resource.id);
@@ -127,6 +151,82 @@ export const useResourceStore = defineStore({
       }
     },
 
+    async createResource(
+      project: ProjectObject,
+      resource: ResourceObject
+    ): Promise<ResourceObject | null> {
+      if (project.id) {
+        const apiResponse = await ResourceApi.resourceStoreToProject(
+          project.id,
+          resource
+        );
+        if (apiResponse.status === StatusCodes.OK) {
+          const createdResource: ResourceObject = apiResponse.data;
+          return createdResource;
+        } else {
+          // Handle other Status Codes
+          return null;
+        }
+      } else {
+        console.error("Selected project's ID is undefined.");
+        return null;
+      }
+    },
+
+    async updateResource(resource: ResourceObject): Promise<boolean> {
+      if (resource.id) {
+        const apiResponse = await ResourceApi.resourceUpdate(
+          resource.id,
+          resource
+        );
+        if (apiResponse.status === StatusCodes.OK) {
+          return true;
+        } else {
+          // Handle other Status Codes
+          return false;
+        }
+      } else {
+        console.error("Selected resource's ID is undefined.");
+        return false;
+      }
+    },
+
+    async setResourceArchiveStatus(
+      resource: ResourceObject,
+      status: boolean
+    ): Promise<boolean> {
+      if (resource.id) {
+        const apiResponse = await ResourceApi.resourceSetResourceReadonly(
+          resource.id,
+          status
+        );
+        if (apiResponse.status === StatusCodes.OK) {
+          return true;
+        } else {
+          // Handle other Status Codes
+          return false;
+        }
+      } else {
+        console.error("Selected resource's ID is undefined.");
+        return false;
+      }
+    },
+
+    async deleteResource(resource: ResourceObject): Promise<boolean> {
+      if (resource.id) {
+        const apiResponse = await ResourceApi.resourceDelete(resource.id);
+        if (apiResponse.status === StatusCodes.OK) {
+          return true;
+        } else {
+          // Handle other Status Codes
+          return false;
+        }
+      } else {
+        console.error("Selected resource's ID is undefined.");
+        return false;
+      }
+    },
+
     async handleUnsetResource(resource: ResourceObject | null, route: Route) {
       const routeParams = route.params;
       if (
@@ -149,6 +249,10 @@ export const useResourceStore = defineStore({
 
     addResourceAsVisited(resource: ResourceObject | null) {
       if (resource && resource.id) {
+        const updatedKeys = updatedDiff(
+          this.visitedResources[resource.id],
+          resource
+        );
         if (!this.visitedResources[resource.id]) {
           // Important! Keep object assignment reactive()
           const visitedResource: VisitedResourceObject = reactive({
@@ -161,6 +265,8 @@ export const useResourceStore = defineStore({
             ),
           });
           this.visitedResources[resource.id] = visitedResource;
+        } else if (updatedKeys && Object.keys(updatedKeys).length > 0) {
+          Object.assign(this.visitedResources[resource.id], updatedKeys);
         }
       }
     },
diff --git a/src/modules/resource/types.ts b/src/modules/resource/types.ts
index 600048033cb25c9be512a3fb150d22d6a98b2cac..a98eebd28af35d80d4fffd470546bb25d8e5f270 100644
--- a/src/modules/resource/types.ts
+++ b/src/modules/resource/types.ts
@@ -16,6 +16,33 @@ export interface VisitedResourceObject extends ResourceObject {
   storedColumns: string | null;
 }
 
+export interface LabeledResourceObject extends ResourceTypeInformation {
+  iDisplayName: string;
+  iFullName: string;
+  iDescription: string;
+}
+
+export interface GroupedApplicationProfiles {
+  label?: string;
+  options?: Array<{
+    text: string;
+    value: string;
+  }>;
+  text?: string;
+  value?: string;
+}
+
+export interface ResourceCreationTab {
+  title: string;
+  active: boolean;
+  step: string;
+}
+
+export interface ResourceTypeOption {
+  Size: number;
+  [x: string]: unknown;
+}
+
 export interface ResourceState {
   /*  
     --------------------------------------------------------------------------------------
diff --git a/src/modules/search/SearchModule.vue b/src/modules/search/SearchModule.vue
index b879728276aae8daf507e36b87e1d036de984f0c..b25069d5188a30360cc3abbdcfe349928ea7c06c 100644
--- a/src/modules/search/SearchModule.vue
+++ b/src/modules/search/SearchModule.vue
@@ -6,12 +6,11 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import { SearchI18nMessages } from "./i18n";
 
 // import the store for current module
-import { useSearchStore } from "./store";
+import useSearchStore from "./store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
@@ -20,7 +19,6 @@ export default defineComponent({
 
     return { mainStore, searchStore };
   },
-  i18n: { messages: SearchI18nMessages },
 
   created() {
     this.initialize();
diff --git a/src/modules/search/pages/Search.vue b/src/modules/search/pages/Search.vue
index c12673094ab4bc7d7997c3993776aab47bebb418..9337e54aee73bf4eb0860c050faa859c41472283 100644
--- a/src/modules/search/pages/Search.vue
+++ b/src/modules/search/pages/Search.vue
@@ -1,6 +1,6 @@
 <template>
   <div class="search">
-    <CoscineHeadline :headline="$parent.$t('page.search.title')" />
+    <CoscineHeadline :headline="$t('page.search.title')" />
 
     <b-row id="mainRow">
       <!-- Sidebar -->
@@ -12,14 +12,14 @@
           <b-col id="searchField" align-self="start" class="pl-0">
             <b-form-input
               v-model="searchText"
-              :placeholder="$parent.$t('page.search.search')"
+              :placeholder="$t('page.search.search')"
             ></b-form-input>
           </b-col>
           <b-col sm="2" id="selectProjCol" align-self="center" class="pl-0">
             <b-form-select v-model="selectProjValue">
               <template #first>
                 <b-form-select-option :value="null" disabled
-                  >{{ $parent.$t("page.search.allProjects") }}
+                  >{{ $t("page.search.allProjects") }}
                 </b-form-select-option>
               </template>
             </b-form-select>
@@ -28,7 +28,7 @@
             <b-form-select v-model="selectResValue">
               <template #first>
                 <b-form-select-option :value="null" disabled
-                  >{{ $parent.$t("page.search.allResources") }}
+                  >{{ $t("page.search.allResources") }}
                 </b-form-select-option>
               </template>
             </b-form-select>
@@ -36,14 +36,14 @@
           <b-col sm="0" align-self="center" class="text-right p-0">
             <b-button-group>
               <b-button id="searchButton" variant="primary">
-                {{ $parent.$t("page.search.search") }}
+                {{ $t("page.search.search") }}
               </b-button>
               <b-dropdown id="searchDropdown" right size="sm" variant="primary">
                 <b-dropdown-item>{{
-                  $parent.$t("page.search.buttonSearch.Item1")
+                  $t("page.search.buttonSearch.Item1")
                 }}</b-dropdown-item>
                 <b-dropdown-item>{{
-                  $parent.$t("page.search.buttonSearch.Item2")
+                  $t("page.search.buttonSearch.Item2")
                 }}</b-dropdown-item>
               </b-dropdown>
             </b-button-group>
@@ -121,7 +121,7 @@
 
                 <template #empty>
                   <h6 class="text-center">
-                    {{ $parent.$t("page.search.emptySearch") }}
+                    {{ $t("page.search.emptySearch") }}
                   </h6>
                 </template>
 
@@ -135,7 +135,7 @@
                     "
                     class="p-2 text-center text-muted border-top"
                   >
-                    {{ $parent.$t("page.search.endSearchResults") }}
+                    {{ $t("page.search.endSearchResults") }}
                   </div>
                 </template>
               </b-table>
@@ -175,9 +175,9 @@ import Result from "./components/Result.vue";
 import Sidebar from "./components/Sidebar.vue";
 
 // import the store for current module
-import { useSearchStore } from "../store";
+import useSearchStore from "../store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 import type { DummyDataType } from "../types";
 
diff --git a/src/modules/search/pages/components/Result.vue b/src/modules/search/pages/components/Result.vue
index e39d57afc956bd2a59b2a16ea77d79b4d016ed3a..5b72bc7ab3e415277e03d1eef508b6bf259b25c3 100644
--- a/src/modules/search/pages/components/Result.vue
+++ b/src/modules/search/pages/components/Result.vue
@@ -36,9 +36,9 @@ import { defineComponent, PropType } from "vue-demi";
 import { DummyDataType } from "../../types";
 
 // import the store for current module
-import { useSearchStore } from "../../store";
+import useSearchStore from "../../store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
diff --git a/src/modules/search/pages/components/Sidebar.vue b/src/modules/search/pages/components/Sidebar.vue
index eecf99799713fd4490d01f6609c16ac66e4b821f..8f8bb0d36c709d8bd672c3059f316663f10bc191 100644
--- a/src/modules/search/pages/components/Sidebar.vue
+++ b/src/modules/search/pages/components/Sidebar.vue
@@ -14,9 +14,9 @@
 import { defineComponent } from "vue-demi";
 
 // import the store for current module
-import { useSearchStore } from "../../store";
+import useSearchStore from "../../store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
diff --git a/src/modules/search/routes.ts b/src/modules/search/routes.ts
index 2d5e53dce8381645d975ab6df2f5f5d4cce7796f..a34aa3d1cbb4ce43d267845252c6b3a4d7182e08 100644
--- a/src/modules/search/routes.ts
+++ b/src/modules/search/routes.ts
@@ -3,12 +3,15 @@ import { RouteConfig } from "vue-router";
 const SearchModule = () => import("./SearchModule.vue");
 const Search = () => import("./pages/Search.vue");
 
+import { SearchI18nMessages } from "@/modules/search/i18n/index";
+
 export const SearchRoutes: RouteConfig[] = [
   {
     path: "/search",
     component: SearchModule,
     meta: {
       breadCrumb: "search",
+      i18n: SearchI18nMessages,
     },
     children: [
       {
diff --git a/src/modules/user/UserModule.vue b/src/modules/user/UserModule.vue
index 063a6c83019e31d42193dc91e09ab33b6fa3adb6..d8ae5577583f500ea49272bc22496c17934f8764 100644
--- a/src/modules/user/UserModule.vue
+++ b/src/modules/user/UserModule.vue
@@ -6,12 +6,11 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import { UserI18nMessages } from "./i18n";
 
 // import the store for current module
-import { useUserStore } from "./store";
+import useUserStore from "./store";
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 export default defineComponent({
   setup() {
@@ -20,7 +19,6 @@ export default defineComponent({
 
     return { mainStore, userStore };
   },
-  i18n: { messages: UserI18nMessages },
 
   created() {
     this.initialize();
diff --git a/src/modules/user/pages/UserProfile.vue b/src/modules/user/pages/UserProfile.vue
index 5ee02bc009e2a41d8aa995efbd5b9e498821ea0f..399a70cd1c8bd368c6b4f487f3a8f728771fe089 100644
--- a/src/modules/user/pages/UserProfile.vue
+++ b/src/modules/user/pages/UserProfile.vue
@@ -5,17 +5,13 @@
       <b-form @submit.stop.prevent="onSubmit">
         <!-- Personal Information -->
         <CoscineHeadline
-          :headline="
-            $parent.$t('page.userprofile.form.personalInformation.header')
-          "
+          :headline="$t('page.userprofile.form.personalInformation.header')"
         />
         <!-- Title -->
         <coscine-form-group
           labelFor="title"
           :label="
-            $parent.$t(
-              'page.userprofile.form.personalInformation.labels.titleLabel'
-            )
+            $t('page.userprofile.form.personalInformation.labels.titleLabel')
           "
           :isLoading="isLoading"
           type="input"
@@ -28,23 +24,23 @@
             label="displayName"
             track-by="displayName"
             :placeholder="
-              $parent.$t(
+              $t(
                 'page.userprofile.form.personalInformation.multiselect.placeholderTitle'
               )
             "
             :selectLabel="
-              $parent.$t(
+              $t(
                 'page.userprofile.form.personalInformation.multiselect.selectEnter'
               )
             "
           >
             <span slot="noResult">{{
-              $parent.$t(
+              $t(
                 "page.userprofile.form.personalInformation.multiselect.noResults"
               )
             }}</span>
             <span slot="noOptions">{{
-              $parent.$t(
+              $t(
                 "page.userprofile.form.personalInformation.multiselect.noOptions"
               )
             }}</span>
@@ -55,7 +51,7 @@
           :mandatory="true"
           labelFor="givenname"
           :label="
-            $parent.$t(
+            $t(
               'page.userprofile.form.personalInformation.labels.givenNameLabel'
             )
           "
@@ -67,7 +63,7 @@
             v-model="$v.form.givenname.$model"
             :state="$v.form.givenname.$dirty ? !$v.form.givenname.$error : null"
             :placeholder="
-              $parent.$t('page.userprofile.form.personalInformation.givenName')
+              $t('page.userprofile.form.personalInformation.givenName')
             "
           />
         </coscine-form-group>
@@ -76,9 +72,7 @@
           :mandatory="true"
           labelFor="surname"
           :label="
-            $parent.$t(
-              'page.userprofile.form.personalInformation.labels.surnameLabel'
-            )
+            $t('page.userprofile.form.personalInformation.labels.surnameLabel')
           "
           :isLoading="isLoading"
           type="input"
@@ -88,7 +82,7 @@
             v-model="$v.form.surname.$model"
             :state="$v.form.surname.$dirty ? !$v.form.surname.$error : null"
             :placeholder="
-              $parent.$t('page.userprofile.form.personalInformation.surname')
+              $t('page.userprofile.form.personalInformation.surname')
             "
           />
         </coscine-form-group>
@@ -97,9 +91,7 @@
           :mandatory="true"
           labelFor="Email"
           :label="
-            $parent.$t(
-              'page.userprofile.form.personalInformation.labels.emailLabel'
-            )
+            $t('page.userprofile.form.personalInformation.labels.emailLabel')
           "
           :isLoading="isLoading"
           type="input"
@@ -110,9 +102,7 @@
             :state="
               $v.form.emailAddress.$dirty ? !$v.form.emailAddress.$error : null
             "
-            :placeholder="
-              $parent.$t('page.userprofile.form.personalInformation.email')
-            "
+            :placeholder="$t('page.userprofile.form.personalInformation.email')"
           />
           <div id="emailHint">{{ emailHint }}</div>
         </coscine-form-group>
@@ -121,7 +111,7 @@
           :mandatory="true"
           labelFor="organization"
           :label="
-            $parent.$t(
+            $t(
               'page.userprofile.form.personalInformation.labels.organizationLabel'
             )
           "
@@ -138,7 +128,7 @@
             label="displayName"
             track-by="displayName"
             :placeholder="
-              $parent.$t(
+              $t(
                 'page.userprofile.form.personalInformation.multiselect.placeholderText'
               )
             "
@@ -152,7 +142,7 @@
             </template>
             <template slot="noOptions">
               {{
-                $parent.$t(
+                $t(
                   "page.userprofile.form.personalInformation.multiselect.noOptionsOrganization"
                 )
               }}
@@ -167,9 +157,7 @@
             label="displayName"
             track-by="displayName"
             :placeholder="
-              $parent.$t(
-                'page.userprofile.form.personalInformation.organization'
-              )
+              $t('page.userprofile.form.personalInformation.organization')
             "
             :disabled="true"
           >
@@ -180,7 +168,7 @@
           :mandatory="true"
           labelFor="institute"
           :label="
-            $parent.$t(
+            $t(
               'page.userprofile.form.personalInformation.labels.instituteLabel'
             )
           "
@@ -193,7 +181,7 @@
             v-model="$v.form.institute.$model"
             type="text"
             :placeholder="
-              $parent.$t('page.userprofile.form.personalInformation.institute')
+              $t('page.userprofile.form.personalInformation.institute')
             "
           >
           </b-form-input>
@@ -206,7 +194,7 @@
             label="displayName"
             track-by="displayName"
             :placeholder="
-              $parent.$t('page.userprofile.form.personalInformation.institute')
+              $t('page.userprofile.form.personalInformation.institute')
             "
             :disabled="true"
           >
@@ -217,7 +205,7 @@
           :mandatory="true"
           labelFor="Discipline"
           :label="
-            $parent.$t(
+            $t(
               'page.userprofile.form.personalInformation.labels.disciplineLabel'
             )
           "
@@ -232,7 +220,7 @@
             :label="disciplineLabel"
             :track-by="disciplineLabel"
             :placeholder="
-              $parent.$t(
+              $t(
                 'page.userprofile.form.personalInformation.multiselect.placeholderDiscipline'
               )
             "
@@ -249,22 +237,20 @@
         <!-- Access Token -->
         <div class="h-divider" />
         <CoscineHeadline
-          :headline="$parent.$t('page.userprofile.form.accessToken.header')"
+          :headline="$t('page.userprofile.form.accessToken.header')"
         />
         <AccessToken />
 
         <!-- User Preferences -->
         <div class="h-divider"></div>
         <CoscineHeadline
-          :headline="$parent.$t('page.userprofile.form.userPreferences.header')"
+          :headline="$t('page.userprofile.form.userPreferences.header')"
         />
         <coscine-form-group
           :mandatory="true"
           labelFor="language"
           :label="
-            $parent.$t(
-              'page.userprofile.form.userPreferences.labels.languageLabel'
-            )
+            $t('page.userprofile.form.userPreferences.labels.languageLabel')
           "
           :isLoading="isLoading"
           type="button"
@@ -289,16 +275,12 @@
         <!-- Connected Accounts -->
         <div class="h-divider" />
         <CoscineHeadline
-          :headline="
-            $parent.$t('page.userprofile.form.connectedAccounts.header')
-          "
+          :headline="$t('page.userprofile.form.connectedAccounts.header')"
         />
         <coscine-form-group
           :mandatory="true"
           :label="
-            $parent.$t(
-              'page.userprofile.form.connectedAccounts.labels.orcidLabel'
-            )
+            $t('page.userprofile.form.connectedAccounts.labels.orcidLabel')
           "
           :isLoading="isLoading"
           type="button"
@@ -310,18 +292,14 @@
             @click.prevent="clickConnect('orcid')"
             :disabled="orcidConnected"
             >{{
-              orcidConnected
-                ? $parent.$t("buttons.connected")
-                : $parent.$t("buttons.connect")
+              orcidConnected ? $t("buttons.connected") : $t("buttons.connect")
             }}</b-button
           >
         </coscine-form-group>
         <coscine-form-group
           :mandatory="true"
           :label="
-            $parent.$t(
-              'page.userprofile.form.connectedAccounts.labels.shibbolethLabel'
-            )
+            $t('page.userprofile.form.connectedAccounts.labels.shibbolethLabel')
           "
           :isLoading="isLoading"
           type="button"
@@ -334,8 +312,8 @@
             :disabled="shibbolethConnected"
             >{{
               shibbolethConnected
-                ? $parent.$t("buttons.connected")
-                : $parent.$t("buttons.connect")
+                ? $t("buttons.connected")
+                : $t("buttons.connect")
             }}</b-button
           >
         </coscine-form-group>
@@ -381,7 +359,7 @@
                 shift-h="-4"
               ></b-icon>
             </b-iconstack>
-            {{ $parent.$t("buttons.save") }}</b-button
+            {{ $t("buttons.save") }}</b-button
           >
         </coscine-form-group>
       </b-form>
@@ -403,9 +381,9 @@ import CoscineHeadline from "@/components/CoscineHeadline.vue";
 import "@/plugins/deprecated/vue-multiselect";
 
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 // import the store for current module
-import { useUserStore } from "../store";
+import useUserStore from "../store";
 import type {
   ContactChangeObject,
   DisciplineObject,
@@ -599,13 +577,13 @@ export default defineComponent({
           await this.userStore.updateUser(this.form);
           this.$v.form.$reset();
           this.makeToast(
-            this.$parent.$t("toast.onSave.success.message").toString(),
-            this.$parent.$t("toast.onSave.success.title").toString()
+            this.$t("toast.onSave.success.message").toString(),
+            this.$t("toast.onSave.success.title").toString()
           );
         } catch {
           this.makeToast(
-            this.$parent.$t("toast.onSave.failure.message").toString(),
-            this.$parent.$t("toast.onSave.failure.title").toString()
+            this.$t("toast.onSave.failure.message").toString(),
+            this.$t("toast.onSave.failure.title").toString()
           );
         } finally {
           this.savingProfile = false;
@@ -613,7 +591,7 @@ export default defineComponent({
       }
     },
     makeToast(text = "Message", givenTitle = "title") {
-      this.$bvToast.toast(text, {
+      this.$root.$bvToast.toast(text, {
         title: givenTitle,
         autoHideDelay: 5000,
         toaster: "b-toaster-bottom-right",
diff --git a/src/modules/user/pages/components/AccessToken.vue b/src/modules/user/pages/components/AccessToken.vue
index e478024cdf04ce42e047ae20778a680e1ee78f02..d05e76b06d70e0297dc90cda3d456bace04ce301 100644
--- a/src/modules/user/pages/components/AccessToken.vue
+++ b/src/modules/user/pages/components/AccessToken.vue
@@ -3,16 +3,8 @@
     <!-- Modal Create Access Token -->
     <CoscineModal
       v-model="isCreateModalVisible"
-      :title="
-        $parent.$parent.$t(
-          'page.userprofile.form.accessToken.modal.createToken.title'
-        )
-      "
-      :body="
-        $parent.$parent.$t(
-          'page.userprofile.form.accessToken.modal.createToken.body'
-        )
-      "
+      :title="$t('page.userprofile.form.accessToken.modal.createToken.title')"
+      :body="$t('page.userprofile.form.accessToken.modal.createToken.body')"
     >
       <div class="create-modal-content">
         <b-button-group id="tokenButtonGroup" style="width: 100%">
@@ -25,7 +17,7 @@
             ><b-icon-clipboard
           /></b-button>
           <b-tooltip ref="tooltip" target="copyButton" triggers="focus">{{
-            $parent.$parent.$t(
+            $t(
               "page.userprofile.form.accessToken.modal.createToken.copyToClipboard"
             )
           }}</b-tooltip>
@@ -34,7 +26,7 @@
       <template #buttons>
         <div align="right">
           <b-button name="close" @click="isCreateModalVisible = false">{{
-            $parent.$parent.$t("buttons.close")
+            $t("buttons.close")
           }}</b-button>
         </div>
       </template>
@@ -43,30 +35,22 @@
     <!-- Modal Revoke Access Token -->
     <CoscineModal
       v-model="isRevokeModalVisible"
-      :title="
-        $parent.$parent.$t(
-          'page.userprofile.form.accessToken.modal.revokeToken.title'
-        )
-      "
-      :body="
-        $parent.$parent.$t(
-          'page.userprofile.form.accessToken.modal.revokeToken.body'
-        )
-      "
+      :title="$t('page.userprofile.form.accessToken.modal.revokeToken.title')"
+      :body="$t('page.userprofile.form.accessToken.modal.revokeToken.body')"
     >
       <br />
       <div class="revoke-modal-content">{{ selectedTokenName }}</div>
       <br />
       <template #buttons>
         <b-button name="close" @click="isRevokeModalVisible = false">{{
-          $parent.$parent.$t("buttons.cancel")
+          $t("buttons.cancel")
         }}</b-button>
         <b-button
           name="deleteToken"
           @click="confirmRevoke"
           variant="danger"
           style="float: right"
-          >{{ $parent.$parent.$t("buttons.revoke") }}</b-button
+          >{{ $t("buttons.revoke") }}</b-button
         >
       </template>
     </CoscineModal>
@@ -79,7 +63,7 @@
     >
       <!-- Token Body Text -->
       <b-form-text id="TokenBodytext" style="text-align: left">
-        {{ $parent.$parent.$t("page.userprofile.form.accessToken.bodyText") }}
+        {{ $t("page.userprofile.form.accessToken.bodyText") }}
       </b-form-text>
     </b-form-group>
     <!-- Token Name -->
@@ -88,18 +72,12 @@
       label-for="TokenName"
       label-cols-sm="3"
       label-align-sm="right"
-      :label="
-        $parent.$parent.$t(
-          'page.userprofile.form.accessToken.labels.tokenNameLabel'
-        )
-      "
+      :label="$t('page.userprofile.form.accessToken.labels.tokenNameLabel')"
     >
       <b-form-input
         id="TokenName"
         v-model="$v.token.TokenName.$model"
-        :placeholder="
-          $parent.$parent.$t('page.userprofile.form.accessToken.tokenName')
-        "
+        :placeholder="$t('page.userprofile.form.accessToken.tokenName')"
       />
     </b-form-group>
     <!-- Expires on -->
@@ -107,20 +85,14 @@
       label-for="ExpiredDate"
       label-cols-sm="3"
       label-align-sm="right"
-      :label="
-        $parent.$parent.$t(
-          'page.userprofile.form.accessToken.labels.tokenExpireLabel'
-        )
-      "
+      :label="$t('page.userprofile.form.accessToken.labels.tokenExpireLabel')"
     >
       <b-form-datepicker
         v-model="$v.token.TokenExpirationDate.$model"
         :min="tokenValidityBounds.minDate"
         :max="tokenValidityBounds.maxDate"
         :locale="$i18n.locale"
-        :placeholder="
-          $parent.$parent.$t('page.userprofile.form.accessToken.tokenExpire')
-        "
+        :placeholder="$t('page.userprofile.form.accessToken.tokenExpire')"
         :date-format-options="dateFormatOptions"
       ></b-form-datepicker>
     </b-form-group>
@@ -134,7 +106,7 @@
         style="margin-right: 0px"
         @click.prevent="createToken"
         :disabled="$v.token.$invalid"
-        >{{ $parent.$parent.$t("buttons.tokenCreate") }}</b-button
+        >{{ $t("buttons.tokenCreate") }}</b-button
       >
     </b-form-group>
 
@@ -162,11 +134,7 @@
           :items="tokens"
           :locale="$i18n.locale"
           :show-empty="true"
-          :empty-text="
-            $parent.$parent.$t(
-              'page.userprofile.form.accessToken.table.emptyText'
-            )
-          "
+          :empty-text="$t('page.userprofile.form.accessToken.table.emptyText')"
           class="mb-0 text-left"
           fixed
           small
@@ -188,7 +156,7 @@
               v-on:click="revokeToken(selectedToken.item)"
               size="sm"
               variant="danger"
-              >{{ $parent.$parent.$t("buttons.revoke") }}</b-button
+              >{{ $t("buttons.revoke") }}</b-button
             >
           </template>
         </b-table>
@@ -207,13 +175,13 @@ import { BIconClipboard } from "bootstrap-vue";
 import CoscineModal from "@/components/CoscineModal.vue";
 
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 // import the store for current module
-import { useUserStore } from "../../store";
+import useUserStore from "../../store";
 
 import moment from "moment";
 
-import {
+import type {
   AddApiTokenParameter,
   ApiTokenObject,
 } from "@coscine/api-client/dist/types/Coscine.Api.Token";
@@ -253,27 +221,23 @@ export default defineComponent({
       isRevokeModalVisible: false,
       headers: [
         {
-          label: this.$parent.$parent.$t(
-            "page.userprofile.form.accessToken.tokenName"
-          ),
+          label: this.$t("page.userprofile.form.accessToken.tokenName"),
           key: "name",
         },
         {
-          label: this.$parent.$parent.$t(
+          label: this.$t(
             "page.userprofile.form.accessToken.table.tokenCreated"
           ),
           key: "created",
         },
         {
-          label: this.$parent.$parent.$t(
+          label: this.$t(
             "page.userprofile.form.accessToken.table.tokenExpires"
           ),
           key: "expires",
         },
         {
-          label: this.$parent.$parent.$t(
-            "page.userprofile.form.accessToken.table.tokenAction"
-          ),
+          label: this.$t("page.userprofile.form.accessToken.table.tokenAction"),
           key: "actions",
         },
       ],
diff --git a/src/modules/user/routes.ts b/src/modules/user/routes.ts
index 76a2d88f005946006a6b003acf20104846cd5cc3..554da9aa663fefd643a5a6a7055c8790c0c58ee6 100644
--- a/src/modules/user/routes.ts
+++ b/src/modules/user/routes.ts
@@ -3,10 +3,15 @@ import { RouteConfig } from "vue-router";
 const UserModule = () => import("./UserModule.vue");
 const UserProfile = () => import("./pages/UserProfile.vue");
 
+import { UserI18nMessages } from "@/modules/user/i18n/index";
+
 export const UserRoutes: RouteConfig[] = [
   {
     path: "/user",
     component: UserModule,
+    meta: {
+      i18n: UserI18nMessages,
+    },
     children: [
       {
         path: "/",
diff --git a/src/modules/user/store.ts b/src/modules/user/store.ts
index 1342c5235ad76273f2311208e942b59ff08ed8ec..8762e4e3071a4673e226bdeedfb77d7f58ee6acd 100644
--- a/src/modules/user/store.ts
+++ b/src/modules/user/store.ts
@@ -13,7 +13,7 @@ import { defineStore } from "pinia";
 import type { UserState } from "./types";
 
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 
 /*  
   Store variable name is "this.<id>Store"
diff --git a/src/plugins/loadingCounter.ts b/src/plugins/loadingCounter.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e0927c4f911ff3f6e898728a460c985e5034ed8f
--- /dev/null
+++ b/src/plugins/loadingCounter.ts
@@ -0,0 +1,27 @@
+import useMainStore from "@/store";
+
+import type { StoreDefinition } from "pinia";
+
+export function loadingCounterEventHandler(store: StoreDefinition) {
+  const mainStore = useMainStore();
+
+  store().$onAction(
+    ({
+      after, // Hook after the action returns or resolves
+      onError, // Hook if the action throws or rejects
+    }) => {
+      // Increment the loading counter
+      mainStore.coscine.loading.counter++;
+
+      // Decrease the loading counter
+      after(() => {
+        mainStore.coscine.loading.counter--;
+      });
+
+      // Decrease the loading counter
+      onError(() => {
+        mainStore.coscine.loading.counter--;
+      });
+    }
+  );
+}
diff --git a/src/router/index.ts b/src/router/index.ts
index 0e0dec377113d8ce0b4ac4b2fda3669486837cda..c94909883cddb38dbc65ce3bcfaecd73d6b358ba 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -52,18 +52,28 @@ VueRouter.prototype.push = async function (location: RawLocation) {
 };
 
 // import the main store
-import { useMainStore } from "@/store/index";
+import useMainStore from "@/store/index";
 import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
+import i18n, { def } from "@/plugins/vue-i18n";
+import type VueI18n from "vue-i18n";
 
 router.beforeEach((to, _, next) => {
+  // Replace the available locale messages
+  const localeMessages: VueI18n.LocaleMessages | undefined = to.matched
+    .map((e) => e.meta.i18n)
+    .filter((i) => i)
+    .pop();
+  if (localeMessages) {
+    i18n.availableLocales.forEach((locale) => {
+      i18n.setLocaleMessage(locale, def[locale]); // default locale messages
+      i18n.mergeLocaleMessage(locale, localeMessages[locale]); // append the locale messages for the component
+    });
+  }
+
   const mainStore = useMainStore();
   // Handle access token from URL
   mainStore.setAccessTokenFromRoute(router, to);
   mainStore.getMaintenance();
-  // Set the page not loading
-  mainStore.$patch((state) => {
-    state.coscine.loading.counter = 0;
-  });
   if (to.meta?.requiresAuth && !mainStore.loggedIn) {
     // Route requires auth, check if logged in
     // if not, redirect to login page.
diff --git a/src/router/types.d.ts b/src/router/types.d.ts
index bdb56cab169dd3155ac4a1f8778c5d81d76643b1..7847671208d7861ed4a866b07f09c045385ceac1 100644
--- a/src/router/types.d.ts
+++ b/src/router/types.d.ts
@@ -1,5 +1,6 @@
 // typings.d.ts or router.ts
 import "vue-router";
+import VueI18n from "vue-i18n";
 
 declare module "vue-router" {
   interface RouteMeta {
@@ -7,7 +8,8 @@ declare module "vue-router" {
     requiresAdmin?: boolean;
     requiresAuth?: boolean;
     // must be declared by every route
-    breadCrumb: string;
+    breadCrumb?: string;
     default?: string;
+    i18n?: VueI18n.LocaleMessages;
   }
 }
diff --git a/src/store/index.ts b/src/store/index.ts
index 4c92f2adf1d5b46f992372534bd86be2ae60819f..f9ff652165f12941e6b70d08b64b6c784d735971 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -8,7 +8,7 @@ import { removeQueryParameterFromUrl } from "@/router";
 import { NoticeApi } from "@coscine/api-client";
 import { StatusCodes } from "http-status-codes";
 
-import { useLoginStore } from "@/modules/login/store";
+import useLoginStore from "@/modules/login/store";
 
 /*  
   Store variable name is "this.<id>Store"
@@ -31,7 +31,7 @@ export const useMainStore = defineStore({
         id: useLocalStorage("coscine.clientcorrelation.id", uuidv4()),
       },
       loading: {
-        counter: useLocalStorage("coscine.loading.counter", 0),
+        counter: 0,
       },
       locale: useLocalStorage("coscine.locale", "en"),
       banner: {
@@ -60,6 +60,9 @@ export const useMainStore = defineStore({
       :label = "this.mainStore.<getter_name>;
   */
   getters: {
+    isLoading(): boolean {
+      return this.coscine.loading.counter > 0;
+    },
     loggedIn() {
       const loginStore = useLoginStore();
       if (this.coscine.authorization.bearer && !loginStore.expiredSession) {
diff --git a/src/store/types.d.ts b/src/store/types.d.ts
index f6489cbf3ee4d3bb60c0599259ef1ff562cfe4cc..67edb2d70657d329d27911e38e4c080920eeddfb 100644
--- a/src/store/types.d.ts
+++ b/src/store/types.d.ts
@@ -15,7 +15,7 @@ export interface MainState {
       id: RemovableRef<string>;
     };
     loading: {
-      counter: RemovableRef<number>;
+      counter: number;
     };
     locale: RemovableRef<string>;
     banner: {
diff --git a/yarn.lock-workspace b/yarn.lock-workspace
index 3534621d5681dceed43a31487856f006e7cd46ab..22ada528f23ceb18bed9d75901e1b00aa918845c 100644
--- a/yarn.lock-workspace
+++ b/yarn.lock-workspace
@@ -30,7 +30,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.7":
+"@babel/code-frame@npm:7.12.11":
+  version: 7.12.11
+  resolution: "@babel/code-frame@npm:7.12.11"
+  dependencies:
+    "@babel/highlight": ^7.10.4
+  checksum: 3963eff3ebfb0e091c7e6f99596ef4b258683e4ba8a134e4e95f77afe85be5c931e184fff6435fb4885d12eba04a5e25532f7fbc292ca13b48e7da943474e2f3
+  languageName: node
+  linkType: hard
+
+"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7":
   version: 7.16.7
   resolution: "@babel/code-frame@npm:7.16.7"
   dependencies:
@@ -46,6 +55,29 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@babel/core@npm:^7.1.0, @babel/core@npm:^7.12.3, @babel/core@npm:^7.7.2, @babel/core@npm:^7.8.0":
+  version: 7.17.9
+  resolution: "@babel/core@npm:7.17.9"
+  dependencies:
+    "@ampproject/remapping": ^2.1.0
+    "@babel/code-frame": ^7.16.7
+    "@babel/generator": ^7.17.9
+    "@babel/helper-compilation-targets": ^7.17.7
+    "@babel/helper-module-transforms": ^7.17.7
+    "@babel/helpers": ^7.17.9
+    "@babel/parser": ^7.17.9
+    "@babel/template": ^7.16.7
+    "@babel/traverse": ^7.17.9
+    "@babel/types": ^7.17.0
+    convert-source-map: ^1.7.0
+    debug: ^4.1.0
+    gensync: ^1.0.0-beta.2
+    json5: ^2.2.1
+    semver: ^6.3.0
+  checksum: 2d301e4561a170bb584a735ec412de8fdc40b2052e12380d4a5e36781be5af1fd2a60552e7f0764b0a491a242f20105265bd2a10ff57b30c2842684f02dbb5a2
+  languageName: node
+  linkType: hard
+
 "@babel/core@npm:^7.16.10":
   version: 7.17.7
   resolution: "@babel/core@npm:7.17.7"
@@ -80,6 +112,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@babel/generator@npm:^7.17.9, @babel/generator@npm:^7.7.2":
+  version: 7.17.9
+  resolution: "@babel/generator@npm:7.17.9"
+  dependencies:
+    "@babel/types": ^7.17.0
+    jsesc: ^2.5.1
+    source-map: ^0.5.0
+  checksum: afbdd4afbf731ba0a17e7e2d9a2291e6461259af887f88f1178f63514a86e9c18cec462ae8f9cd6df9ba15a18296f47b0e151202bb4f834f7338ac0c07ec8dc8
+  languageName: node
+  linkType: hard
+
 "@babel/helper-annotate-as-pure@npm:^7.16.7":
   version: 7.16.7
   resolution: "@babel/helper-annotate-as-pure@npm:7.16.7"
@@ -140,6 +183,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@babel/helper-function-name@npm:^7.17.9":
+  version: 7.17.9
+  resolution: "@babel/helper-function-name@npm:7.17.9"
+  dependencies:
+    "@babel/template": ^7.16.7
+    "@babel/types": ^7.17.0
+  checksum: a59b2e5af56d8f43b9b0019939a43774754beb7cb01a211809ca8031c71890999d07739e955343135ec566c4d8ff725435f1f60fb0af3bb546837c1f9f84f496
+  languageName: node
+  linkType: hard
+
 "@babel/helper-get-function-arity@npm:^7.16.7":
   version: 7.16.7
   resolution: "@babel/helper-get-function-arity@npm:7.16.7"
@@ -201,7 +254,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-plugin-utils@npm:^7.16.7":
+"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.8.0":
   version: 7.16.7
   resolution: "@babel/helper-plugin-utils@npm:7.16.7"
   checksum: d08dd86554a186c2538547cd537552e4029f704994a9201d41d82015c10ed7f58f9036e8d1527c3760f042409163269d308b0b3706589039c5f1884619c6d4ce
@@ -264,6 +317,28 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@babel/helpers@npm:^7.17.9":
+  version: 7.17.9
+  resolution: "@babel/helpers@npm:7.17.9"
+  dependencies:
+    "@babel/template": ^7.16.7
+    "@babel/traverse": ^7.17.9
+    "@babel/types": ^7.17.0
+  checksum: 3c6db861e4c82fff2de3efb4ad12e32658c50c29920597cd0979390659b202e5849acd9542e0e2453167a52ccc30156ee4455d64d0e330f020d991d7551566f8
+  languageName: node
+  linkType: hard
+
+"@babel/highlight@npm:^7.10.4":
+  version: 7.17.9
+  resolution: "@babel/highlight@npm:7.17.9"
+  dependencies:
+    "@babel/helper-validator-identifier": ^7.16.7
+    chalk: ^2.0.0
+    js-tokens: ^4.0.0
+  checksum: 7bdf10228f2e4d18f48f114411ed584380d356e7c168d7582c14abd8df9909b2fc09e0a7cd334f47c3eb0bc17e639e0c8d9688c6afd5d09a2bdbf0ac193b11fd
+  languageName: node
+  linkType: hard
+
 "@babel/highlight@npm:^7.16.7":
   version: 7.16.10
   resolution: "@babel/highlight@npm:7.16.10"
@@ -275,6 +350,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.17.9":
+  version: 7.17.9
+  resolution: "@babel/parser@npm:7.17.9"
+  bin:
+    parser: ./bin/babel-parser.js
+  checksum: ea59c985ebfae7c0299c8ea63ed34903202f51665db8d59c55b4366e20270b74d7367a2c211fdd2db20f25750df89adcc85ab6c8692061c6459a88efb79f43e6
+  languageName: node
+  linkType: hard
+
 "@babel/parser@npm:^7.16.10, @babel/parser@npm:^7.16.7, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.17.7":
   version: 7.17.7
   resolution: "@babel/parser@npm:7.17.7"
@@ -311,6 +395,39 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@babel/plugin-syntax-async-generators@npm:^7.8.4":
+  version: 7.8.4
+  resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.8.0
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-bigint@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-bigint@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.8.0
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-class-properties@npm:^7.8.3":
+  version: 7.12.13
+  resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.12.13
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc
+  languageName: node
+  linkType: hard
+
 "@babel/plugin-syntax-decorators@npm:^7.17.0":
   version: 7.17.0
   resolution: "@babel/plugin-syntax-decorators@npm:7.17.0"
@@ -322,6 +439,28 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@babel/plugin-syntax-import-meta@npm:^7.8.3":
+  version: 7.10.4
+  resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.10.4
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-json-strings@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.8.0
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a
+  languageName: node
+  linkType: hard
+
 "@babel/plugin-syntax-jsx@npm:^7.2.0":
   version: 7.16.7
   resolution: "@babel/plugin-syntax-jsx@npm:7.16.7"
@@ -333,7 +472,84 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-typescript@npm:^7.16.7":
+"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3":
+  version: 7.10.4
+  resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.10.4
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.8.0
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-numeric-separator@npm:^7.8.3":
+  version: 7.10.4
+  resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.10.4
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.8.0
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.8.0
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-optional-chaining@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.8.0
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-top-level-await@npm:^7.8.3":
+  version: 7.14.5
+  resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5"
+  dependencies:
+    "@babel/helper-plugin-utils": ^7.14.5
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-typescript@npm:^7.16.7, @babel/plugin-syntax-typescript@npm:^7.7.2":
   version: 7.16.7
   resolution: "@babel/plugin-syntax-typescript@npm:7.16.7"
   dependencies:
@@ -357,7 +573,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/template@npm:^7.16.7":
+"@babel/template@npm:^7.16.7, @babel/template@npm:^7.3.3":
   version: 7.16.7
   resolution: "@babel/template@npm:7.16.7"
   dependencies:
@@ -386,7 +602,25 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/types@npm:^7.16.7, @babel/types@npm:^7.17.0, @babel/types@npm:^7.8.3":
+"@babel/traverse@npm:^7.17.9, @babel/traverse@npm:^7.7.2":
+  version: 7.17.9
+  resolution: "@babel/traverse@npm:7.17.9"
+  dependencies:
+    "@babel/code-frame": ^7.16.7
+    "@babel/generator": ^7.17.9
+    "@babel/helper-environment-visitor": ^7.16.7
+    "@babel/helper-function-name": ^7.17.9
+    "@babel/helper-hoist-variables": ^7.16.7
+    "@babel/helper-split-export-declaration": ^7.16.7
+    "@babel/parser": ^7.17.9
+    "@babel/types": ^7.17.0
+    debug: ^4.1.0
+    globals: ^11.1.0
+  checksum: d907c71d1617589cc0cddc9837cb27bcb9b8f2117c379e13e72653745abe01da24e8c072bd0c91b9db33323ddb1086722756fbc50b487b2608733baf9dd6fd2c
+  languageName: node
+  linkType: hard
+
+"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.7, @babel/types@npm:^7.17.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3":
   version: 7.17.0
   resolution: "@babel/types@npm:7.17.0"
   dependencies:
@@ -396,6 +630,253 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@bcoe/v8-coverage@npm:^0.2.3":
+  version: 0.2.3
+  resolution: "@bcoe/v8-coverage@npm:0.2.3"
+  checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27
+  languageName: node
+  linkType: hard
+
+"@colors/colors@npm:1.5.0":
+  version: 1.5.0
+  resolution: "@colors/colors@npm:1.5.0"
+  checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425
+  languageName: node
+  linkType: hard
+
+"@commitlint/cli@npm:^13.1.0":
+  version: 13.2.1
+  resolution: "@commitlint/cli@npm:13.2.1"
+  dependencies:
+    "@commitlint/format": ^13.2.0
+    "@commitlint/lint": ^13.2.0
+    "@commitlint/load": ^13.2.1
+    "@commitlint/read": ^13.2.0
+    "@commitlint/types": ^13.2.0
+    lodash: ^4.17.19
+    resolve-from: 5.0.0
+    resolve-global: 1.0.0
+    yargs: ^17.0.0
+  bin:
+    commitlint: cli.js
+  checksum: 41b74874ec3e3b1da69f07710ea080654017d6e9a73d98d06c061259bb255e09a4870a516da0ee92f86776f030e608eb797cdd44dac804c39f2f32e798e81a60
+  languageName: node
+  linkType: hard
+
+"@commitlint/config-conventional@npm:^13.1.0":
+  version: 13.2.0
+  resolution: "@commitlint/config-conventional@npm:13.2.0"
+  dependencies:
+    conventional-changelog-conventionalcommits: ^4.3.1
+  checksum: fd659269fe31df17bf479b90e915e063c7dc61b795396458d403c4154f037e152ad015463c078a881af18456c638ab3b6c1b67966abc42b131e5a900ad3c2753
+  languageName: node
+  linkType: hard
+
+"@commitlint/config-validator@npm:^16.2.1":
+  version: 16.2.1
+  resolution: "@commitlint/config-validator@npm:16.2.1"
+  dependencies:
+    "@commitlint/types": ^16.2.1
+    ajv: ^6.12.6
+  checksum: 1b86832dc03fc7f9442f9358c6c73d42974e9006944b8524bc4b4cd2ce946e50f3eca972737844dc7765a874c465ff5f18dad210f979491f9ee07c831b0eb8d3
+  languageName: node
+  linkType: hard
+
+"@commitlint/ensure@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/ensure@npm:13.2.0"
+  dependencies:
+    "@commitlint/types": ^13.2.0
+    lodash: ^4.17.19
+  checksum: c3193e871532c14da99525852589b3a7f81ee769c1dfcbfb9b79e339a53cf9dc02dfdf7209ab46252534c3e3f30fd944d42b8eb1744c560d67b7ae5d75347727
+  languageName: node
+  linkType: hard
+
+"@commitlint/execute-rule@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/execute-rule@npm:13.2.0"
+  checksum: 785361665d0c6857eddbe918d8405f0cae2e35b9ee6320df17ba6ac8a351b0a438130ed8c18c558e91aef585546e64b3b8b21f2a7b4d43b121fc6da103e9baa0
+  languageName: node
+  linkType: hard
+
+"@commitlint/execute-rule@npm:^16.2.1":
+  version: 16.2.1
+  resolution: "@commitlint/execute-rule@npm:16.2.1"
+  checksum: 83be0e858fa415ba7d844fc68c7c8bcc3b14074fe862f2129e03ce5fd07a58876d88d080e0d2fbf25e10f6d3189a04bca024def48206fa0f0f1c5890d689539c
+  languageName: node
+  linkType: hard
+
+"@commitlint/format@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/format@npm:13.2.0"
+  dependencies:
+    "@commitlint/types": ^13.2.0
+    chalk: ^4.0.0
+  checksum: 2436616dfad82cf5c21a2158d84199a02af04db3bb55c1075ba6c048f6acde0e63e19f98dcbcedd5ad09b0641a3d16a40250d4f16bf8ab2816d4328b04d6a6cf
+  languageName: node
+  linkType: hard
+
+"@commitlint/is-ignored@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/is-ignored@npm:13.2.0"
+  dependencies:
+    "@commitlint/types": ^13.2.0
+    semver: 7.3.5
+  checksum: 0a06adb765236a5ebf03be69f4bf30cbb4375ce902e1d819dc428bd725fed1d83790bdad9bcdb990ac61affd63a50c31f904ded807c62ca70da4556398e7f729
+  languageName: node
+  linkType: hard
+
+"@commitlint/lint@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/lint@npm:13.2.0"
+  dependencies:
+    "@commitlint/is-ignored": ^13.2.0
+    "@commitlint/parse": ^13.2.0
+    "@commitlint/rules": ^13.2.0
+    "@commitlint/types": ^13.2.0
+  checksum: f56d9029bdf7957d8c4e5af6ab621cf0dac82422550bdc84ac28965b5828e376b986be091502bc4e60240e0fd4db9f35cecf95a6b35d5c926ea78118bab06e9f
+  languageName: node
+  linkType: hard
+
+"@commitlint/load@npm:>6.1.1":
+  version: 16.2.3
+  resolution: "@commitlint/load@npm:16.2.3"
+  dependencies:
+    "@commitlint/config-validator": ^16.2.1
+    "@commitlint/execute-rule": ^16.2.1
+    "@commitlint/resolve-extends": ^16.2.1
+    "@commitlint/types": ^16.2.1
+    "@types/node": ">=12"
+    chalk: ^4.0.0
+    cosmiconfig: ^7.0.0
+    cosmiconfig-typescript-loader: ^1.0.0
+    lodash: ^4.17.19
+    resolve-from: ^5.0.0
+    typescript: ^4.4.3
+  checksum: 11a34e018431c9639c84427305167a4f3a4ebffab0f42c681c5eba347690b444cf4ea3ce5fde953106b3d615a273b8b6afe34fd4f72fa480512d4f2297636191
+  languageName: node
+  linkType: hard
+
+"@commitlint/load@npm:^13.2.1":
+  version: 13.2.1
+  resolution: "@commitlint/load@npm:13.2.1"
+  dependencies:
+    "@commitlint/execute-rule": ^13.2.0
+    "@commitlint/resolve-extends": ^13.2.0
+    "@commitlint/types": ^13.2.0
+    "@endemolshinegroup/cosmiconfig-typescript-loader": ^3.0.2
+    chalk: ^4.0.0
+    cosmiconfig: ^7.0.0
+    lodash: ^4.17.19
+    resolve-from: ^5.0.0
+    typescript: ^4.4.3
+  checksum: e64c32ab9f461daa6e389b613546ca3a57bac381dd57fa1252674cdbbb9c65ae4fac10f787ff305008fef9b4ea218ccfe8db09cbc716622a5695a85f1a8b5f35
+  languageName: node
+  linkType: hard
+
+"@commitlint/message@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/message@npm:13.2.0"
+  checksum: 77e4e0670490b294d4e9c55ff4788e2c76050a23e471478494a4b8efed196f0aecb7b64ce652109ecbc6847adaa95a0d3495330b7776fecac3ff6e5a6bb5f6eb
+  languageName: node
+  linkType: hard
+
+"@commitlint/parse@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/parse@npm:13.2.0"
+  dependencies:
+    "@commitlint/types": ^13.2.0
+    conventional-changelog-angular: ^5.0.11
+    conventional-commits-parser: ^3.2.2
+  checksum: ef445bd5f4bf5711fe845f3e507d5776f8f57319f527b25b049671006223419af2ca8765133683bbd42c725528bf254bc1d7ee745c027e105f602f1b78e86a7e
+  languageName: node
+  linkType: hard
+
+"@commitlint/read@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/read@npm:13.2.0"
+  dependencies:
+    "@commitlint/top-level": ^13.2.0
+    "@commitlint/types": ^13.2.0
+    fs-extra: ^10.0.0
+    git-raw-commits: ^2.0.0
+  checksum: 440763c8e5d8529ec7ba642af0b6996a0fcba818e5078eadb265d6134c938d6a272a99937d2158f3df09937492cc72470f46e6e2f239b588611fe5cb9092699b
+  languageName: node
+  linkType: hard
+
+"@commitlint/resolve-extends@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/resolve-extends@npm:13.2.0"
+  dependencies:
+    import-fresh: ^3.0.0
+    lodash: ^4.17.19
+    resolve-from: ^5.0.0
+    resolve-global: ^1.0.0
+  checksum: 21b07de2676543fd7967c36fbfebde4c9d1cc5c3213e2c4b8976b84b30f3085c686852d8f0078b5084eb9a0e0f743cc7b8a9e4d01928eff447e682ab626983f8
+  languageName: node
+  linkType: hard
+
+"@commitlint/resolve-extends@npm:^16.2.1":
+  version: 16.2.1
+  resolution: "@commitlint/resolve-extends@npm:16.2.1"
+  dependencies:
+    "@commitlint/config-validator": ^16.2.1
+    "@commitlint/types": ^16.2.1
+    import-fresh: ^3.0.0
+    lodash: ^4.17.19
+    resolve-from: ^5.0.0
+    resolve-global: ^1.0.0
+  checksum: e710fcb24573e1027bf0b7336983cd0539c32734b01831eb0da8a7f500d0734669d38ea75ff93e90c162417fd4db5cc460c2f122d772dfa0f4577f49caaee687
+  languageName: node
+  linkType: hard
+
+"@commitlint/rules@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/rules@npm:13.2.0"
+  dependencies:
+    "@commitlint/ensure": ^13.2.0
+    "@commitlint/message": ^13.2.0
+    "@commitlint/to-lines": ^13.2.0
+    "@commitlint/types": ^13.2.0
+    execa: ^5.0.0
+  checksum: 0f6d9fe431dbdbc79f1420f0ea577d2fe2010421e35a30fb87b5fda3272d5e8c257ee762de7b6affe5cf83c322383f77d5d5c7068017060c0458fae8023ea580
+  languageName: node
+  linkType: hard
+
+"@commitlint/to-lines@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/to-lines@npm:13.2.0"
+  checksum: bd1c6597542c7dbe95817f029710ae5e206ba4523b4fded7544324832e901b8a4d4636c165bef4b911d1213606314a0c2110c3dffd2a01e7a769edc26e1da1a8
+  languageName: node
+  linkType: hard
+
+"@commitlint/top-level@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/top-level@npm:13.2.0"
+  dependencies:
+    find-up: ^5.0.0
+  checksum: 1dbf3940a66529fc0324741d03b63c2a18569dcbf0353de5277234c9ffe641671d80fad826e5c47cbbd1be93986b4903682eecae0eca5f475601209fc9cafd4c
+  languageName: node
+  linkType: hard
+
+"@commitlint/types@npm:^13.2.0":
+  version: 13.2.0
+  resolution: "@commitlint/types@npm:13.2.0"
+  dependencies:
+    chalk: ^4.0.0
+  checksum: 9035c01864bfbf9d3073c6ff45ef9fc8c47ee34bcc6135390bbfa6be868b23edc9b98dab5013f813e69c8ba1630a3a4a93f522a2aaf082588aeed0c5dd922167
+  languageName: node
+  linkType: hard
+
+"@commitlint/types@npm:^16.2.1":
+  version: 16.2.1
+  resolution: "@commitlint/types@npm:16.2.1"
+  dependencies:
+    chalk: ^4.0.0
+  checksum: 93af3c26c36f3b11d99f0cbbb09c8952581eed2a6b7763eb728c0e7e7ecff5072de064a208b80225fb51533823af84ee3117d9c2efbcb63d1f5cfbf6fbfb8ed8
+  languageName: node
+  linkType: hard
+
 "@comunica/actor-abstract-mediatyped@npm:^1.21.1":
   version: 1.22.0
   resolution: "@comunica/actor-abstract-mediatyped@npm:1.22.0"
@@ -640,33 +1121,158 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@coscine/api-client@npm:^1.5.0, @coscine/api-client@npm:^1.5.1":
-  version: 1.5.1
-  resolution: "@coscine/api-client@npm:1.5.1"
-  dependencies:
+"@coscine/api-client@^1.5.0, @coscine/api-client@^1.5.1":
+  version: 0.0.0-use.local
+  resolution: "@coscine/api-client@workspace:libraries/api-client"
+  dependencies:
+    "@commitlint/cli": ^13.1.0
+    "@commitlint/config-conventional": ^13.1.0
+    "@hutson/semantic-delivery-gitlab": ^9.1.0
+    "@rollup/plugin-commonjs": ^20.0.0
+    "@rollup/plugin-json": ^4.1.0
+    "@rollup/plugin-node-resolve": ^13.0.4
+    "@semantic-release/commit-analyzer": ^8.0.1
+    "@semantic-release/git": ^9.0.0
+    "@semantic-release/gitlab": ^6.2.2
+    "@semantic-release/npm": ^7.1.3
+    "@semantic-release/release-notes-generator": ^9.0.3
+    "@types/jest": ^27.0.1
+    "@types/node": ^16.7.8
+    "@typescript-eslint/eslint-plugin": ^4.0.1
+    "@typescript-eslint/parser": ^4.0.1
     axios: ^0.21.1
-  checksum: e17dc39bc8c5fcc3eb0ef9647556cb9e17cba59567f9e63f8ce821202363b45fcde122c651c37515b317c83930dda399afacd020ce5e8a83603e84b5b2a3fe81
-  languageName: node
-  linkType: hard
+    colors: ^1.4.0
+    commitizen: ^4.2.4
+    conventional-changelog-eslint: ^3.0.9
+    coveralls: ^3.1.1
+    cross-env: ^7.0.3
+    cz-conventional-changelog: ^3.3.0
+    eslint: ^7.8.0
+    eslint-config-prettier: ^6.11.0
+    eslint-import-resolver-node: ^0.3.6
+    eslint-plugin-eslint-comments: ^3.2.0
+    eslint-plugin-functional: ^3.0.2
+    eslint-plugin-import: ^2.22.0
+    husky: ^7.0.2
+    jest: ^27.1.0
+    jest-config: ^27.1.0
+    lint-staged: ^11.1.2
+    lodash.camelcase: ^4.3.0
+    prettier: ^2.3.2
+    prompt: ^1.2.0
+    replace-in-file: ^6.2.0
+    rimraf: ^3.0.2
+    rollup: ^2.56.3
+    rollup-plugin-sourcemaps: ^0.6.3
+    rollup-plugin-typescript2: ^0.30.0
+    semantic-release: ^17.4.7
+    shelljs: ^0.8.4
+    ts-jest: ^27.0.5
+    ts-node: ^10.2.1
+    tslib: ^2.3.1
+    typedoc: ^0.21.9
+    typescript: ~4.4.4
+  languageName: unknown
+  linkType: soft
 
-"@coscine/form-generator@npm:^1.18.0":
-  version: 1.18.0
-  resolution: "@coscine/form-generator@npm:1.18.0"
+"@coscine/form-generator@^1.18.0":
+  version: 0.0.0-use.local
+  resolution: "@coscine/form-generator@workspace:libraries/form-generator"
   dependencies:
     "@coscine/api-client": ^1.5.0
-    bootstrap-vue: ^2.20.1
-    rdf-ext: ^1.3.4
-    rdf-parse: 1.8.0
-    rdf-validate-shacl: ^0.2.5
+    "@hutson/semantic-delivery-gitlab": ^9.1.0
+    "@semantic-release/commit-analyzer": ^8.0.1
+    "@semantic-release/git": ^9.0.0
+    "@semantic-release/gitlab": ^6.0.5
+    "@semantic-release/npm": ^7.0.6
+    "@semantic-release/release-notes-generator": ^9.0.1
+    "@types/node": ^14.14.20
+    "@types/rdf-js": ^4.0.0
+    "@types/rdf-validate-shacl": ^0.2.4
+    "@types/uuid": ^8.3.1
+    "@types/vuelidate": ^0.7.13
+    "@typescript-eslint/eslint-plugin": ^5.15.0
+    "@typescript-eslint/parser": ^5.15.0
+    "@vue/cli-plugin-eslint": ^4.5.15
+    "@vue/eslint-config-prettier": ^6.0.0
+    "@vue/eslint-config-typescript": ^8.0.0
+    bootstrap-vue: ^2.22.0
+    conventional-changelog-eslint: 3.0.9
+    core-js: ^3.8.2
+    eslint: ^8.11.0
+    eslint-import-resolver-node: ^0.3.6
+    eslint-plugin-eslint-comments: ^3.2.0
+    eslint-plugin-functional: ^4.2.0
+    eslint-plugin-import: ^2.25.4
+    eslint-plugin-prettier: ^4.0.0
+    eslint-plugin-vue: ^8.5.0
+    prettier: ^2.5.1
+    rdf-ext: ^1.3.4
+    rdf-parse: 1.8.0
+    rdf-validate-shacl: ^0.2.5
+    rollup-plugin-node-globals: ^1.4.0
+    rollup-plugin-node-polyfills: ^0.2.1
+    rollup-plugin-polyfill-node: ^0.8.0
+    semantic-release: ^17.3.1
     stream-browserify: ^3.0.0
+    typescript: ~4.4.3
     uuid: ^8.3.2
+    vite: ^2.8.6
+    vite-plugin-vue2: ^1.9.3
     vue: ^2.6.14
     vue-i18n: ^8.22.2
     vue-material-design-icons: ^4.11.0
     vue-multiselect: ^2.1.6
     vue-runtime-helpers: ^1.1.2
+    vue-template-compiler: ^2.6.14
     vuelidate: ^0.7.6
-  checksum: a2c4afa74bd141e27a84b558ddb1a162bec0d8a215c8a52e5efdc10752e0c85eef3fe5bbefd2676f7740804d8c41aedaee3eacae97974e5746e6359784968dda
+  languageName: unknown
+  linkType: soft
+
+"@cspotcode/source-map-consumer@npm:0.8.0":
+  version: 0.8.0
+  resolution: "@cspotcode/source-map-consumer@npm:0.8.0"
+  checksum: c0c16ca3d2f58898f1bd74c4f41a189dbcc202e642e60e489cbcc2e52419c4e89bdead02c886a12fb13ea37798ede9e562b2321df997ebc210ae9bd881561b4e
+  languageName: node
+  linkType: hard
+
+"@cspotcode/source-map-support@npm:0.7.0":
+  version: 0.7.0
+  resolution: "@cspotcode/source-map-support@npm:0.7.0"
+  dependencies:
+    "@cspotcode/source-map-consumer": 0.8.0
+  checksum: 9faddda7757cd778b5fd6812137b2cc265810043680d6399acc20441668fafcdc874053be9dccd0d9110087287bfad27eb3bf342f72bceca9aa9059f5d0c4be8
+  languageName: node
+  linkType: hard
+
+"@endemolshinegroup/cosmiconfig-typescript-loader@npm:^3.0.2":
+  version: 3.0.2
+  resolution: "@endemolshinegroup/cosmiconfig-typescript-loader@npm:3.0.2"
+  dependencies:
+    lodash.get: ^4
+    make-error: ^1
+    ts-node: ^9
+    tslib: ^2
+  peerDependencies:
+    cosmiconfig: ">=6"
+  checksum: 7fe0198622b1063c40572034df7e8ba867865a1b4815afe230795929abcf785758b34d7806a8e2100ba8ab4e92c5a1c3e11a980c466c4406df6e7ec6e50df8b6
+  languageName: node
+  linkType: hard
+
+"@eslint/eslintrc@npm:^0.4.3":
+  version: 0.4.3
+  resolution: "@eslint/eslintrc@npm:0.4.3"
+  dependencies:
+    ajv: ^6.12.4
+    debug: ^4.1.1
+    espree: ^7.3.0
+    globals: ^13.9.0
+    ignore: ^4.0.6
+    import-fresh: ^3.2.1
+    js-yaml: ^3.13.1
+    minimatch: ^3.0.4
+    strip-json-comments: ^3.1.1
+  checksum: 03a7704150b868c318aab6a94d87a33d30dc2ec579d27374575014f06237ba1370ae11178db772f985ef680d469dc237e7b16a1c5d8edaaeb8c3733e7a95a6d3
   languageName: node
   linkType: hard
 
@@ -736,6 +1342,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@humanwhocodes/config-array@npm:^0.5.0":
+  version: 0.5.0
+  resolution: "@humanwhocodes/config-array@npm:0.5.0"
+  dependencies:
+    "@humanwhocodes/object-schema": ^1.2.0
+    debug: ^4.1.1
+    minimatch: ^3.0.4
+  checksum: 44ee6a9f05d93dd9d5935a006b17572328ba9caff8002442f601736cbda79c580cc0f5a49ce9eb88fbacc5c3a6b62098357c2e95326cd17bb9f1a6c61d6e95e7
+  languageName: node
+  linkType: hard
+
 "@humanwhocodes/config-array@npm:^0.9.2":
   version: 0.9.5
   resolution: "@humanwhocodes/config-array@npm:0.9.5"
@@ -747,13 +1364,45 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@humanwhocodes/object-schema@npm:^1.2.1":
+"@humanwhocodes/object-schema@npm:^1.2.0, @humanwhocodes/object-schema@npm:^1.2.1":
   version: 1.2.1
   resolution: "@humanwhocodes/object-schema@npm:1.2.1"
   checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1
   languageName: node
   linkType: hard
 
+"@hutson/parse-repository-url@npm:^3.0.0":
+  version: 3.0.2
+  resolution: "@hutson/parse-repository-url@npm:3.0.2"
+  checksum: 39992c5f183c5ca3d761d6ed9dfabcb79b5f3750bf1b7f3532e1dc439ca370138bbd426ee250fdaba460bc948e6761fbefd484b8f4f36885d71ded96138340d1
+  languageName: node
+  linkType: hard
+
+"@hutson/semantic-delivery-gitlab@npm:^9.1.0":
+  version: 9.1.0
+  resolution: "@hutson/semantic-delivery-gitlab@npm:9.1.0"
+  dependencies:
+    commander: ^4.0.1
+    conventional-changelog-angular: ^5.0.0
+    conventional-commits-detector: ^1.0.0
+    conventional-commits-parser: ^3.0.0
+    conventional-gitlab-releaser: ^4.0.0
+    conventional-recommended-bump: ^6.0.5
+    debug: ^4.0.0
+    get-pkg-repo: ^4.0.2
+    git-raw-commits: ^2.0.0
+    git-remote-origin-url: ^3.0.0
+    git-semver-tags: ^3.0.1
+    got: ^9.6.0
+    semver: ^6.0.0
+    shelljs: ^0.8.0
+    stream-to-array: ^2.3.0
+  bin:
+    semantic-delivery-gitlab: src/cli.js
+  checksum: 931eaf57eb18d940d0e74b06070b055aacf2c31e3722f137ef96a9ec4ef94aa888b74acb58389e3fe7407f2384f6f0903169800206a8cf88ee0e17f26166097f
+  languageName: node
+  linkType: hard
+
 "@isaacs/string-locale-compare@npm:*, @isaacs/string-locale-compare@npm:^1.1.0":
   version: 1.1.0
   resolution: "@isaacs/string-locale-compare@npm:1.1.0"
@@ -761,6 +1410,227 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@istanbuljs/load-nyc-config@npm:^1.0.0":
+  version: 1.1.0
+  resolution: "@istanbuljs/load-nyc-config@npm:1.1.0"
+  dependencies:
+    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
+  checksum: d578da5e2e804d5c93228450a1380e1a3c691de4953acc162f387b717258512a3e07b83510a936d9fab03eac90817473917e24f5d16297af3867f59328d58568
+  languageName: node
+  linkType: hard
+
+"@istanbuljs/schema@npm:^0.1.2":
+  version: 0.1.3
+  resolution: "@istanbuljs/schema@npm:0.1.3"
+  checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9
+  languageName: node
+  linkType: hard
+
+"@jest/console@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "@jest/console@npm:27.5.1"
+  dependencies:
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+    chalk: ^4.0.0
+    jest-message-util: ^27.5.1
+    jest-util: ^27.5.1
+    slash: ^3.0.0
+  checksum: 7cb20f06a34b09734c0342685ec53aa4c401fe3757c13a9c58fce76b971a322eb884f6de1068ef96f746e5398e067371b89515a07c268d4440a867c87748a706
+  languageName: node
+  linkType: hard
+
+"@jest/core@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "@jest/core@npm:27.5.1"
+  dependencies:
+    "@jest/console": ^27.5.1
+    "@jest/reporters": ^27.5.1
+    "@jest/test-result": ^27.5.1
+    "@jest/transform": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+    ansi-escapes: ^4.2.1
+    chalk: ^4.0.0
+    emittery: ^0.8.1
+    exit: ^0.1.2
+    graceful-fs: ^4.2.9
+    jest-changed-files: ^27.5.1
+    jest-config: ^27.5.1
+    jest-haste-map: ^27.5.1
+    jest-message-util: ^27.5.1
+    jest-regex-util: ^27.5.1
+    jest-resolve: ^27.5.1
+    jest-resolve-dependencies: ^27.5.1
+    jest-runner: ^27.5.1
+    jest-runtime: ^27.5.1
+    jest-snapshot: ^27.5.1
+    jest-util: ^27.5.1
+    jest-validate: ^27.5.1
+    jest-watcher: ^27.5.1
+    micromatch: ^4.0.4
+    rimraf: ^3.0.0
+    slash: ^3.0.0
+    strip-ansi: ^6.0.0
+  peerDependencies:
+    node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+  peerDependenciesMeta:
+    node-notifier:
+      optional: true
+  checksum: 904a94ad8f1b43cd6b48de3b0226659bff3696150ff8cf7680fc2faffdc8a115203bb9ab6e817c1f79f9d6a81f67953053cbc64d8a4604f2e0c42a04c28cf126
+  languageName: node
+  linkType: hard
+
+"@jest/environment@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "@jest/environment@npm:27.5.1"
+  dependencies:
+    "@jest/fake-timers": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+    jest-mock: ^27.5.1
+  checksum: 2a9e18c35a015508dbec5b90b21c150230fa6c1c8cb8fabe029d46ee2ca4c40eb832fb636157da14c66590d0a4c8a2c053226b041f54a44507d6f6a89abefd66
+  languageName: node
+  linkType: hard
+
+"@jest/fake-timers@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "@jest/fake-timers@npm:27.5.1"
+  dependencies:
+    "@jest/types": ^27.5.1
+    "@sinonjs/fake-timers": ^8.0.1
+    "@types/node": "*"
+    jest-message-util: ^27.5.1
+    jest-mock: ^27.5.1
+    jest-util: ^27.5.1
+  checksum: 02a0561ed2f4586093facd4ae500b74694f187ac24d4a00e949a39a1c5325bca8932b4fcb0388a2c5ed0656506fc1cf51fd3e32cdd48cea7497ad9c6e028aba8
+  languageName: node
+  linkType: hard
+
+"@jest/globals@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "@jest/globals@npm:27.5.1"
+  dependencies:
+    "@jest/environment": ^27.5.1
+    "@jest/types": ^27.5.1
+    expect: ^27.5.1
+  checksum: 087f97047e9dcf555f76fe2ce54aee681e005eaa837a0c0c2d251df6b6412c892c9df54cb871b180342114389a5ff895a4e52e6e6d3d0015bf83c02a54f64c3c
+  languageName: node
+  linkType: hard
+
+"@jest/reporters@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "@jest/reporters@npm:27.5.1"
+  dependencies:
+    "@bcoe/v8-coverage": ^0.2.3
+    "@jest/console": ^27.5.1
+    "@jest/test-result": ^27.5.1
+    "@jest/transform": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+    chalk: ^4.0.0
+    collect-v8-coverage: ^1.0.0
+    exit: ^0.1.2
+    glob: ^7.1.2
+    graceful-fs: ^4.2.9
+    istanbul-lib-coverage: ^3.0.0
+    istanbul-lib-instrument: ^5.1.0
+    istanbul-lib-report: ^3.0.0
+    istanbul-lib-source-maps: ^4.0.0
+    istanbul-reports: ^3.1.3
+    jest-haste-map: ^27.5.1
+    jest-resolve: ^27.5.1
+    jest-util: ^27.5.1
+    jest-worker: ^27.5.1
+    slash: ^3.0.0
+    source-map: ^0.6.0
+    string-length: ^4.0.1
+    terminal-link: ^2.0.0
+    v8-to-istanbul: ^8.1.0
+  peerDependencies:
+    node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+  peerDependenciesMeta:
+    node-notifier:
+      optional: true
+  checksum: faba5eafb86e62b62e152cafc8812d56308f9d1e8b77f3a7dcae4a8803a20a60a0909cc43ed73363ef649bf558e4fb181c7a336d144c89f7998279d1882bb69e
+  languageName: node
+  linkType: hard
+
+"@jest/source-map@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "@jest/source-map@npm:27.5.1"
+  dependencies:
+    callsites: ^3.0.0
+    graceful-fs: ^4.2.9
+    source-map: ^0.6.0
+  checksum: 4fb1e743b602841babf7e22bd84eca34676cb05d4eb3b604cae57fc59e406099f5ac759ac1a0d04d901237d143f0f4f234417306e823bde732a1d19982230862
+  languageName: node
+  linkType: hard
+
+"@jest/test-result@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "@jest/test-result@npm:27.5.1"
+  dependencies:
+    "@jest/console": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/istanbul-lib-coverage": ^2.0.0
+    collect-v8-coverage: ^1.0.0
+  checksum: 338f7c509d6a3bc6d7dd7388c8f6f548b87638e171dc1fddfedcacb4e8950583288832223ba688058cbcf874b937d22bdc0fa88f79f5fc666f77957e465c06a5
+  languageName: node
+  linkType: hard
+
+"@jest/test-sequencer@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "@jest/test-sequencer@npm:27.5.1"
+  dependencies:
+    "@jest/test-result": ^27.5.1
+    graceful-fs: ^4.2.9
+    jest-haste-map: ^27.5.1
+    jest-runtime: ^27.5.1
+  checksum: f21f9c8bb746847f7f89accfd29d6046eec1446f0b54e4694444feaa4df379791f76ef0f5a4360aafcbc73b50bc979f68b8a7620de404019d3de166be6720cb0
+  languageName: node
+  linkType: hard
+
+"@jest/transform@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "@jest/transform@npm:27.5.1"
+  dependencies:
+    "@babel/core": ^7.1.0
+    "@jest/types": ^27.5.1
+    babel-plugin-istanbul: ^6.1.1
+    chalk: ^4.0.0
+    convert-source-map: ^1.4.0
+    fast-json-stable-stringify: ^2.0.0
+    graceful-fs: ^4.2.9
+    jest-haste-map: ^27.5.1
+    jest-regex-util: ^27.5.1
+    jest-util: ^27.5.1
+    micromatch: ^4.0.4
+    pirates: ^4.0.4
+    slash: ^3.0.0
+    source-map: ^0.6.1
+    write-file-atomic: ^3.0.0
+  checksum: a22079121aedea0f20a03a9c026be971f7b92adbfb4d5fd1fb67be315741deac4f056936d7c72a53b24aa5a1071bc942c003925fd453bf3f6a0ae5da6384e137
+  languageName: node
+  linkType: hard
+
+"@jest/types@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "@jest/types@npm:27.5.1"
+  dependencies:
+    "@types/istanbul-lib-coverage": ^2.0.0
+    "@types/istanbul-reports": ^3.0.0
+    "@types/node": "*"
+    "@types/yargs": ^16.0.0
+    chalk: ^4.0.0
+  checksum: d1f43cc946d87543ddd79d49547aab2399481d34025d5c5f2025d3d99c573e1d9832fa83cef25e9d9b07a8583500229d15bbb07b8e233d127d911d133e2f14b1
+  languageName: node
+  linkType: hard
+
 "@jridgewell/resolve-uri@npm:^3.0.3":
   version: 3.0.5
   resolution: "@jridgewell/resolve-uri@npm:3.0.5"
@@ -1283,7 +2153,77 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@rollup/pluginutils@npm:^4.1.1":
+"@rollup/plugin-commonjs@npm:^20.0.0":
+  version: 20.0.0
+  resolution: "@rollup/plugin-commonjs@npm:20.0.0"
+  dependencies:
+    "@rollup/pluginutils": ^3.1.0
+    commondir: ^1.0.1
+    estree-walker: ^2.0.1
+    glob: ^7.1.6
+    is-reference: ^1.2.1
+    magic-string: ^0.25.7
+    resolve: ^1.17.0
+  peerDependencies:
+    rollup: ^2.38.3
+  checksum: fefc4b5ab1509ff64e26dfee3eca2f23cea204bf20f3dc76c616d3aa3faf4b1035166287518a64ba07faaaea1621a0af5b94b8f8199371ca67db905562e7e619
+  languageName: node
+  linkType: hard
+
+"@rollup/plugin-inject@npm:^4.0.0":
+  version: 4.0.4
+  resolution: "@rollup/plugin-inject@npm:4.0.4"
+  dependencies:
+    "@rollup/pluginutils": ^3.1.0
+    estree-walker: ^2.0.1
+    magic-string: ^0.25.7
+  peerDependencies:
+    rollup: ^1.20.0 || ^2.0.0
+  checksum: 22a1847372a96296a5b176af3d5b23ac7b48143a32c77ec4efed38daf4b0d1399a3cd144496d65731299984c5f98c9e00dc6a7f53d0fe87bd4aab2d4bd7b8289
+  languageName: node
+  linkType: hard
+
+"@rollup/plugin-json@npm:^4.1.0":
+  version: 4.1.0
+  resolution: "@rollup/plugin-json@npm:4.1.0"
+  dependencies:
+    "@rollup/pluginutils": ^3.0.8
+  peerDependencies:
+    rollup: ^1.20.0 || ^2.0.0
+  checksum: 867bc9339b4ccf0b9ff3b2617a95b3b8920115163f86c8e3b1f068a14ca25949472d3c05b09a5ac38ca0fe2185756e34617eaeb219d4a2b6e2307c501c7d4552
+  languageName: node
+  linkType: hard
+
+"@rollup/plugin-node-resolve@npm:^13.0.4":
+  version: 13.1.3
+  resolution: "@rollup/plugin-node-resolve@npm:13.1.3"
+  dependencies:
+    "@rollup/pluginutils": ^3.1.0
+    "@types/resolve": 1.17.1
+    builtin-modules: ^3.1.0
+    deepmerge: ^4.2.2
+    is-module: ^1.0.0
+    resolve: ^1.19.0
+  peerDependencies:
+    rollup: ^2.42.0
+  checksum: c275843aef884ff15ed7edb8a3b8fd072a72d517632098f6e9c25ef2c00f7842559565cc77e16c59eb119b8c4e2d858a8b5a94701ca6f85ae6a4f60a6e31f0ab
+  languageName: node
+  linkType: hard
+
+"@rollup/pluginutils@npm:^3.0.8, @rollup/pluginutils@npm:^3.0.9, @rollup/pluginutils@npm:^3.1.0":
+  version: 3.1.0
+  resolution: "@rollup/pluginutils@npm:3.1.0"
+  dependencies:
+    "@types/estree": 0.0.39
+    estree-walker: ^1.0.1
+    picomatch: ^2.2.2
+  peerDependencies:
+    rollup: ^1.20.0||^2.0.0
+  checksum: 8be16e27863c219edbb25a4e6ec2fe0e1e451d9e917b6a43cf2ae5bc025a6b8faaa40f82a6e53b66d0de37b58ff472c6c3d57a83037ae635041f8df959d6d9aa
+  languageName: node
+  linkType: hard
+
+"@rollup/pluginutils@npm:^4.1.0, @rollup/pluginutils@npm:^4.1.1":
   version: 4.2.0
   resolution: "@rollup/pluginutils@npm:4.2.0"
   dependencies:
@@ -1293,6 +2233,23 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@semantic-release/commit-analyzer@npm:^8.0.0, @semantic-release/commit-analyzer@npm:^8.0.1":
+  version: 8.0.1
+  resolution: "@semantic-release/commit-analyzer@npm:8.0.1"
+  dependencies:
+    conventional-changelog-angular: ^5.0.0
+    conventional-commits-filter: ^2.0.0
+    conventional-commits-parser: ^3.0.7
+    debug: ^4.0.0
+    import-from: ^3.0.0
+    lodash: ^4.17.4
+    micromatch: ^4.0.2
+  peerDependencies:
+    semantic-release: ">=16.0.0 <18.0.0"
+  checksum: 94ac8035538a55a3ca1b19f2c5f0eaea5bc97986ef251149d9db0b3382be5d4271f0080ba077b070e50330844e364dd48a83e453a415dad0a1364e05ffb70f8d
+  languageName: node
+  linkType: hard
+
 "@semantic-release/commit-analyzer@npm:^9.0.2":
   version: 9.0.2
   resolution: "@semantic-release/commit-analyzer@npm:9.0.2"
@@ -1310,7 +2267,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@semantic-release/error@npm:^2.2.0":
+"@semantic-release/error@npm:^2.1.0, @semantic-release/error@npm:^2.2.0":
   version: 2.2.0
   resolution: "@semantic-release/error@npm:2.2.0"
   checksum: a264a8e16a89e5fcb104ffb2c4339fde3135b90a6d8fe4497a95fe0776a2bf77771d4c702343c47324aefee2e2a2af72f48b5310c84e8a0902fadb631272700f
@@ -1342,6 +2299,50 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@semantic-release/git@npm:^9.0.0":
+  version: 9.0.1
+  resolution: "@semantic-release/git@npm:9.0.1"
+  dependencies:
+    "@semantic-release/error": ^2.1.0
+    aggregate-error: ^3.0.0
+    debug: ^4.0.0
+    dir-glob: ^3.0.0
+    execa: ^5.0.0
+    lodash: ^4.17.4
+    micromatch: ^4.0.0
+    p-reduce: ^2.0.0
+  peerDependencies:
+    semantic-release: ">=16.0.0 <18.0.0"
+  checksum: 00045da5b48ff09b4a3045c93f07c4bf7e7fb8355d9d4e306862a2a9a4233f728901e4949fac5fa7bed868e18931f8d5bbeae1dfc4cc298a20191789a8c70907
+  languageName: node
+  linkType: hard
+
+"@semantic-release/github@npm:^7.0.0":
+  version: 7.2.3
+  resolution: "@semantic-release/github@npm:7.2.3"
+  dependencies:
+    "@octokit/rest": ^18.0.0
+    "@semantic-release/error": ^2.2.0
+    aggregate-error: ^3.0.0
+    bottleneck: ^2.18.1
+    debug: ^4.0.0
+    dir-glob: ^3.0.0
+    fs-extra: ^10.0.0
+    globby: ^11.0.0
+    http-proxy-agent: ^4.0.0
+    https-proxy-agent: ^5.0.0
+    issue-parser: ^6.0.0
+    lodash: ^4.17.4
+    mime: ^2.4.3
+    p-filter: ^2.0.0
+    p-retry: ^4.0.0
+    url-join: ^4.0.0
+  peerDependencies:
+    semantic-release: ">=16.0.0 <18.0.0"
+  checksum: 3de4031e38be3e5c555f31845d5504a454e61cb03809177857952eb2a764a8b9291e085d59f48922cc7c6e30b2e701add299fe19279d98417c09746ed68a389d
+  languageName: node
+  linkType: hard
+
 "@semantic-release/github@npm:^8.0.0":
   version: 8.0.2
   resolution: "@semantic-release/github@npm:8.0.2"
@@ -1368,6 +2369,28 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@semantic-release/gitlab@npm:^6.0.5, @semantic-release/gitlab@npm:^6.2.2":
+  version: 6.2.2
+  resolution: "@semantic-release/gitlab@npm:6.2.2"
+  dependencies:
+    "@semantic-release/error": ^2.2.0
+    aggregate-error: ^3.0.0
+    debug: ^4.0.0
+    dir-glob: ^3.0.0
+    escape-string-regexp: ^3.0.0
+    form-data: ^3.0.0
+    fs-extra: ^9.0.0
+    globby: ^11.0.0
+    got: ^10.5.2
+    lodash: ^4.17.11
+    parse-path: ^4.0.0
+    url-join: ^4.0.0
+  peerDependencies:
+    semantic-release: ">=15.8.0 <18.0.0"
+  checksum: fb0085a3386f9a1da0903528bdf49180f10e058612605b6c14463834d834a8921422b6bea3ec7997dfa07c0b14a360544594be9088d6ff9cf3e5d0f3e7100f70
+  languageName: node
+  linkType: hard
+
 "@semantic-release/gitlab@npm:^7.0.4":
   version: 7.0.4
   resolution: "@semantic-release/gitlab@npm:7.0.4"
@@ -1390,11 +2413,11 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@semantic-release/npm@npm:^8.0.3":
-  version: 8.0.3
-  resolution: "@semantic-release/npm@npm:8.0.3"
+"@semantic-release/npm@npm:^7.0.0, @semantic-release/npm@npm:^7.0.6, @semantic-release/npm@npm:^7.1.3":
+  version: 7.1.3
+  resolution: "@semantic-release/npm@npm:7.1.3"
   dependencies:
-    "@semantic-release/error": ^3.0.0
+    "@semantic-release/error": ^2.2.0
     aggregate-error: ^3.0.0
     execa: ^5.0.0
     fs-extra: ^10.0.0
@@ -1408,8 +2431,31 @@ __metadata:
     semver: ^7.1.2
     tempy: ^1.0.0
   peerDependencies:
-    semantic-release: ">=18.0.0"
-  checksum: 6c1e178f0fdc1b6ab24d14f02fb012302c7220e64e192293be7d11346d309b00338bd5a42e076c7849af68a91745359e750c5a1d7c85c8f11e9941e4516bb413
+    semantic-release: ">=16.0.0 <18.0.0"
+  checksum: 4c17efb6011e37d6a02e599780b2ecf9862f046464cce0d30e62aac3ab4be2a993bff350c1cd9df7f856795044cbc70bec98bb58760f5a11880107212fb2e60e
+  languageName: node
+  linkType: hard
+
+"@semantic-release/npm@npm:^8.0.3":
+  version: 8.0.3
+  resolution: "@semantic-release/npm@npm:8.0.3"
+  dependencies:
+    "@semantic-release/error": ^3.0.0
+    aggregate-error: ^3.0.0
+    execa: ^5.0.0
+    fs-extra: ^10.0.0
+    lodash: ^4.17.15
+    nerf-dart: ^1.0.0
+    normalize-url: ^6.0.0
+    npm: ^7.0.0
+    rc: ^1.2.8
+    read-pkg: ^5.0.0
+    registry-auth-token: ^4.0.0
+    semver: ^7.1.2
+    tempy: ^1.0.0
+  peerDependencies:
+    semantic-release: ">=18.0.0"
+  checksum: 6c1e178f0fdc1b6ab24d14f02fb012302c7220e64e192293be7d11346d309b00338bd5a42e076c7849af68a91745359e750c5a1d7c85c8f11e9941e4516bb413
   languageName: node
   linkType: hard
 
@@ -1456,6 +2502,40 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@semantic-release/release-notes-generator@npm:^9.0.0, @semantic-release/release-notes-generator@npm:^9.0.1, @semantic-release/release-notes-generator@npm:^9.0.3":
+  version: 9.0.3
+  resolution: "@semantic-release/release-notes-generator@npm:9.0.3"
+  dependencies:
+    conventional-changelog-angular: ^5.0.0
+    conventional-changelog-writer: ^4.0.0
+    conventional-commits-filter: ^2.0.0
+    conventional-commits-parser: ^3.0.0
+    debug: ^4.0.0
+    get-stream: ^6.0.0
+    import-from: ^3.0.0
+    into-stream: ^6.0.0
+    lodash: ^4.17.4
+    read-pkg-up: ^7.0.0
+  peerDependencies:
+    semantic-release: ">=15.8.0 <18.0.0"
+  checksum: 01feb133489b4d73259466e91e6ba98d48dd93047fe6ac78924bd0ac8ad09ee86ae2eba3e02239819cd4edb43cd1adcac81312203318d0cdf75632c379dcd8a1
+  languageName: node
+  linkType: hard
+
+"@sindresorhus/is@npm:^0.14.0":
+  version: 0.14.0
+  resolution: "@sindresorhus/is@npm:0.14.0"
+  checksum: 971e0441dd44ba3909b467219a5e242da0fc584048db5324cfb8048148fa8dcc9d44d71e3948972c4f6121d24e5da402ef191420d1266a95f713bb6d6e59c98a
+  languageName: node
+  linkType: hard
+
+"@sindresorhus/is@npm:^2.0.0":
+  version: 2.1.1
+  resolution: "@sindresorhus/is@npm:2.1.1"
+  checksum: cbae604a29931dd33a0ecb77ef50e7ac6f4b626939aad84e4d4da06ace624902f294bd652268939b94596c725ed1905a73c453a5574b8504010296f5619e44cc
+  languageName: node
+  linkType: hard
+
 "@sindresorhus/is@npm:^4.0.0":
   version: 4.6.0
   resolution: "@sindresorhus/is@npm:4.6.0"
@@ -1463,7 +2543,34 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@szmarczak/http-timer@npm:^4.0.5":
+"@sinonjs/commons@npm:^1.7.0":
+  version: 1.8.3
+  resolution: "@sinonjs/commons@npm:1.8.3"
+  dependencies:
+    type-detect: 4.0.8
+  checksum: 6159726db5ce6bf9f2297f8427f7ca5b3dff45b31e5cee23496f1fa6ef0bb4eab878b23fb2c5e6446381f6a66aba4968ef2fc255c1180d753d4b8c271636a2e5
+  languageName: node
+  linkType: hard
+
+"@sinonjs/fake-timers@npm:^8.0.1":
+  version: 8.1.0
+  resolution: "@sinonjs/fake-timers@npm:8.1.0"
+  dependencies:
+    "@sinonjs/commons": ^1.7.0
+  checksum: 09b5a158ce013a6c37613258bad79ca4efeb99b1f59c41c73cca36cac00b258aefcf46eeea970fccf06b989414d86fe9f54c1102272c0c3bdd51a313cea80949
+  languageName: node
+  linkType: hard
+
+"@szmarczak/http-timer@npm:^1.1.2":
+  version: 1.1.2
+  resolution: "@szmarczak/http-timer@npm:1.1.2"
+  dependencies:
+    defer-to-connect: ^1.0.1
+  checksum: 4d9158061c5f397c57b4988cde33a163244e4f02df16364f103971957a32886beb104d6180902cbe8b38cb940e234d9f98a4e486200deca621923f62f50a06fe
+  languageName: node
+  linkType: hard
+
+"@szmarczak/http-timer@npm:^4.0.0, @szmarczak/http-timer@npm:^4.0.5":
   version: 4.0.6
   resolution: "@szmarczak/http-timer@npm:4.0.6"
   dependencies:
@@ -1472,6 +2579,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@tootallnate/once@npm:1":
+  version: 1.1.2
+  resolution: "@tootallnate/once@npm:1.1.2"
+  checksum: e1fb1bbbc12089a0cb9433dc290f97bddd062deadb6178ce9bcb93bb7c1aecde5e60184bc7065aec42fe1663622a213493c48bbd4972d931aae48315f18e1be9
+  languageName: node
+  linkType: hard
+
 "@tootallnate/once@npm:2":
   version: 2.0.0
   resolution: "@tootallnate/once@npm:2.0.0"
@@ -1479,6 +2593,75 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@tsconfig/node10@npm:^1.0.7":
+  version: 1.0.8
+  resolution: "@tsconfig/node10@npm:1.0.8"
+  checksum: b8d5fffbc6b17ef64ef74f7fdbccee02a809a063ade785c3648dae59406bc207f70ea2c4296f92749b33019fa36a5ae716e42e49cc7f1bbf0fd147be0d6b970a
+  languageName: node
+  linkType: hard
+
+"@tsconfig/node12@npm:^1.0.7":
+  version: 1.0.9
+  resolution: "@tsconfig/node12@npm:1.0.9"
+  checksum: a01b2400ab3582b86b589c6d31dcd0c0656f333adecde85d6d7d4086adb059808b82692380bb169546d189bf771ae21d02544a75b57bd6da4a5dd95f8567bec9
+  languageName: node
+  linkType: hard
+
+"@tsconfig/node14@npm:^1.0.0":
+  version: 1.0.1
+  resolution: "@tsconfig/node14@npm:1.0.1"
+  checksum: 976345e896c0f059867f94f8d0f6ddb8b1844fb62bf36b727de8a9a68f024857e5db97ed51d3325e23e0616a5e48c034ff51a8d595b3fe7e955f3587540489be
+  languageName: node
+  linkType: hard
+
+"@tsconfig/node16@npm:^1.0.2":
+  version: 1.0.2
+  resolution: "@tsconfig/node16@npm:1.0.2"
+  checksum: ca94d3639714672bbfd55f03521d3f56bb6a25479bd425da81faf21f13e1e9d15f40f97377dedbbf477a5841c5b0c8f4cd1b391f33553d750b9202c54c2c07aa
+  languageName: node
+  linkType: hard
+
+"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14":
+  version: 7.1.19
+  resolution: "@types/babel__core@npm:7.1.19"
+  dependencies:
+    "@babel/parser": ^7.1.0
+    "@babel/types": ^7.0.0
+    "@types/babel__generator": "*"
+    "@types/babel__template": "*"
+    "@types/babel__traverse": "*"
+  checksum: 8c9fa87a1c2224cbec251683a58bebb0d74c497118034166aaa0491a4e2627998a6621fc71f8a60ffd27d9c0c52097defedf7637adc6618d0331c15adb302338
+  languageName: node
+  linkType: hard
+
+"@types/babel__generator@npm:*":
+  version: 7.6.4
+  resolution: "@types/babel__generator@npm:7.6.4"
+  dependencies:
+    "@babel/types": ^7.0.0
+  checksum: 20effbbb5f8a3a0211e95959d06ae70c097fb6191011b73b38fe86deebefad8e09ee014605e0fd3cdaedc73d158be555866810e9166e1f09e4cfd880b874dcb0
+  languageName: node
+  linkType: hard
+
+"@types/babel__template@npm:*":
+  version: 7.4.1
+  resolution: "@types/babel__template@npm:7.4.1"
+  dependencies:
+    "@babel/parser": ^7.1.0
+    "@babel/types": ^7.0.0
+  checksum: 649fe8b42c2876be1fd28c6ed9b276f78152d5904ec290b6c861d9ef324206e0a5c242e8305c421ac52ecf6358fa7e32ab7a692f55370484825c1df29b1596ee
+  languageName: node
+  linkType: hard
+
+"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.4, @types/babel__traverse@npm:^7.0.6":
+  version: 7.14.2
+  resolution: "@types/babel__traverse@npm:7.14.2"
+  dependencies:
+    "@babel/types": ^7.3.0
+  checksum: a797ea09c72307569e3ee08aa3900ca744ce3091114084f2dc59b67a45ee7d01df7865252790dbfa787a7915ce892cdc820c9b920f3683292765fc656b08dc63
+  languageName: node
+  linkType: hard
+
 "@types/cacheable-request@npm:^6.0.1":
   version: 6.0.2
   resolution: "@types/cacheable-request@npm:6.0.2"
@@ -1500,6 +2683,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/estree@npm:*":
+  version: 0.0.51
+  resolution: "@types/estree@npm:0.0.51"
+  checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189
+  languageName: node
+  linkType: hard
+
+"@types/estree@npm:0.0.39":
+  version: 0.0.39
+  resolution: "@types/estree@npm:0.0.39"
+  checksum: 412fb5b9868f2c418126451821833414189b75cc6bf84361156feed733e3d92ec220b9d74a89e52722e03d5e241b2932732711b7497374a404fad49087adc248
+  languageName: node
+  linkType: hard
+
 "@types/file-saver@npm:^2.0.5":
   version: 2.0.5
   resolution: "@types/file-saver@npm:2.0.5"
@@ -1517,6 +2714,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/graceful-fs@npm:^4.1.2":
+  version: 4.1.5
+  resolution: "@types/graceful-fs@npm:4.1.5"
+  dependencies:
+    "@types/node": "*"
+  checksum: d076bb61f45d0fc42dee496ef8b1c2f8742e15d5e47e90e20d0243386e426c04d4efd408a48875ab432f7960b4ce3414db20ed0fbbfc7bcc89d84e574f6e045a
+  languageName: node
+  linkType: hard
+
 "@types/http-cache-semantics@npm:*":
   version: 4.0.1
   resolution: "@types/http-cache-semantics@npm:4.0.1"
@@ -1533,6 +2739,48 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1":
+  version: 2.0.4
+  resolution: "@types/istanbul-lib-coverage@npm:2.0.4"
+  checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7
+  languageName: node
+  linkType: hard
+
+"@types/istanbul-lib-report@npm:*":
+  version: 3.0.0
+  resolution: "@types/istanbul-lib-report@npm:3.0.0"
+  dependencies:
+    "@types/istanbul-lib-coverage": "*"
+  checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36
+  languageName: node
+  linkType: hard
+
+"@types/istanbul-reports@npm:^3.0.0":
+  version: 3.0.1
+  resolution: "@types/istanbul-reports@npm:3.0.1"
+  dependencies:
+    "@types/istanbul-lib-report": "*"
+  checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903
+  languageName: node
+  linkType: hard
+
+"@types/jest@npm:^27.0.1":
+  version: 27.4.1
+  resolution: "@types/jest@npm:27.4.1"
+  dependencies:
+    jest-matcher-utils: ^27.0.0
+    pretty-format: ^27.0.0
+  checksum: 5184f3eef4832d01ee8f59bed15eec45ccc8e29c724a5e6ce37bf74396b37bdf04f557000f45ba4fc38ae6075cf9cfcce3d7a75abc981023c61ceb27230a93e4
+  languageName: node
+  linkType: hard
+
+"@types/json-schema@npm:^7.0.7":
+  version: 7.0.11
+  resolution: "@types/json-schema@npm:7.0.11"
+  checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d
+  languageName: node
+  linkType: hard
+
 "@types/json-schema@npm:^7.0.9":
   version: 7.0.9
   resolution: "@types/json-schema@npm:7.0.9"
@@ -1556,6 +2804,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/keyv@npm:^3.1.1":
+  version: 3.1.4
+  resolution: "@types/keyv@npm:3.1.4"
+  dependencies:
+    "@types/node": "*"
+  checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d
+  languageName: node
+  linkType: hard
+
 "@types/lodash@npm:^4.14.178":
   version: 4.14.180
   resolution: "@types/lodash@npm:4.14.180"
@@ -1594,6 +2851,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/node@npm:>=12":
+  version: 17.0.23
+  resolution: "@types/node@npm:17.0.23"
+  checksum: a3517554737cbb042e76c30d0e5482192ac4d9bea0eeb086e2622d9cabf460a0eb52a696b99fcd18e7fcc93c96db6cc7ae507f6608f256ef0b5c1d8c87a5a470
+  languageName: node
+  linkType: hard
+
 "@types/node@npm:^13.1.0":
   version: 13.13.52
   resolution: "@types/node@npm:13.13.52"
@@ -1601,6 +2865,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/node@npm:^14.14.20":
+  version: 14.18.12
+  resolution: "@types/node@npm:14.18.12"
+  checksum: 8a0273caa0584020adb8802784fc7d4f18f05e6c205335b7f3818a91d6b0c22736b9f51da3428d5bc54076ad47f1a4d6d57990a3ce8489a520ac66b2b3ff24bc
+  languageName: node
+  linkType: hard
+
+"@types/node@npm:^16.7.8":
+  version: 16.11.26
+  resolution: "@types/node@npm:16.11.26"
+  checksum: 57757caaba3f0d95de82198cb276a1002c49b710108c932a1d02d7c91ff2fa57cfe2dd19fde60853b6dd90b0964b3cf35557981d2628e20aed6a909057aedfe6
+  languageName: node
+  linkType: hard
+
 "@types/normalize-package-data@npm:^2.4.0":
   version: 2.4.1
   resolution: "@types/normalize-package-data@npm:2.4.1"
@@ -1622,7 +2900,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/rdf-js@npm:*":
+"@types/prettier@npm:^2.1.5":
+  version: 2.6.0
+  resolution: "@types/prettier@npm:2.6.0"
+  checksum: 946f1f82ce6f31664e023a5d65931c31b7d677b454f528f67dce851d72e7fcfe713076f4251b16c3646eecf1545f5f5b909b4962966341ed9ddf5b80113b3674
+  languageName: node
+  linkType: hard
+
+"@types/rdf-js@npm:*, @types/rdf-js@npm:^4.0.0":
   version: 4.0.1
   resolution: "@types/rdf-js@npm:4.0.1"
   dependencies:
@@ -1631,6 +2916,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/rdf-validate-shacl@npm:^0.2.4":
+  version: 0.2.4
+  resolution: "@types/rdf-validate-shacl@npm:0.2.4"
+  dependencies:
+    "@types/clownface": "*"
+    rdf-js: ^4.0.2
+  checksum: 1866e0c86d9713b161948e488a211000dc5855981e7bab55be151f543415788742956420bf571129d9cc60899ff2a9919f7464171622b9543e98702c1ed246a8
+  languageName: node
+  linkType: hard
+
 "@types/rdf-validate-shacl@npm:^0.4.0":
   version: 0.4.0
   resolution: "@types/rdf-validate-shacl@npm:0.4.0"
@@ -1641,6 +2936,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/resolve@npm:1.17.1":
+  version: 1.17.1
+  resolution: "@types/resolve@npm:1.17.1"
+  dependencies:
+    "@types/node": "*"
+  checksum: dc6a6df507656004e242dcb02c784479deca516d5f4b58a1707e708022b269ae147e1da0521f3e8ad0d63638869d87e0adc023f0bd5454aa6f72ac66c7525cf5
+  languageName: node
+  linkType: hard
+
 "@types/responselike@npm:*, @types/responselike@npm:^1.0.0":
   version: 1.0.0
   resolution: "@types/responselike@npm:1.0.0"
@@ -1666,6 +2970,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/stack-utils@npm:^2.0.0":
+  version: 2.0.1
+  resolution: "@types/stack-utils@npm:2.0.1"
+  checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019
+  languageName: node
+  linkType: hard
+
 "@types/throttle-debounce@npm:^2.1.0":
   version: 2.1.0
   resolution: "@types/throttle-debounce@npm:2.1.0"
@@ -1673,7 +2984,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/uuid@npm:^8.3.4":
+"@types/uuid@npm:^8.3.1, @types/uuid@npm:^8.3.4":
   version: 8.3.4
   resolution: "@types/uuid@npm:8.3.4"
   checksum: 6f11f3ff70f30210edaa8071422d405e9c1d4e53abbe50fdce365150d3c698fe7bbff65c1e71ae080cbfb8fded860dbb5e174da96fdbbdfcaa3fb3daa474d20f
@@ -1689,7 +3000,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/vuelidate@npm:^0.7.15":
+"@types/vuelidate@npm:^0.7.13, @types/vuelidate@npm:^0.7.15":
   version: 0.7.15
   resolution: "@types/vuelidate@npm:0.7.15"
   dependencies:
@@ -1698,6 +3009,44 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/yargs-parser@npm:*":
+  version: 21.0.0
+  resolution: "@types/yargs-parser@npm:21.0.0"
+  checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2
+  languageName: node
+  linkType: hard
+
+"@types/yargs@npm:^16.0.0":
+  version: 16.0.4
+  resolution: "@types/yargs@npm:16.0.4"
+  dependencies:
+    "@types/yargs-parser": "*"
+  checksum: caa21d2c957592fe2184a8368c8cbe5a82a6c2e2f2893722e489f842dc5963293d2f3120bc06fe3933d60a3a0d1e2eb269649fd6b1947fe1820f8841ba611dd9
+  languageName: node
+  linkType: hard
+
+"@typescript-eslint/eslint-plugin@npm:^4.0.1":
+  version: 4.33.0
+  resolution: "@typescript-eslint/eslint-plugin@npm:4.33.0"
+  dependencies:
+    "@typescript-eslint/experimental-utils": 4.33.0
+    "@typescript-eslint/scope-manager": 4.33.0
+    debug: ^4.3.1
+    functional-red-black-tree: ^1.0.1
+    ignore: ^5.1.8
+    regexpp: ^3.1.0
+    semver: ^7.3.5
+    tsutils: ^3.21.0
+  peerDependencies:
+    "@typescript-eslint/parser": ^4.0.0
+    eslint: ^5.0.0 || ^6.0.0 || ^7.0.0
+  peerDependenciesMeta:
+    typescript:
+      optional: true
+  checksum: d74855d0a5ffe0b2f362ec02fcd9301d39a53fb4155b9bd0cb15a0a31d065143129ebf98df9d86af4b6f74de1d423a4c0d8c0095520844068117453afda5bc4f
+  languageName: node
+  linkType: hard
+
 "@typescript-eslint/eslint-plugin@npm:^5.15.0":
   version: 5.16.0
   resolution: "@typescript-eslint/eslint-plugin@npm:5.16.0"
@@ -1721,6 +3070,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@typescript-eslint/experimental-utils@npm:4.33.0, @typescript-eslint/experimental-utils@npm:^4.9.1":
+  version: 4.33.0
+  resolution: "@typescript-eslint/experimental-utils@npm:4.33.0"
+  dependencies:
+    "@types/json-schema": ^7.0.7
+    "@typescript-eslint/scope-manager": 4.33.0
+    "@typescript-eslint/types": 4.33.0
+    "@typescript-eslint/typescript-estree": 4.33.0
+    eslint-scope: ^5.1.1
+    eslint-utils: ^3.0.0
+  peerDependencies:
+    eslint: "*"
+  checksum: f859800ada0884f92db6856f24efcb1d073ac9883ddc2b1aa9339f392215487895bed8447ebce3741e8141bb32e545244abef62b73193ba9a8a0527c523aabae
+  languageName: node
+  linkType: hard
+
 "@typescript-eslint/experimental-utils@npm:^5.0.0":
   version: 5.15.0
   resolution: "@typescript-eslint/experimental-utils@npm:5.15.0"
@@ -1732,6 +3097,23 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@typescript-eslint/parser@npm:^4.0.1":
+  version: 4.33.0
+  resolution: "@typescript-eslint/parser@npm:4.33.0"
+  dependencies:
+    "@typescript-eslint/scope-manager": 4.33.0
+    "@typescript-eslint/types": 4.33.0
+    "@typescript-eslint/typescript-estree": 4.33.0
+    debug: ^4.3.1
+  peerDependencies:
+    eslint: ^5.0.0 || ^6.0.0 || ^7.0.0
+  peerDependenciesMeta:
+    typescript:
+      optional: true
+  checksum: 102457eae1acd516211098fea081c8a2ed728522bbda7f5a557b6ef23d88970514f9a0f6285d53fca134d3d4d7d17822b5d5e12438d5918df4d1f89cc9e67d57
+  languageName: node
+  linkType: hard
+
 "@typescript-eslint/parser@npm:^5.15.0":
   version: 5.16.0
   resolution: "@typescript-eslint/parser@npm:5.16.0"
@@ -1749,6 +3131,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@typescript-eslint/scope-manager@npm:4.33.0":
+  version: 4.33.0
+  resolution: "@typescript-eslint/scope-manager@npm:4.33.0"
+  dependencies:
+    "@typescript-eslint/types": 4.33.0
+    "@typescript-eslint/visitor-keys": 4.33.0
+  checksum: 9a25fb7ba7c725ea7227a24d315b0f6aacbad002e2549a049edf723c1d3615c22f5c301f0d7d615b377f2cdf2f3519d97e79af0c459de6ef8d2aaf0906dff13e
+  languageName: node
+  linkType: hard
+
 "@typescript-eslint/scope-manager@npm:5.15.0":
   version: 5.15.0
   resolution: "@typescript-eslint/scope-manager@npm:5.15.0"
@@ -1785,6 +3177,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@typescript-eslint/types@npm:4.33.0":
+  version: 4.33.0
+  resolution: "@typescript-eslint/types@npm:4.33.0"
+  checksum: 3baae1ca35872421b4eb60f5d3f3f32dc1d513f2ae0a67dee28c7d159fd7a43ed0d11a8a5a0f0c2d38507ffa036fc7c511cb0f18a5e8ac524b3ebde77390ec53
+  languageName: node
+  linkType: hard
+
 "@typescript-eslint/types@npm:5.15.0":
   version: 5.15.0
   resolution: "@typescript-eslint/types@npm:5.15.0"
@@ -1799,6 +3198,24 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@typescript-eslint/typescript-estree@npm:4.33.0":
+  version: 4.33.0
+  resolution: "@typescript-eslint/typescript-estree@npm:4.33.0"
+  dependencies:
+    "@typescript-eslint/types": 4.33.0
+    "@typescript-eslint/visitor-keys": 4.33.0
+    debug: ^4.3.1
+    globby: ^11.0.3
+    is-glob: ^4.0.1
+    semver: ^7.3.5
+    tsutils: ^3.21.0
+  peerDependenciesMeta:
+    typescript:
+      optional: true
+  checksum: 2566984390c76bd95f43240057215c068c69769e406e27aba41e9f21fd300074d6772e4983fa58fe61e80eb5550af1548d2e31e80550d92ba1d051bb00fe6f5c
+  languageName: node
+  linkType: hard
+
 "@typescript-eslint/typescript-estree@npm:5.15.0":
   version: 5.15.0
   resolution: "@typescript-eslint/typescript-estree@npm:5.15.0"
@@ -1867,6 +3284,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@typescript-eslint/visitor-keys@npm:4.33.0":
+  version: 4.33.0
+  resolution: "@typescript-eslint/visitor-keys@npm:4.33.0"
+  dependencies:
+    "@typescript-eslint/types": 4.33.0
+    eslint-visitor-keys: ^2.0.0
+  checksum: 59953e474ad4610c1aa23b2b1a964445e2c6201521da6367752f37939d854352bbfced5c04ea539274065e012b1337ba3ffa49c2647a240a4e87155378ba9873
+  languageName: node
+  linkType: hard
+
 "@typescript-eslint/visitor-keys@npm:5.15.0":
   version: 5.15.0
   resolution: "@typescript-eslint/visitor-keys@npm:5.15.0"
@@ -2369,6 +3796,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"abab@npm:^2.0.3, abab@npm:^2.0.5":
+  version: 2.0.5
+  resolution: "abab@npm:2.0.5"
+  checksum: 0ec951b46d5418c2c2f923021ec193eaebdb4e802ffd5506286781b454be722a13a8430f98085cd3e204918401d9130ec6cc8f5ae19be315b3a0e857d83196e1
+  languageName: node
+  linkType: hard
+
 "abbrev@npm:*, abbrev@npm:1, abbrev@npm:~1.1.1":
   version: 1.1.1
   resolution: "abbrev@npm:1.1.1"
@@ -2376,6 +3810,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"acorn-globals@npm:^6.0.0":
+  version: 6.0.0
+  resolution: "acorn-globals@npm:6.0.0"
+  dependencies:
+    acorn: ^7.1.1
+    acorn-walk: ^7.1.1
+  checksum: 72d95e5b5e585f9acd019b993ab8bbba68bb3cbc9d9b5c1ebb3c2f1fe5981f11deababfb4949f48e6262f9c57878837f5958c0cca396f81023814680ca878042
+  languageName: node
+  linkType: hard
+
 "acorn-jsx@npm:^5.2.0, acorn-jsx@npm:^5.3.1":
   version: 5.3.2
   resolution: "acorn-jsx@npm:5.3.2"
@@ -2385,6 +3829,29 @@ __metadata:
   languageName: node
   linkType: hard
 
+"acorn-walk@npm:^7.1.1":
+  version: 7.2.0
+  resolution: "acorn-walk@npm:7.2.0"
+  checksum: 9252158a79b9d92f1bc0dd6acc0fcfb87a67339e84bcc301bb33d6078936d27e35d606b4d35626d2962cd43c256d6f27717e70cbe15c04fff999ab0b2260b21f
+  languageName: node
+  linkType: hard
+
+"acorn-walk@npm:^8.1.1":
+  version: 8.2.0
+  resolution: "acorn-walk@npm:8.2.0"
+  checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1
+  languageName: node
+  linkType: hard
+
+"acorn@npm:^5.7.3":
+  version: 5.7.4
+  resolution: "acorn@npm:5.7.4"
+  bin:
+    acorn: bin/acorn
+  checksum: f51392a4d25c7705fadb890f784c59cde4ac1c5452ccd569fa59bd2191b7951b4a6398348ab7ea08a54f0bc0a56c13776710f4e1bae9de441e4d33e2015ad1e0
+  languageName: node
+  linkType: hard
+
 "acorn@npm:^6.4.1":
   version: 6.4.2
   resolution: "acorn@npm:6.4.2"
@@ -2394,7 +3861,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"acorn@npm:^7.1.1":
+"acorn@npm:^7.1.1, acorn@npm:^7.4.0":
   version: 7.4.1
   resolution: "acorn@npm:7.4.1"
   bin:
@@ -2403,7 +3870,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"acorn@npm:^8.5.0, acorn@npm:^8.7.0":
+"acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.7.0":
   version: 8.7.0
   resolution: "acorn@npm:8.7.0"
   bin:
@@ -2460,7 +3927,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ajv@npm:^6.1.0, ajv@npm:^6.10.0, ajv@npm:^6.10.2, ajv@npm:^6.12.3, ajv@npm:^6.12.4":
+"ajv@npm:^6.1.0, ajv@npm:^6.10.0, ajv@npm:^6.10.2, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.6":
   version: 6.12.6
   resolution: "ajv@npm:6.12.6"
   dependencies:
@@ -2472,7 +3939,33 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0":
+"ajv@npm:^8.0.1":
+  version: 8.11.0
+  resolution: "ajv@npm:8.11.0"
+  dependencies:
+    fast-deep-equal: ^3.1.1
+    json-schema-traverse: ^1.0.0
+    require-from-string: ^2.0.2
+    uri-js: ^4.2.2
+  checksum: 5e0ff226806763be73e93dd7805b634f6f5921e3e90ca04acdf8db81eed9d8d3f0d4c5f1213047f45ebbf8047ffe0c840fa1ef2ec42c3a644899f69aa72b5bef
+  languageName: node
+  linkType: hard
+
+"ansi-colors@npm:^4.1.1":
+  version: 4.1.1
+  resolution: "ansi-colors@npm:4.1.1"
+  checksum: 138d04a51076cb085da0a7e2d000c5c0bb09f6e772ed5c65c53cb118d37f6c5f1637506d7155fb5f330f0abcf6f12fa2e489ac3f8cdab9da393bf1bb4f9a32b0
+  languageName: node
+  linkType: hard
+
+"ansi-escapes@npm:^3.2.0":
+  version: 3.2.0
+  resolution: "ansi-escapes@npm:3.2.0"
+  checksum: 0f94695b677ea742f7f1eed961f7fd8d05670f744c6ad1f8f635362f6681dcfbc1575cb05b43abc7bb6d67e25a75fb8c7ea8f2a57330eb2c76b33f18cb2cef0a
+  languageName: node
+  linkType: hard
+
+"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.1":
   version: 4.3.2
   resolution: "ansi-escapes@npm:4.3.2"
   dependencies:
@@ -2490,7 +3983,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ansi-regex@npm:^4.1.0":
+"ansi-regex@npm:^3.0.0":
+  version: 3.0.1
+  resolution: "ansi-regex@npm:3.0.1"
+  checksum: 09daf180c5f59af9850c7ac1bd7fda85ba596cc8cbeb210826e90755f06c818af86d9fa1e6e8322fab2c3b9e9b03f56c537b42241139f824dd75066a1e7257cc
+  languageName: node
+  linkType: hard
+
+"ansi-regex@npm:^4.1.0":
   version: 4.1.1
   resolution: "ansi-regex@npm:4.1.1"
   checksum: b1a6ee44cb6ecdabaa770b2ed500542714d4395d71c7e5c25baa631f680fb2ad322eb9ba697548d498a6fd366949fc8b5bfcf48d49a32803611f648005b01888
@@ -2529,6 +4029,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"ansi-styles@npm:^5.0.0":
+  version: 5.2.0
+  resolution: "ansi-styles@npm:5.2.0"
+  checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469
+  languageName: node
+  linkType: hard
+
 "ansi-styles@npm:^6.0.0":
   version: 6.1.0
   resolution: "ansi-styles@npm:6.1.0"
@@ -2550,6 +4057,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"any-promise@npm:^1.1.0":
+  version: 1.3.0
+  resolution: "any-promise@npm:1.3.0"
+  checksum: 0ee8a9bdbe882c90464d75d1f55cf027f5458650c4bd1f0467e65aec38ccccda07ca5844969ee77ed46d04e7dded3eaceb027e8d32f385688523fe305fa7e1de
+  languageName: node
+  linkType: hard
+
 "anymatch@npm:^2.0.0":
   version: 2.0.0
   resolution: "anymatch@npm:2.0.0"
@@ -2560,7 +4074,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"anymatch@npm:~3.1.2":
+"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2":
   version: 3.1.2
   resolution: "anymatch@npm:3.1.2"
   dependencies:
@@ -2601,6 +4115,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"arg@npm:^4.1.0":
+  version: 4.1.3
+  resolution: "arg@npm:4.1.3"
+  checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43
+  languageName: node
+  linkType: hard
+
+"argparse@npm:^1.0.7":
+  version: 1.0.10
+  resolution: "argparse@npm:1.0.10"
+  dependencies:
+    sprintf-js: ~1.0.2
+  checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945
+  languageName: node
+  linkType: hard
+
 "argparse@npm:^2.0.1":
   version: 2.0.1
   resolution: "argparse@npm:2.0.1"
@@ -2636,6 +4166,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"array-find-index@npm:^1.0.1":
+  version: 1.0.2
+  resolution: "array-find-index@npm:1.0.2"
+  checksum: aac128bf369e1ac6c06ff0bb330788371c0e256f71279fb92d745e26fb4b9db8920e485b4ec25e841c93146bf71a34dcdbcefa115e7e0f96927a214d237b7081
+  languageName: node
+  linkType: hard
+
 "array-ify@npm:^1.0.0":
   version: 1.0.0
   resolution: "array-ify@npm:1.0.0"
@@ -2704,7 +4241,18 @@ __metadata:
   languageName: node
   linkType: hard
 
-"arrify@npm:^1.0.1":
+"array.prototype.flatmap@npm:^1.2.4":
+  version: 1.2.5
+  resolution: "array.prototype.flatmap@npm:1.2.5"
+  dependencies:
+    call-bind: ^1.0.0
+    define-properties: ^1.1.3
+    es-abstract: ^1.19.0
+  checksum: a14119a28e5687a13cf3fd6756a8e7810563a9e81cd4227e27a25c31d362df47ac72553f06a271fd728741e199047933ad43d561d64a28da0b4e1a26f74e939e
+  languageName: node
+  linkType: hard
+
+"arrify@npm:^1.0.0, arrify@npm:^1.0.1":
   version: 1.0.1
   resolution: "arrify@npm:1.0.1"
   checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7
@@ -2777,6 +4325,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"async@npm:~0.9.0":
+  version: 0.9.2
+  resolution: "async@npm:0.9.2"
+  checksum: 87dbf129292b8a6c32a4e07f43f462498162aa86f404a7e11f978dbfdf75cfb163c26833684bb07b9d436083cd604cbbf730a57bfcbe436c6ae1ed266cdc56bb
+  languageName: node
+  linkType: hard
+
+"async@npm:~1.0.0":
+  version: 1.0.0
+  resolution: "async@npm:1.0.0"
+  checksum: 04d4e57806b1a46b1635a3d821a9bcc06f893d6828a0468ceb494d1857b565754cbbaed22529aef79749dbbe7cf5080bfdb346b54be0e9cd35c41d7ef8d7911f
+  languageName: node
+  linkType: hard
+
 "asynciterator@npm:^3.2.0":
   version: 3.4.0
   resolution: "asynciterator@npm:3.4.0"
@@ -2839,6 +4401,83 @@ __metadata:
   languageName: node
   linkType: hard
 
+"babel-jest@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "babel-jest@npm:27.5.1"
+  dependencies:
+    "@jest/transform": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/babel__core": ^7.1.14
+    babel-plugin-istanbul: ^6.1.1
+    babel-preset-jest: ^27.5.1
+    chalk: ^4.0.0
+    graceful-fs: ^4.2.9
+    slash: ^3.0.0
+  peerDependencies:
+    "@babel/core": ^7.8.0
+  checksum: 4e93e6e9fb996cc5f1505e924eb8e8cc7b25c294ba9629762a2715390f48af6a4c14dbb84cd9730013ac0e03267a5a9aa2fb6318c544489cda7f50f4e506def4
+  languageName: node
+  linkType: hard
+
+"babel-plugin-istanbul@npm:^6.1.1":
+  version: 6.1.1
+  resolution: "babel-plugin-istanbul@npm:6.1.1"
+  dependencies:
+    "@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
+  checksum: cb4fd95738219f232f0aece1116628cccff16db891713c4ccb501cddbbf9272951a5df81f2f2658dfdf4b3e7b236a9d5cbcf04d5d8c07dd5077297339598061a
+  languageName: node
+  linkType: hard
+
+"babel-plugin-jest-hoist@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "babel-plugin-jest-hoist@npm:27.5.1"
+  dependencies:
+    "@babel/template": ^7.3.3
+    "@babel/types": ^7.3.3
+    "@types/babel__core": ^7.0.0
+    "@types/babel__traverse": ^7.0.6
+  checksum: 709c17727aa8fd3be755d256fb514bf945a5c2ea6017f037d80280fc44ae5fe7dfeebf63d8412df53796455c2c216119d628d8cc90b099434fd819005943d058
+  languageName: node
+  linkType: hard
+
+"babel-preset-current-node-syntax@npm:^1.0.0":
+  version: 1.0.1
+  resolution: "babel-preset-current-node-syntax@npm:1.0.1"
+  dependencies:
+    "@babel/plugin-syntax-async-generators": ^7.8.4
+    "@babel/plugin-syntax-bigint": ^7.8.3
+    "@babel/plugin-syntax-class-properties": ^7.8.3
+    "@babel/plugin-syntax-import-meta": ^7.8.3
+    "@babel/plugin-syntax-json-strings": ^7.8.3
+    "@babel/plugin-syntax-logical-assignment-operators": ^7.8.3
+    "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3
+    "@babel/plugin-syntax-numeric-separator": ^7.8.3
+    "@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-top-level-await": ^7.8.3
+  peerDependencies:
+    "@babel/core": ^7.0.0
+  checksum: d118c2742498c5492c095bc8541f4076b253e705b5f1ad9a2e7d302d81a84866f0070346662355c8e25fc02caa28dc2da8d69bcd67794a0d60c4d6fab6913cc8
+  languageName: node
+  linkType: hard
+
+"babel-preset-jest@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "babel-preset-jest@npm:27.5.1"
+  dependencies:
+    babel-plugin-jest-hoist: ^27.5.1
+    babel-preset-current-node-syntax: ^1.0.0
+  peerDependencies:
+    "@babel/core": ^7.0.0
+  checksum: 251bcea11c18fd9672fec104eadb45b43f117ceeb326fa7345ced778d4c1feab29343cd7a87a1dcfae4997d6c851a8b386d7f7213792da6e23b74f4443a8976d
+  languageName: node
+  linkType: hard
+
 "balanced-match@npm:^1.0.0":
   version: 1.0.2
   resolution: "balanced-match@npm:1.0.2"
@@ -2956,20 +4595,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"bootstrap-vue@npm:^2.20.1, bootstrap-vue@npm:^2.21.2":
-  version: 2.21.2
-  resolution: "bootstrap-vue@npm:2.21.2"
+"bootstrap-vue@npm:^2.22.0":
+  version: 2.22.0
+  resolution: "bootstrap-vue@npm:2.22.0"
   dependencies:
     "@nuxt/opencollective": ^0.3.2
-    bootstrap: ">=4.5.3 <5.0.0"
+    bootstrap: ^4.6.1
     popper.js: ^1.16.1
     portal-vue: ^2.1.7
     vue-functional-data-merge: ^3.1.0
-  checksum: cf49df1a38917d9fcfca7f015f2660880c11cae8b36da612cb485c995af3823ec9da9620b65f9f5a8dfaa1c88d8bf03dfeb4a7501a6c2c52abc92c6c3af97319
+  checksum: 801f148de895b4e390d2d79629f0da5c2fd8fd6d002230f4572ff0354e64f70236363bb69496451009bcd582d9b4eea2c31055649c7c99b8971bce5b418a4f01
   languageName: node
   linkType: hard
 
-"bootstrap@npm:>=4.5.3 <5.0.0, bootstrap@npm:^4.6.1":
+"bootstrap@npm:^4.6.1":
   version: 4.6.1
   resolution: "bootstrap@npm:4.6.1"
   peerDependencies:
@@ -3039,6 +4678,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"browser-process-hrtime@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "browser-process-hrtime@npm:1.0.0"
+  checksum: e30f868cdb770b1201afb714ad1575dd86366b6e861900884665fb627109b3cc757c40067d3bfee1ff2a29c835257ea30725a8018a9afd02ac1c24b408b1e45f
+  languageName: node
+  linkType: hard
+
 "browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4":
   version: 1.2.0
   resolution: "browserify-aes@npm:1.2.0"
@@ -3127,6 +4773,31 @@ __metadata:
   languageName: node
   linkType: hard
 
+"bs-logger@npm:0.x":
+  version: 0.2.6
+  resolution: "bs-logger@npm:0.2.6"
+  dependencies:
+    fast-json-stable-stringify: 2.x
+  checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606
+  languageName: node
+  linkType: hard
+
+"bser@npm:2.1.1":
+  version: 2.1.1
+  resolution: "bser@npm:2.1.1"
+  dependencies:
+    node-int64: ^0.4.0
+  checksum: 9ba4dc58ce86300c862bffc3ae91f00b2a03b01ee07f3564beeeaf82aa243b8b03ba53f123b0b842c190d4399b94697970c8e7cf7b1ea44b61aa28c3526a4449
+  languageName: node
+  linkType: hard
+
+"buffer-es6@npm:^4.9.3":
+  version: 4.9.3
+  resolution: "buffer-es6@npm:4.9.3"
+  checksum: dfc8ebb3c5c00166e6f81e6ec7ea876693ea6197a8d0b07b1a17482ffab0e5d3307bfb539f84862b1ae35cd70ad03835db0f3c7dc4e337cbd16c50bb4c7e5df7
+  languageName: node
+  linkType: hard
+
 "buffer-from@npm:^1.0.0":
   version: 1.1.2
   resolution: "buffer-from@npm:1.1.2"
@@ -3152,6 +4823,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"builtin-modules@npm:^3.1.0":
+  version: 3.2.0
+  resolution: "builtin-modules@npm:3.2.0"
+  checksum: 0265aa1ba78e1a16f4e18668d815cb43fb364e6a6b8aa9189c6f44c7b894a551a43b323c40206959d2d4b2568c1f2805607ad6c88adc306a776ce6904cca6715
+  languageName: node
+  linkType: hard
+
 "builtin-status-codes@npm:^3.0.0":
   version: 3.0.0
   resolution: "builtin-status-codes@npm:3.0.0"
@@ -3284,6 +4962,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"cacheable-lookup@npm:^2.0.0":
+  version: 2.0.1
+  resolution: "cacheable-lookup@npm:2.0.1"
+  dependencies:
+    "@types/keyv": ^3.1.1
+    keyv: ^4.0.0
+  checksum: 6c2d0ca045aa6d9ffca54ace4ec8e9856678dcc55fd4506ad4078a3aab82fa2592f0c9316abbd6ddfabd1a785f34f289ccdcf4a565f329cd4aae55912b5ec1f8
+  languageName: node
+  linkType: hard
+
 "cacheable-lookup@npm:^5.0.3":
   version: 5.0.4
   resolution: "cacheable-lookup@npm:5.0.4"
@@ -3291,7 +4979,22 @@ __metadata:
   languageName: node
   linkType: hard
 
-"cacheable-request@npm:^7.0.2":
+"cacheable-request@npm:^6.0.0":
+  version: 6.1.0
+  resolution: "cacheable-request@npm:6.1.0"
+  dependencies:
+    clone-response: ^1.0.2
+    get-stream: ^5.1.0
+    http-cache-semantics: ^4.0.0
+    keyv: ^3.0.0
+    lowercase-keys: ^2.0.0
+    normalize-url: ^4.1.0
+    responselike: ^1.0.2
+  checksum: b510b237b18d17e89942e9ee2d2a077cb38db03f12167fd100932dfa8fc963424bfae0bfa1598df4ae16c944a5484e43e03df8f32105b04395ee9495e9e4e9f1
+  languageName: node
+  linkType: hard
+
+"cacheable-request@npm:^7.0.1, cacheable-request@npm:^7.0.2":
   version: 7.0.2
   resolution: "cacheable-request@npm:7.0.2"
   dependencies:
@@ -3306,6 +5009,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"cachedir@npm:2.2.0":
+  version: 2.2.0
+  resolution: "cachedir@npm:2.2.0"
+  checksum: 7b55a54c312885dc497c19780ed5ec527f1ae9df61db4bdb939ba66d00a49a1f28ced3919f1f094b472eac36874c268d6d63f397a093caf8c534f34be78c6438
+  languageName: node
+  linkType: hard
+
 "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2":
   version: 1.0.2
   resolution: "call-bind@npm:1.0.2"
@@ -3330,6 +5040,27 @@ __metadata:
   languageName: node
   linkType: hard
 
+"camelcase-keys@npm:^2.0.0":
+  version: 2.1.0
+  resolution: "camelcase-keys@npm:2.1.0"
+  dependencies:
+    camelcase: ^2.0.0
+    map-obj: ^1.0.0
+  checksum: 97d2993da5db44d45e285910c70a54ce7f83a2be05afceaafd9831f7aeaf38a48dcdede5ca3aae2b2694852281d38dc459706e346942c5df0bf755f4133f5c39
+  languageName: node
+  linkType: hard
+
+"camelcase-keys@npm:^4.0.0":
+  version: 4.2.0
+  resolution: "camelcase-keys@npm:4.2.0"
+  dependencies:
+    camelcase: ^4.1.0
+    map-obj: ^2.0.0
+    quick-lru: ^1.0.0
+  checksum: 8cb52633f2d335bf7efd9ec4169df3174047dbeadbe9b7604fb4a24cbc53a976bc26bb8557f6e9da5feff139bf94e36f40e2636b31225670f9524f586070c3ec
+  languageName: node
+  linkType: hard
+
 "camelcase-keys@npm:^6.2.2":
   version: 6.2.2
   resolution: "camelcase-keys@npm:6.2.2"
@@ -3341,6 +5072,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"camelcase@npm:^2.0.0":
+  version: 2.1.1
+  resolution: "camelcase@npm:2.1.1"
+  checksum: 20a3ef08f348de832631d605362ffe447d883ada89617144a82649363ed5860923b021f8e09681624ef774afb93ff3597cfbcf8aaf0574f65af7648f1aea5e50
+  languageName: node
+  linkType: hard
+
+"camelcase@npm:^4.1.0":
+  version: 4.1.0
+  resolution: "camelcase@npm:4.1.0"
+  checksum: 9683356daf9b64fae4b30c91f8ceb1f34f22746e03d1804efdbe738357d38b47f206cdd71efcf2ed72018b2e88eeb8ec3f79adb09c02f1253a4b6d5d405ff2ae
+  languageName: node
+  linkType: hard
+
 "camelcase@npm:^5.0.0, camelcase@npm:^5.3.1":
   version: 5.3.1
   resolution: "camelcase@npm:5.3.1"
@@ -3348,6 +5093,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"camelcase@npm:^6.2.0":
+  version: 6.3.0
+  resolution: "camelcase@npm:6.3.0"
+  checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d
+  languageName: node
+  linkType: hard
+
 "caniuse-lite@npm:^1.0.30001313":
   version: 1.0.30001317
   resolution: "caniuse-lite@npm:1.0.30001317"
@@ -3388,7 +5140,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"chalk@npm:^2.0.0, chalk@npm:^2.0.1, chalk@npm:^2.3.2, chalk@npm:^2.4.2":
+"chalk@npm:^2.0.0, chalk@npm:^2.0.1, chalk@npm:^2.3.2, chalk@npm:^2.4.1, chalk@npm:^2.4.2":
   version: 2.4.2
   resolution: "chalk@npm:2.4.2"
   dependencies:
@@ -3409,6 +5161,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"char-regex@npm:^1.0.2":
+  version: 1.0.2
+  resolution: "char-regex@npm:1.0.2"
+  checksum: b563e4b6039b15213114626621e7a3d12f31008bdce20f9c741d69987f62aeaace7ec30f6018890ad77b2e9b4d95324c9f5acfca58a9441e3b1dcdd1e2525d17
+  languageName: node
+  linkType: hard
+
 "charcodes@npm:^0.2.0":
   version: 0.2.0
   resolution: "charcodes@npm:0.2.0"
@@ -3493,6 +5252,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"ci-info@npm:^3.2.0":
+  version: 3.3.0
+  resolution: "ci-info@npm:3.3.0"
+  checksum: c3d86fe374938ecda5093b1ba39acb535d8309185ba3f23587747c6a057e63f45419b406d880304dbc0e1d72392c9a33e42fe9a1e299209bc0ded5efaa232b66
+  languageName: node
+  linkType: hard
+
 "cidr-regex@npm:^3.1.1":
   version: 3.1.1
   resolution: "cidr-regex@npm:3.1.1"
@@ -3512,6 +5278,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"cjs-module-lexer@npm:^1.0.0":
+  version: 1.2.2
+  resolution: "cjs-module-lexer@npm:1.2.2"
+  checksum: 977f3f042bd4f08e368c890d91eecfbc4f91da0bc009a3c557bc4dfbf32022ad1141244ac1178d44de70fc9f3dea7add7cd9a658a34b9fae98a55d8f92331ce5
+  languageName: node
+  linkType: hard
+
 "class-utils@npm:^0.3.5":
   version: 0.3.6
   resolution: "class-utils@npm:0.3.6"
@@ -3566,7 +5339,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"cli-table3@npm:*, cli-table3@npm:^0.6.1":
+"cli-table3@npm:*, cli-table3@npm:^0.6.0, cli-table3@npm:^0.6.1":
   version: 0.6.1
   resolution: "cli-table3@npm:0.6.1"
   dependencies:
@@ -3579,7 +5352,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"cli-truncate@npm:^2.1.0":
+"cli-truncate@npm:2.1.0, cli-truncate@npm:^2.1.0":
   version: 2.1.0
   resolution: "cli-truncate@npm:2.1.0"
   dependencies:
@@ -3599,6 +5372,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"cli-width@npm:^2.0.0":
+  version: 2.2.1
+  resolution: "cli-width@npm:2.2.1"
+  checksum: 3c21b897a2ff551ae5b3c3ab32c866ed2965dcf7fb442f81adf0e27f4a397925c8f84619af7bcc6354821303f6ee9b2aa31d248306174f32c287986158cf4eed
+  languageName: node
+  linkType: hard
+
 "cli-width@npm:^3.0.0":
   version: 3.0.0
   resolution: "cli-width@npm:3.0.0"
@@ -3662,6 +5442,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"co@npm:^4.6.0":
+  version: 4.6.0
+  resolution: "co@npm:4.6.0"
+  checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510
+  languageName: node
+  linkType: hard
+
+"collect-v8-coverage@npm:^1.0.0":
+  version: 1.0.1
+  resolution: "collect-v8-coverage@npm:1.0.1"
+  checksum: 4efe0a1fccd517b65478a2364b33dadd0a43fc92a56f59aaece9b6186fe5177b2de471253587de7c91516f07c7268c2f6770b6cbcffc0e0ece353b766ec87e55
+  languageName: node
+  linkType: hard
+
 "collection-visit@npm:^1.0.0":
   version: 1.0.0
   resolution: "collection-visit@npm:1.0.0"
@@ -3713,6 +5507,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"colorette@npm:^1.4.0":
+  version: 1.4.0
+  resolution: "colorette@npm:1.4.0"
+  checksum: 01c3c16058b182a4ab4c126a65a75faa4d38a20fa7c845090b25453acec6c371bb2c5dceb0a2338511f17902b9d1a9af0cadd8509c9403894b79311032c256c3
+  languageName: node
+  linkType: hard
+
 "colorette@npm:^2.0.16":
   version: 2.0.16
   resolution: "colorette@npm:2.0.16"
@@ -3720,7 +5521,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"colors@npm:1.4.0":
+"colors@npm:1.0.x":
+  version: 1.0.3
+  resolution: "colors@npm:1.0.3"
+  checksum: 234e8d3ab7e4003851cdd6a1f02eaa16dabc502ee5f4dc576ad7959c64b7477b15bd21177bab4055a4c0a66aa3d919753958030445f87c39a253d73b7a3637f5
+  languageName: node
+  linkType: hard
+
+"colors@npm:1.4.0, colors@npm:^1.4.0":
   version: 1.4.0
   resolution: "colors@npm:1.4.0"
   checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec
@@ -3753,7 +5561,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"commander@npm:^8.3.0":
+"commander@npm:^4.0.1":
+  version: 4.1.1
+  resolution: "commander@npm:4.1.1"
+  checksum: d7b9913ff92cae20cb577a4ac6fcc121bd6223319e54a40f51a14740a681ad5c574fd29a57da478a5f234a6fa6c52cbf0b7c641353e03c648b1ae85ba670b977
+  languageName: node
+  linkType: hard
+
+"commander@npm:^8.2.0, commander@npm:^8.3.0":
   version: 8.3.0
   resolution: "commander@npm:8.3.0"
   checksum: 0f82321821fc27b83bd409510bb9deeebcfa799ff0bf5d102128b500b7af22872c0c92cb6a0ebc5a4cf19c6b550fba9cedfa7329d18c6442a625f851377bacf0
@@ -3773,6 +5588,32 @@ __metadata:
   languageName: node
   linkType: hard
 
+"commitizen@npm:^4.0.3, commitizen@npm:^4.2.4":
+  version: 4.2.4
+  resolution: "commitizen@npm:4.2.4"
+  dependencies:
+    cachedir: 2.2.0
+    cz-conventional-changelog: 3.2.0
+    dedent: 0.7.0
+    detect-indent: 6.0.0
+    find-node-modules: ^2.1.2
+    find-root: 1.1.0
+    fs-extra: 8.1.0
+    glob: 7.1.4
+    inquirer: 6.5.2
+    is-utf8: ^0.2.1
+    lodash: ^4.17.20
+    minimist: 1.2.5
+    strip-bom: 4.0.0
+    strip-json-comments: 3.0.1
+  bin:
+    commitizen: bin/commitizen
+    cz: bin/git-cz
+    git-cz: bin/git-cz
+  checksum: 5b0ae7310e91616e5f3c5149e355b0e675b1132bbad4c3292afe04c91192be81859b2c22f8fef00887310b270ab01b9aef60c6fc4e9bc47fbf208c209f1d8ff5
+  languageName: node
+  linkType: hard
+
 "common-ancestor-path@npm:^1.0.1":
   version: 1.0.1
   resolution: "common-ancestor-path@npm:1.0.1"
@@ -3787,6 +5628,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"compare-func@npm:^1.3.1":
+  version: 1.3.4
+  resolution: "compare-func@npm:1.3.4"
+  dependencies:
+    array-ify: ^1.0.0
+    dot-prop: ^3.0.0
+  checksum: b3fccca2957d102cd2f00aa7941e6a6264db67fc0f1322dd2ea216ceeb92ea738797304ceb73644a9cfabaf6c1ecd39e793efd1a3804edbfdfaf507cc6804f7a
+  languageName: node
+  linkType: hard
+
 "compare-func@npm:^2.0.0":
   version: 2.0.0
   resolution: "compare-func@npm:2.0.0"
@@ -3823,6 +5674,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"concat-stream@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "concat-stream@npm:2.0.0"
+  dependencies:
+    buffer-from: ^1.0.0
+    inherits: ^2.0.3
+    readable-stream: ^3.0.2
+    typedarray: ^0.0.6
+  checksum: d7f75d48f0ecd356c1545d87e22f57b488172811b1181d96021c7c4b14ab8855f5313280263dca44bb06e5222f274d047da3e290a38841ef87b59719bde967c7
+  languageName: node
+  linkType: hard
+
 "consola@npm:^2.15.0, consola@npm:^2.15.3":
   version: 2.15.3
   resolution: "consola@npm:2.15.3"
@@ -3869,7 +5732,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"conventional-changelog-angular@npm:^5.0.0":
+"conventional-changelog-angular@npm:^1.6.6":
+  version: 1.6.6
+  resolution: "conventional-changelog-angular@npm:1.6.6"
+  dependencies:
+    compare-func: ^1.3.1
+    q: ^1.5.1
+  checksum: 14b6644d5ba8e792897f1ada32c615d544cbc6c6092295caedf81b71c1af631d25b370847efb3e49d2e4ba836a7bbbd0edb4a437a66e2e117130b6413032bad2
+  languageName: node
+  linkType: hard
+
+"conventional-changelog-angular@npm:^5.0.0, conventional-changelog-angular@npm:^5.0.11":
   version: 5.0.13
   resolution: "conventional-changelog-angular@npm:5.0.13"
   dependencies:
@@ -3879,80 +5752,282 @@ __metadata:
   languageName: node
   linkType: hard
 
-"conventional-changelog-eslint@npm:^3.0.9":
-  version: 3.0.9
-  resolution: "conventional-changelog-eslint@npm:3.0.9"
+"conventional-changelog-atom@npm:^2.0.0":
+  version: 2.0.8
+  resolution: "conventional-changelog-atom@npm:2.0.8"
   dependencies:
     q: ^1.5.1
-  checksum: 402ae73a8c5390405d4f902819f630f56fa7dfa8f6bef77b3b5f2fb7c8bd17f64ad83edbacc030cfef5b84400ab722d4f166dd906296a4d286e66205c1bd8a3f
+  checksum: 12ecbd928f8c261f9afaac067fcc0cf10ff6ac8505e4285dc3d9959ee072a8937ac942d505e850dce27c4527046009adb22b498ba0b10802916d2c7d2dc1f7bc
   languageName: node
   linkType: hard
 
-"conventional-changelog-writer@npm:^5.0.0":
-  version: 5.0.1
-  resolution: "conventional-changelog-writer@npm:5.0.1"
+"conventional-changelog-codemirror@npm:^2.0.0":
+  version: 2.0.8
+  resolution: "conventional-changelog-codemirror@npm:2.0.8"
   dependencies:
-    conventional-commits-filter: ^2.0.7
-    dateformat: ^3.0.0
-    handlebars: ^4.7.7
-    json-stringify-safe: ^5.0.1
+    q: ^1.5.1
+  checksum: cf331db40cc54c2353b0189aba26a2b959cb08b059bf2a81245272027371519c9acc90d574295782985829c50f0c52da60c952c70ec6dbd70e9e17affeb61453
+  languageName: node
+  linkType: hard
+
+"conventional-changelog-conventionalcommits@npm:^4.3.1":
+  version: 4.6.3
+  resolution: "conventional-changelog-conventionalcommits@npm:4.6.3"
+  dependencies:
+    compare-func: ^2.0.0
     lodash: ^4.17.15
-    meow: ^8.0.0
-    semver: ^6.0.0
-    split: ^1.0.0
-    through2: ^4.0.0
-  bin:
-    conventional-changelog-writer: cli.js
-  checksum: 5c0129db44577f14b1f8de225b62a392a9927ba7fe3422cb21ad71a771b8472bd03badb7c87cb47419913abc3f2ce3759b69f59550cdc6f7a7b0459015b3b44c
+    q: ^1.5.1
+  checksum: 7b8e8a21ebb56f9aaa510e12917b7c609202072c3e71089e0a09630c37c2e8146cdb04364809839b0e3eb55f807fe84d03b2079500b37f6186d505848be5c562
   languageName: node
   linkType: hard
 
-"conventional-commits-filter@npm:^2.0.0, conventional-commits-filter@npm:^2.0.7":
-  version: 2.0.7
-  resolution: "conventional-commits-filter@npm:2.0.7"
+"conventional-changelog-core@npm:^3.1.0":
+  version: 3.2.3
+  resolution: "conventional-changelog-core@npm:3.2.3"
   dependencies:
-    lodash.ismatch: ^4.4.0
-    modify-values: ^1.0.0
-  checksum: feb567f680a6da1baaa1ef3cff393b3c56a5828f77ab9df5e70626475425d109a6fee0289b4979223c62bbd63bf9c98ef532baa6fcb1b66ee8b5f49077f5d46c
+    conventional-changelog-writer: ^4.0.6
+    conventional-commits-parser: ^3.0.3
+    dateformat: ^3.0.0
+    get-pkg-repo: ^1.0.0
+    git-raw-commits: 2.0.0
+    git-remote-origin-url: ^2.0.0
+    git-semver-tags: ^2.0.3
+    lodash: ^4.2.1
+    normalize-package-data: ^2.3.5
+    q: ^1.5.1
+    read-pkg: ^3.0.0
+    read-pkg-up: ^3.0.0
+    through2: ^3.0.0
+  checksum: ef442eb12cbcbf41492d18328f7506cee09392cbe631e44e3c92c7b644199070a533c7ead35fec56b354069e0ca5a622636b9f3fb3ab94b3bb0ead643e7994d9
   languageName: node
   linkType: hard
 
-"conventional-commits-parser@npm:^3.2.3":
-  version: 3.2.4
-  resolution: "conventional-commits-parser@npm:3.2.4"
+"conventional-changelog-ember@npm:^2.0.1":
+  version: 2.0.9
+  resolution: "conventional-changelog-ember@npm:2.0.9"
   dependencies:
-    JSONStream: ^1.0.4
-    is-text-path: ^1.0.1
-    lodash: ^4.17.15
-    meow: ^8.0.0
-    split2: ^3.0.0
-    through2: ^4.0.0
-  bin:
-    conventional-commits-parser: cli.js
-  checksum: 1627ff203bc9586d89e47a7fe63acecf339aba74903b9114e23d28094f79d4e2d6389bf146ae561461dcba8fc42e7bc228165d2b173f15756c43f1d32bc50bfd
+    q: ^1.5.1
+  checksum: 30c7bd48ce995e39fc91bcd8c719b2bee10cb408c246a6a7de6cec44a3ca12afe5a86f57f55aa1fd2c64beb484c68013d16658047e6273f130c1c80e7dad38e9
   languageName: node
   linkType: hard
 
-"convert-source-map@npm:^1.7.0":
-  version: 1.8.0
-  resolution: "convert-source-map@npm:1.8.0"
+"conventional-changelog-eslint@npm:3.0.9, conventional-changelog-eslint@npm:^3.0.0, conventional-changelog-eslint@npm:^3.0.9":
+  version: 3.0.9
+  resolution: "conventional-changelog-eslint@npm:3.0.9"
   dependencies:
-    safe-buffer: ~5.1.1
-  checksum: 985d974a2d33e1a2543ada51c93e1ba2f73eaed608dc39f229afc78f71dcc4c8b7d7c684aa647e3c6a3a204027444d69e53e169ce94e8d1fa8d7dee80c9c8fed
+    q: ^1.5.1
+  checksum: 402ae73a8c5390405d4f902819f630f56fa7dfa8f6bef77b3b5f2fb7c8bd17f64ad83edbacc030cfef5b84400ab722d4f166dd906296a4d286e66205c1bd8a3f
   languageName: node
   linkType: hard
 
-"copy-concurrently@npm:^1.0.0":
-  version: 1.0.5
-  resolution: "copy-concurrently@npm:1.0.5"
+"conventional-changelog-express@npm:^2.0.0":
+  version: 2.0.6
+  resolution: "conventional-changelog-express@npm:2.0.6"
   dependencies:
-    aproba: ^1.1.1
-    fs-write-stream-atomic: ^1.0.8
-    iferr: ^0.1.5
-    mkdirp: ^0.5.1
-    rimraf: ^2.5.4
-    run-queue: ^1.0.0
-  checksum: 63c169f582e09445260988f697b2d07793d439dfc31e97c8999707bd188dd94d1c7f2ca3533c7786fb75f03a3f2f54ad1ee08055f95f61bb8d2e862498c1d460
+    q: ^1.5.1
+  checksum: c139fa9878971455cce9904a195d92f770679d24a88ef07a016a6954e28f0f237ec59e45f2591b2fc9b8e10fd46c30150ddf0ce50a2cb03be85cae0ee64d4cdd
+  languageName: node
+  linkType: hard
+
+"conventional-changelog-jquery@npm:^0.1.0":
+  version: 0.1.0
+  resolution: "conventional-changelog-jquery@npm:0.1.0"
+  dependencies:
+    q: ^1.4.1
+  checksum: c4e80b3f4abea38ac4b2f6c78e5b5847561ebfb657c1c941e58373b33eefa3ba029ef6c258ecbf5737ef8e57122725f980dcee0b8c8cf8aa3d5809b0dd566a72
+  languageName: node
+  linkType: hard
+
+"conventional-changelog-jscs@npm:^0.1.0":
+  version: 0.1.0
+  resolution: "conventional-changelog-jscs@npm:0.1.0"
+  dependencies:
+    q: ^1.4.1
+  checksum: 7de846a6ae013a85d880fc94110bb01ccbab9048542020e6c3252e51aea4f33193f4e94e5b5cd52a29a3d202de3ea9a195fee88a5c970fad88730272d1f1b6f1
+  languageName: node
+  linkType: hard
+
+"conventional-changelog-jshint@npm:^2.0.0":
+  version: 2.0.9
+  resolution: "conventional-changelog-jshint@npm:2.0.9"
+  dependencies:
+    compare-func: ^2.0.0
+    q: ^1.5.1
+  checksum: ec96144b75fdb84c4a6f7db9b671dc258d964cd7aa35f9b00539e42bbe05601a9127c17cf0dcc315ae81a0dd20fe795d9d41dd90373928d24b33f065728eb2e2
+  languageName: node
+  linkType: hard
+
+"conventional-changelog-preset-loader@npm:^2.0.1, conventional-changelog-preset-loader@npm:^2.3.4":
+  version: 2.3.4
+  resolution: "conventional-changelog-preset-loader@npm:2.3.4"
+  checksum: 23a889b7fcf6fe7653e61f32a048877b2f954dcc1e0daa2848c5422eb908e6f24c78372f8d0d2130b5ed941c02e7010c599dccf44b8552602c6c8db9cb227453
+  languageName: node
+  linkType: hard
+
+"conventional-changelog-writer@npm:^4.0.0, conventional-changelog-writer@npm:^4.0.6":
+  version: 4.1.0
+  resolution: "conventional-changelog-writer@npm:4.1.0"
+  dependencies:
+    compare-func: ^2.0.0
+    conventional-commits-filter: ^2.0.7
+    dateformat: ^3.0.0
+    handlebars: ^4.7.6
+    json-stringify-safe: ^5.0.1
+    lodash: ^4.17.15
+    meow: ^8.0.0
+    semver: ^6.0.0
+    split: ^1.0.0
+    through2: ^4.0.0
+  bin:
+    conventional-changelog-writer: cli.js
+  checksum: 6fce8f64f50bcabae1373ff7e84c2e6b71f5d050315f90f77ac7a847d36bbe8b60d83cb2e5c616b81d99bf34b9ab907e7e88840e82e6ab995081aaf561ee37d5
+  languageName: node
+  linkType: hard
+
+"conventional-changelog-writer@npm:^5.0.0":
+  version: 5.0.1
+  resolution: "conventional-changelog-writer@npm:5.0.1"
+  dependencies:
+    conventional-commits-filter: ^2.0.7
+    dateformat: ^3.0.0
+    handlebars: ^4.7.7
+    json-stringify-safe: ^5.0.1
+    lodash: ^4.17.15
+    meow: ^8.0.0
+    semver: ^6.0.0
+    split: ^1.0.0
+    through2: ^4.0.0
+  bin:
+    conventional-changelog-writer: cli.js
+  checksum: 5c0129db44577f14b1f8de225b62a392a9927ba7fe3422cb21ad71a771b8472bd03badb7c87cb47419913abc3f2ce3759b69f59550cdc6f7a7b0459015b3b44c
+  languageName: node
+  linkType: hard
+
+"conventional-changelog@npm:^2.0.0":
+  version: 2.0.3
+  resolution: "conventional-changelog@npm:2.0.3"
+  dependencies:
+    conventional-changelog-angular: ^1.6.6
+    conventional-changelog-atom: ^2.0.0
+    conventional-changelog-codemirror: ^2.0.0
+    conventional-changelog-core: ^3.1.0
+    conventional-changelog-ember: ^2.0.1
+    conventional-changelog-eslint: ^3.0.0
+    conventional-changelog-express: ^2.0.0
+    conventional-changelog-jquery: ^0.1.0
+    conventional-changelog-jscs: ^0.1.0
+    conventional-changelog-jshint: ^2.0.0
+    conventional-changelog-preset-loader: ^2.0.1
+  checksum: c70042cca095a2a97212305042be79f3c608621299ebda8c811c94931aef18ae96585af9d3b72e84e99f9aa525d5bb34fe405d382b1664175696ae9abb682a4e
+  languageName: node
+  linkType: hard
+
+"conventional-commit-types@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "conventional-commit-types@npm:3.0.0"
+  checksum: b9552de6a310c91a271ee57a890ed70d2d94340e710fc33856aaca5b24928fb2162f04dda5484d155b68c1fbaa042d904014d7fad0b6751a6d68052a0616015d
+  languageName: node
+  linkType: hard
+
+"conventional-commits-detector@npm:^1.0.0":
+  version: 1.0.3
+  resolution: "conventional-commits-detector@npm:1.0.3"
+  dependencies:
+    arrify: ^1.0.0
+    git-raw-commits: ^2.0.0
+    meow: ^7.0.0
+    through2-concurrent: ^2.0.0
+  bin:
+    conventional-commits-detector: src/cli.js
+  checksum: b7bd60c422bf93a943788b88eaf925fc2358d29a15dfd50da43c5a3b5f8df3eae18d5c3e9ef59f6ca5a270bcc7b5b173eca024ff77213b5f9f9999f0c2e56610
+  languageName: node
+  linkType: hard
+
+"conventional-commits-filter@npm:^2.0.0, conventional-commits-filter@npm:^2.0.7":
+  version: 2.0.7
+  resolution: "conventional-commits-filter@npm:2.0.7"
+  dependencies:
+    lodash.ismatch: ^4.4.0
+    modify-values: ^1.0.0
+  checksum: feb567f680a6da1baaa1ef3cff393b3c56a5828f77ab9df5e70626475425d109a6fee0289b4979223c62bbd63bf9c98ef532baa6fcb1b66ee8b5f49077f5d46c
+  languageName: node
+  linkType: hard
+
+"conventional-commits-parser@npm:^3.0.0, conventional-commits-parser@npm:^3.0.3, conventional-commits-parser@npm:^3.0.7, conventional-commits-parser@npm:^3.2.0, conventional-commits-parser@npm:^3.2.2, conventional-commits-parser@npm:^3.2.3":
+  version: 3.2.4
+  resolution: "conventional-commits-parser@npm:3.2.4"
+  dependencies:
+    JSONStream: ^1.0.4
+    is-text-path: ^1.0.1
+    lodash: ^4.17.15
+    meow: ^8.0.0
+    split2: ^3.0.0
+    through2: ^4.0.0
+  bin:
+    conventional-commits-parser: cli.js
+  checksum: 1627ff203bc9586d89e47a7fe63acecf339aba74903b9114e23d28094f79d4e2d6389bf146ae561461dcba8fc42e7bc228165d2b173f15756c43f1d32bc50bfd
+  languageName: node
+  linkType: hard
+
+"conventional-gitlab-releaser@npm:^4.0.0":
+  version: 4.0.3
+  resolution: "conventional-gitlab-releaser@npm:4.0.3"
+  dependencies:
+    conventional-changelog: ^2.0.0
+    dateformat: ^3.0.0
+    debug: ^3.1.0
+    git-semver-tags: ^2.0.0
+    gl-got: ^8.0.0
+    lodash.merge: ^4.0.2
+    meow: ^7.0.0
+    object-assign: ^4.0.1
+    q: ^1.4.1
+    semver-regex: ^2.0.0
+    through2: ^2.0.0
+  bin:
+    conventional-gitlab-releaser: src/cli.js
+  checksum: bbbd2edf93bacb80215eb2395a990e5a15bbc6783ef9ef4fe096780836bd2f9653b1a48ec14d24036180559128da79043f4232969504c55323027450537a2d49
+  languageName: node
+  linkType: hard
+
+"conventional-recommended-bump@npm:^6.0.5":
+  version: 6.1.0
+  resolution: "conventional-recommended-bump@npm:6.1.0"
+  dependencies:
+    concat-stream: ^2.0.0
+    conventional-changelog-preset-loader: ^2.3.4
+    conventional-commits-filter: ^2.0.7
+    conventional-commits-parser: ^3.2.0
+    git-raw-commits: ^2.0.8
+    git-semver-tags: ^4.1.1
+    meow: ^8.0.0
+    q: ^1.5.1
+  bin:
+    conventional-recommended-bump: cli.js
+  checksum: da1d7a5f3b9f7706bede685cdcb3db67997fdaa43c310fd5bf340955c84a4b85dbb9427031522ee06dad290b730a54be987b08629d79c73720dbad3a2531146b
+  languageName: node
+  linkType: hard
+
+"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0":
+  version: 1.8.0
+  resolution: "convert-source-map@npm:1.8.0"
+  dependencies:
+    safe-buffer: ~5.1.1
+  checksum: 985d974a2d33e1a2543ada51c93e1ba2f73eaed608dc39f229afc78f71dcc4c8b7d7c684aa647e3c6a3a204027444d69e53e169ce94e8d1fa8d7dee80c9c8fed
+  languageName: node
+  linkType: hard
+
+"copy-concurrently@npm:^1.0.0":
+  version: 1.0.5
+  resolution: "copy-concurrently@npm:1.0.5"
+  dependencies:
+    aproba: ^1.1.1
+    fs-write-stream-atomic: ^1.0.8
+    iferr: ^0.1.5
+    mkdirp: ^0.5.1
+    rimraf: ^2.5.4
+    run-queue: ^1.0.0
+  checksum: 63c169f582e09445260988f697b2d07793d439dfc31e97c8999707bd188dd94d1c7f2ca3533c7786fb75f03a3f2f54ad1ee08055f95f61bb8d2e862498c1d460
   languageName: node
   linkType: hard
 
@@ -3963,7 +6038,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"core-js@npm:^3.21.1":
+"core-js@npm:^3.21.1, core-js@npm:^3.8.2":
   version: 3.21.1
   resolution: "core-js@npm:3.21.1"
   checksum: d68eddd831340ad5b24ac29c72fda022a43b17f194c4278b6b875a843283d316502cb4abd07f28631d6ebc4387f66aa06e2b1b3c8fd7e08096a751b5c63f6889
@@ -3984,7 +6059,21 @@ __metadata:
   languageName: node
   linkType: hard
 
-"cosmiconfig@npm:^7.0.0":
+"cosmiconfig-typescript-loader@npm:^1.0.0":
+  version: 1.0.9
+  resolution: "cosmiconfig-typescript-loader@npm:1.0.9"
+  dependencies:
+    cosmiconfig: ^7
+    ts-node: ^10.7.0
+  peerDependencies:
+    "@types/node": "*"
+    cosmiconfig: ">=7"
+    typescript: ">=3"
+  checksum: 26a0198e03e81a9e7e1a6ce880d7309fdd056c7a3a23b587253e6d1d1224154d3f9edf727d9c0310628e89752353211b75de151b705298b4d0741fa1740c661e
+  languageName: node
+  linkType: hard
+
+"cosmiconfig@npm:^7, cosmiconfig@npm:^7.0.0, cosmiconfig@npm:^7.0.1":
   version: 7.0.1
   resolution: "cosmiconfig@npm:7.0.1"
   dependencies:
@@ -3997,6 +6086,21 @@ __metadata:
   languageName: node
   linkType: hard
 
+"coveralls@npm:^3.1.1":
+  version: 3.1.1
+  resolution: "coveralls@npm:3.1.1"
+  dependencies:
+    js-yaml: ^3.13.1
+    lcov-parse: ^1.0.0
+    log-driver: ^1.2.7
+    minimist: ^1.2.5
+    request: ^2.88.2
+  bin:
+    coveralls: bin/coveralls.js
+  checksum: 70a208907c5c9182120e980392988245fb170889b1a5c7c4f6c7271026dd88caa2b5750b15b6f16d3a2ba4c718bada8c8dd4ed1e9503a42703c71af384de1abf
+  languageName: node
+  linkType: hard
+
 "create-ecdh@npm:^4.0.0":
   version: 4.0.4
   resolution: "create-ecdh@npm:4.0.4"
@@ -4034,6 +6138,25 @@ __metadata:
   languageName: node
   linkType: hard
 
+"create-require@npm:^1.1.0":
+  version: 1.1.1
+  resolution: "create-require@npm:1.1.1"
+  checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff
+  languageName: node
+  linkType: hard
+
+"cross-env@npm:^7.0.3":
+  version: 7.0.3
+  resolution: "cross-env@npm:7.0.3"
+  dependencies:
+    cross-spawn: ^7.0.1
+  bin:
+    cross-env: src/bin/cross-env.js
+    cross-env-shell: src/bin/cross-env-shell.js
+  checksum: 26f2f3ea2ab32617f57effb70d329c2070d2f5630adc800985d8b30b56e8bf7f5f439dd3a0358b79cee6f930afc23cf8e23515f17ccfb30092c6b62c6b630a79
+  languageName: node
+  linkType: hard
+
 "cross-fetch@npm:^3.0.5, cross-fetch@npm:^3.0.6":
   version: 3.1.5
   resolution: "cross-fetch@npm:3.1.5"
@@ -4067,7 +6190,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3":
+"cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3":
   version: 7.0.3
   resolution: "cross-spawn@npm:7.0.3"
   dependencies:
@@ -4113,6 +6236,45 @@ __metadata:
   languageName: node
   linkType: hard
 
+"cssom@npm:^0.4.4":
+  version: 0.4.4
+  resolution: "cssom@npm:0.4.4"
+  checksum: e3bc1076e7ee4213d4fef05e7ae03bfa83dc05f32611d8edc341f4ecc3d9647b89c8245474c7dd2cdcdb797a27c462e99da7ad00a34399694559f763478ff53f
+  languageName: node
+  linkType: hard
+
+"cssom@npm:~0.3.6":
+  version: 0.3.8
+  resolution: "cssom@npm:0.3.8"
+  checksum: 24beb3087c76c0d52dd458be9ee1fbc80ac771478a9baef35dd258cdeb527c68eb43204dd439692bb2b1ae5272fa5f2946d10946edab0d04f1078f85e06bc7f6
+  languageName: node
+  linkType: hard
+
+"cssstyle@npm:^2.3.0":
+  version: 2.3.0
+  resolution: "cssstyle@npm:2.3.0"
+  dependencies:
+    cssom: ~0.3.6
+  checksum: 5f05e6fd2e3df0b44695c2f08b9ef38b011862b274e320665176467c0725e44a53e341bc4959a41176e83b66064ab786262e7380fd1cabeae6efee0d255bb4e3
+  languageName: node
+  linkType: hard
+
+"currently-unhandled@npm:^0.4.1":
+  version: 0.4.1
+  resolution: "currently-unhandled@npm:0.4.1"
+  dependencies:
+    array-find-index: ^1.0.1
+  checksum: 1f59fe10b5339b54b1a1eee110022f663f3495cf7cf2f480686e89edc7fa8bfe42dbab4b54f85034bc8b092a76cc7becbc2dad4f9adad332ab5831bec39ad540
+  languageName: node
+  linkType: hard
+
+"cycle@npm:1.0.x":
+  version: 1.0.3
+  resolution: "cycle@npm:1.0.3"
+  checksum: b9f131094fb832a8c4ba18c6d2dc9c87fc80d3242847a45f0a5f70911b2acab68abc1c25eb23e5155fcf2135a27d8fcc3635556745b03b488c4f360cfbc352df
+  languageName: node
+  linkType: hard
+
 "cyclist@npm:^1.0.1":
   version: 1.0.1
   resolution: "cyclist@npm:1.0.1"
@@ -4120,6 +6282,58 @@ __metadata:
   languageName: node
   linkType: hard
 
+"cz-conventional-changelog@npm:3.2.0":
+  version: 3.2.0
+  resolution: "cz-conventional-changelog@npm:3.2.0"
+  dependencies:
+    "@commitlint/load": ">6.1.1"
+    chalk: ^2.4.1
+    commitizen: ^4.0.3
+    conventional-commit-types: ^3.0.0
+    lodash.map: ^4.5.1
+    longest: ^2.0.1
+    word-wrap: ^1.0.3
+  dependenciesMeta:
+    "@commitlint/load":
+      optional: true
+  checksum: 5512b2e28a4582a92a68323027cbb5df4a405647c0ddbdc8408c2bad3c520ae964f19978dca1641122b12dd9db692c445ec5859b1f6bdb74c4661d13c02e2c6e
+  languageName: node
+  linkType: hard
+
+"cz-conventional-changelog@npm:^3.3.0":
+  version: 3.3.0
+  resolution: "cz-conventional-changelog@npm:3.3.0"
+  dependencies:
+    "@commitlint/load": ">6.1.1"
+    chalk: ^2.4.1
+    commitizen: ^4.0.3
+    conventional-commit-types: ^3.0.0
+    lodash.map: ^4.5.1
+    longest: ^2.0.1
+    word-wrap: ^1.0.3
+  dependenciesMeta:
+    "@commitlint/load":
+      optional: true
+  checksum: 8b766712092142ecec86c5c8a2a7206d0b2da46ae16e137303c6d75b42c048acd831c734fd542b9c3cbeb0fd8e7d1f5391494ed629dfba4459fee2d6f5d2c0ca
+  languageName: node
+  linkType: hard
+
+"dargs@npm:^4.0.1":
+  version: 4.1.0
+  resolution: "dargs@npm:4.1.0"
+  dependencies:
+    number-is-nan: ^1.0.0
+  checksum: 941e8fb09d5b26af3a8a065069216fa5170eef23b74f97822bcd2da6aeb33067c0fe10dd56800100755886795929e165ce4a7295ae67d471183f8e9a591e034a
+  languageName: node
+  linkType: hard
+
+"dargs@npm:^7.0.0":
+  version: 7.0.0
+  resolution: "dargs@npm:7.0.0"
+  checksum: b8f1e3cba59c42e1f13a114ad4848c3fc1cf7470f633ee9e9f1043762429bc97d91ae31b826fb135eefde203a3fdb20deb0c0a0222ac29d937b8046085d668d1
+  languageName: node
+  linkType: hard
+
 "dashdash@npm:^1.12.0":
   version: 1.14.1
   resolution: "dashdash@npm:1.14.1"
@@ -4129,6 +6343,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"data-urls@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "data-urls@npm:2.0.0"
+  dependencies:
+    abab: ^2.0.3
+    whatwg-mimetype: ^2.3.0
+    whatwg-url: ^8.0.0
+  checksum: 97caf828aac25e25e04ba6869db0f99c75e6859bb5b424ada28d3e7841941ebf08ddff3c1b1bb4585986bd507a5d54c2a716853ea6cb98af877400e637393e71
+  languageName: node
+  linkType: hard
+
 "dateformat@npm:^3.0.0":
   version: 3.0.3
   resolution: "dateformat@npm:3.0.3"
@@ -4164,7 +6389,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"debug@npm:^3.2.7":
+"debug@npm:^3.1.0, debug@npm:^3.2.7":
   version: 3.2.7
   resolution: "debug@npm:3.2.7"
   dependencies:
@@ -4173,6 +6398,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"debug@npm:^4.0.1":
+  version: 4.3.4
+  resolution: "debug@npm:4.3.4"
+  dependencies:
+    ms: 2.1.2
+  peerDependenciesMeta:
+    supports-color:
+      optional: true
+  checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708
+  languageName: node
+  linkType: hard
+
 "debuglog@npm:^1.0.1":
   version: 1.0.1
   resolution: "debuglog@npm:1.0.1"
@@ -4180,7 +6417,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"decamelize-keys@npm:^1.1.0":
+"decamelize-keys@npm:^1.0.0, decamelize-keys@npm:^1.1.0":
   version: 1.1.0
   resolution: "decamelize-keys@npm:1.1.0"
   dependencies:
@@ -4190,13 +6427,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"decamelize@npm:^1.1.0":
+"decamelize@npm:^1.1.0, decamelize@npm:^1.1.2, decamelize@npm:^1.2.0":
   version: 1.2.0
   resolution: "decamelize@npm:1.2.0"
   checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa
   languageName: node
   linkType: hard
 
+"decimal.js@npm:^10.2.1":
+  version: 10.3.1
+  resolution: "decimal.js@npm:10.3.1"
+  checksum: 0351ac9f05fe050f23227aa6a4573bee2d58fa7378fcf28d969a8c789525032effb488a90320fd3fe86a66e17b4bc507d811b15eada5b7f0e7ec5d2af4c24a59
+  languageName: node
+  linkType: hard
+
 "decode-uri-component@npm:^0.2.0":
   version: 0.2.0
   resolution: "decode-uri-component@npm:0.2.0"
@@ -4204,6 +6448,24 @@ __metadata:
   languageName: node
   linkType: hard
 
+"decompress-response@npm:^3.2.0, decompress-response@npm:^3.3.0":
+  version: 3.3.0
+  resolution: "decompress-response@npm:3.3.0"
+  dependencies:
+    mimic-response: ^1.0.0
+  checksum: 952552ac3bd7de2fc18015086b09468645c9638d98a551305e485230ada278c039c91116e946d07894b39ee53c0f0d5b6473f25a224029344354513b412d7380
+  languageName: node
+  linkType: hard
+
+"decompress-response@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "decompress-response@npm:5.0.0"
+  dependencies:
+    mimic-response: ^2.0.0
+  checksum: b46fe6c275b410e6dbf354083b42122b18eb6010c25aa19134f61934110269f715b2dfaf0089e3ef4e2acf5eb477193f8f5d42dbe3cc38adfc43fd090510c765
+  languageName: node
+  linkType: hard
+
 "decompress-response@npm:^6.0.0":
   version: 6.0.0
   resolution: "decompress-response@npm:6.0.0"
@@ -4213,6 +6475,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"dedent@npm:0.7.0, dedent@npm:^0.7.0":
+  version: 0.7.0
+  resolution: "dedent@npm:0.7.0"
+  checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2
+  languageName: node
+  linkType: hard
+
 "deep-extend@npm:^0.6.0":
   version: 0.6.0
   resolution: "deep-extend@npm:0.6.0"
@@ -4220,13 +6489,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"deep-is@npm:^0.1.3":
+"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3":
   version: 0.1.4
   resolution: "deep-is@npm:0.1.4"
   checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804
   languageName: node
   linkType: hard
 
+"deep-object-diff@npm:^1.1.7":
+  version: 1.1.7
+  resolution: "deep-object-diff@npm:1.1.7"
+  checksum: 543fb1ae87b138ad260691e6949e72bf7dc144825084b7ad1886bb725d2ace1c19ed1ef1280f1116243e86bf2c6b942f45c670958b1468f644613f28c5dc97ea
+  languageName: node
+  linkType: hard
+
 "deepmerge-ts@npm:^2.0.1":
   version: 2.0.1
   resolution: "deepmerge-ts@npm:2.0.1"
@@ -4236,6 +6512,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"deepmerge@npm:^4.2.2":
+  version: 4.2.2
+  resolution: "deepmerge@npm:4.2.2"
+  checksum: a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b
+  languageName: node
+  linkType: hard
+
 "defaults@npm:^1.0.3":
   version: 1.0.3
   resolution: "defaults@npm:1.0.3"
@@ -4245,6 +6528,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"defer-to-connect@npm:^1.0.1":
+  version: 1.1.3
+  resolution: "defer-to-connect@npm:1.1.3"
+  checksum: 9491b301dcfa04956f989481ba7a43c2231044206269eb4ab64a52d6639ee15b1252262a789eb4239fb46ab63e44d4e408641bae8e0793d640aee55398cb3930
+  languageName: node
+  linkType: hard
+
 "defer-to-connect@npm:^2.0.0":
   version: 2.0.1
   resolution: "defer-to-connect@npm:2.0.1"
@@ -4343,6 +6633,27 @@ __metadata:
   languageName: node
   linkType: hard
 
+"detect-file@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "detect-file@npm:1.0.0"
+  checksum: 1861e4146128622e847abe0e1ed80fef01e78532665858a792267adf89032b7a9c698436137707fcc6f02956c2a6a0052d6a0cef5be3d4b76b1ff0da88e2158a
+  languageName: node
+  linkType: hard
+
+"detect-indent@npm:6.0.0":
+  version: 6.0.0
+  resolution: "detect-indent@npm:6.0.0"
+  checksum: 0c38f362016e2d07af1c65b1ecd6ad8a91f06bfdd11383887c867a495ad286d04be2ab44027ac42444704d523982013115bd748c1541df7c9396ad76b22aaf5d
+  languageName: node
+  linkType: hard
+
+"detect-newline@npm:^3.0.0":
+  version: 3.1.0
+  resolution: "detect-newline@npm:3.1.0"
+  checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7
+  languageName: node
+  linkType: hard
+
 "dezalgo@npm:^1.0.0":
   version: 1.0.3
   resolution: "dezalgo@npm:1.0.3"
@@ -4353,8 +6664,22 @@ __metadata:
   languageName: node
   linkType: hard
 
-"diff@npm:^5.0.0":
-  version: 5.0.0
+"diff-sequences@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "diff-sequences@npm:27.5.1"
+  checksum: a00db5554c9da7da225db2d2638d85f8e41124eccbd56cbaefb3b276dcbb1c1c2ad851c32defe2055a54a4806f030656cbf6638105fd6ce97bb87b90b32a33ca
+  languageName: node
+  linkType: hard
+
+"diff@npm:^4.0.1":
+  version: 4.0.2
+  resolution: "diff@npm:4.0.2"
+  checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d
+  languageName: node
+  linkType: hard
+
+"diff@npm:^5.0.0":
+  version: 5.0.0
   resolution: "diff@npm:5.0.0"
   checksum: f19fe29284b633afdb2725c2a8bb7d25761ea54d321d8e67987ac851c5294be4afeab532bd84531e02583a3fe7f4014aa314a3eda84f5590e7a9e6b371ef3b46
   languageName: node
@@ -4432,6 +6757,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"domexception@npm:^2.0.1":
+  version: 2.0.1
+  resolution: "domexception@npm:2.0.1"
+  dependencies:
+    webidl-conversions: ^5.0.0
+  checksum: d638e9cb05c52999f1b2eb87c374b03311ea5b1d69c2f875bc92da73e17db60c12142b45c950228642ff7f845c536b65305483350d080df59003a653da80b691
+  languageName: node
+  linkType: hard
+
 "domhandler@npm:^4.0.0, domhandler@npm:^4.2.0":
   version: 4.3.1
   resolution: "domhandler@npm:4.3.1"
@@ -4452,6 +6786,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"dot-prop@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "dot-prop@npm:3.0.0"
+  dependencies:
+    is-obj: ^1.0.0
+  checksum: 7bc2735afc0b76387ccb9a437f80300e96a82d2863eb5cb14b30b1d6583a221a8589fd3a86cfdb8d8c877f36e44599f38560d4068db51ef563094d04ad7dfe64
+  languageName: node
+  linkType: hard
+
 "dot-prop@npm:^5.1.0":
   version: 5.3.0
   resolution: "dot-prop@npm:5.3.0"
@@ -4470,6 +6813,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"duplexer3@npm:^0.1.4":
+  version: 0.1.4
+  resolution: "duplexer3@npm:0.1.4"
+  checksum: c2fd6969314607d23439c583699aaa43c4100d66b3e161df55dccd731acc57d5c81a64bb4f250805fbe434ddb1d2623fee2386fb890f5886ca1298690ec53415
+  languageName: node
+  linkType: hard
+
 "duplexify@npm:^3.4.2, duplexify@npm:^3.6.0":
   version: 3.7.1
   resolution: "duplexify@npm:3.7.1"
@@ -4528,6 +6878,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"emittery@npm:^0.8.1":
+  version: 0.8.1
+  resolution: "emittery@npm:0.8.1"
+  checksum: 2457e8c7b0688bb006126f2c025b2655abe682f66b184954122a8a065b5277f9813d49d627896a10b076b81c513ec5f491fd9c14fbd42c04b95ca3c9f3c365ee
+  languageName: node
+  linkType: hard
+
 "emoji-regex@npm:^8.0.0":
   version: 8.0.0
   resolution: "emoji-regex@npm:8.0.0"
@@ -4578,6 +6935,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"enquirer@npm:^2.3.5, enquirer@npm:^2.3.6":
+  version: 2.3.6
+  resolution: "enquirer@npm:2.3.6"
+  dependencies:
+    ansi-colors: ^4.1.1
+  checksum: 1c0911e14a6f8d26721c91e01db06092a5f7675159f0261d69c403396a385afd13dd76825e7678f66daffa930cfaa8d45f506fb35f818a2788463d022af1b884
+  languageName: node
+  linkType: hard
+
 "entities@npm:^2.0.0":
   version: 2.2.0
   resolution: "entities@npm:2.2.0"
@@ -4621,7 +6987,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"error-ex@npm:^1.3.1":
+"error-ex@npm:^1.2.0, error-ex@npm:^1.3.1":
   version: 1.3.2
   resolution: "error-ex@npm:1.3.2"
   dependencies:
@@ -4894,6 +7260,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"escape-string-regexp@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "escape-string-regexp@npm:2.0.0"
+  checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395
+  languageName: node
+  linkType: hard
+
 "escape-string-regexp@npm:^3.0.0":
   version: 3.0.0
   resolution: "escape-string-regexp@npm:3.0.0"
@@ -4908,7 +7281,26 @@ __metadata:
   languageName: node
   linkType: hard
 
-"eslint-config-prettier@npm:^6.0.0":
+"escodegen@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "escodegen@npm:2.0.0"
+  dependencies:
+    esprima: ^4.0.1
+    estraverse: ^5.2.0
+    esutils: ^2.0.2
+    optionator: ^0.8.1
+    source-map: ~0.6.1
+  dependenciesMeta:
+    source-map:
+      optional: true
+  bin:
+    escodegen: bin/escodegen.js
+    esgenerate: bin/esgenerate.js
+  checksum: 5aa6b2966fafe0545e4e77936300cc94ad57cfe4dc4ebff9950492eaba83eef634503f12d7e3cbd644ecc1bab388ad0e92b06fd32222c9281a75d1cf02ec6cef
+  languageName: node
+  linkType: hard
+
+"eslint-config-prettier@npm:^6.0.0, eslint-config-prettier@npm:^6.11.0":
   version: 6.15.0
   resolution: "eslint-config-prettier@npm:6.15.0"
   dependencies:
@@ -4947,7 +7339,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"eslint-module-utils@npm:^2.7.2":
+"eslint-module-utils@npm:^2.7.2, eslint-module-utils@npm:^2.7.3":
   version: 2.7.3
   resolution: "eslint-module-utils@npm:2.7.3"
   dependencies:
@@ -4969,6 +7361,28 @@ __metadata:
   languageName: node
   linkType: hard
 
+"eslint-plugin-functional@npm:^3.0.2":
+  version: 3.7.2
+  resolution: "eslint-plugin-functional@npm:3.7.2"
+  dependencies:
+    "@typescript-eslint/experimental-utils": ^4.9.1
+    array.prototype.flatmap: ^1.2.4
+    deepmerge: ^4.2.2
+    escape-string-regexp: ^4.0.0
+    object.fromentries: ^2.0.3
+  peerDependencies:
+    eslint: ^5.0.0 || ^6.0.0 || ^7.0.0
+    tsutils: ^3.0.0
+    typescript: ^3.4.1 || ^4.0.0
+  peerDependenciesMeta:
+    tsutils:
+      optional: true
+    typescript:
+      optional: true
+  checksum: 7aa0f4306627bf2a8f7ef486e8eb956b2fe161fc9ce5ffc011ec22a714c5a621316ae08c85f81061aa31c6ec94a234c2fdc1c97c99653b591a2778d161d5f90f
+  languageName: node
+  linkType: hard
+
 "eslint-plugin-functional@npm:^4.2.0":
   version: 4.2.0
   resolution: "eslint-plugin-functional@npm:4.2.0"
@@ -4989,6 +7403,29 @@ __metadata:
   languageName: node
   linkType: hard
 
+"eslint-plugin-import@npm:^2.22.0":
+  version: 2.26.0
+  resolution: "eslint-plugin-import@npm:2.26.0"
+  dependencies:
+    array-includes: ^3.1.4
+    array.prototype.flat: ^1.2.5
+    debug: ^2.6.9
+    doctrine: ^2.1.0
+    eslint-import-resolver-node: ^0.3.6
+    eslint-module-utils: ^2.7.3
+    has: ^1.0.3
+    is-core-module: ^2.8.1
+    is-glob: ^4.0.3
+    minimatch: ^3.1.2
+    object.values: ^1.1.5
+    resolve: ^1.22.0
+    tsconfig-paths: ^3.14.1
+  peerDependencies:
+    eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
+  checksum: 0bf77ad80339554481eafa2b1967449e1f816b94c7a6f9614ce33fb4083c4e6c050f10d241dd50b4975d47922880a34de1e42ea9d8e6fd663ebb768baa67e655
+  languageName: node
+  linkType: hard
+
 "eslint-plugin-import@npm:^2.25.4":
   version: 2.25.4
   resolution: "eslint-plugin-import@npm:2.25.4"
@@ -5071,6 +7508,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"eslint-utils@npm:^2.1.0":
+  version: 2.1.0
+  resolution: "eslint-utils@npm:2.1.0"
+  dependencies:
+    eslint-visitor-keys: ^1.1.0
+  checksum: 27500938f348da42100d9e6ad03ae29b3de19ba757ae1a7f4a087bdcf83ac60949bbb54286492ca61fac1f5f3ac8692dd21537ce6214240bf95ad0122f24d71d
+  languageName: node
+  linkType: hard
+
 "eslint-utils@npm:^3.0.0":
   version: 3.0.0
   resolution: "eslint-utils@npm:3.0.0"
@@ -5082,7 +7528,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"eslint-visitor-keys@npm:^1.1.0":
+"eslint-visitor-keys@npm:^1.1.0, eslint-visitor-keys@npm:^1.3.0":
   version: 1.3.0
   resolution: "eslint-visitor-keys@npm:1.3.0"
   checksum: 37a19b712f42f4c9027e8ba98c2b06031c17e0c0a4c696cd429bd9ee04eb43889c446f2cd545e1ff51bef9593fcec94ecd2c2ef89129fcbbf3adadbef520376a
@@ -5103,6 +7549,56 @@ __metadata:
   languageName: node
   linkType: hard
 
+"eslint@npm:^7.8.0":
+  version: 7.32.0
+  resolution: "eslint@npm:7.32.0"
+  dependencies:
+    "@babel/code-frame": 7.12.11
+    "@eslint/eslintrc": ^0.4.3
+    "@humanwhocodes/config-array": ^0.5.0
+    ajv: ^6.10.0
+    chalk: ^4.0.0
+    cross-spawn: ^7.0.2
+    debug: ^4.0.1
+    doctrine: ^3.0.0
+    enquirer: ^2.3.5
+    escape-string-regexp: ^4.0.0
+    eslint-scope: ^5.1.1
+    eslint-utils: ^2.1.0
+    eslint-visitor-keys: ^2.0.0
+    espree: ^7.3.1
+    esquery: ^1.4.0
+    esutils: ^2.0.2
+    fast-deep-equal: ^3.1.3
+    file-entry-cache: ^6.0.1
+    functional-red-black-tree: ^1.0.1
+    glob-parent: ^5.1.2
+    globals: ^13.6.0
+    ignore: ^4.0.6
+    import-fresh: ^3.0.0
+    imurmurhash: ^0.1.4
+    is-glob: ^4.0.0
+    js-yaml: ^3.13.1
+    json-stable-stringify-without-jsonify: ^1.0.1
+    levn: ^0.4.1
+    lodash.merge: ^4.6.2
+    minimatch: ^3.0.4
+    natural-compare: ^1.4.0
+    optionator: ^0.9.1
+    progress: ^2.0.0
+    regexpp: ^3.1.0
+    semver: ^7.2.1
+    strip-ansi: ^6.0.0
+    strip-json-comments: ^3.1.0
+    table: ^6.0.9
+    text-table: ^0.2.0
+    v8-compile-cache: ^2.0.3
+  bin:
+    eslint: bin/eslint.js
+  checksum: cc85af9985a3a11085c011f3d27abe8111006d34cc274291b3c4d7bea51a4e2ff6135780249becd919ba7f6d6d1ecc38a6b73dacb6a7be08d38453b344dc8d37
+  languageName: node
+  linkType: hard
+
 "eslint@npm:^8.11.0":
   version: 8.11.0
   resolution: "eslint@npm:8.11.0"
@@ -5159,6 +7655,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"espree@npm:^7.3.0, espree@npm:^7.3.1":
+  version: 7.3.1
+  resolution: "espree@npm:7.3.1"
+  dependencies:
+    acorn: ^7.4.0
+    acorn-jsx: ^5.3.1
+    eslint-visitor-keys: ^1.3.0
+  checksum: aa9b50dcce883449af2e23bc2b8d9abb77118f96f4cb313935d6b220f77137eaef7724a83c3f6243b96bc0e4ab14766198e60818caad99f9519ae5a336a39b45
+  languageName: node
+  linkType: hard
+
 "espree@npm:^9.0.0, espree@npm:^9.3.1":
   version: 9.3.1
   resolution: "espree@npm:9.3.1"
@@ -5170,7 +7677,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"esprima@npm:^4.0.1, esprima@npm:~4.0.0":
+"esprima@npm:^4.0.0, esprima@npm:^4.0.1, esprima@npm:~4.0.0":
   version: 4.0.1
   resolution: "esprima@npm:4.0.1"
   bin:
@@ -5212,6 +7719,27 @@ __metadata:
   languageName: node
   linkType: hard
 
+"estree-walker@npm:^0.5.2":
+  version: 0.5.2
+  resolution: "estree-walker@npm:0.5.2"
+  checksum: c0beb0a6c016c888337437204d0d0a2677aab623abd1da2d18bf4257fceb9ec38f9772b58b53d7144937e2a5324fd26bfe7a822c18b23f45061f74c5296ec96a
+  languageName: node
+  linkType: hard
+
+"estree-walker@npm:^0.6.1":
+  version: 0.6.1
+  resolution: "estree-walker@npm:0.6.1"
+  checksum: 9d6f82a4921f11eec18f8089fb3cce6e53bcf45a8e545c42a2674d02d055fb30f25f90495f8be60803df6c39680c80dcee7f944526867eb7aa1fc9254883b23d
+  languageName: node
+  linkType: hard
+
+"estree-walker@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "estree-walker@npm:1.0.1"
+  checksum: 7e70da539691f6db03a08e7ce94f394ce2eef4180e136d251af299d41f92fb2d28ebcd9a6e393e3728d7970aeb5358705ddf7209d52fbcb2dd4693f95dcf925f
+  languageName: node
+  linkType: hard
+
 "estree-walker@npm:^2.0.1":
   version: 2.0.2
   resolution: "estree-walker@npm:2.0.2"
@@ -5298,6 +7826,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"exit@npm:^0.1.2":
+  version: 0.1.2
+  resolution: "exit@npm:0.1.2"
+  checksum: abc407f07a875c3961e4781dfcb743b58d6c93de9ab263f4f8c9d23bb6da5f9b7764fc773f86b43dd88030444d5ab8abcb611cb680fba8ca075362b77114bba3
+  languageName: node
+  linkType: hard
+
 "expand-brackets@npm:^2.1.4":
   version: 2.1.4
   resolution: "expand-brackets@npm:2.1.4"
@@ -5313,6 +7848,27 @@ __metadata:
   languageName: node
   linkType: hard
 
+"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2":
+  version: 2.0.2
+  resolution: "expand-tilde@npm:2.0.2"
+  dependencies:
+    homedir-polyfill: ^1.0.1
+  checksum: 2efe6ed407d229981b1b6ceb552438fbc9e5c7d6a6751ad6ced3e0aa5cf12f0b299da695e90d6c2ac79191b5c53c613e508f7149e4573abfbb540698ddb7301a
+  languageName: node
+  linkType: hard
+
+"expect@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "expect@npm:27.5.1"
+  dependencies:
+    "@jest/types": ^27.5.1
+    jest-get-type: ^27.5.1
+    jest-matcher-utils: ^27.5.1
+    jest-message-util: ^27.5.1
+  checksum: b2c66beb52de53ef1872165aace40224e722bca3c2274c54cfa74b6d617d55cf0ccdbf36783ccd64dbea501b280098ed33fd0b207d4f15bc03cd3c7a24364a6a
+  languageName: node
+  linkType: hard
+
 "extend-shallow@npm:^2.0.1":
   version: 2.0.1
   resolution: "extend-shallow@npm:2.0.1"
@@ -5380,6 +7936,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"eyes@npm:0.1.x":
+  version: 0.1.8
+  resolution: "eyes@npm:0.1.8"
+  checksum: c31703a92bf36ba75ee8d379ee7985c24ee6149f3a6175f44cec7a05b178c38bce9836d3ca48c9acb0329a960ac2c4b2ead4e60cdd4fe6e8c92cad7cd6913687
+  languageName: node
+  linkType: hard
+
 "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3":
   version: 3.1.3
   resolution: "fast-deep-equal@npm:3.1.3"
@@ -5421,14 +7984,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"fast-json-stable-stringify@npm:^2.0.0":
+"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0":
   version: 2.1.0
   resolution: "fast-json-stable-stringify@npm:2.1.0"
   checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb
   languageName: node
   linkType: hard
 
-"fast-levenshtein@npm:^2.0.6":
+"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6":
   version: 2.0.6
   resolution: "fast-levenshtein@npm:2.0.6"
   checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c
@@ -5451,6 +8014,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"fb-watchman@npm:^2.0.0":
+  version: 2.0.1
+  resolution: "fb-watchman@npm:2.0.1"
+  dependencies:
+    bser: 2.1.1
+  checksum: 8510230778ab3a51c27dffb1b76ef2c24fab672a42742d3c0a45c2e9d1e5f20210b1fbca33486088da4a9a3958bde96b5aec0a63aac9894b4e9df65c88b2cbd6
+  languageName: node
+  linkType: hard
+
 "figgy-pudding@npm:^3.5.1":
   version: 3.5.2
   resolution: "figgy-pudding@npm:3.5.2"
@@ -5549,6 +8121,34 @@ __metadata:
   languageName: node
   linkType: hard
 
+"find-cache-dir@npm:^3.3.1":
+  version: 3.3.2
+  resolution: "find-cache-dir@npm:3.3.2"
+  dependencies:
+    commondir: ^1.0.1
+    make-dir: ^3.0.2
+    pkg-dir: ^4.1.0
+  checksum: 1e61c2e64f5c0b1c535bd85939ae73b0e5773142713273818cc0b393ee3555fb0fd44e1a5b161b8b6c3e03e98c2fcc9c227d784850a13a90a8ab576869576817
+  languageName: node
+  linkType: hard
+
+"find-node-modules@npm:^2.1.2":
+  version: 2.1.3
+  resolution: "find-node-modules@npm:2.1.3"
+  dependencies:
+    findup-sync: ^4.0.0
+    merge: ^2.1.1
+  checksum: 4b8a194ffd56ccf1a1033de35e2ee8209869b05cce68ff7c4ab0dbf04e63fd7196283383eee4c84596c7b311755b2836815209d558234cadc330a87881e5a3f4
+  languageName: node
+  linkType: hard
+
+"find-root@npm:1.1.0":
+  version: 1.1.0
+  resolution: "find-root@npm:1.1.0"
+  checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf
+  languageName: node
+  linkType: hard
+
 "find-up@npm:^1.0.0":
   version: 1.1.2
   resolution: "find-up@npm:1.1.2"
@@ -5577,7 +8177,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"find-up@npm:^4.1.0":
+"find-up@npm:^4.0.0, find-up@npm:^4.1.0":
   version: 4.1.0
   resolution: "find-up@npm:4.1.0"
   dependencies:
@@ -5587,6 +8187,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"find-up@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "find-up@npm:5.0.0"
+  dependencies:
+    locate-path: ^6.0.0
+    path-exists: ^4.0.0
+  checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095
+  languageName: node
+  linkType: hard
+
 "find-versions@npm:^4.0.0":
   version: 4.0.0
   resolution: "find-versions@npm:4.0.0"
@@ -5596,6 +8206,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"findup-sync@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "findup-sync@npm:4.0.0"
+  dependencies:
+    detect-file: ^1.0.0
+    is-glob: ^4.0.0
+    micromatch: ^4.0.2
+    resolve-dir: ^1.0.1
+  checksum: 94131e1107ad63790ed00c4c39ca131a93ea602607bd97afeffd92b69a9a63cf2c6f57d6db88cb753fe748ac7fde79e1e76768ff784247026b7c5ebf23ede3a0
+  languageName: node
+  linkType: hard
+
 "flat-cache@npm:^3.0.4":
   version: 3.0.4
   resolution: "flat-cache@npm:3.0.4"
@@ -5647,6 +8269,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"form-data@npm:^3.0.0":
+  version: 3.0.1
+  resolution: "form-data@npm:3.0.1"
+  dependencies:
+    asynckit: ^0.4.0
+    combined-stream: ^1.0.8
+    mime-types: ^2.1.12
+  checksum: b019e8d35c8afc14a2bd8a7a92fa4f525a4726b6d5a9740e8d2623c30e308fbb58dc8469f90415a856698933c8479b01646a9dff33c87cc4e76d72aedbbf860d
+  languageName: node
+  linkType: hard
+
 "form-data@npm:^4.0.0":
   version: 4.0.0
   resolution: "form-data@npm:4.0.0"
@@ -5695,6 +8328,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"fs-extra@npm:8.1.0":
+  version: 8.1.0
+  resolution: "fs-extra@npm:8.1.0"
+  dependencies:
+    graceful-fs: ^4.2.0
+    jsonfile: ^4.0.0
+    universalify: ^0.1.0
+  checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880
+  languageName: node
+  linkType: hard
+
 "fs-extra@npm:^10.0.0":
   version: 10.0.1
   resolution: "fs-extra@npm:10.0.1"
@@ -5706,7 +8350,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"fs-extra@npm:^9.1.0":
+"fs-extra@npm:^9.0.0, fs-extra@npm:^9.1.0":
   version: 9.1.0
   resolution: "fs-extra@npm:9.1.0"
   dependencies:
@@ -5757,7 +8401,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"fsevents@npm:~2.3.2":
+"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2":
   version: 2.3.2
   resolution: "fsevents@npm:2.3.2"
   dependencies:
@@ -5777,7 +8421,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>":
+"fsevents@patch:fsevents@^2.3.2#~builtin<compat/fsevents>, fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>":
   version: 2.3.2
   resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin<compat/fsevents>::version=2.3.2&hash=18f3a7"
   dependencies:
@@ -5841,6 +8485,56 @@ __metadata:
   languageName: node
   linkType: hard
 
+"get-own-enumerable-property-symbols@npm:^3.0.0":
+  version: 3.0.2
+  resolution: "get-own-enumerable-property-symbols@npm:3.0.2"
+  checksum: 8f0331f14159f939830884799f937343c8c0a2c330506094bc12cbee3665d88337fe97a4ea35c002cc2bdba0f5d9975ad7ec3abb925015cdf2a93e76d4759ede
+  languageName: node
+  linkType: hard
+
+"get-package-type@npm:^0.1.0":
+  version: 0.1.0
+  resolution: "get-package-type@npm:0.1.0"
+  checksum: bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148
+  languageName: node
+  linkType: hard
+
+"get-pkg-repo@npm:^1.0.0":
+  version: 1.4.0
+  resolution: "get-pkg-repo@npm:1.4.0"
+  dependencies:
+    hosted-git-info: ^2.1.4
+    meow: ^3.3.0
+    normalize-package-data: ^2.3.0
+    parse-github-repo-url: ^1.3.0
+    through2: ^2.0.0
+  bin:
+    get-pkg-repo: cli.js
+  checksum: c81dd33b33db7cc0bc5700440d678349773d8cf363935d71bae6a1a67f20dccb78c241a56587c36920a4372a3437571d93425819e7e6f030920d0a407c18fc34
+  languageName: node
+  linkType: hard
+
+"get-pkg-repo@npm:^4.0.2":
+  version: 4.2.1
+  resolution: "get-pkg-repo@npm:4.2.1"
+  dependencies:
+    "@hutson/parse-repository-url": ^3.0.0
+    hosted-git-info: ^4.0.0
+    through2: ^2.0.0
+    yargs: ^16.2.0
+  bin:
+    get-pkg-repo: src/cli.js
+  checksum: 5abf169137665e45b09a857b33ad2fdcf2f4a09f0ecbd0ebdd789a7ce78c39186a21f58621127eb724d2d4a3a7ee8e6bd4ac7715efda01ad5200665afc218e0d
+  languageName: node
+  linkType: hard
+
+"get-stdin@npm:^4.0.1":
+  version: 4.0.1
+  resolution: "get-stdin@npm:4.0.1"
+  checksum: 4f73d3fe0516bc1f3dc7764466a68ad7c2ba809397a02f56c2a598120e028430fcff137a648a01876b2adfb486b4bc164119f98f1f7d7c0abd63385bdaa0113f
+  languageName: node
+  linkType: hard
+
 "get-stdin@npm:^6.0.0":
   version: 6.0.0
   resolution: "get-stdin@npm:6.0.0"
@@ -5855,7 +8549,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"get-stream@npm:^4.0.0":
+"get-stream@npm:^4.0.0, get-stream@npm:^4.1.0":
   version: 4.1.0
   resolution: "get-stream@npm:4.1.0"
   dependencies:
@@ -5864,7 +8558,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"get-stream@npm:^5.1.0":
+"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0":
   version: 5.2.0
   resolution: "get-stream@npm:5.2.0"
   dependencies:
@@ -5920,44 +8614,157 @@ __metadata:
   languageName: node
   linkType: hard
 
-"glob-parent@npm:^3.1.0":
-  version: 3.1.0
-  resolution: "glob-parent@npm:3.1.0"
+"git-raw-commits@npm:2.0.0":
+  version: 2.0.0
+  resolution: "git-raw-commits@npm:2.0.0"
   dependencies:
-    is-glob: ^3.1.0
-    path-dirname: ^1.0.0
-  checksum: 653d559237e89a11b9934bef3f392ec42335602034c928590544d383ff5ef449f7b12f3cfa539708e74bc0a6c28ab1fe51d663cc07463cdf899ba92afd85a855
+    dargs: ^4.0.1
+    lodash.template: ^4.0.2
+    meow: ^4.0.0
+    split2: ^2.0.0
+    through2: ^2.0.0
+  bin:
+    git-raw-commits: cli.js
+  checksum: eeca8f4440bacfb9bda300583a4fa9b17183c46197ee5dda7369b30421ee9006ff311d18115db758262d55b48a52639a54ff9945444eb2590b9216deb8aa4ab2
   languageName: node
   linkType: hard
 
-"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2":
-  version: 5.1.2
-  resolution: "glob-parent@npm:5.1.2"
+"git-raw-commits@npm:^2.0.0, git-raw-commits@npm:^2.0.8":
+  version: 2.0.11
+  resolution: "git-raw-commits@npm:2.0.11"
   dependencies:
-    is-glob: ^4.0.1
-  checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e
+    dargs: ^7.0.0
+    lodash: ^4.17.15
+    meow: ^8.0.0
+    split2: ^3.0.0
+    through2: ^4.0.0
+  bin:
+    git-raw-commits: cli.js
+  checksum: c178af43633684106179793b6e3473e1d2bb50bb41d04e2e285ea4eef342ca4090fee6bc8a737552fde879d22346c90de5c49f18c719a0f38d4c934f258a0f79
   languageName: node
   linkType: hard
 
-"glob-parent@npm:^6.0.1":
-  version: 6.0.2
-  resolution: "glob-parent@npm:6.0.2"
+"git-remote-origin-url@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "git-remote-origin-url@npm:2.0.0"
   dependencies:
-    is-glob: ^4.0.3
-  checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8
+    gitconfiglocal: ^1.0.0
+    pify: ^2.3.0
+  checksum: 85263a09c044b5f4fe2acc45cbb3c5331ab2bd4484bb53dfe7f3dd593a4bf90a9786a2e00b9884524331f50b3da18e8c924f01c2944087fc7f342282c4437b73
   languageName: node
   linkType: hard
 
-"glob-to-regexp@npm:^0.3.0":
-  version: 0.3.0
-  resolution: "glob-to-regexp@npm:0.3.0"
-  checksum: d34b3219d860042d508c4893b67617cd16e2668827e445ff39cff9f72ef70361d3dc24f429e003cdfb6607c75c9664b8eadc41d2eeb95690af0b0d3113c1b23b
+"git-remote-origin-url@npm:^3.0.0":
+  version: 3.1.0
+  resolution: "git-remote-origin-url@npm:3.1.0"
+  dependencies:
+    gitconfiglocal: ^2.1.0
+  checksum: 32d5e1cb4f1fc7a3ac5b8a1d3f71ea1aa2020eeb6ed5bf0722d704a97cfeaf3681d861f89cd181508f4e3e943e0d0b750e008d99e9db5b65f4a2be223e2ea490
   languageName: node
   linkType: hard
 
-"glob@npm:*, glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.2.0":
-  version: 7.2.0
-  resolution: "glob@npm:7.2.0"
+"git-semver-tags@npm:^2.0.0, git-semver-tags@npm:^2.0.3":
+  version: 2.0.3
+  resolution: "git-semver-tags@npm:2.0.3"
+  dependencies:
+    meow: ^4.0.0
+    semver: ^6.0.0
+  bin:
+    git-semver-tags: cli.js
+  checksum: b72483e7cafc469b9682c1dce6b758612052cac04fb29da123160d88ed4a68a870b707ae6da2b26e8f426a8224438f9d207b7ee244b615804927472dbb0bbb2e
+  languageName: node
+  linkType: hard
+
+"git-semver-tags@npm:^3.0.1":
+  version: 3.0.1
+  resolution: "git-semver-tags@npm:3.0.1"
+  dependencies:
+    meow: ^5.0.0
+    semver: ^6.0.0
+  bin:
+    git-semver-tags: cli.js
+  checksum: 0c62643c5929082d145ca48106e869379d90604716defd7127dff1eebca7664a0d8695266aee0a0dd41a31d5297aea88cbd1cfb5d525416fbbd5d27131f7009e
+  languageName: node
+  linkType: hard
+
+"git-semver-tags@npm:^4.1.1":
+  version: 4.1.1
+  resolution: "git-semver-tags@npm:4.1.1"
+  dependencies:
+    meow: ^8.0.0
+    semver: ^6.0.0
+  bin:
+    git-semver-tags: cli.js
+  checksum: e16d02a515c0f88289a28b5bf59bf42c0dc053765922d3b617ae4b50546bd4f74a25bf3ad53b91cb6c1159319a2e92533b160c573b856c2629125c8b26b3b0e3
+  languageName: node
+  linkType: hard
+
+"gitconfiglocal@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "gitconfiglocal@npm:1.0.0"
+  dependencies:
+    ini: ^1.3.2
+  checksum: e6d2764c15bbab6d1d1000d1181bb907f6b3796bb04f63614dba571b18369e0ecb1beaf27ce8da5b24307ef607e3a5f262a67cb9575510b9446aac697d421beb
+  languageName: node
+  linkType: hard
+
+"gitconfiglocal@npm:^2.1.0":
+  version: 2.1.0
+  resolution: "gitconfiglocal@npm:2.1.0"
+  dependencies:
+    ini: ^1.3.2
+  checksum: 4b4b44d992a6abf2900eec8cfe960dc36e0d3c2467d20ec69e0a0f13b6b7645b926daa004df42f94c34ad28a58529cf2522fa0bf261e4e7b95958fb451dcedda
+  languageName: node
+  linkType: hard
+
+"gl-got@npm:^8.0.0":
+  version: 8.0.0
+  resolution: "gl-got@npm:8.0.0"
+  dependencies:
+    got: ^7.0.0
+    is-plain-obj: ^1.1.0
+  checksum: 6798ac28716f0257fdc1570f750d572739c039722dfa203467e3b987e2cc8669bc211f2d699b7f600bffb9443fbfe0eb55cc74195de7e7f3dc258e73f0e0cc32
+  languageName: node
+  linkType: hard
+
+"glob-parent@npm:^3.1.0":
+  version: 3.1.0
+  resolution: "glob-parent@npm:3.1.0"
+  dependencies:
+    is-glob: ^3.1.0
+    path-dirname: ^1.0.0
+  checksum: 653d559237e89a11b9934bef3f392ec42335602034c928590544d383ff5ef449f7b12f3cfa539708e74bc0a6c28ab1fe51d663cc07463cdf899ba92afd85a855
+  languageName: node
+  linkType: hard
+
+"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2":
+  version: 5.1.2
+  resolution: "glob-parent@npm:5.1.2"
+  dependencies:
+    is-glob: ^4.0.1
+  checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e
+  languageName: node
+  linkType: hard
+
+"glob-parent@npm:^6.0.1":
+  version: 6.0.2
+  resolution: "glob-parent@npm:6.0.2"
+  dependencies:
+    is-glob: ^4.0.3
+  checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8
+  languageName: node
+  linkType: hard
+
+"glob-to-regexp@npm:^0.3.0":
+  version: 0.3.0
+  resolution: "glob-to-regexp@npm:0.3.0"
+  checksum: d34b3219d860042d508c4893b67617cd16e2668827e445ff39cff9f72ef70361d3dc24f429e003cdfb6607c75c9664b8eadc41d2eeb95690af0b0d3113c1b23b
+  languageName: node
+  linkType: hard
+
+"glob@npm:*, glob@npm:^7.0.0, glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.1.7, glob@npm:^7.2.0":
+  version: 7.2.0
+  resolution: "glob@npm:7.2.0"
   dependencies:
     fs.realpath: ^1.0.0
     inflight: ^1.0.4
@@ -5969,6 +8776,53 @@ __metadata:
   languageName: node
   linkType: hard
 
+"glob@npm:7.1.4":
+  version: 7.1.4
+  resolution: "glob@npm:7.1.4"
+  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
+  checksum: f52480fc82b1e66e52990f0f2e7306447d12294c83fbbee0395e761ad1178172012a7cc0673dbf4810baac400fc09bf34484c08b5778c216403fd823db281716
+  languageName: node
+  linkType: hard
+
+"global-dirs@npm:^0.1.1":
+  version: 0.1.1
+  resolution: "global-dirs@npm:0.1.1"
+  dependencies:
+    ini: ^1.3.4
+  checksum: 10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a
+  languageName: node
+  linkType: hard
+
+"global-modules@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "global-modules@npm:1.0.0"
+  dependencies:
+    global-prefix: ^1.0.1
+    is-windows: ^1.0.1
+    resolve-dir: ^1.0.0
+  checksum: 10be68796c1e1abc1e2ba87ec4ea507f5629873b119ab0cd29c07284ef2b930f1402d10df01beccb7391dedd9cd479611dd6a24311c71be58937beaf18edf85e
+  languageName: node
+  linkType: hard
+
+"global-prefix@npm:^1.0.1":
+  version: 1.0.2
+  resolution: "global-prefix@npm:1.0.2"
+  dependencies:
+    expand-tilde: ^2.0.2
+    homedir-polyfill: ^1.0.1
+    ini: ^1.3.4
+    is-windows: ^1.0.1
+    which: ^1.2.14
+  checksum: 061b43470fe498271bcd514e7746e8a8535032b17ab9570517014ae27d700ff0dca749f76bbde13ba384d185be4310d8ba5712cb0e74f7d54d59390db63dd9a0
+  languageName: node
+  linkType: hard
+
 "globals@npm:^11.1.0":
   version: 11.12.0
   resolution: "globals@npm:11.12.0"
@@ -5985,7 +8839,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.4":
+"globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.3, globby@npm:^11.0.4":
   version: 11.1.0
   resolution: "globby@npm:11.1.0"
   dependencies:
@@ -6015,6 +8869,29 @@ __metadata:
   languageName: node
   linkType: hard
 
+"got@npm:^10.5.2":
+  version: 10.7.0
+  resolution: "got@npm:10.7.0"
+  dependencies:
+    "@sindresorhus/is": ^2.0.0
+    "@szmarczak/http-timer": ^4.0.0
+    "@types/cacheable-request": ^6.0.1
+    cacheable-lookup: ^2.0.0
+    cacheable-request: ^7.0.1
+    decompress-response: ^5.0.0
+    duplexer3: ^0.1.4
+    get-stream: ^5.0.0
+    lowercase-keys: ^2.0.0
+    mimic-response: ^2.1.0
+    p-cancelable: ^2.0.0
+    p-event: ^4.0.0
+    responselike: ^2.0.0
+    to-readable-stream: ^2.0.0
+    type-fest: ^0.10.0
+  checksum: 66feaec071b2dac412bfff3786a67d144a4bf615115ef70ac7e1db1e2a640bd02dcfbc60c55de11c8ee00f069df06f1de9d462446e56b09e4ade332ca2db7cd0
+  languageName: node
+  linkType: hard
+
 "got@npm:^11.0.0":
   version: 11.8.3
   resolution: "got@npm:11.8.3"
@@ -6034,6 +8911,47 @@ __metadata:
   languageName: node
   linkType: hard
 
+"got@npm:^7.0.0":
+  version: 7.1.0
+  resolution: "got@npm:7.1.0"
+  dependencies:
+    decompress-response: ^3.2.0
+    duplexer3: ^0.1.4
+    get-stream: ^3.0.0
+    is-plain-obj: ^1.1.0
+    is-retry-allowed: ^1.0.0
+    is-stream: ^1.0.0
+    isurl: ^1.0.0-alpha5
+    lowercase-keys: ^1.0.0
+    p-cancelable: ^0.3.0
+    p-timeout: ^1.1.1
+    safe-buffer: ^5.0.1
+    timed-out: ^4.0.0
+    url-parse-lax: ^1.0.0
+    url-to-options: ^1.0.1
+  checksum: 0270472a389bdca67e60d36cccd014e502d1797d925c06ea2ef372fb41ae99c9e25ac4f187cc422760b4a66abb5478f8821b8134b4eaefe0bf5183daeded5e2f
+  languageName: node
+  linkType: hard
+
+"got@npm:^9.6.0":
+  version: 9.6.0
+  resolution: "got@npm:9.6.0"
+  dependencies:
+    "@sindresorhus/is": ^0.14.0
+    "@szmarczak/http-timer": ^1.1.2
+    cacheable-request: ^6.0.0
+    decompress-response: ^3.3.0
+    duplexer3: ^0.1.4
+    get-stream: ^4.1.0
+    lowercase-keys: ^1.0.1
+    mimic-response: ^1.0.1
+    p-cancelable: ^1.0.0
+    to-readable-stream: ^1.0.0
+    url-parse-lax: ^3.0.0
+  checksum: 941807bd9704bacf5eb401f0cc1212ffa1f67c6642f2d028fd75900471c221b1da2b8527f4553d2558f3faeda62ea1cf31665f8b002c6137f5de8732f07370b0
+  languageName: node
+  linkType: hard
+
 "graceful-fs@npm:*, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9":
   version: 4.2.9
   resolution: "graceful-fs@npm:4.2.9"
@@ -6041,7 +8959,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"handlebars@npm:^4.7.7":
+"handlebars@npm:^4.7.6, handlebars@npm:^4.7.7":
   version: 4.7.7
   resolution: "handlebars@npm:4.7.7"
   dependencies:
@@ -6111,6 +9029,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"has-symbol-support-x@npm:^1.4.1":
+  version: 1.4.2
+  resolution: "has-symbol-support-x@npm:1.4.2"
+  checksum: ff06631d556d897424c00e8e79c10093ad34c93e88bb0563932d7837f148a4c90a4377abc5d8da000cb6637c0ecdb4acc9ae836c7cfd0ffc919986db32097609
+  languageName: node
+  linkType: hard
+
 "has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2":
   version: 1.0.3
   resolution: "has-symbols@npm:1.0.3"
@@ -6118,6 +9043,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"has-to-string-tag-x@npm:^1.2.0":
+  version: 1.4.1
+  resolution: "has-to-string-tag-x@npm:1.4.1"
+  dependencies:
+    has-symbol-support-x: ^1.4.1
+  checksum: 804c4505727be7770f8b2f5e727ce31c9affc5b83df4ce12344f44b68d557fefb31f77751dbd739de900653126bcd71f8842fac06f97a3fae5422685ab0ce6f0
+  languageName: node
+  linkType: hard
+
 "has-tostringtag@npm:^1.0.0":
   version: 1.0.0
   resolution: "has-tostringtag@npm:1.0.0"
@@ -6237,6 +9171,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"homedir-polyfill@npm:^1.0.1":
+  version: 1.0.3
+  resolution: "homedir-polyfill@npm:1.0.3"
+  dependencies:
+    parse-passwd: ^1.0.0
+  checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250
+  languageName: node
+  linkType: hard
+
 "hook-std@npm:^2.0.0":
   version: 2.0.0
   resolution: "hook-std@npm:2.0.0"
@@ -6269,6 +9212,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"html-encoding-sniffer@npm:^2.0.1":
+  version: 2.0.1
+  resolution: "html-encoding-sniffer@npm:2.0.1"
+  dependencies:
+    whatwg-encoding: ^1.0.5
+  checksum: bf30cce461015ed7e365736fcd6a3063c7bc016a91f74398ef6158886970a96333938f7c02417ab3c12aa82e3e53b40822145facccb9ddfbcdc15a879ae4d7ba
+  languageName: node
+  linkType: hard
+
+"html-escaper@npm:^2.0.0":
+  version: 2.0.2
+  resolution: "html-escaper@npm:2.0.2"
+  checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974
+  languageName: node
+  linkType: hard
+
 "html-tags@npm:^2.0.0":
   version: 2.0.0
   resolution: "html-tags@npm:2.0.0"
@@ -6302,6 +9261,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"http-proxy-agent@npm:^4.0.0, http-proxy-agent@npm:^4.0.1":
+  version: 4.0.1
+  resolution: "http-proxy-agent@npm:4.0.1"
+  dependencies:
+    "@tootallnate/once": 1
+    agent-base: 6
+    debug: 4
+  checksum: c6a5da5a1929416b6bbdf77b1aca13888013fe7eb9d59fc292e25d18e041bb154a8dfada58e223fc7b76b9b2d155a87e92e608235201f77d34aa258707963a82
+  languageName: node
+  linkType: hard
+
 "http-proxy-agent@npm:^5.0.0":
   version: 5.0.0
   resolution: "http-proxy-agent@npm:5.0.0"
@@ -6374,7 +9344,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"iconv-lite@npm:^0.4.24":
+"husky@npm:^7.0.2":
+  version: 7.0.4
+  resolution: "husky@npm:7.0.4"
+  bin:
+    husky: lib/bin.js
+  checksum: c6ec4af63da2c9522da8674a20ad9b48362cc92704896cc8a58c6a2a39d797feb2b806f93fbd83a6d653fbdceb2c3b6e0b602c6b2e8565206ffc2882ef7db9e9
+  languageName: node
+  linkType: hard
+
+"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24":
   version: 0.4.24
   resolution: "iconv-lite@npm:0.4.24"
   dependencies:
@@ -6415,7 +9394,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ignore@npm:^4.0.3":
+"ignore@npm:^4.0.3, ignore@npm:^4.0.6":
   version: 4.0.6
   resolution: "ignore@npm:4.0.6"
   checksum: 248f82e50a430906f9ee7f35e1158e3ec4c3971451dd9f99c9bc1548261b4db2b99709f60ac6c6cac9333494384176cc4cc9b07acbe42d52ac6a09cad734d800
@@ -6453,6 +9432,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"import-from@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "import-from@npm:3.0.0"
+  dependencies:
+    resolve-from: ^5.0.0
+  checksum: 5040a7400e77e41e2c3bb6b1b123b52a15a284de1ffc03d605879942c00e3a87428499d8d031d554646108a0f77652549411167f6a7788e4fc7027eefccf3356
+  languageName: node
+  linkType: hard
+
 "import-from@npm:^4.0.0":
   version: 4.0.0
   resolution: "import-from@npm:4.0.0"
@@ -6460,6 +9448,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"import-local@npm:^3.0.2":
+  version: 3.1.0
+  resolution: "import-local@npm:3.1.0"
+  dependencies:
+    pkg-dir: ^4.2.0
+    resolve-cwd: ^3.0.0
+  bin:
+    import-local-fixture: fixtures/cli.js
+  checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd
+  languageName: node
+  linkType: hard
+
 "imurmurhash@npm:^0.1.4":
   version: 0.1.4
   resolution: "imurmurhash@npm:0.1.4"
@@ -6467,6 +9467,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"indent-string@npm:^2.1.0":
+  version: 2.1.0
+  resolution: "indent-string@npm:2.1.0"
+  dependencies:
+    repeating: ^2.0.0
+  checksum: 2fe7124311435f4d7a98f0a314d8259a4ec47ecb221110a58e2e2073e5f75c8d2b4f775f2ed199598fbe20638917e57423096539455ca8bff8eab113c9bee12c
+  languageName: node
+  linkType: hard
+
+"indent-string@npm:^3.0.0":
+  version: 3.2.0
+  resolution: "indent-string@npm:3.2.0"
+  checksum: a0b72603bba6c985d367fda3a25aad16423d2056b22a7e83ee2dd9ce0ce3d03d1e078644b679087aa7edf1cfb457f0d96d9eeadc0b12f38582088cc00e995d2f
+  languageName: node
+  linkType: hard
+
 "indent-string@npm:^4.0.0":
   version: 4.0.0
   resolution: "indent-string@npm:4.0.0"
@@ -6519,7 +9535,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ini@npm:~1.3.0":
+"ini@npm:^1.3.2, ini@npm:^1.3.4, ini@npm:~1.3.0":
   version: 1.3.8
   resolution: "ini@npm:1.3.8"
   checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3
@@ -6556,6 +9572,27 @@ __metadata:
   languageName: node
   linkType: hard
 
+"inquirer@npm:6.5.2":
+  version: 6.5.2
+  resolution: "inquirer@npm:6.5.2"
+  dependencies:
+    ansi-escapes: ^3.2.0
+    chalk: ^2.4.2
+    cli-cursor: ^2.1.0
+    cli-width: ^2.0.0
+    external-editor: ^3.0.3
+    figures: ^2.0.0
+    lodash: ^4.17.12
+    mute-stream: 0.0.7
+    run-async: ^2.2.0
+    rxjs: ^6.4.0
+    string-width: ^2.1.0
+    strip-ansi: ^5.1.0
+    through: ^2.3.6
+  checksum: 175ad4cd1ebed493b231b240185f1da5afeace5f4e8811dfa83cf55dcae59c3255eaed990aa71871b0fd31aa9dc212f43c44c50ed04fb529364405e72f484d28
+  languageName: node
+  linkType: hard
+
 "inquirer@npm:^7.1.0":
   version: 7.3.3
   resolution: "inquirer@npm:7.3.3"
@@ -6588,6 +9625,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"interpret@npm:^1.0.0":
+  version: 1.4.0
+  resolution: "interpret@npm:1.4.0"
+  checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155
+  languageName: node
+  linkType: hard
+
 "into-stream@npm:^6.0.0":
   version: 6.0.0
   resolution: "into-stream@npm:6.0.0"
@@ -6708,7 +9752,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.0, is-core-module@npm:^2.8.1":
+"is-core-module@npm:^2.2.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.0, is-core-module@npm:^2.8.1":
   version: 2.8.1
   resolution: "is-core-module@npm:2.8.1"
   dependencies:
@@ -6789,6 +9833,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"is-finite@npm:^1.0.0":
+  version: 1.1.0
+  resolution: "is-finite@npm:1.1.0"
+  checksum: 532b97ed3d03e04c6bd203984d9e4ba3c0c390efee492bad5d1d1cd1802a68ab27adbd3ef6382f6312bed6c8bb1bd3e325ea79a8dc8fe080ed7a06f5f97b93e7
+  languageName: node
+  linkType: hard
+
+"is-fullwidth-code-point@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "is-fullwidth-code-point@npm:2.0.0"
+  checksum: eef9c6e15f68085fec19ff6a978a6f1b8f48018fd1265035552078ee945573594933b09bbd6f562553e2a241561439f1ef5339276eba68d272001343084cfab8
+  languageName: node
+  linkType: hard
+
 "is-fullwidth-code-point@npm:^3.0.0":
   version: 3.0.0
   resolution: "is-fullwidth-code-point@npm:3.0.0"
@@ -6803,6 +9861,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"is-generator-fn@npm:^2.0.0":
+  version: 2.1.0
+  resolution: "is-generator-fn@npm:2.1.0"
+  checksum: a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215
+  languageName: node
+  linkType: hard
+
 "is-glob@npm:^3.1.0":
   version: 3.1.0
   resolution: "is-glob@npm:3.1.0"
@@ -6828,6 +9893,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"is-module@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "is-module@npm:1.0.0"
+  checksum: 8cd5390730c7976fb4e8546dd0b38865ee6f7bacfa08dfbb2cc07219606755f0b01709d9361e01f13009bbbd8099fa2927a8ed665118a6105d66e40f1b838c3f
+  languageName: node
+  linkType: hard
+
 "is-negative-zero@npm:^2.0.1":
   version: 2.0.2
   resolution: "is-negative-zero@npm:2.0.2"
@@ -6860,6 +9932,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"is-obj@npm:^1.0.0, is-obj@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "is-obj@npm:1.0.1"
+  checksum: 3ccf0efdea12951e0b9c784e2b00e77e87b2f8bd30b42a498548a8afcc11b3287342a2030c308e473e93a7a19c9ea7854c99a8832a476591c727df2a9c79796c
+  languageName: node
+  linkType: hard
+
 "is-obj@npm:^2.0.0":
   version: 2.0.0
   resolution: "is-obj@npm:2.0.0"
@@ -6867,6 +9946,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"is-object@npm:^1.0.1":
+  version: 1.0.2
+  resolution: "is-object@npm:1.0.2"
+  checksum: 971219c4b1985b9751f65e4c8296d3104f0457b0e8a70849e848a4a2208bc47317d73b3b85d4a369619cb2df8284dc22584cb2695a7d99aca5e8d0aa64fc075a
+  languageName: node
+  linkType: hard
+
 "is-path-cwd@npm:^2.2.0":
   version: 2.2.0
   resolution: "is-path-cwd@npm:2.2.0"
@@ -6904,6 +9990,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"is-potential-custom-element-name@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "is-potential-custom-element-name@npm:1.0.1"
+  checksum: ced7bbbb6433a5b684af581872afe0e1767e2d1146b2207ca0068a648fb5cab9d898495d1ac0583524faaf24ca98176a7d9876363097c2d14fee6dd324f3a1ab
+  languageName: node
+  linkType: hard
+
+"is-reference@npm:^1.2.1":
+  version: 1.2.1
+  resolution: "is-reference@npm:1.2.1"
+  dependencies:
+    "@types/estree": "*"
+  checksum: e7b48149f8abda2c10849ea51965904d6a714193d68942ad74e30522231045acf06cbfae5a4be2702fede5d232e61bf50b3183acdc056e6e3afe07fcf4f4b2bc
+  languageName: node
+  linkType: hard
+
 "is-regex@npm:^1.1.4":
   version: 1.1.4
   resolution: "is-regex@npm:1.1.4"
@@ -6914,6 +10016,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"is-regexp@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "is-regexp@npm:1.0.0"
+  checksum: be692828e24cba479ec33644326fa98959ec68ba77965e0291088c1a741feaea4919d79f8031708f85fd25e39de002b4520622b55460660b9c369e6f7187faef
+  languageName: node
+  linkType: hard
+
+"is-retry-allowed@npm:^1.0.0":
+  version: 1.2.0
+  resolution: "is-retry-allowed@npm:1.2.0"
+  checksum: 50d700a89ae31926b1c91b3eb0104dbceeac8790d8b80d02f5c76d9a75c2056f1bb24b5268a8a018dead606bddf116b2262e5ac07401eb8b8783b266ed22558d
+  languageName: node
+  linkType: hard
+
 "is-shared-array-buffer@npm:^1.0.1":
   version: 1.0.1
   resolution: "is-shared-array-buffer@npm:1.0.1"
@@ -6930,7 +10046,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-stream@npm:^1.1.0":
+"is-stream@npm:^1.0.0, is-stream@npm:^1.1.0":
   version: 1.1.0
   resolution: "is-stream@npm:1.1.0"
   checksum: 063c6bec9d5647aa6d42108d4c59723d2bd4ae42135a2d4db6eadbd49b7ea05b750fd69d279e5c7c45cf9da753ad2c00d8978be354d65aa9f6bb434969c6a2ae
@@ -6971,13 +10087,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-typedarray@npm:~1.0.0":
+"is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0":
   version: 1.0.0
   resolution: "is-typedarray@npm:1.0.0"
   checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7
   languageName: node
   linkType: hard
 
+"is-utf8@npm:^0.2.0, is-utf8@npm:^0.2.1":
+  version: 0.2.1
+  resolution: "is-utf8@npm:0.2.1"
+  checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3
+  languageName: node
+  linkType: hard
+
 "is-weakref@npm:^1.0.1":
   version: 1.0.2
   resolution: "is-weakref@npm:1.0.2"
@@ -6987,7 +10110,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-windows@npm:^1.0.2":
+"is-windows@npm:^1.0.1, is-windows@npm:^1.0.2":
   version: 1.0.2
   resolution: "is-windows@npm:1.0.2"
   checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7
@@ -7022,46 +10145,597 @@ __metadata:
   languageName: node
   linkType: hard
 
-"isobject@npm:^2.0.0":
-  version: 2.1.0
-  resolution: "isobject@npm:2.1.0"
+"isobject@npm:^2.0.0":
+  version: 2.1.0
+  resolution: "isobject@npm:2.1.0"
+  dependencies:
+    isarray: 1.0.0
+  checksum: 811c6f5a866877d31f0606a88af4a45f282544de886bf29f6a34c46616a1ae2ed17076cc6bf34c0128f33eecf7e1fcaa2c82cf3770560d3e26810894e96ae79f
+  languageName: node
+  linkType: hard
+
+"isobject@npm:^3.0.0, isobject@npm:^3.0.1":
+  version: 3.0.1
+  resolution: "isobject@npm:3.0.1"
+  checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703
+  languageName: node
+  linkType: hard
+
+"isstream@npm:0.1.x, isstream@npm:~0.1.2":
+  version: 0.1.2
+  resolution: "isstream@npm:0.1.2"
+  checksum: 1eb2fe63a729f7bdd8a559ab552c69055f4f48eb5c2f03724430587c6f450783c8f1cd936c1c952d0a927925180fcc892ebd5b174236cf1065d4bd5bdb37e963
+  languageName: node
+  linkType: hard
+
+"issue-parser@npm:^6.0.0":
+  version: 6.0.0
+  resolution: "issue-parser@npm:6.0.0"
+  dependencies:
+    lodash.capitalize: ^4.2.1
+    lodash.escaperegexp: ^4.1.2
+    lodash.isplainobject: ^4.0.6
+    lodash.isstring: ^4.0.1
+    lodash.uniqby: ^4.7.0
+  checksum: 3357928af6c78c4803340f978bd55dc922b6b15b3f6c76aaa78a08999d39002729502ce1650863d1a9d728a7e31ccc0a865087244225ef6e8fc85aaf2f9c0f67
+  languageName: node
+  linkType: hard
+
+"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0":
+  version: 3.2.0
+  resolution: "istanbul-lib-coverage@npm:3.2.0"
+  checksum: a2a545033b9d56da04a8571ed05c8120bf10e9bce01cf8633a3a2b0d1d83dff4ac4fe78d6d5673c27fc29b7f21a41d75f83a36be09f82a61c367b56aa73c1ff9
+  languageName: node
+  linkType: hard
+
+"istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0":
+  version: 5.1.0
+  resolution: "istanbul-lib-instrument@npm:5.1.0"
+  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
+  checksum: 8b82e733c69fe9f94d2e21f3e5760c9bedb110329aa75df4bd40df95f1cac3bf38767e43f35b125cc547ceca7376b72ce7d95cc5238b7e9088345c7b589233d3
+  languageName: node
+  linkType: hard
+
+"istanbul-lib-report@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "istanbul-lib-report@npm:3.0.0"
+  dependencies:
+    istanbul-lib-coverage: ^3.0.0
+    make-dir: ^3.0.0
+    supports-color: ^7.1.0
+  checksum: 3f29eb3f53c59b987386e07fe772d24c7f58c6897f34c9d7a296f4000de7ae3de9eb95c3de3df91dc65b134c84dee35c54eee572a56243e8907c48064e34ff1b
+  languageName: node
+  linkType: hard
+
+"istanbul-lib-source-maps@npm:^4.0.0":
+  version: 4.0.1
+  resolution: "istanbul-lib-source-maps@npm:4.0.1"
+  dependencies:
+    debug: ^4.1.1
+    istanbul-lib-coverage: ^3.0.0
+    source-map: ^0.6.1
+  checksum: 21ad3df45db4b81852b662b8d4161f6446cd250c1ddc70ef96a585e2e85c26ed7cd9c2a396a71533cfb981d1a645508bc9618cae431e55d01a0628e7dec62ef2
+  languageName: node
+  linkType: hard
+
+"istanbul-reports@npm:^3.1.3":
+  version: 3.1.4
+  resolution: "istanbul-reports@npm:3.1.4"
+  dependencies:
+    html-escaper: ^2.0.0
+    istanbul-lib-report: ^3.0.0
+  checksum: 2132983355710c522f6b26808015cab9a0ee8b9f5ae0db0d3edeff40b886dd83cb670fb123cb7b32dbe59473d7c00cdde2ba6136bc0acdb20a865fccea64dfe1
+  languageName: node
+  linkType: hard
+
+"isurl@npm:^1.0.0-alpha5":
+  version: 1.0.0
+  resolution: "isurl@npm:1.0.0"
+  dependencies:
+    has-to-string-tag-x: ^1.2.0
+    is-object: ^1.0.1
+  checksum: 28a96e019269d57015fa5869f19dda5a3ed1f7b21e3e0c4ff695419bd0541547db352aa32ee4a3659e811a177b0e37a5bc1a036731e71939dd16b59808ab92bd
+  languageName: node
+  linkType: hard
+
+"java-properties@npm:^1.0.0":
+  version: 1.0.2
+  resolution: "java-properties@npm:1.0.2"
+  checksum: 9a086778346e3adbe2395e370f5c779033ed60360055a15e2cead49e3d676d2c73786cf2f6563a1860277dea3dd0a859432e546ed89c03ee08c1f53e31a5d420
+  languageName: node
+  linkType: hard
+
+"jest-changed-files@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-changed-files@npm:27.5.1"
+  dependencies:
+    "@jest/types": ^27.5.1
+    execa: ^5.0.0
+    throat: ^6.0.1
+  checksum: 95e9dc74c3ca688ef85cfeab270f43f8902721a6c8ade6ac2459459a77890c85977f537d6fb809056deaa6d9c3f075fa7d2699ff5f3bf7d3fda17c3760b79b15
+  languageName: node
+  linkType: hard
+
+"jest-circus@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-circus@npm:27.5.1"
+  dependencies:
+    "@jest/environment": ^27.5.1
+    "@jest/test-result": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+    chalk: ^4.0.0
+    co: ^4.6.0
+    dedent: ^0.7.0
+    expect: ^27.5.1
+    is-generator-fn: ^2.0.0
+    jest-each: ^27.5.1
+    jest-matcher-utils: ^27.5.1
+    jest-message-util: ^27.5.1
+    jest-runtime: ^27.5.1
+    jest-snapshot: ^27.5.1
+    jest-util: ^27.5.1
+    pretty-format: ^27.5.1
+    slash: ^3.0.0
+    stack-utils: ^2.0.3
+    throat: ^6.0.1
+  checksum: 6192dccbccb3a6acfa361cbb97bdbabe94864ccf3d885932cfd41f19534329d40698078cf9be1489415e8234255d6ea9f9aff5396b79ad842a6fca6e6fc08fd0
+  languageName: node
+  linkType: hard
+
+"jest-cli@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-cli@npm:27.5.1"
+  dependencies:
+    "@jest/core": ^27.5.1
+    "@jest/test-result": ^27.5.1
+    "@jest/types": ^27.5.1
+    chalk: ^4.0.0
+    exit: ^0.1.2
+    graceful-fs: ^4.2.9
+    import-local: ^3.0.2
+    jest-config: ^27.5.1
+    jest-util: ^27.5.1
+    jest-validate: ^27.5.1
+    prompts: ^2.0.1
+    yargs: ^16.2.0
+  peerDependencies:
+    node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+  peerDependenciesMeta:
+    node-notifier:
+      optional: true
+  bin:
+    jest: bin/jest.js
+  checksum: 6c0a69fb48e500241409e09ff743ed72bc6578d7769e2c994724e7ef1e5587f6c1f85dc429e93b98ae38a365222993ee70f0acc2199358992120900984f349e5
+  languageName: node
+  linkType: hard
+
+"jest-config@npm:^27.1.0, jest-config@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-config@npm:27.5.1"
+  dependencies:
+    "@babel/core": ^7.8.0
+    "@jest/test-sequencer": ^27.5.1
+    "@jest/types": ^27.5.1
+    babel-jest: ^27.5.1
+    chalk: ^4.0.0
+    ci-info: ^3.2.0
+    deepmerge: ^4.2.2
+    glob: ^7.1.1
+    graceful-fs: ^4.2.9
+    jest-circus: ^27.5.1
+    jest-environment-jsdom: ^27.5.1
+    jest-environment-node: ^27.5.1
+    jest-get-type: ^27.5.1
+    jest-jasmine2: ^27.5.1
+    jest-regex-util: ^27.5.1
+    jest-resolve: ^27.5.1
+    jest-runner: ^27.5.1
+    jest-util: ^27.5.1
+    jest-validate: ^27.5.1
+    micromatch: ^4.0.4
+    parse-json: ^5.2.0
+    pretty-format: ^27.5.1
+    slash: ^3.0.0
+    strip-json-comments: ^3.1.1
+  peerDependencies:
+    ts-node: ">=9.0.0"
+  peerDependenciesMeta:
+    ts-node:
+      optional: true
+  checksum: 1188fd46c0ed78cbe3175eb9ad6712ccf74a74be33d9f0d748e147c107f0889f8b701fbff1567f31836ae18597dacdc43d6a8fc30dd34ade6c9229cc6c7cb82d
+  languageName: node
+  linkType: hard
+
+"jest-diff@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-diff@npm:27.5.1"
+  dependencies:
+    chalk: ^4.0.0
+    diff-sequences: ^27.5.1
+    jest-get-type: ^27.5.1
+    pretty-format: ^27.5.1
+  checksum: 8be27c1e1ee57b2bb2bef9c0b233c19621b4c43d53a3c26e2c00a4e805eb4ea11fe1694a06a9fb0e80ffdcfdc0d2b1cb0b85920b3f5c892327ecd1e7bd96b865
+  languageName: node
+  linkType: hard
+
+"jest-docblock@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-docblock@npm:27.5.1"
+  dependencies:
+    detect-newline: ^3.0.0
+  checksum: c0fed6d55b229d8bffdd8d03f121dd1a3be77c88f50552d374f9e1ea3bde57bf6bea017a0add04628d98abcb1bfb48b456438eeca8a74ef0053f4dae3b95d29c
+  languageName: node
+  linkType: hard
+
+"jest-each@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-each@npm:27.5.1"
+  dependencies:
+    "@jest/types": ^27.5.1
+    chalk: ^4.0.0
+    jest-get-type: ^27.5.1
+    jest-util: ^27.5.1
+    pretty-format: ^27.5.1
+  checksum: b5a6d8730fd938982569c9e0b42bdf3c242f97b957ed8155a6473b5f7b540970f8685524e7f53963dc1805319f4b6602abfc56605590ca19d55bd7a87e467e63
+  languageName: node
+  linkType: hard
+
+"jest-environment-jsdom@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-environment-jsdom@npm:27.5.1"
+  dependencies:
+    "@jest/environment": ^27.5.1
+    "@jest/fake-timers": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+    jest-mock: ^27.5.1
+    jest-util: ^27.5.1
+    jsdom: ^16.6.0
+  checksum: bc104aef7d7530d0740402aa84ac812138b6d1e51fe58adecce679f82b99340ddab73e5ec68fa079f33f50c9ddec9728fc9f0ddcca2ad6f0b351eed2762cc555
+  languageName: node
+  linkType: hard
+
+"jest-environment-node@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-environment-node@npm:27.5.1"
+  dependencies:
+    "@jest/environment": ^27.5.1
+    "@jest/fake-timers": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+    jest-mock: ^27.5.1
+    jest-util: ^27.5.1
+  checksum: 0f988330c4f3eec092e3fb37ea753b0c6f702e83cd8f4d770af9c2bf964a70bc45fbd34ec6fdb6d71ce98a778d9f54afd673e63f222e4667fff289e8069dba39
+  languageName: node
+  linkType: hard
+
+"jest-get-type@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-get-type@npm:27.5.1"
+  checksum: 63064ab70195c21007d897c1157bf88ff94a790824a10f8c890392e7d17eda9c3900513cb291ca1c8d5722cad79169764e9a1279f7c8a9c4cd6e9109ff04bbc0
+  languageName: node
+  linkType: hard
+
+"jest-haste-map@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-haste-map@npm:27.5.1"
+  dependencies:
+    "@jest/types": ^27.5.1
+    "@types/graceful-fs": ^4.1.2
+    "@types/node": "*"
+    anymatch: ^3.0.3
+    fb-watchman: ^2.0.0
+    fsevents: ^2.3.2
+    graceful-fs: ^4.2.9
+    jest-regex-util: ^27.5.1
+    jest-serializer: ^27.5.1
+    jest-util: ^27.5.1
+    jest-worker: ^27.5.1
+    micromatch: ^4.0.4
+    walker: ^1.0.7
+  dependenciesMeta:
+    fsevents:
+      optional: true
+  checksum: e092a1412829a9254b4725531ee72926de530f77fda7b0d9ea18008fb7623c16f72e772d8e93be71cac9e591b2c6843a669610887dd2c89bd9eb528856e3ab47
+  languageName: node
+  linkType: hard
+
+"jest-jasmine2@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-jasmine2@npm:27.5.1"
+  dependencies:
+    "@jest/environment": ^27.5.1
+    "@jest/source-map": ^27.5.1
+    "@jest/test-result": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+    chalk: ^4.0.0
+    co: ^4.6.0
+    expect: ^27.5.1
+    is-generator-fn: ^2.0.0
+    jest-each: ^27.5.1
+    jest-matcher-utils: ^27.5.1
+    jest-message-util: ^27.5.1
+    jest-runtime: ^27.5.1
+    jest-snapshot: ^27.5.1
+    jest-util: ^27.5.1
+    pretty-format: ^27.5.1
+    throat: ^6.0.1
+  checksum: b716adf253ceb73db661936153394ab90d7f3a8ba56d6189b7cd4df8e4e2a4153b4e63ebb5d36e29ceb0f4c211d5a6f36ab7048c6abbd881c8646567e2ab8e6d
+  languageName: node
+  linkType: hard
+
+"jest-leak-detector@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-leak-detector@npm:27.5.1"
+  dependencies:
+    jest-get-type: ^27.5.1
+    pretty-format: ^27.5.1
+  checksum: 5c9689060960567ddaf16c570d87afa760a461885765d2c71ef4f4857bbc3af1482c34e3cce88e50beefde1bf35e33530b020480752057a7e3dbb1ca0bae359f
+  languageName: node
+  linkType: hard
+
+"jest-matcher-utils@npm:^27.0.0, jest-matcher-utils@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-matcher-utils@npm:27.5.1"
+  dependencies:
+    chalk: ^4.0.0
+    jest-diff: ^27.5.1
+    jest-get-type: ^27.5.1
+    pretty-format: ^27.5.1
+  checksum: bb2135fc48889ff3fe73888f6cc7168ddab9de28b51b3148f820c89fdfd2effdcad005f18be67d0b9be80eda208ad47290f62f03d0a33f848db2dd0273c8217a
+  languageName: node
+  linkType: hard
+
+"jest-message-util@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-message-util@npm:27.5.1"
+  dependencies:
+    "@babel/code-frame": ^7.12.13
+    "@jest/types": ^27.5.1
+    "@types/stack-utils": ^2.0.0
+    chalk: ^4.0.0
+    graceful-fs: ^4.2.9
+    micromatch: ^4.0.4
+    pretty-format: ^27.5.1
+    slash: ^3.0.0
+    stack-utils: ^2.0.3
+  checksum: eb6d637d1411c71646de578c49826b6da8e33dd293e501967011de9d1916d53d845afbfb52a5b661ff1c495be7c13f751c48c7f30781fd94fbd64842e8195796
+  languageName: node
+  linkType: hard
+
+"jest-mock@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-mock@npm:27.5.1"
+  dependencies:
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+  checksum: f5b5904bb1741b4a1687a5f492535b7b1758dc26534c72a5423305f8711292e96a601dec966df81bb313269fb52d47227e29f9c2e08324d79529172f67311be0
+  languageName: node
+  linkType: hard
+
+"jest-pnp-resolver@npm:^1.2.2":
+  version: 1.2.2
+  resolution: "jest-pnp-resolver@npm:1.2.2"
+  peerDependencies:
+    jest-resolve: "*"
+  peerDependenciesMeta:
+    jest-resolve:
+      optional: true
+  checksum: bd85dcc0e76e0eb0c3d56382ec140f08d25ff4068cda9d0e360bb78fb176cb726d0beab82dc0e8694cafd09f55fee7622b8bcb240afa5fad301f4ed3eebb4f47
+  languageName: node
+  linkType: hard
+
+"jest-regex-util@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-regex-util@npm:27.5.1"
+  checksum: d45ca7a9543616a34f7f3079337439cf07566e677a096472baa2810e274b9808b76767c97b0a4029b8a5b82b9d256dee28ef9ad4138b2b9e5933f6fac106c418
+  languageName: node
+  linkType: hard
+
+"jest-resolve-dependencies@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-resolve-dependencies@npm:27.5.1"
+  dependencies:
+    "@jest/types": ^27.5.1
+    jest-regex-util: ^27.5.1
+    jest-snapshot: ^27.5.1
+  checksum: c67af97afad1da88f5530317c732bbd1262d1225f6cd7f4e4740a5db48f90ab0bd8564738ac70d1a43934894f9aef62205c1b8f8ee89e5c7a737e6a121ee4c25
+  languageName: node
+  linkType: hard
+
+"jest-resolve@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-resolve@npm:27.5.1"
+  dependencies:
+    "@jest/types": ^27.5.1
+    chalk: ^4.0.0
+    graceful-fs: ^4.2.9
+    jest-haste-map: ^27.5.1
+    jest-pnp-resolver: ^1.2.2
+    jest-util: ^27.5.1
+    jest-validate: ^27.5.1
+    resolve: ^1.20.0
+    resolve.exports: ^1.1.0
+    slash: ^3.0.0
+  checksum: 735830e7265b20a348029738680bb2f6e37f80ecea86cda869a4c318ba3a45d39c7a3a873a22f7f746d86258c50ead6e7f501de043e201c095d7ba628a1c440f
+  languageName: node
+  linkType: hard
+
+"jest-runner@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-runner@npm:27.5.1"
+  dependencies:
+    "@jest/console": ^27.5.1
+    "@jest/environment": ^27.5.1
+    "@jest/test-result": ^27.5.1
+    "@jest/transform": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+    chalk: ^4.0.0
+    emittery: ^0.8.1
+    graceful-fs: ^4.2.9
+    jest-docblock: ^27.5.1
+    jest-environment-jsdom: ^27.5.1
+    jest-environment-node: ^27.5.1
+    jest-haste-map: ^27.5.1
+    jest-leak-detector: ^27.5.1
+    jest-message-util: ^27.5.1
+    jest-resolve: ^27.5.1
+    jest-runtime: ^27.5.1
+    jest-util: ^27.5.1
+    jest-worker: ^27.5.1
+    source-map-support: ^0.5.6
+    throat: ^6.0.1
+  checksum: 5bbe6cf847dd322b3332ec9d6977b54f91bd5f72ff620bc1a0192f0f129deda8aa7ca74c98922187a7aa87d8e0ce4f6c50e99a7ccb2a310bf4d94be2e0c3ce8e
+  languageName: node
+  linkType: hard
+
+"jest-runtime@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-runtime@npm:27.5.1"
+  dependencies:
+    "@jest/environment": ^27.5.1
+    "@jest/fake-timers": ^27.5.1
+    "@jest/globals": ^27.5.1
+    "@jest/source-map": ^27.5.1
+    "@jest/test-result": ^27.5.1
+    "@jest/transform": ^27.5.1
+    "@jest/types": ^27.5.1
+    chalk: ^4.0.0
+    cjs-module-lexer: ^1.0.0
+    collect-v8-coverage: ^1.0.0
+    execa: ^5.0.0
+    glob: ^7.1.3
+    graceful-fs: ^4.2.9
+    jest-haste-map: ^27.5.1
+    jest-message-util: ^27.5.1
+    jest-mock: ^27.5.1
+    jest-regex-util: ^27.5.1
+    jest-resolve: ^27.5.1
+    jest-snapshot: ^27.5.1
+    jest-util: ^27.5.1
+    slash: ^3.0.0
+    strip-bom: ^4.0.0
+  checksum: 929e3df0c53dab43f831f2af4e2996b22aa8cb2d6d483919d6b0426cbc100098fd5b777b998c6568b77f8c4d860b2e83127514292ff61416064f5ef926492386
+  languageName: node
+  linkType: hard
+
+"jest-serializer@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-serializer@npm:27.5.1"
+  dependencies:
+    "@types/node": "*"
+    graceful-fs: ^4.2.9
+  checksum: 803e03a552278610edc6753c0dd9fa5bb5cd3ca47414a7b2918106efb62b79fd5e9ae785d0a21f12a299fa599fea8acc1fa6dd41283328cee43962cf7df9bb44
+  languageName: node
+  linkType: hard
+
+"jest-snapshot@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-snapshot@npm:27.5.1"
+  dependencies:
+    "@babel/core": ^7.7.2
+    "@babel/generator": ^7.7.2
+    "@babel/plugin-syntax-typescript": ^7.7.2
+    "@babel/traverse": ^7.7.2
+    "@babel/types": ^7.0.0
+    "@jest/transform": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/babel__traverse": ^7.0.4
+    "@types/prettier": ^2.1.5
+    babel-preset-current-node-syntax: ^1.0.0
+    chalk: ^4.0.0
+    expect: ^27.5.1
+    graceful-fs: ^4.2.9
+    jest-diff: ^27.5.1
+    jest-get-type: ^27.5.1
+    jest-haste-map: ^27.5.1
+    jest-matcher-utils: ^27.5.1
+    jest-message-util: ^27.5.1
+    jest-util: ^27.5.1
+    natural-compare: ^1.4.0
+    pretty-format: ^27.5.1
+    semver: ^7.3.2
+  checksum: a5cfadf0d21cd76063925d1434bc076443ed6d87847d0e248f0b245f11db3d98ff13e45cc03b15404027dabecd712d925f47b6eae4f64986f688640a7d362514
+  languageName: node
+  linkType: hard
+
+"jest-util@npm:^27.0.0, jest-util@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-util@npm:27.5.1"
   dependencies:
-    isarray: 1.0.0
-  checksum: 811c6f5a866877d31f0606a88af4a45f282544de886bf29f6a34c46616a1ae2ed17076cc6bf34c0128f33eecf7e1fcaa2c82cf3770560d3e26810894e96ae79f
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+    chalk: ^4.0.0
+    ci-info: ^3.2.0
+    graceful-fs: ^4.2.9
+    picomatch: ^2.2.3
+  checksum: ac8d122f6daf7a035dcea156641fd3701aeba245417c40836a77e35b3341b9c02ddc5d904cfcd4ddbaa00ab854da76d3b911870cafdcdbaff90ea471de26c7d7
   languageName: node
   linkType: hard
 
-"isobject@npm:^3.0.0, isobject@npm:^3.0.1":
-  version: 3.0.1
-  resolution: "isobject@npm:3.0.1"
-  checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703
+"jest-validate@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-validate@npm:27.5.1"
+  dependencies:
+    "@jest/types": ^27.5.1
+    camelcase: ^6.2.0
+    chalk: ^4.0.0
+    jest-get-type: ^27.5.1
+    leven: ^3.1.0
+    pretty-format: ^27.5.1
+  checksum: 82e870f8ee7e4fb949652711b1567f05ae31c54be346b0899e8353e5c20fad7692b511905b37966945e90af8dc0383eb41a74f3ffefb16140ea4f9164d841412
   languageName: node
   linkType: hard
 
-"isstream@npm:~0.1.2":
-  version: 0.1.2
-  resolution: "isstream@npm:0.1.2"
-  checksum: 1eb2fe63a729f7bdd8a559ab552c69055f4f48eb5c2f03724430587c6f450783c8f1cd936c1c952d0a927925180fcc892ebd5b174236cf1065d4bd5bdb37e963
+"jest-watcher@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-watcher@npm:27.5.1"
+  dependencies:
+    "@jest/test-result": ^27.5.1
+    "@jest/types": ^27.5.1
+    "@types/node": "*"
+    ansi-escapes: ^4.2.1
+    chalk: ^4.0.0
+    jest-util: ^27.5.1
+    string-length: ^4.0.1
+  checksum: 191c4e9c278c0902ade1a8a80883ac244963ba3e6e78607a3d5f729ccca9c6e71fb3b316f87883658132641c5d818aa84202585c76752e03c539e6cbecb820bd
   languageName: node
   linkType: hard
 
-"issue-parser@npm:^6.0.0":
-  version: 6.0.0
-  resolution: "issue-parser@npm:6.0.0"
+"jest-worker@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "jest-worker@npm:27.5.1"
   dependencies:
-    lodash.capitalize: ^4.2.1
-    lodash.escaperegexp: ^4.1.2
-    lodash.isplainobject: ^4.0.6
-    lodash.isstring: ^4.0.1
-    lodash.uniqby: ^4.7.0
-  checksum: 3357928af6c78c4803340f978bd55dc922b6b15b3f6c76aaa78a08999d39002729502ce1650863d1a9d728a7e31ccc0a865087244225ef6e8fc85aaf2f9c0f67
+    "@types/node": "*"
+    merge-stream: ^2.0.0
+    supports-color: ^8.0.0
+  checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980
   languageName: node
   linkType: hard
 
-"java-properties@npm:^1.0.0":
-  version: 1.0.2
-  resolution: "java-properties@npm:1.0.2"
-  checksum: 9a086778346e3adbe2395e370f5c779033ed60360055a15e2cead49e3d676d2c73786cf2f6563a1860277dea3dd0a859432e546ed89c03ee08c1f53e31a5d420
+"jest@npm:^27.1.0":
+  version: 27.5.1
+  resolution: "jest@npm:27.5.1"
+  dependencies:
+    "@jest/core": ^27.5.1
+    import-local: ^3.0.2
+    jest-cli: ^27.5.1
+  peerDependencies:
+    node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+  peerDependenciesMeta:
+    node-notifier:
+      optional: true
+  bin:
+    jest: bin/jest.js
+  checksum: 96f1d69042b3c6dfc695f2a4e4b0db38af6fb78582ad1a02beaa57cfcd77cbd31567d7d865c1c85709b7c3e176eefa3b2035ffecd646005f15d8ef528eccf205
   languageName: node
   linkType: hard
 
@@ -7111,6 +10785,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"js-yaml@npm:^3.13.1":
+  version: 3.14.1
+  resolution: "js-yaml@npm:3.14.1"
+  dependencies:
+    argparse: ^1.0.7
+    esprima: ^4.0.0
+  bin:
+    js-yaml: bin/js-yaml.js
+  checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c
+  languageName: node
+  linkType: hard
+
 "js-yaml@npm:^4.1.0":
   version: 4.1.0
   resolution: "js-yaml@npm:4.1.0"
@@ -7129,6 +10815,46 @@ __metadata:
   languageName: node
   linkType: hard
 
+"jsdom@npm:^16.6.0":
+  version: 16.7.0
+  resolution: "jsdom@npm:16.7.0"
+  dependencies:
+    abab: ^2.0.5
+    acorn: ^8.2.4
+    acorn-globals: ^6.0.0
+    cssom: ^0.4.4
+    cssstyle: ^2.3.0
+    data-urls: ^2.0.0
+    decimal.js: ^10.2.1
+    domexception: ^2.0.1
+    escodegen: ^2.0.0
+    form-data: ^3.0.0
+    html-encoding-sniffer: ^2.0.1
+    http-proxy-agent: ^4.0.1
+    https-proxy-agent: ^5.0.0
+    is-potential-custom-element-name: ^1.0.1
+    nwsapi: ^2.2.0
+    parse5: 6.0.1
+    saxes: ^5.0.1
+    symbol-tree: ^3.2.4
+    tough-cookie: ^4.0.0
+    w3c-hr-time: ^1.0.2
+    w3c-xmlserializer: ^2.0.0
+    webidl-conversions: ^6.1.0
+    whatwg-encoding: ^1.0.5
+    whatwg-mimetype: ^2.3.0
+    whatwg-url: ^8.5.0
+    ws: ^7.4.6
+    xml-name-validator: ^3.0.0
+  peerDependencies:
+    canvas: ^2.5.0
+  peerDependenciesMeta:
+    canvas:
+      optional: true
+  checksum: 454b83371857000763ed31130a049acd1b113e3b927e6dcd75c67ddc30cdd242d7ebcac5c2294b7a1a6428155cb1398709c573b3c6d809218692ea68edd93370
+  languageName: node
+  linkType: hard
+
 "jsesc@npm:^2.5.1":
   version: 2.5.2
   resolution: "jsesc@npm:2.5.2"
@@ -7138,6 +10864,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"json-buffer@npm:3.0.0":
+  version: 3.0.0
+  resolution: "json-buffer@npm:3.0.0"
+  checksum: 0cecacb8025370686a916069a2ff81f7d55167421b6aa7270ee74e244012650dd6bce22b0852202ea7ff8624fce50ff0ec1bdf95914ccb4553426e290d5a63fa
+  languageName: node
+  linkType: hard
+
 "json-buffer@npm:3.0.1":
   version: 3.0.1
   resolution: "json-buffer@npm:3.0.1"
@@ -7166,6 +10899,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"json-schema-traverse@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "json-schema-traverse@npm:1.0.0"
+  checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad
+  languageName: node
+  linkType: hard
+
 "json-schema@npm:0.4.0":
   version: 0.4.0
   resolution: "json-schema@npm:0.4.0"
@@ -7194,6 +10934,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"json5@npm:2.x, json5@npm:^2.2.1":
+  version: 2.2.1
+  resolution: "json5@npm:2.2.1"
+  bin:
+    json5: lib/cli.js
+  checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b
+  languageName: node
+  linkType: hard
+
 "json5@npm:^1.0.1":
   version: 1.0.1
   resolution: "json5@npm:1.0.1"
@@ -7223,6 +10972,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"jsonfile@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "jsonfile@npm:4.0.0"
+  dependencies:
+    graceful-fs: ^4.1.6
+  dependenciesMeta:
+    graceful-fs:
+      optional: true
+  checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e
+  languageName: node
+  linkType: hard
+
 "jsonfile@npm:^6.0.1":
   version: 6.1.0
   resolution: "jsonfile@npm:6.1.0"
@@ -7300,6 +11061,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"keyv@npm:^3.0.0":
+  version: 3.1.0
+  resolution: "keyv@npm:3.1.0"
+  dependencies:
+    json-buffer: 3.0.0
+  checksum: bb7e8f3acffdbafbc2dd5b63f377fe6ec4c0e2c44fc82720449ef8ab54f4a7ce3802671ed94c0f475ae0a8549703353a2124561fcf3317010c141b32ca1ce903
+  languageName: node
+  linkType: hard
+
 "keyv@npm:^4.0.0":
   version: 4.1.1
   resolution: "keyv@npm:4.1.1"
@@ -7341,6 +11111,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"kleur@npm:^3.0.3":
+  version: 3.0.3
+  resolution: "kleur@npm:3.0.3"
+  checksum: df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169
+  languageName: node
+  linkType: hard
+
 "kolorist@npm:^1.5.1":
   version: 1.5.1
   resolution: "kolorist@npm:1.5.1"
@@ -7358,6 +11135,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"lcov-parse@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "lcov-parse@npm:1.0.0"
+  bin:
+    lcov-parse: ./bin/cli.js
+  checksum: d4b14b5e33d8f7511dc62dea49252a79f04720aa837ce120235451c43653e8aeb7e330588691f2d584826c5ac8145a0aa778dd02f543cd71270f80374e5fcf20
+  languageName: node
+  linkType: hard
+
+"leven@npm:^3.1.0":
+  version: 3.1.0
+  resolution: "leven@npm:3.1.0"
+  checksum: 638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55
+  languageName: node
+  linkType: hard
+
 "levn@npm:^0.4.1":
   version: 0.4.1
   resolution: "levn@npm:0.4.1"
@@ -7368,6 +11161,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"levn@npm:~0.3.0":
+  version: 0.3.0
+  resolution: "levn@npm:0.3.0"
+  dependencies:
+    prelude-ls: ~1.1.2
+    type-check: ~0.3.2
+  checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e
+  languageName: node
+  linkType: hard
+
 "libnpmaccess@npm:*":
   version: 6.0.1
   resolution: "libnpmaccess@npm:6.0.1"
@@ -7627,6 +11430,30 @@ __metadata:
   languageName: node
   linkType: hard
 
+"lint-staged@npm:^11.1.2":
+  version: 11.2.6
+  resolution: "lint-staged@npm:11.2.6"
+  dependencies:
+    cli-truncate: 2.1.0
+    colorette: ^1.4.0
+    commander: ^8.2.0
+    cosmiconfig: ^7.0.1
+    debug: ^4.3.2
+    enquirer: ^2.3.6
+    execa: ^5.1.1
+    listr2: ^3.12.2
+    micromatch: ^4.0.4
+    normalize-path: ^3.0.0
+    please-upgrade-node: ^3.2.0
+    string-argv: 0.3.1
+    stringify-object: 3.3.0
+    supports-color: 8.1.1
+  bin:
+    lint-staged: bin/lint-staged.js
+  checksum: b9071621db351c553579bd18df3d80fb753f851c4f1f72db0aaf12e713eab25b6d8a044dab2957817de7da02054a63f7725a49c763aee09295133f0d554f4d3f
+  languageName: node
+  linkType: hard
+
 "lint-staged@npm:^12.3.5":
   version: 12.3.7
   resolution: "lint-staged@npm:12.3.7"
@@ -7651,6 +11478,27 @@ __metadata:
   languageName: node
   linkType: hard
 
+"listr2@npm:^3.12.2":
+  version: 3.14.0
+  resolution: "listr2@npm:3.14.0"
+  dependencies:
+    cli-truncate: ^2.1.0
+    colorette: ^2.0.16
+    log-update: ^4.0.0
+    p-map: ^4.0.0
+    rfdc: ^1.3.0
+    rxjs: ^7.5.1
+    through: ^2.3.8
+    wrap-ansi: ^7.0.0
+  peerDependencies:
+    enquirer: ">= 2.3.0 < 3"
+  peerDependenciesMeta:
+    enquirer:
+      optional: true
+  checksum: fdb8b2d6bdf5df9371ebd5082bee46c6d0ca3d1e5f2b11fbb5a127839855d5f3da9d4968fce94f0a5ec67cac2459766abbb1faeef621065ebb1829b11ef9476d
+  languageName: node
+  linkType: hard
+
 "listr2@npm:^4.0.1":
   version: 4.0.5
   resolution: "listr2@npm:4.0.5"
@@ -7672,6 +11520,19 @@ __metadata:
   languageName: node
   linkType: hard
 
+"load-json-file@npm:^1.0.0":
+  version: 1.1.0
+  resolution: "load-json-file@npm:1.1.0"
+  dependencies:
+    graceful-fs: ^4.1.2
+    parse-json: ^2.2.0
+    pify: ^2.0.0
+    pinkie-promise: ^2.0.0
+    strip-bom: ^2.0.0
+  checksum: 0e4e4f380d897e13aa236246a917527ea5a14e4fc34d49e01ce4e7e2a1e08e2740ee463a03fb021c04f594f29a178f4adb994087549d7c1c5315fcd29bf9934b
+  languageName: node
+  linkType: hard
+
 "load-json-file@npm:^4.0.0":
   version: 4.0.0
   resolution: "load-json-file@npm:4.0.0"
@@ -7748,6 +11609,29 @@ __metadata:
   languageName: node
   linkType: hard
 
+"locate-path@npm:^6.0.0":
+  version: 6.0.0
+  resolution: "locate-path@npm:6.0.0"
+  dependencies:
+    p-locate: ^5.0.0
+  checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a
+  languageName: node
+  linkType: hard
+
+"lodash._reinterpolate@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "lodash._reinterpolate@npm:3.0.0"
+  checksum: 06d2d5f33169604fa5e9f27b6067ed9fb85d51a84202a656901e5ffb63b426781a601508466f039c720af111b0c685d12f1a5c14ff8df5d5f27e491e562784b2
+  languageName: node
+  linkType: hard
+
+"lodash.camelcase@npm:^4.3.0":
+  version: 4.3.0
+  resolution: "lodash.camelcase@npm:4.3.0"
+  checksum: cb9227612f71b83e42de93eccf1232feeb25e705bdb19ba26c04f91e885bfd3dd5c517c4a97137658190581d3493ea3973072ca010aab7e301046d90740393d1
+  languageName: node
+  linkType: hard
+
 "lodash.capitalize@npm:^4.2.1":
   version: 4.2.1
   resolution: "lodash.capitalize@npm:4.2.1"
@@ -7762,6 +11646,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"lodash.get@npm:^4":
+  version: 4.4.2
+  resolution: "lodash.get@npm:4.4.2"
+  checksum: e403047ddb03181c9d0e92df9556570e2b67e0f0a930fcbbbd779370972368f5568e914f913e93f3b08f6d492abc71e14d4e9b7a18916c31fa04bd2306efe545
+  languageName: node
+  linkType: hard
+
 "lodash.ismatch@npm:^4.4.0":
   version: 4.4.0
   resolution: "lodash.ismatch@npm:4.4.0"
@@ -7790,13 +11681,53 @@ __metadata:
   languageName: node
   linkType: hard
 
-"lodash.merge@npm:^4.6.2":
+"lodash.map@npm:^4.5.1":
+  version: 4.6.0
+  resolution: "lodash.map@npm:4.6.0"
+  checksum: 7369a41d7d24d15ce3bbd02a7faa3a90f6266c38184e64932571b9b21b758bd10c04ffd117d1859be1a44156f29b94df5045eff172bf8a97fddf68bf1002d12f
+  languageName: node
+  linkType: hard
+
+"lodash.memoize@npm:4.x":
+  version: 4.1.2
+  resolution: "lodash.memoize@npm:4.1.2"
+  checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089
+  languageName: node
+  linkType: hard
+
+"lodash.merge@npm:^4.0.2, lodash.merge@npm:^4.6.2":
   version: 4.6.2
   resolution: "lodash.merge@npm:4.6.2"
   checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005
   languageName: node
   linkType: hard
 
+"lodash.template@npm:^4.0.2":
+  version: 4.5.0
+  resolution: "lodash.template@npm:4.5.0"
+  dependencies:
+    lodash._reinterpolate: ^3.0.0
+    lodash.templatesettings: ^4.0.0
+  checksum: ca64e5f07b6646c9d3dbc0fe3aaa995cb227c4918abd1cef7a9024cd9c924f2fa389a0ec4296aa6634667e029bc81d4bbdb8efbfde11df76d66085e6c529b450
+  languageName: node
+  linkType: hard
+
+"lodash.templatesettings@npm:^4.0.0":
+  version: 4.2.0
+  resolution: "lodash.templatesettings@npm:4.2.0"
+  dependencies:
+    lodash._reinterpolate: ^3.0.0
+  checksum: 863e025478b092997e11a04e9d9e735875eeff1ffcd6c61742aa8272e3c2cddc89ce795eb9726c4e74cef5991f722897ff37df7738a125895f23fc7d12a7bb59
+  languageName: node
+  linkType: hard
+
+"lodash.truncate@npm:^4.4.2":
+  version: 4.4.2
+  resolution: "lodash.truncate@npm:4.4.2"
+  checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5
+  languageName: node
+  linkType: hard
+
 "lodash.uniqby@npm:^4.7.0":
   version: 4.7.0
   resolution: "lodash.uniqby@npm:4.7.0"
@@ -7804,13 +11735,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"lodash@npm:^4.17.11, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21, lodash@npm:^4.17.4":
+"lodash@npm:^4.17.11, lodash@npm:^4.17.12, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.2.1, lodash@npm:^4.7.0":
   version: 4.17.21
   resolution: "lodash@npm:4.17.21"
   checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7
   languageName: node
   linkType: hard
 
+"log-driver@npm:^1.2.7":
+  version: 1.2.7
+  resolution: "log-driver@npm:1.2.7"
+  checksum: 14949119f830d897f52a0f83b058d8af3d13b9d21deedcc341c65c523091d4f95b0c151798b0bb988ed2712f487d9d44c302cd95b177708a80ac8e47a6a28a16
+  languageName: node
+  linkType: hard
+
 "log-symbols@npm:^2.2.0":
   version: 2.2.0
   resolution: "log-symbols@npm:2.2.0"
@@ -7832,6 +11770,23 @@ __metadata:
   languageName: node
   linkType: hard
 
+"longest@npm:^2.0.1":
+  version: 2.0.1
+  resolution: "longest@npm:2.0.1"
+  checksum: 9587c153919a883ecbcc33e9439bc2592aa6fdbbd2d343f8ab17d8d3e0373c4e4350e3b428566fd689d704800a23f2b4d145cbdcca4ef3fd35742e5927f919a9
+  languageName: node
+  linkType: hard
+
+"loud-rejection@npm:^1.0.0":
+  version: 1.6.0
+  resolution: "loud-rejection@npm:1.6.0"
+  dependencies:
+    currently-unhandled: ^0.4.1
+    signal-exit: ^3.0.0
+  checksum: 750e12defde34e8cbf263c2bff16f028a89b56e022ad6b368aa7c39495b5ac33f2349a8d00665a9b6d25c030b376396524d8a31eb0dde98aaa97956d7324f927
+  languageName: node
+  linkType: hard
+
 "lowdb@npm:^3.0.0":
   version: 3.0.0
   resolution: "lowdb@npm:3.0.0"
@@ -7841,6 +11796,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"lowercase-keys@npm:^1.0.0, lowercase-keys@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "lowercase-keys@npm:1.0.1"
+  checksum: 4d045026595936e09953e3867722e309415ff2c80d7701d067546d75ef698dac218a4f53c6d1d0e7368b47e45fd7529df47e6cb56fbb90523ba599f898b3d147
+  languageName: node
+  linkType: hard
+
 "lowercase-keys@npm:^2.0.0":
   version: 2.0.0
   resolution: "lowercase-keys@npm:2.0.0"
@@ -7883,6 +11845,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"lru-cache@npm:^7.4.0":
+  version: 7.8.1
+  resolution: "lru-cache@npm:7.8.1"
+  checksum: 31ea67388c9774300331d70f4affd5a433869bcf0fae5405f967d19d7b447930b713b0566a2e95362c9082034a8b496f3671ccf8f0c061d8e8048412663f9432
+  languageName: node
+  linkType: hard
+
 "lru-cache@npm:^7.7.1":
   version: 7.7.1
   resolution: "lru-cache@npm:7.7.1"
@@ -7890,7 +11859,23 @@ __metadata:
   languageName: node
   linkType: hard
 
-"magic-string@npm:^0.25.7":
+"lunr@npm:^2.3.9":
+  version: 2.3.9
+  resolution: "lunr@npm:2.3.9"
+  checksum: 176719e24fcce7d3cf1baccce9dd5633cd8bdc1f41ebe6a180112e5ee99d80373fe2454f5d4624d437e5a8319698ca6837b9950566e15d2cae5f2a543a3db4b8
+  languageName: node
+  linkType: hard
+
+"magic-string@npm:^0.22.5":
+  version: 0.22.5
+  resolution: "magic-string@npm:0.22.5"
+  dependencies:
+    vlq: ^0.2.2
+  checksum: e4d8b2083ed81f139ca471c19f5d0505c0f9083e06b71f48835057b3295a9494a15aac6a111d335573b986a67d3932e41c726d2eb6c76af30d0391b5e254ced3
+  languageName: node
+  linkType: hard
+
+"magic-string@npm:^0.25.3, magic-string@npm:^0.25.7":
   version: 0.25.9
   resolution: "magic-string@npm:0.25.9"
   dependencies:
@@ -7909,6 +11894,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"make-dir@npm:^3.0.0, make-dir@npm:^3.0.2":
+  version: 3.1.0
+  resolution: "make-dir@npm:3.1.0"
+  dependencies:
+    semver: ^6.0.0
+  checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78
+  languageName: node
+  linkType: hard
+
+"make-error@npm:1.x, make-error@npm:^1, make-error@npm:^1.1.1":
+  version: 1.3.6
+  resolution: "make-error@npm:1.3.6"
+  checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402
+  languageName: node
+  linkType: hard
+
 "make-fetch-happen@npm:*, make-fetch-happen@npm:^10.0.3, make-fetch-happen@npm:^10.0.6":
   version: 10.0.6
   resolution: "make-fetch-happen@npm:10.0.6"
@@ -7933,6 +11934,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"makeerror@npm:1.0.12":
+  version: 1.0.12
+  resolution: "makeerror@npm:1.0.12"
+  dependencies:
+    tmpl: 1.0.5
+  checksum: b38a025a12c8146d6eeea5a7f2bf27d51d8ad6064da8ca9405fcf7bf9b54acd43e3b30ddd7abb9b1bfa4ddb266019133313482570ddb207de568f71ecfcf6060
+  languageName: node
+  linkType: hard
+
 "map-cache@npm:^0.2.2":
   version: 0.2.2
   resolution: "map-cache@npm:0.2.2"
@@ -7940,13 +11950,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"map-obj@npm:^1.0.0":
+"map-obj@npm:^1.0.0, map-obj@npm:^1.0.1":
   version: 1.0.1
   resolution: "map-obj@npm:1.0.1"
   checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed
   languageName: node
   linkType: hard
 
+"map-obj@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "map-obj@npm:2.0.0"
+  checksum: 77d2b7b03398a71c84bd7df8ab7be2139e5459fc1e18dbb5f15055fe7284bec0fc37fe410185b5f8ca2e3c3e01fd0fd1f946c579607878adb26cad1cd75314aa
+  languageName: node
+  linkType: hard
+
 "map-obj@npm:^4.0.0":
   version: 4.3.0
   resolution: "map-obj@npm:4.3.0"
@@ -7963,6 +11980,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"marked-terminal@npm:^4.1.1":
+  version: 4.2.0
+  resolution: "marked-terminal@npm:4.2.0"
+  dependencies:
+    ansi-escapes: ^4.3.1
+    cardinal: ^2.1.1
+    chalk: ^4.1.0
+    cli-table3: ^0.6.0
+    node-emoji: ^1.10.0
+    supports-hyperlinks: ^2.1.0
+  peerDependencies:
+    marked: ^1.0.0 || ^2.0.0
+  checksum: a68a4cfd22b42f990a82e3234c68006ab4d1285a4a9bdd162f597740d9a55275c10c78ca21fa3927a76b2197589fe382e33af9baa2ccb2153812986c15aa73b8
+  languageName: node
+  linkType: hard
+
 "marked-terminal@npm:^5.0.0":
   version: 5.1.1
   resolution: "marked-terminal@npm:5.1.1"
@@ -7979,6 +12012,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"marked@npm:^2.0.0":
+  version: 2.1.3
+  resolution: "marked@npm:2.1.3"
+  bin:
+    marked: bin/marked
+  checksum: 21a5ecd4941bc760aba21dfd97185853ec3b464cf707ad971e3ddb3aeb2f44d0deeb36b0889932afdb6f734975a994d92f18815dd0fabadbd902bdaff997cc5b
+  languageName: node
+  linkType: hard
+
 "marked@npm:^4.0.10":
   version: 4.0.12
   resolution: "marked@npm:4.0.12"
@@ -8019,6 +12061,77 @@ __metadata:
   languageName: node
   linkType: hard
 
+"meow@npm:^3.3.0":
+  version: 3.7.0
+  resolution: "meow@npm:3.7.0"
+  dependencies:
+    camelcase-keys: ^2.0.0
+    decamelize: ^1.1.2
+    loud-rejection: ^1.0.0
+    map-obj: ^1.0.1
+    minimist: ^1.1.3
+    normalize-package-data: ^2.3.4
+    object-assign: ^4.0.1
+    read-pkg-up: ^1.0.1
+    redent: ^1.0.0
+    trim-newlines: ^1.0.0
+  checksum: 65a412e5d0d643615508007a9292799bb3e4e690597d54c9e98eb0ca3adb7b8ca8899f41ea7cb7d8277129cdcd9a1a60202b31f88e0034e6aaae02894d80999a
+  languageName: node
+  linkType: hard
+
+"meow@npm:^4.0.0":
+  version: 4.0.1
+  resolution: "meow@npm:4.0.1"
+  dependencies:
+    camelcase-keys: ^4.0.0
+    decamelize-keys: ^1.0.0
+    loud-rejection: ^1.0.0
+    minimist: ^1.1.3
+    minimist-options: ^3.0.1
+    normalize-package-data: ^2.3.4
+    read-pkg-up: ^3.0.0
+    redent: ^2.0.0
+    trim-newlines: ^2.0.0
+  checksum: cde5539eb5bbacba01057fa8735834cbfd1cc00fd97a8ec7b1d427f0829ff1bb8f66b0a194cf213ab35ed1adba0680eb65f1aa28f6d7808c8fffaa674116a7ad
+  languageName: node
+  linkType: hard
+
+"meow@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "meow@npm:5.0.0"
+  dependencies:
+    camelcase-keys: ^4.0.0
+    decamelize-keys: ^1.0.0
+    loud-rejection: ^1.0.0
+    minimist-options: ^3.0.1
+    normalize-package-data: ^2.3.4
+    read-pkg-up: ^3.0.0
+    redent: ^2.0.0
+    trim-newlines: ^2.0.0
+    yargs-parser: ^10.0.0
+  checksum: c00b6cdde2b1c1d8679eb0de46a51ed4eb1ee2c8785454d7383d09ddde1076e6928f17ef0d9111e28585d4d59cc15b4ba85668e274211b502f14bd1cf659fc46
+  languageName: node
+  linkType: hard
+
+"meow@npm:^7.0.0":
+  version: 7.1.1
+  resolution: "meow@npm:7.1.1"
+  dependencies:
+    "@types/minimist": ^1.2.0
+    camelcase-keys: ^6.2.2
+    decamelize-keys: ^1.1.0
+    hard-rejection: ^2.1.0
+    minimist-options: 4.1.0
+    normalize-package-data: ^2.5.0
+    read-pkg-up: ^7.0.1
+    redent: ^3.0.0
+    trim-newlines: ^3.0.0
+    type-fest: ^0.13.1
+    yargs-parser: ^18.1.3
+  checksum: 87bba177ab858a9b606ee52220e6bf395277beebafefe8ab5dbdf178f5825274a24ca16dca7e0ddd41e5ac3533164ee52e3d0eec87b66d78aae796d24a817842
+  languageName: node
+  linkType: hard
+
 "meow@npm:^8.0.0":
   version: 8.1.2
   resolution: "meow@npm:8.1.2"
@@ -8061,6 +12174,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"merge@npm:^2.1.1":
+  version: 2.1.1
+  resolution: "merge@npm:2.1.1"
+  checksum: 9c36b0e25aa53b3f7305d7cf0f330397f1142cf311802b681e5619f12e986a790019b8246c1c0df21701c8652449f9046b0129551030097ef563d1958c823249
+  languageName: node
+  linkType: hard
+
 "microdata-rdf-streaming-parser@npm:^1.1.0":
   version: 1.2.0
   resolution: "microdata-rdf-streaming-parser@npm:1.2.0"
@@ -8132,6 +12252,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"mime@npm:^2.4.3":
+  version: 2.6.0
+  resolution: "mime@npm:2.6.0"
+  bin:
+    mime: cli.js
+  checksum: 1497ba7b9f6960694268a557eae24b743fd2923da46ec392b042469f4b901721ba0adcf8b0d3c2677839d0e243b209d76e5edcbd09cfdeffa2dfb6bb4df4b862
+  languageName: node
+  linkType: hard
+
 "mime@npm:^3.0.0":
   version: 3.0.0
   resolution: "mime@npm:3.0.0"
@@ -8155,13 +12284,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"mimic-response@npm:^1.0.0":
+"mimic-response@npm:^1.0.0, mimic-response@npm:^1.0.1":
   version: 1.0.1
   resolution: "mimic-response@npm:1.0.1"
   checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823
   languageName: node
   linkType: hard
 
+"mimic-response@npm:^2.0.0, mimic-response@npm:^2.1.0":
+  version: 2.1.0
+  resolution: "mimic-response@npm:2.1.0"
+  checksum: 014fad6ab936657e5f2f48bd87af62a8e928ebe84472aaf9e14fec4fcb31257a5edff77324d8ac13ddc6685ba5135cf16e381efac324e5f174fb4ddbf902bf07
+  languageName: node
+  linkType: hard
+
 "mimic-response@npm:^3.1.0":
   version: 3.1.0
   resolution: "mimic-response@npm:3.1.0"
@@ -8190,7 +12326,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"minimatch@npm:^3.0.4":
+"minimatch@npm:^3.0.0, minimatch@npm:^3.0.4, minimatch@npm:^3.1.2":
   version: 3.1.2
   resolution: "minimatch@npm:3.1.2"
   dependencies:
@@ -8219,13 +12355,30 @@ __metadata:
   languageName: node
   linkType: hard
 
-"minimist@npm:^1.2.0, minimist@npm:^1.2.5":
+"minimist-options@npm:^3.0.1":
+  version: 3.0.2
+  resolution: "minimist-options@npm:3.0.2"
+  dependencies:
+    arrify: ^1.0.1
+    is-plain-obj: ^1.1.0
+  checksum: f111ff4a3371312f3827bc5a519d757bd5bd8406599193b6cd32b8137eeaee74dd8f1896b66778ac26069ecbaee0659dd0ca4b65c6ec9d0683b09a9573e4f389
+  languageName: node
+  linkType: hard
+
+"minimist@npm:1.2.5, minimist@npm:^1.2.0, minimist@npm:^1.2.5":
   version: 1.2.5
   resolution: "minimist@npm:1.2.5"
   checksum: 86706ce5b36c16bfc35c5fe3dbb01d5acdc9a22f2b6cc810b6680656a1d2c0e44a0159c9a3ba51fb072bb5c203e49e10b51dcd0eec39c481f4c42086719bae52
   languageName: node
   linkType: hard
 
+"minimist@npm:^1.1.3, minimist@npm:^1.2.6":
+  version: 1.2.6
+  resolution: "minimist@npm:1.2.6"
+  checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb
+  languageName: node
+  linkType: hard
+
 "minipass-collect@npm:^1.0.2":
   version: 1.0.2
   resolution: "minipass-collect@npm:1.0.2"
@@ -8414,6 +12567,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"mute-stream@npm:0.0.7":
+  version: 0.0.7
+  resolution: "mute-stream@npm:0.0.7"
+  checksum: a9d4772c1c84206aa37c218ed4751cd060239bf1d678893124f51e037f6f22f4a159b2918c030236c93252638a74beb29c9b1fd3267c9f24d4b3253cf1eaa86f
+  languageName: node
+  linkType: hard
+
 "mute-stream@npm:0.0.8, mute-stream@npm:~0.0.4":
   version: 0.0.8
   resolution: "mute-stream@npm:0.0.8"
@@ -8503,7 +12663,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"node-emoji@npm:^1.11.0":
+"node-emoji@npm:^1.10.0, node-emoji@npm:^1.11.0":
   version: 1.11.0
   resolution: "node-emoji@npm:1.11.0"
   dependencies:
@@ -8546,6 +12706,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"node-int64@npm:^0.4.0":
+  version: 0.4.0
+  resolution: "node-int64@npm:0.4.0"
+  checksum: d0b30b1ee6d961851c60d5eaa745d30b5c95d94bc0e74b81e5292f7c42a49e3af87f1eb9e89f59456f80645d679202537de751b7d72e9e40ceea40c5e449057e
+  languageName: node
+  linkType: hard
+
 "node-ipc@npm:9.2.1":
   version: 9.2.1
   resolution: "node-ipc@npm:9.2.1"
@@ -8606,7 +12773,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"normalize-package-data@npm:^2.5.0":
+"normalize-package-data@npm:^2.3.0, normalize-package-data@npm:^2.3.2, normalize-package-data@npm:^2.3.4, normalize-package-data@npm:^2.3.5, normalize-package-data@npm:^2.5.0":
   version: 2.5.0
   resolution: "normalize-package-data@npm:2.5.0"
   dependencies:
@@ -8665,6 +12832,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"normalize-url@npm:^4.1.0":
+  version: 4.5.1
+  resolution: "normalize-url@npm:4.5.1"
+  checksum: 9a9dee01df02ad23e171171893e56e22d752f7cff86fb96aafeae074819b572ea655b60f8302e2d85dbb834dc885c972cc1c573892fea24df46b2765065dd05a
+  languageName: node
+  linkType: hard
+
 "normalize-url@npm:^6.0.0, normalize-url@npm:^6.0.1":
   version: 6.1.0
   resolution: "normalize-url@npm:6.1.0"
@@ -8979,6 +13153,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"number-is-nan@npm:^1.0.0":
+  version: 1.0.1
+  resolution: "number-is-nan@npm:1.0.1"
+  checksum: 13656bc9aa771b96cef209ffca31c31a03b507ca6862ba7c3f638a283560620d723d52e626d57892c7fff475f4c36ac07f0600f14544692ff595abff214b9ffb
+  languageName: node
+  linkType: hard
+
+"nwsapi@npm:^2.2.0":
+  version: 2.2.0
+  resolution: "nwsapi@npm:2.2.0"
+  checksum: 5ef4a9bc0c1a5b7f2e014aa6a4b359a257503b796618ed1ef0eb852098f77e772305bb0e92856e4bbfa3e6c75da48c0113505c76f144555ff38867229c2400a7
+  languageName: node
+  linkType: hard
+
 "oauth-sign@npm:~0.9.0":
   version: 0.9.0
   resolution: "oauth-sign@npm:0.9.0"
@@ -9046,6 +13234,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"object.fromentries@npm:^2.0.3":
+  version: 2.0.5
+  resolution: "object.fromentries@npm:2.0.5"
+  dependencies:
+    call-bind: ^1.0.2
+    define-properties: ^1.1.3
+    es-abstract: ^1.19.1
+  checksum: 61a0b565ded97b76df9e30b569729866e1824cce902f98e90bb106e84f378aea20163366f66dc75c9000e2aad2ed0caf65c6f530cb2abc4c0c0f6c982102db4b
+  languageName: node
+  linkType: hard
+
 "object.pick@npm:^1.3.0":
   version: 1.3.0
   resolution: "object.pick@npm:1.3.0"
@@ -9111,6 +13310,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"optionator@npm:^0.8.1":
+  version: 0.8.3
+  resolution: "optionator@npm:0.8.3"
+  dependencies:
+    deep-is: ~0.1.3
+    fast-levenshtein: ~2.0.6
+    levn: ~0.3.0
+    prelude-ls: ~1.1.2
+    type-check: ~0.3.2
+    word-wrap: ~1.2.3
+  checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34
+  languageName: node
+  linkType: hard
+
 "optionator@npm:^0.9.1":
   version: 0.9.1
   resolution: "optionator@npm:0.9.1"
@@ -9153,6 +13366,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"p-cancelable@npm:^0.3.0":
+  version: 0.3.0
+  resolution: "p-cancelable@npm:0.3.0"
+  checksum: 2b27639be8f7f8718f2854c1711f713c296db00acc4675975b1531ecb6253da197304b4a211a330a8e54e754d28d4b3f7feecb48f0566dd265e3ba6745cd4148
+  languageName: node
+  linkType: hard
+
+"p-cancelable@npm:^1.0.0":
+  version: 1.1.0
+  resolution: "p-cancelable@npm:1.1.0"
+  checksum: 2db3814fef6d9025787f30afaee4496a8857a28be3c5706432cbad76c688a6db1874308f48e364a42f5317f5e41e8e7b4f2ff5c8ff2256dbb6264bc361704ece
+  languageName: node
+  linkType: hard
+
 "p-cancelable@npm:^2.0.0":
   version: 2.1.1
   resolution: "p-cancelable@npm:2.1.1"
@@ -9167,6 +13394,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"p-event@npm:^4.0.0":
+  version: 4.2.0
+  resolution: "p-event@npm:4.2.0"
+  dependencies:
+    p-timeout: ^3.1.0
+  checksum: 8a3588f7a816a20726a3262dfeee70a631e3997e4773d23219176333eda55cce9a76219e3d2b441b331eb746e14fdb381eb2694ab9ff2fcf87c846462696fe89
+  languageName: node
+  linkType: hard
+
 "p-filter@npm:^2.0.0":
   version: 2.1.0
   resolution: "p-filter@npm:2.1.0"
@@ -9208,6 +13444,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"p-limit@npm:^3.0.2":
+  version: 3.1.0
+  resolution: "p-limit@npm:3.1.0"
+  dependencies:
+    yocto-queue: ^0.1.0
+  checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360
+  languageName: node
+  linkType: hard
+
 "p-locate@npm:^2.0.0":
   version: 2.0.0
   resolution: "p-locate@npm:2.0.0"
@@ -9235,6 +13480,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"p-locate@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "p-locate@npm:5.0.0"
+  dependencies:
+    p-limit: ^3.0.2
+  checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3
+  languageName: node
+  linkType: hard
+
 "p-map@npm:^2.0.0":
   version: 2.1.0
   resolution: "p-map@npm:2.1.0"
@@ -9268,6 +13522,24 @@ __metadata:
   languageName: node
   linkType: hard
 
+"p-timeout@npm:^1.1.1":
+  version: 1.2.1
+  resolution: "p-timeout@npm:1.2.1"
+  dependencies:
+    p-finally: ^1.0.0
+  checksum: 65a456f49cca1328774a6bfba61aac98d854b36df9153c2887f82f078d4399e9a30463be8a479871c22ed350a23b34a66ff303ca652b9d81ed4ff5260ac660d2
+  languageName: node
+  linkType: hard
+
+"p-timeout@npm:^3.1.0":
+  version: 3.2.0
+  resolution: "p-timeout@npm:3.2.0"
+  dependencies:
+    p-finally: ^1.0.0
+  checksum: 3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c
+  languageName: node
+  linkType: hard
+
 "p-try@npm:^1.0.0":
   version: 1.0.0
   resolution: "p-try@npm:1.0.0"
@@ -9395,6 +13667,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"parse-github-repo-url@npm:^1.3.0":
+  version: 1.4.1
+  resolution: "parse-github-repo-url@npm:1.4.1"
+  checksum: 58d9facd65621267d2484d0bc88f0194e9142f4e42e333d9cd7322418279e186bac0ced67480dcd2d0695522c2c91b6d99f6fd3824ec113a17fd69bc893c173a
+  languageName: node
+  linkType: hard
+
+"parse-json@npm:^2.2.0":
+  version: 2.2.0
+  resolution: "parse-json@npm:2.2.0"
+  dependencies:
+    error-ex: ^1.2.0
+  checksum: dda78a63e57a47b713a038630868538f718a7ca0cd172a36887b0392ccf544ed0374902eb28f8bf3409e8b71d62b79d17062f8543afccf2745f9b0b2d2bb80ca
+  languageName: node
+  linkType: hard
+
 "parse-json@npm:^4.0.0":
   version: 4.0.0
   resolution: "parse-json@npm:4.0.0"
@@ -9405,7 +13693,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"parse-json@npm:^5.0.0":
+"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0":
   version: 5.2.0
   resolution: "parse-json@npm:5.2.0"
   dependencies:
@@ -9426,6 +13714,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"parse-passwd@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "parse-passwd@npm:1.0.0"
+  checksum: 4e55e0231d58f828a41d0f1da2bf2ff7bcef8f4cb6146e69d16ce499190de58b06199e6bd9b17fbf0d4d8aef9052099cdf8c4f13a6294b1a522e8e958073066e
+  languageName: node
+  linkType: hard
+
 "parse-path@npm:^4.0.0":
   version: 4.0.3
   resolution: "parse-path@npm:4.0.3"
@@ -9438,6 +13733,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"parse5@npm:6.0.1":
+  version: 6.0.1
+  resolution: "parse5@npm:6.0.1"
+  checksum: 7d569a176c5460897f7c8f3377eff640d54132b9be51ae8a8fa4979af940830b2b0c296ce75e5bd8f4041520aadde13170dbdec44889975f906098ea0002f4bd
+  languageName: node
+  linkType: hard
+
 "pascalcase@npm:^0.1.1":
   version: 0.1.1
   resolution: "pascalcase@npm:0.1.1"
@@ -9503,7 +13805,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"path-parse@npm:^1.0.7":
+"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7":
   version: 1.0.7
   resolution: "path-parse@npm:1.0.7"
   checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a
@@ -9519,6 +13821,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"path-type@npm:^1.0.0":
+  version: 1.1.0
+  resolution: "path-type@npm:1.1.0"
+  dependencies:
+    graceful-fs: ^4.1.2
+    pify: ^2.0.0
+    pinkie-promise: ^2.0.0
+  checksum: 59a4b2c0e566baf4db3021a1ed4ec09a8b36fca960a490b54a6bcefdb9987dafe772852982b6011cd09579478a96e57960a01f75fa78a794192853c9d468fc79
+  languageName: node
+  linkType: hard
+
 "path-type@npm:^3.0.0":
   version: 3.0.0
   resolution: "path-type@npm:3.0.0"
@@ -9585,6 +13898,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"pify@npm:^2.0.0, pify@npm:^2.3.0":
+  version: 2.3.0
+  resolution: "pify@npm:2.3.0"
+  checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba
+  languageName: node
+  linkType: hard
+
 "pify@npm:^3.0.0":
   version: 3.0.0
   resolution: "pify@npm:3.0.0"
@@ -9634,6 +13954,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"pirates@npm:^4.0.4":
+  version: 4.0.5
+  resolution: "pirates@npm:4.0.5"
+  checksum: c9994e61b85260bec6c4fc0307016340d9b0c4f4b6550a957afaaff0c9b1ad58fbbea5cfcf083860a25cb27a375442e2b0edf52e2e1e40e69934e08dcc52d227
+  languageName: node
+  linkType: hard
+
 "pkg-conf@npm:^2.1.0":
   version: 2.1.0
   resolution: "pkg-conf@npm:2.1.0"
@@ -9662,6 +13989,24 @@ __metadata:
   languageName: node
   linkType: hard
 
+"pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0":
+  version: 4.2.0
+  resolution: "pkg-dir@npm:4.2.0"
+  dependencies:
+    find-up: ^4.0.0
+  checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6
+  languageName: node
+  linkType: hard
+
+"please-upgrade-node@npm:^3.2.0":
+  version: 3.2.0
+  resolution: "please-upgrade-node@npm:3.2.0"
+  dependencies:
+    semver-compare: ^1.0.0
+  checksum: d87c41581a2a022fbe25965a97006238cd9b8cbbf49b39f78d262548149a9d30bd2bdf35fec3d810e0001e630cd46ef13c7e19c389dea8de7e64db271a2381bb
+  languageName: node
+  linkType: hard
+
 "popper.js@npm:^1.16.1":
   version: 1.16.1
   resolution: "popper.js@npm:1.16.1"
@@ -9723,6 +14068,27 @@ __metadata:
   languageName: node
   linkType: hard
 
+"prelude-ls@npm:~1.1.2":
+  version: 1.1.2
+  resolution: "prelude-ls@npm:1.1.2"
+  checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4
+  languageName: node
+  linkType: hard
+
+"prepend-http@npm:^1.0.1":
+  version: 1.0.4
+  resolution: "prepend-http@npm:1.0.4"
+  checksum: 01e7baf4ad38af02257b99098543469332fc42ae50df33d97a124bf8172295907352fa6138c9b1610c10c6dd0847ca736e53fda736387cc5cf8fcffe96b47f29
+  languageName: node
+  linkType: hard
+
+"prepend-http@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "prepend-http@npm:2.0.0"
+  checksum: 7694a9525405447662c1ffd352fcb41b6410c705b739b6f4e3a3e21cf5fdede8377890088e8934436b8b17ba55365a615f153960f30877bf0d0392f9e93503ea
+  languageName: node
+  linkType: hard
+
 "prettier-linter-helpers@npm:^1.0.0":
   version: 1.0.0
   resolution: "prettier-linter-helpers@npm:1.0.0"
@@ -9741,6 +14107,26 @@ __metadata:
   languageName: node
   linkType: hard
 
+"prettier@npm:^2.3.2":
+  version: 2.6.2
+  resolution: "prettier@npm:2.6.2"
+  bin:
+    prettier: bin-prettier.js
+  checksum: 48d08dde8e9fb1f5bccdd205baa7f192e9fc8bc98f86e1b97d919de804e28c806b0e6cc685e4a88211aa7987fa9668f30baae19580d87ced3ed0f2ec6572106f
+  languageName: node
+  linkType: hard
+
+"pretty-format@npm:^27.0.0, pretty-format@npm:^27.5.1":
+  version: 27.5.1
+  resolution: "pretty-format@npm:27.5.1"
+  dependencies:
+    ansi-regex: ^5.0.1
+    ansi-styles: ^5.0.0
+    react-is: ^17.0.1
+  checksum: cf610cffcb793885d16f184a62162f2dd0df31642d9a18edf4ca298e909a8fe80bdbf556d5c9573992c102ce8bf948691da91bf9739bee0ffb6e79c8a8a6e088
+  languageName: node
+  linkType: hard
+
 "proc-log@npm:^2.0.0":
   version: 2.0.0
   resolution: "proc-log@npm:2.0.0"
@@ -9748,6 +14134,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"process-es6@npm:^0.11.6":
+  version: 0.11.6
+  resolution: "process-es6@npm:0.11.6"
+  checksum: 8849ea1a799a20a8e863fd3a5558d4085357ee59cae16b76f61327e3b3a27697b4e49c880742a6cc0f0c37eb0bd78fb0d4e382bd2e5318bb699b404b55a9b91e
+  languageName: node
+  linkType: hard
+
 "process-nextick-args@npm:~2.0.0":
   version: 2.0.1
   resolution: "process-nextick-args@npm:2.0.1"
@@ -9762,6 +14155,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"progress@npm:^2.0.0, progress@npm:^2.0.3":
+  version: 2.0.3
+  resolution: "progress@npm:2.0.3"
+  checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7
+  languageName: node
+  linkType: hard
+
 "promise-all-reject-late@npm:^1.0.0":
   version: 1.0.1
   resolution: "promise-all-reject-late@npm:1.0.1"
@@ -9800,6 +14200,29 @@ __metadata:
   languageName: node
   linkType: hard
 
+"prompt@npm:^1.2.0":
+  version: 1.2.2
+  resolution: "prompt@npm:1.2.2"
+  dependencies:
+    "@colors/colors": 1.5.0
+    async: ~0.9.0
+    read: 1.0.x
+    revalidator: 0.1.x
+    winston: 2.x
+  checksum: 86731e2a7d49b02e380e4cf4d1d41c6c8dc706bf7016faf2dab49b90bd583a846e3947c8d5e3dbf404878d97ea89fe97b0ed7d1e8885479f9de46963508f85fa
+  languageName: node
+  linkType: hard
+
+"prompts@npm:^2.0.1":
+  version: 2.4.2
+  resolution: "prompts@npm:2.4.2"
+  dependencies:
+    kleur: ^3.0.3
+    sisteransi: ^1.0.5
+  checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d
+  languageName: node
+  linkType: hard
+
 "promzard@npm:^0.3.0":
   version: 0.3.0
   resolution: "promzard@npm:0.3.0"
@@ -9830,7 +14253,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"psl@npm:^1.1.28":
+"psl@npm:^1.1.28, psl@npm:^1.1.33":
   version: 1.8.0
   resolution: "psl@npm:1.8.0"
   checksum: 6150048ed2da3f919478bee8a82f3828303bc0fc730fb015a48f83c9977682c7b28c60ab01425a72d82a2891a1681627aa530a991d50c086b48a3be27744bde7
@@ -9903,7 +14326,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"q@npm:^1.5.1":
+"q@npm:^1.4.1, q@npm:^1.5.1":
   version: 1.5.1
   resolution: "q@npm:1.5.1"
   checksum: 147baa93c805bc1200ed698bdf9c72e9e42c05f96d007e33a558b5fdfd63e5ea130e99313f28efc1783e90e6bdb4e48b67a36fcc026b7b09202437ae88a1fb12
@@ -9975,6 +14398,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"quick-lru@npm:^1.0.0":
+  version: 1.1.0
+  resolution: "quick-lru@npm:1.1.0"
+  checksum: 7fd3fb3fb19dfc1d32bc0799c336f5867adc9ba3d9a662a50fdb463d2bb27d9c89b5e55b01a51fe09c3e251389ea858e1c38326bac8f550ff92dcebbf26665a3
+  languageName: node
+  linkType: hard
+
 "quick-lru@npm:^4.0.1":
   version: 4.0.1
   resolution: "quick-lru@npm:4.0.1"
@@ -10193,6 +14623,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"react-is@npm:^17.0.1":
+  version: 17.0.2
+  resolution: "react-is@npm:17.0.2"
+  checksum: 9d6d111d8990dc98bc5402c1266a808b0459b5d54830bbea24c12d908b536df7883f268a7868cfaedde3dd9d4e0d574db456f84d2e6df9c4526f99bb4b5344d8
+  languageName: node
+  linkType: hard
+
 "read-cmd-shim@npm:^2.0.0":
   version: 2.0.0
   resolution: "read-cmd-shim@npm:2.0.0"
@@ -10234,6 +14671,26 @@ __metadata:
   languageName: node
   linkType: hard
 
+"read-pkg-up@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "read-pkg-up@npm:1.0.1"
+  dependencies:
+    find-up: ^1.0.0
+    read-pkg: ^1.0.0
+  checksum: d18399a0f46e2da32beb2f041edd0cda49d2f2cc30195a05c759ef3ed9b5e6e19ba1ad1bae2362bdec8c6a9f2c3d18f4d5e8c369e808b03d498d5781cb9122c7
+  languageName: node
+  linkType: hard
+
+"read-pkg-up@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "read-pkg-up@npm:3.0.0"
+  dependencies:
+    find-up: ^2.0.0
+    read-pkg: ^3.0.0
+  checksum: 16175573f2914ab9788897bcbe2a62b5728d0075e62285b3680cebe97059e2911e0134a062cf6e51ebe3e3775312bc788ac2039ed6af38ec68d2c10c6f2b30fb
+  languageName: node
+  linkType: hard
+
 "read-pkg-up@npm:^7.0.0, read-pkg-up@npm:^7.0.1":
   version: 7.0.1
   resolution: "read-pkg-up@npm:7.0.1"
@@ -10245,6 +14702,28 @@ __metadata:
   languageName: node
   linkType: hard
 
+"read-pkg@npm:^1.0.0":
+  version: 1.1.0
+  resolution: "read-pkg@npm:1.1.0"
+  dependencies:
+    load-json-file: ^1.0.0
+    normalize-package-data: ^2.3.2
+    path-type: ^1.0.0
+  checksum: a0f5d5e32227ec8e6a028dd5c5134eab229768dcb7a5d9a41a284ed28ad4b9284fecc47383dc1593b5694f4de603a7ffaee84b738956b9b77e0999567485a366
+  languageName: node
+  linkType: hard
+
+"read-pkg@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "read-pkg@npm:3.0.0"
+  dependencies:
+    load-json-file: ^4.0.0
+    normalize-package-data: ^2.3.2
+    path-type: ^3.0.0
+  checksum: 398903ebae6c7e9965419a1062924436cc0b6f516c42c4679a90290d2f87448ed8f977e7aa2dbba4aa1ac09248628c43e493ac25b2bc76640e946035200e34c6
+  languageName: node
+  linkType: hard
+
 "read-pkg@npm:^5.0.0, read-pkg@npm:^5.1.1, read-pkg@npm:^5.2.0":
   version: 5.2.0
   resolution: "read-pkg@npm:5.2.0"
@@ -10257,7 +14736,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"read@npm:*, read@npm:1, read@npm:^1.0.7, read@npm:~1.0.7":
+"read@npm:*, read@npm:1, read@npm:1.0.x, read@npm:^1.0.7, read@npm:~1.0.7":
   version: 1.0.7
   resolution: "read@npm:1.0.7"
   dependencies:
@@ -10288,7 +14767,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0":
+"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0":
   version: 3.6.0
   resolution: "readable-stream@npm:3.6.0"
   dependencies:
@@ -10331,6 +14810,35 @@ __metadata:
   languageName: node
   linkType: hard
 
+"rechoir@npm:^0.6.2":
+  version: 0.6.2
+  resolution: "rechoir@npm:0.6.2"
+  dependencies:
+    resolve: ^1.1.6
+  checksum: fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b
+  languageName: node
+  linkType: hard
+
+"redent@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "redent@npm:1.0.0"
+  dependencies:
+    indent-string: ^2.1.0
+    strip-indent: ^1.0.1
+  checksum: 2bb8f76fda9c9f44e26620047b0ba9dd1834b0a80309d0badcc23fdcf7bb27a7ca74e66b683baa0d4b8cb5db787f11be086504036d63447976f409dd3e73fd7d
+  languageName: node
+  linkType: hard
+
+"redent@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "redent@npm:2.0.0"
+  dependencies:
+    indent-string: ^3.0.0
+    strip-indent: ^2.0.0
+  checksum: c3bcea97de01023efbe826cd72abf2e5948e096acd808a498b4de5dd25e64ad8df0cb4218403197b4ea050ce73f2264a318bf469a27f87ba8ca31543892011d4
+  languageName: node
+  linkType: hard
+
 "redent@npm:^3.0.0":
   version: 3.0.0
   resolution: "redent@npm:3.0.0"
@@ -10360,7 +14868,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"regexpp@npm:^3.2.0":
+"regexpp@npm:^3.1.0, regexpp@npm:^3.2.0":
   version: 3.2.0
   resolution: "regexpp@npm:3.2.0"
   checksum: a78dc5c7158ad9ddcfe01aa9144f46e192ddbfa7b263895a70a5c6c73edd9ce85faf7c0430e59ac38839e1734e275b9c3de5c57ee3ab6edc0e0b1bdebefccef8
@@ -10404,6 +14912,28 @@ __metadata:
   languageName: node
   linkType: hard
 
+"repeating@npm:^2.0.0":
+  version: 2.0.1
+  resolution: "repeating@npm:2.0.1"
+  dependencies:
+    is-finite: ^1.0.0
+  checksum: d2db0b69c5cb0c14dd750036e0abcd6b3c3f7b2da3ee179786b755cf737ca15fa0fff417ca72de33d6966056f4695440e680a352401fc02c95ade59899afbdd0
+  languageName: node
+  linkType: hard
+
+"replace-in-file@npm:^6.2.0":
+  version: 6.3.2
+  resolution: "replace-in-file@npm:6.3.2"
+  dependencies:
+    chalk: ^4.1.2
+    glob: ^7.2.0
+    yargs: ^17.2.1
+  bin:
+    replace-in-file: bin/cli.js
+  checksum: ae3a0486711edfc1d7d769782764902934aeb327e54a56fbf8a92df22862a56312d86dbe0067274fb3666da668457576f6a775f814742acceea70f5aedb01f49
+  languageName: node
+  linkType: hard
+
 "request@npm:^2.88.2":
   version: 2.88.2
   resolution: "request@npm:2.88.2"
@@ -10432,17 +14962,50 @@ __metadata:
   languageName: node
   linkType: hard
 
-"require-directory@npm:^2.1.1":
-  version: 2.1.1
-  resolution: "require-directory@npm:2.1.1"
-  checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80
+"require-directory@npm:^2.1.1":
+  version: 2.1.1
+  resolution: "require-directory@npm:2.1.1"
+  checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80
+  languageName: node
+  linkType: hard
+
+"require-from-string@npm:^2.0.2":
+  version: 2.0.2
+  resolution: "require-from-string@npm:2.0.2"
+  checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b
+  languageName: node
+  linkType: hard
+
+"resolve-alpn@npm:^1.0.0":
+  version: 1.2.1
+  resolution: "resolve-alpn@npm:1.2.1"
+  checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0
+  languageName: node
+  linkType: hard
+
+"resolve-cwd@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "resolve-cwd@npm:3.0.0"
+  dependencies:
+    resolve-from: ^5.0.0
+  checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81
+  languageName: node
+  linkType: hard
+
+"resolve-dir@npm:^1.0.0, resolve-dir@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "resolve-dir@npm:1.0.1"
+  dependencies:
+    expand-tilde: ^2.0.0
+    global-modules: ^1.0.0
+  checksum: ef736b8ed60d6645c3b573da17d329bfb50ec4e1d6c5ffd6df49e3497acef9226f9810ea6823b8ece1560e01dcb13f77a9f6180d4f242d00cc9a8f4de909c65c
   languageName: node
   linkType: hard
 
-"resolve-alpn@npm:^1.0.0":
-  version: 1.2.1
-  resolution: "resolve-alpn@npm:1.2.1"
-  checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0
+"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "resolve-from@npm:5.0.0"
+  checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf
   languageName: node
   linkType: hard
 
@@ -10453,10 +15016,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"resolve-from@npm:^5.0.0":
-  version: 5.0.0
-  resolution: "resolve-from@npm:5.0.0"
-  checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf
+"resolve-global@npm:1.0.0, resolve-global@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "resolve-global@npm:1.0.0"
+  dependencies:
+    global-dirs: ^0.1.1
+  checksum: c4e11d33e84bde7516b824503ffbe4b6cce863d5ce485680fd3db997b7c64da1df98321b1fd0703b58be8bc9bc83bc96bd83043f96194386b45eb47229efb6b6
   languageName: node
   linkType: hard
 
@@ -10467,7 +15032,24 @@ __metadata:
   languageName: node
   linkType: hard
 
-"resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0":
+"resolve.exports@npm:^1.1.0":
+  version: 1.1.0
+  resolution: "resolve.exports@npm:1.1.0"
+  checksum: 52865af8edb088f6c7759a328584a5de6b226754f004b742523adcfe398cfbc4559515104bc2ae87b8e78b1e4de46c9baec400b3fb1f7d517b86d2d48a098a2d
+  languageName: node
+  linkType: hard
+
+"resolve@npm:1.20.0":
+  version: 1.20.0
+  resolution: "resolve@npm:1.20.0"
+  dependencies:
+    is-core-module: ^2.2.0
+    path-parse: ^1.0.6
+  checksum: 40cf70b2cde00ef57f99daf2dc63c6a56d6c14a1b7fc51735d06a6f0a3b97cb67b4fb7ef6c747b4e13a7baba83b0ef625d7c4ce92a483cd5af923c3b65fd16fe
+  languageName: node
+  linkType: hard
+
+"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0":
   version: 1.22.0
   resolution: "resolve@npm:1.22.0"
   dependencies:
@@ -10480,7 +15062,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"resolve@patch:resolve@^1.10.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.0#~builtin<compat/resolve>":
+"resolve@patch:resolve@1.20.0#~builtin<compat/resolve>":
+  version: 1.20.0
+  resolution: "resolve@patch:resolve@npm%3A1.20.0#~builtin<compat/resolve>::version=1.20.0&hash=07638b"
+  dependencies:
+    is-core-module: ^2.2.0
+    path-parse: ^1.0.6
+  checksum: a0dd7d16a8e47af23afa9386df2dff10e3e0debb2c7299a42e581d9d9b04d7ad5d2c53f24f1e043f7b3c250cbdc71150063e53d0b6559683d37f790b7c8c3cd5
+  languageName: node
+  linkType: hard
+
+"resolve@patch:resolve@^1.1.6#~builtin<compat/resolve>, resolve@patch:resolve@^1.10.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.17.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.19.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.0#~builtin<compat/resolve>":
   version: 1.22.0
   resolution: "resolve@patch:resolve@npm%3A1.22.0#~builtin<compat/resolve>::version=1.22.0&hash=07638b"
   dependencies:
@@ -10493,6 +15085,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"responselike@npm:^1.0.2":
+  version: 1.0.2
+  resolution: "responselike@npm:1.0.2"
+  dependencies:
+    lowercase-keys: ^1.0.0
+  checksum: 2e9e70f1dcca3da621a80ce71f2f9a9cad12c047145c6ece20df22f0743f051cf7c73505e109814915f23f9e34fb0d358e22827723ee3d56b623533cab8eafcd
+  languageName: node
+  linkType: hard
+
 "responselike@npm:^2.0.0":
   version: 2.0.0
   resolution: "responselike@npm:2.0.0"
@@ -10550,6 +15151,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"revalidator@npm:0.1.x":
+  version: 0.1.8
+  resolution: "revalidator@npm:0.1.8"
+  checksum: 9ac69162ce8fc86f5fa77f37f3ad634d3797ea70eff4faff13619167ebbf3f3ccf2ec115ccd9c3c860658f8859426022d61d2a1e49183db095ba4f0a016905fe
+  languageName: node
+  linkType: hard
+
 "rfdc@npm:^1.3.0":
   version: 1.3.0
   resolution: "rfdc@npm:1.3.0"
@@ -10589,7 +15197,93 @@ __metadata:
   languageName: node
   linkType: hard
 
-"rollup@npm:^2.58.0, rollup@npm:^2.59.0":
+"rollup-plugin-inject@npm:^3.0.0":
+  version: 3.0.2
+  resolution: "rollup-plugin-inject@npm:3.0.2"
+  dependencies:
+    estree-walker: ^0.6.1
+    magic-string: ^0.25.3
+    rollup-pluginutils: ^2.8.1
+  checksum: a014972c80fe34b8c8154056fa2533a8440066a31de831e3793fc21b15d108d92c22d8f7f472397bd5783d7c5e04d8cbf112fb72c5a26e997726e4eb090edad1
+  languageName: node
+  linkType: hard
+
+"rollup-plugin-node-globals@npm:^1.4.0":
+  version: 1.4.0
+  resolution: "rollup-plugin-node-globals@npm:1.4.0"
+  dependencies:
+    acorn: ^5.7.3
+    buffer-es6: ^4.9.3
+    estree-walker: ^0.5.2
+    magic-string: ^0.22.5
+    process-es6: ^0.11.6
+    rollup-pluginutils: ^2.3.1
+  checksum: da3cd85ad2f3824a767dd242e484d5cd530eae9fa809c87aba1ff66d64b7a08c84ed76592694c91ee39cf7d5efe487b62e60d402d579001560f6e6de99105576
+  languageName: node
+  linkType: hard
+
+"rollup-plugin-node-polyfills@npm:^0.2.1":
+  version: 0.2.1
+  resolution: "rollup-plugin-node-polyfills@npm:0.2.1"
+  dependencies:
+    rollup-plugin-inject: ^3.0.0
+  checksum: e84645212c443aca3cfae2ba69f01c6d8c5c250f0bf651416b69a4572b60aae9da7cdd687de3ab9b903f7a1ab96b06b71f0c4927d1b02a37485360d2b563937b
+  languageName: node
+  linkType: hard
+
+"rollup-plugin-polyfill-node@npm:^0.8.0":
+  version: 0.8.0
+  resolution: "rollup-plugin-polyfill-node@npm:0.8.0"
+  dependencies:
+    "@rollup/plugin-inject": ^4.0.0
+  peerDependencies:
+    rollup: ^1.20.0 || ^2.0.0
+  checksum: ad6e451b1ae91f7b4370ab7b5dd03f578a67ebd42bcd3eec198ae6d4cd7caa1c454bd020ff8e80f3dcb02cdd9357da2b752c0aac3f84c56a28c23a6c0ffeffd5
+  languageName: node
+  linkType: hard
+
+"rollup-plugin-sourcemaps@npm:^0.6.3":
+  version: 0.6.3
+  resolution: "rollup-plugin-sourcemaps@npm:0.6.3"
+  dependencies:
+    "@rollup/pluginutils": ^3.0.9
+    source-map-resolve: ^0.6.0
+  peerDependencies:
+    "@types/node": ">=10.0.0"
+    rollup: ">=0.31.2"
+  peerDependenciesMeta:
+    "@types/node":
+      optional: true
+  checksum: bb4909a90f2e824717a67ad146b2cccc40411ee54709ffa548c47c4dfe485bd55039a5850d7640ecb2691de9dc30e3fd57287e4d74331f36fed9c263d86dd4dc
+  languageName: node
+  linkType: hard
+
+"rollup-plugin-typescript2@npm:^0.30.0":
+  version: 0.30.0
+  resolution: "rollup-plugin-typescript2@npm:0.30.0"
+  dependencies:
+    "@rollup/pluginutils": ^4.1.0
+    find-cache-dir: ^3.3.1
+    fs-extra: 8.1.0
+    resolve: 1.20.0
+    tslib: 2.1.0
+  peerDependencies:
+    rollup: ">=1.26.3"
+    typescript: ">=2.4.0"
+  checksum: e3097bb25c00e78cca556ed6a77b3bdf2330e5e5647847d1f967ade67dc6b66009b52bb8810de2b2c40857310693e4e663900a13da4f711f082fabac5165091a
+  languageName: node
+  linkType: hard
+
+"rollup-pluginutils@npm:^2.3.1, rollup-pluginutils@npm:^2.8.1":
+  version: 2.8.2
+  resolution: "rollup-pluginutils@npm:2.8.2"
+  dependencies:
+    estree-walker: ^0.6.1
+  checksum: 339fdf866d8f4ff6e408fa274c0525412f7edb01dc46b5ccda51f575b7e0d20ad72965773376fb5db95a77a7fcfcab97bf841ec08dbadf5d6b08af02b7a2cf5e
+  languageName: node
+  linkType: hard
+
+"rollup@npm:^2.56.3, rollup@npm:^2.58.0, rollup@npm:^2.59.0":
   version: 2.70.1
   resolution: "rollup@npm:2.70.1"
   dependencies:
@@ -10603,7 +15297,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"run-async@npm:^2.4.0":
+"run-async@npm:^2.2.0, run-async@npm:^2.4.0":
   version: 2.4.1
   resolution: "run-async@npm:2.4.1"
   checksum: a2c88aa15df176f091a2878eb840e68d0bdee319d8d97bbb89112223259cebecb94bc0defd735662b83c2f7a30bed8cddb7d1674eb48ae7322dc602b22d03797
@@ -10628,7 +15322,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"rxjs@npm:^6.6.0":
+"rxjs@npm:^6.4.0, rxjs@npm:^6.6.0":
   version: 6.6.7
   resolution: "rxjs@npm:6.6.7"
   dependencies:
@@ -10637,7 +15331,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"rxjs@npm:^7.5.5":
+"rxjs@npm:^7.5.1, rxjs@npm:^7.5.5":
   version: 7.5.5
   resolution: "rxjs@npm:7.5.5"
   dependencies:
@@ -10696,6 +15390,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"saxes@npm:^5.0.1":
+  version: 5.0.1
+  resolution: "saxes@npm:5.0.1"
+  dependencies:
+    xmlchars: ^2.2.0
+  checksum: 5636b55cf15f7cf0baa73f2797bf992bdcf75d1b39d82c0aa4608555c774368f6ac321cb641fd5f3d3ceb87805122cd47540da6a7b5960fe0dbdb8f8c263f000
+  languageName: node
+  linkType: hard
+
 "schema-utils@npm:^1.0.0":
   version: 1.0.0
   resolution: "schema-utils@npm:1.0.0"
@@ -10707,6 +15410,44 @@ __metadata:
   languageName: node
   linkType: hard
 
+"semantic-release@npm:^17.3.1, semantic-release@npm:^17.4.7":
+  version: 17.4.7
+  resolution: "semantic-release@npm:17.4.7"
+  dependencies:
+    "@semantic-release/commit-analyzer": ^8.0.0
+    "@semantic-release/error": ^2.2.0
+    "@semantic-release/github": ^7.0.0
+    "@semantic-release/npm": ^7.0.0
+    "@semantic-release/release-notes-generator": ^9.0.0
+    aggregate-error: ^3.0.0
+    cosmiconfig: ^7.0.0
+    debug: ^4.0.0
+    env-ci: ^5.0.0
+    execa: ^5.0.0
+    figures: ^3.0.0
+    find-versions: ^4.0.0
+    get-stream: ^6.0.0
+    git-log-parser: ^1.2.0
+    hook-std: ^2.0.0
+    hosted-git-info: ^4.0.0
+    lodash: ^4.17.21
+    marked: ^2.0.0
+    marked-terminal: ^4.1.1
+    micromatch: ^4.0.2
+    p-each-series: ^2.1.0
+    p-reduce: ^2.0.0
+    read-pkg-up: ^7.0.0
+    resolve-from: ^5.0.0
+    semver: ^7.3.2
+    semver-diff: ^3.1.1
+    signale: ^1.2.1
+    yargs: ^16.2.0
+  bin:
+    semantic-release: bin/semantic-release.js
+  checksum: 9a6c222eb4298e85f8be27d486088f1e9358e1174f36225312701e01127557a722adc1a6dc84b66fa04d27a1470dc15ed48951408684d0ff3559f054f0452ba3
+  languageName: node
+  linkType: hard
+
 "semantic-release@npm:^19.0.2":
   version: 19.0.2
   resolution: "semantic-release@npm:19.0.2"
@@ -10745,6 +15486,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"semver-compare@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "semver-compare@npm:1.0.0"
+  checksum: dd1d7e2909744cf2cf71864ac718efc990297f9de2913b68e41a214319e70174b1d1793ac16e31183b128c2b9812541300cb324db8168e6cf6b570703b171c68
+  languageName: node
+  linkType: hard
+
 "semver-diff@npm:^3.1.1":
   version: 3.1.1
   resolution: "semver-diff@npm:3.1.1"
@@ -10754,6 +15502,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"semver-regex@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "semver-regex@npm:2.0.0"
+  checksum: da7d6f5ceae80e2097933b1e4ea2815c2cfa2c50c6501db1a3d435a6063c0f23d66bc25fe8d06755048f3d7588d85339db6471446b2c91fea907e5c2ada5b0df
+  languageName: node
+  linkType: hard
+
 "semver-regex@npm:^3.1.2":
   version: 3.1.3
   resolution: "semver-regex@npm:3.1.3"
@@ -10761,7 +15516,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"semver@npm:*, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5":
+"semver@npm:*, semver@npm:7.3.5, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5":
   version: 7.3.5
   resolution: "semver@npm:7.3.5"
   dependencies:
@@ -10781,6 +15536,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"semver@npm:7.x, semver@npm:^7.2.1":
+  version: 7.3.6
+  resolution: "semver@npm:7.3.6"
+  dependencies:
+    lru-cache: ^7.4.0
+  bin:
+    semver: bin/semver.js
+  checksum: 9845f96b22268190b30025e02feca391451f2bd49b2c51920c27cc56744f64cbe397df089018fdb347d4b4fd800eabbd85661870eb63eb28055d2b72e457f759
+  languageName: node
+  linkType: hard
+
 "semver@npm:^6.0.0, semver@npm:^6.1.0, semver@npm:^6.3.0":
   version: 6.3.0
   resolution: "semver@npm:6.3.0"
@@ -10876,6 +15642,30 @@ __metadata:
   languageName: node
   linkType: hard
 
+"shelljs@npm:^0.8.0, shelljs@npm:^0.8.4":
+  version: 0.8.5
+  resolution: "shelljs@npm:0.8.5"
+  dependencies:
+    glob: ^7.0.0
+    interpret: ^1.0.0
+    rechoir: ^0.6.2
+  bin:
+    shjs: bin/shjs
+  checksum: 7babc46f732a98f4c054ec1f048b55b9149b98aa2da32f6cf9844c434b43c6251efebd6eec120937bd0999e13811ebd45efe17410edb3ca938f82f9381302748
+  languageName: node
+  linkType: hard
+
+"shiki@npm:^0.9.8":
+  version: 0.9.15
+  resolution: "shiki@npm:0.9.15"
+  dependencies:
+    jsonc-parser: ^3.0.0
+    vscode-oniguruma: ^1.6.1
+    vscode-textmate: 5.2.0
+  checksum: 58d1e3e106320252b67c63dc1269c4b834152e9c675a06a4565ec41db1c93aea2dd94e22640d7ec99334cb47cd41b914642d936577143b689ef2a0db7d938c13
+  languageName: node
+  linkType: hard
+
 "side-channel@npm:^1.0.4":
   version: 1.0.4
   resolution: "side-channel@npm:1.0.4"
@@ -10905,6 +15695,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"sisteransi@npm:^1.0.5":
+  version: 1.0.5
+  resolution: "sisteransi@npm:1.0.5"
+  checksum: aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4
+  languageName: node
+  linkType: hard
+
 "slash@npm:^2.0.0":
   version: 2.0.0
   resolution: "slash@npm:2.0.0"
@@ -11042,7 +15839,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"source-map-support@npm:~0.5.12":
+"source-map-resolve@npm:^0.6.0":
+  version: 0.6.0
+  resolution: "source-map-resolve@npm:0.6.0"
+  dependencies:
+    atob: ^2.1.2
+    decode-uri-component: ^0.2.0
+  checksum: fe503b9e5dac1c54be835282fcfec10879434e7b3ee08a9774f230299c724a8d403484d9531276d1670c87390e0e4d1d3f92b14cca6e4a2445ea3016b786ecd4
+  languageName: node
+  linkType: hard
+
+"source-map-support@npm:^0.5.17, source-map-support@npm:^0.5.6, source-map-support@npm:~0.5.12":
   version: 0.5.21
   resolution: "source-map-support@npm:0.5.21"
   dependencies:
@@ -11173,6 +15980,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"split2@npm:^2.0.0":
+  version: 2.2.0
+  resolution: "split2@npm:2.2.0"
+  dependencies:
+    through2: ^2.0.2
+  checksum: 06a9fe364f1c37098539e8d9b460c8c2e00320600a5e040dd3fa006f6bdabbbe6ee983568a62a585f41862c61b9672f59b93ef0accf4add346c716edcd6d21b7
+  languageName: node
+  linkType: hard
+
 "split2@npm:^3.0.0":
   version: 3.2.2
   resolution: "split2@npm:3.2.2"
@@ -11200,6 +16016,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"sprintf-js@npm:~1.0.2":
+  version: 1.0.3
+  resolution: "sprintf-js@npm:1.0.3"
+  checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3
+  languageName: node
+  linkType: hard
+
 "sshpk@npm:^1.7.0":
   version: 1.17.0
   resolution: "sshpk@npm:1.17.0"
@@ -11239,6 +16062,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"stack-trace@npm:0.0.x":
+  version: 0.0.10
+  resolution: "stack-trace@npm:0.0.10"
+  checksum: 473036ad32f8c00e889613153d6454f9be0536d430eb2358ca51cad6b95cea08a3cc33cc0e34de66b0dad221582b08ed2e61ef8e13f4087ab690f388362d6610
+  languageName: node
+  linkType: hard
+
+"stack-utils@npm:^2.0.3":
+  version: 2.0.5
+  resolution: "stack-utils@npm:2.0.5"
+  dependencies:
+    escape-string-regexp: ^2.0.0
+  checksum: 76b69da0f5b48a34a0f93c98ee2a96544d2c4ca2557f7eef5ddb961d3bdc33870b46f498a84a7c4f4ffb781df639840e7ebf6639164ed4da5e1aeb659615b9c7
+  languageName: node
+  linkType: hard
+
 "static-extend@npm:^0.1.1":
   version: 0.1.2
   resolution: "static-extend@npm:0.1.2"
@@ -11316,6 +16155,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"stream-to-array@npm:^2.3.0":
+  version: 2.3.0
+  resolution: "stream-to-array@npm:2.3.0"
+  dependencies:
+    any-promise: ^1.1.0
+  checksum: 7feaf63b38399b850615e6ffcaa951e96e4c8f46745dbce4b553a94c5dc43966933813747014935a3ff97793e7f30a65270bde19f82b2932871a1879229a77cf
+  languageName: node
+  linkType: hard
+
 "stream-to-string@npm:^1.2.0":
   version: 1.2.0
   resolution: "stream-to-string@npm:1.2.0"
@@ -11332,13 +16180,23 @@ __metadata:
   languageName: node
   linkType: hard
 
-"string-argv@npm:^0.3.1":
+"string-argv@npm:0.3.1, string-argv@npm:^0.3.1":
   version: 0.3.1
   resolution: "string-argv@npm:0.3.1"
   checksum: efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf
   languageName: node
   linkType: hard
 
+"string-length@npm:^4.0.1":
+  version: 4.0.2
+  resolution: "string-length@npm:4.0.2"
+  dependencies:
+    char-regex: ^1.0.2
+    strip-ansi: ^6.0.0
+  checksum: ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505
+  languageName: node
+  linkType: hard
+
 "string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3":
   version: 4.2.3
   resolution: "string-width@npm:4.2.3"
@@ -11350,6 +16208,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"string-width@npm:^2.1.0":
+  version: 2.1.1
+  resolution: "string-width@npm:2.1.1"
+  dependencies:
+    is-fullwidth-code-point: ^2.0.0
+    strip-ansi: ^4.0.0
+  checksum: d6173abe088c615c8dffaf3861dc5d5906ed3dc2d6fd67ff2bd2e2b5dce7fd683c5240699cf0b1b8aa679a3b3bd6b28b5053c824cb89b813d7f6541d8f89064a
+  languageName: node
+  linkType: hard
+
 "string-width@npm:^5.0.0":
   version: 5.1.2
   resolution: "string-width@npm:5.1.2"
@@ -11399,6 +16267,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"stringify-object@npm:3.3.0":
+  version: 3.3.0
+  resolution: "stringify-object@npm:3.3.0"
+  dependencies:
+    get-own-enumerable-property-symbols: ^3.0.0
+    is-obj: ^1.0.1
+    is-regexp: ^1.0.0
+  checksum: 6827a3f35975cfa8572e8cd3ed4f7b262def260af18655c6fde549334acdac49ddba69f3c861ea5a6e9c5a4990fe4ae870b9c0e6c31019430504c94a83b7a154
+  languageName: node
+  linkType: hard
+
 "stringify-package@npm:^1.0.1":
   version: 1.0.1
   resolution: "stringify-package@npm:1.0.1"
@@ -11406,7 +16285,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"strip-ansi@npm:^5.2.0":
+"strip-ansi@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "strip-ansi@npm:4.0.0"
+  dependencies:
+    ansi-regex: ^3.0.0
+  checksum: d9186e6c0cf78f25274f6750ee5e4a5725fb91b70fdd79aa5fe648eab092a0ec5b9621b22d69d4534a56319f75d8944efbd84e3afa8d4ad1b9a9491f12c84eca
+  languageName: node
+  linkType: hard
+
+"strip-ansi@npm:^5.1.0, strip-ansi@npm:^5.2.0":
   version: 5.2.0
   resolution: "strip-ansi@npm:5.2.0"
   dependencies:
@@ -11433,6 +16321,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"strip-bom@npm:4.0.0, strip-bom@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "strip-bom@npm:4.0.0"
+  checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3
+  languageName: node
+  linkType: hard
+
+"strip-bom@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "strip-bom@npm:2.0.0"
+  dependencies:
+    is-utf8: ^0.2.0
+  checksum: 08efb746bc67b10814cd03d79eb31bac633393a782e3f35efbc1b61b5165d3806d03332a97f362822cf0d4dd14ba2e12707fcff44fe1c870c48a063a0c9e4944
+  languageName: node
+  linkType: hard
+
 "strip-bom@npm:^3.0.0":
   version: 3.0.0
   resolution: "strip-bom@npm:3.0.0"
@@ -11454,6 +16358,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"strip-indent@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "strip-indent@npm:1.0.1"
+  dependencies:
+    get-stdin: ^4.0.1
+  bin:
+    strip-indent: cli.js
+  checksum: 81ad9a0b8a558bdbd05b66c6c437b9ab364aa2b5479ed89969ca7908e680e21b043d40229558c434b22b3d640622e39b66288e0456d601981ac9289de9700fbd
+  languageName: node
+  linkType: hard
+
 "strip-indent@npm:^2.0.0":
   version: 2.0.0
   resolution: "strip-indent@npm:2.0.0"
@@ -11470,6 +16385,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"strip-json-comments@npm:3.0.1":
+  version: 3.0.1
+  resolution: "strip-json-comments@npm:3.0.1"
+  checksum: 2b860124c04b9b4ac09ec63c17fea142c789ea99b30569240f63c91917c3a8fdc250fc799280bc80dbbad1cccbcfc5f662636f960f80ce660e230f770c3f3a95
+  languageName: node
+  linkType: hard
+
 "strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1":
   version: 3.1.1
   resolution: "strip-json-comments@npm:3.1.1"
@@ -11484,6 +16406,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"supports-color@npm:8.1.1, supports-color@npm:^8.0.0":
+  version: 8.1.1
+  resolution: "supports-color@npm:8.1.1"
+  dependencies:
+    has-flag: ^4.0.0
+  checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406
+  languageName: node
+  linkType: hard
+
 "supports-color@npm:^5.3.0":
   version: 5.5.0
   resolution: "supports-color@npm:5.5.0"
@@ -11509,7 +16440,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"supports-hyperlinks@npm:^2.2.0":
+"supports-hyperlinks@npm:^2.0.0, supports-hyperlinks@npm:^2.1.0, supports-hyperlinks@npm:^2.2.0":
   version: 2.2.0
   resolution: "supports-hyperlinks@npm:2.2.0"
   dependencies:
@@ -11533,6 +16464,26 @@ __metadata:
   languageName: node
   linkType: hard
 
+"symbol-tree@npm:^3.2.4":
+  version: 3.2.4
+  resolution: "symbol-tree@npm:3.2.4"
+  checksum: 6e8fc7e1486b8b54bea91199d9535bb72f10842e40c79e882fc94fb7b14b89866adf2fd79efa5ebb5b658bc07fb459ccce5ac0e99ef3d72f474e74aaf284029d
+  languageName: node
+  linkType: hard
+
+"table@npm:^6.0.9":
+  version: 6.8.0
+  resolution: "table@npm:6.8.0"
+  dependencies:
+    ajv: ^8.0.1
+    lodash.truncate: ^4.4.2
+    slice-ansi: ^4.0.0
+    string-width: ^4.2.3
+    strip-ansi: ^6.0.1
+  checksum: 5b07fe462ee03d2e1fac02cbb578efd2e0b55ac07e3d3db2e950aa9570ade5a4a2b8d3c15e9f25c89e4e50b646bc4269934601ee1eef4ca7968ad31960977690
+  languageName: node
+  linkType: hard
+
 "tapable@npm:^1.0.0, tapable@npm:^1.1.3":
   version: 1.1.3
   resolution: "tapable@npm:1.1.3"
@@ -11574,6 +16525,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"terminal-link@npm:^2.0.0":
+  version: 2.1.1
+  resolution: "terminal-link@npm:2.1.1"
+  dependencies:
+    ansi-escapes: ^4.2.1
+    supports-hyperlinks: ^2.0.0
+  checksum: ce3d2cd3a438c4a9453947aa664581519173ea40e77e2534d08c088ee6dda449eabdbe0a76d2a516b8b73c33262fedd10d5270ccf7576ae316e3db170ce6562f
+  languageName: node
+  linkType: hard
+
 "terser-webpack-plugin@npm:^1.4.3":
   version: 1.4.5
   resolution: "terser-webpack-plugin@npm:1.4.5"
@@ -11606,6 +16567,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"test-exclude@npm:^6.0.0":
+  version: 6.0.0
+  resolution: "test-exclude@npm:6.0.0"
+  dependencies:
+    "@istanbuljs/schema": ^0.1.2
+    glob: ^7.1.4
+    minimatch: ^3.0.4
+  checksum: 3b34a3d77165a2cb82b34014b3aba93b1c4637a5011807557dc2f3da826c59975a5ccad765721c4648b39817e3472789f9b0fa98fc854c5c1c7a1e632aacdc28
+  languageName: node
+  linkType: hard
+
 "text-extensions@npm:^1.0.0":
   version: 1.9.0
   resolution: "text-extensions@npm:1.9.0"
@@ -11620,13 +16592,39 @@ __metadata:
   languageName: node
   linkType: hard
 
-"through2@npm:^2.0.0, through2@npm:~2.0.0":
+"throat@npm:^6.0.1":
+  version: 6.0.1
+  resolution: "throat@npm:6.0.1"
+  checksum: 782d4171ee4e3cf947483ed2ff1af3e17cc4354c693b9d339284f61f99fbc401d171e0b0d2db3295bb7d447630333e9319c174ebd7ef315c6fb791db9675369c
+  languageName: node
+  linkType: hard
+
+"through2-concurrent@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "through2-concurrent@npm:2.0.0"
+  dependencies:
+    through2: ^2.0.0
+  checksum: ea4609ab474d2a8ee7ca5ead7073bba10568f1013cabffd0895aa470f8d6c9e42dd02b29b0fac7e56f0a83c6129d4393829827de1c1162e2e9369b84ef6eb76b
+  languageName: node
+  linkType: hard
+
+"through2@npm:^2.0.0, through2@npm:^2.0.2, through2@npm:~2.0.0":
   version: 2.0.5
   resolution: "through2@npm:2.0.5"
   dependencies:
-    readable-stream: ~2.3.6
-    xtend: ~4.0.1
-  checksum: beb0f338aa2931e5660ec7bf3ad949e6d2e068c31f4737b9525e5201b824ac40cac6a337224856b56bd1ddd866334bbfb92a9f57cd6f66bc3f18d3d86fc0fe50
+    readable-stream: ~2.3.6
+    xtend: ~4.0.1
+  checksum: beb0f338aa2931e5660ec7bf3ad949e6d2e068c31f4737b9525e5201b824ac40cac6a337224856b56bd1ddd866334bbfb92a9f57cd6f66bc3f18d3d86fc0fe50
+  languageName: node
+  linkType: hard
+
+"through2@npm:^3.0.0":
+  version: 3.0.2
+  resolution: "through2@npm:3.0.2"
+  dependencies:
+    inherits: ^2.0.4
+    readable-stream: 2 || 3
+  checksum: 47c9586c735e7d9cbbc1029f3ff422108212f7cc42e06d5cc9fff7901e659c948143c790e0d0d41b1b5f89f1d1200bdd200c7b72ad34f42f9edbeb32ea49e8b7
   languageName: node
   linkType: hard
 
@@ -11646,6 +16644,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"timed-out@npm:^4.0.0":
+  version: 4.0.1
+  resolution: "timed-out@npm:4.0.1"
+  checksum: 98efc5d6fc0d2a329277bd4d34f65c1bf44d9ca2b14fd267495df92898f522e6f563c5e9e467c418e0836f5ca1f47a84ca3ee1de79b1cc6fe433834b7f02ec54
+  languageName: node
+  linkType: hard
+
 "timers-browserify@npm:^2.0.4":
   version: 2.0.12
   resolution: "timers-browserify@npm:2.0.12"
@@ -11671,6 +16676,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"tmpl@npm:1.0.5":
+  version: 1.0.5
+  resolution: "tmpl@npm:1.0.5"
+  checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873
+  languageName: node
+  linkType: hard
+
 "to-arraybuffer@npm:^1.0.0":
   version: 1.0.1
   resolution: "to-arraybuffer@npm:1.0.1"
@@ -11694,6 +16706,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"to-readable-stream@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "to-readable-stream@npm:1.0.0"
+  checksum: 2bd7778490b6214a2c40276065dd88949f4cf7037ce3964c76838b8cb212893aeb9cceaaf4352a4c486e3336214c350270f3263e1ce7a0c38863a715a4d9aeb5
+  languageName: node
+  linkType: hard
+
+"to-readable-stream@npm:^2.0.0":
+  version: 2.1.0
+  resolution: "to-readable-stream@npm:2.1.0"
+  checksum: 42039fb968a56af99a7201fe01debb0bc55a585a2ab0b1746e322c339c50f91043b1269cedcc6350d2a5f81ceaa6cff7960704f748a59542d1f2c50aca5ea7b9
+  languageName: node
+  linkType: hard
+
 "to-regex-range@npm:^2.1.0":
   version: 2.1.1
   resolution: "to-regex-range@npm:2.1.1"
@@ -11725,6 +16751,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"tough-cookie@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "tough-cookie@npm:4.0.0"
+  dependencies:
+    psl: ^1.1.33
+    punycode: ^2.1.1
+    universalify: ^0.1.2
+  checksum: 0891b37eb7d17faa3479d47f0dce2e3007f2583094ad272f2670d120fbcc3df3b0b0a631ba96ecad49f9e2297d93ff8995ce0d3292d08dd7eabe162f5b224d69
+  languageName: node
+  linkType: hard
+
 "tough-cookie@npm:~2.5.0":
   version: 2.5.0
   resolution: "tough-cookie@npm:2.5.0"
@@ -11735,6 +16772,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"tr46@npm:^2.1.0":
+  version: 2.1.0
+  resolution: "tr46@npm:2.1.0"
+  dependencies:
+    punycode: ^2.1.1
+  checksum: ffe6049b9dca3ae329b059aada7f515b0f0064c611b39b51ff6b53897e954650f6f63d9319c6c008d36ead477c7b55e5f64c9dc60588ddc91ff720d64eb710b3
+  languageName: node
+  linkType: hard
+
 "tr46@npm:~0.0.3":
   version: 0.0.3
   resolution: "tr46@npm:0.0.3"
@@ -11756,6 +16802,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"trim-newlines@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "trim-newlines@npm:1.0.0"
+  checksum: ed96eea318581c6f894c0a98d0c4f16dcce11a41794ce140a79db55f1cab709cd9117578ee5e49a9b52f41e9cd93eaf3efa6c4bddbc77afbf91128b396fadbc1
+  languageName: node
+  linkType: hard
+
+"trim-newlines@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "trim-newlines@npm:2.0.0"
+  checksum: 8a288a860f051f585bdda07ffb97e9e0791ca7c5c1c025b6af4badac185f2eed23ccedeb54da2a79e06ead69824d69b6c9c35c7a69c48e07ee56ac76f91c3096
+  languageName: node
+  linkType: hard
+
 "trim-newlines@npm:^3.0.0":
   version: 3.0.1
   resolution: "trim-newlines@npm:3.0.1"
@@ -11763,6 +16823,98 @@ __metadata:
   languageName: node
   linkType: hard
 
+"ts-jest@npm:^27.0.5":
+  version: 27.1.4
+  resolution: "ts-jest@npm:27.1.4"
+  dependencies:
+    bs-logger: 0.x
+    fast-json-stable-stringify: 2.x
+    jest-util: ^27.0.0
+    json5: 2.x
+    lodash.memoize: 4.x
+    make-error: 1.x
+    semver: 7.x
+    yargs-parser: 20.x
+  peerDependencies:
+    "@babel/core": ">=7.0.0-beta.0 <8"
+    "@types/jest": ^27.0.0
+    babel-jest: ">=27.0.0 <28"
+    jest: ^27.0.0
+    typescript: ">=3.8 <5.0"
+  peerDependenciesMeta:
+    "@babel/core":
+      optional: true
+    "@types/jest":
+      optional: true
+    babel-jest:
+      optional: true
+    esbuild:
+      optional: true
+  bin:
+    ts-jest: cli.js
+  checksum: d2cc2719ed2884a880ab50d2c14c311834be9c88bc79d0064fa0189afce5c296d7676314d26cc3f7e82ddd52df272c2d4137a832c89616f30cbe8f43e30f9a29
+  languageName: node
+  linkType: hard
+
+"ts-node@npm:^10.2.1, ts-node@npm:^10.7.0":
+  version: 10.7.0
+  resolution: "ts-node@npm:10.7.0"
+  dependencies:
+    "@cspotcode/source-map-support": 0.7.0
+    "@tsconfig/node10": ^1.0.7
+    "@tsconfig/node12": ^1.0.7
+    "@tsconfig/node14": ^1.0.0
+    "@tsconfig/node16": ^1.0.2
+    acorn: ^8.4.1
+    acorn-walk: ^8.1.1
+    arg: ^4.1.0
+    create-require: ^1.1.0
+    diff: ^4.0.1
+    make-error: ^1.1.1
+    v8-compile-cache-lib: ^3.0.0
+    yn: 3.1.1
+  peerDependencies:
+    "@swc/core": ">=1.2.50"
+    "@swc/wasm": ">=1.2.50"
+    "@types/node": "*"
+    typescript: ">=2.7"
+  peerDependenciesMeta:
+    "@swc/core":
+      optional: true
+    "@swc/wasm":
+      optional: true
+  bin:
+    ts-node: dist/bin.js
+    ts-node-cwd: dist/bin-cwd.js
+    ts-node-esm: dist/bin-esm.js
+    ts-node-script: dist/bin-script.js
+    ts-node-transpile-only: dist/bin-transpile.js
+    ts-script: dist/bin-script-deprecated.js
+  checksum: 2a379e43f7478d0b79e1e63af91fe222d83857727957df4bd3bdf3c0a884de5097b12feb9bbf530074526b8874c0338b0e6328cf334f3a5e2c49c71e837273f7
+  languageName: node
+  linkType: hard
+
+"ts-node@npm:^9":
+  version: 9.1.1
+  resolution: "ts-node@npm:9.1.1"
+  dependencies:
+    arg: ^4.1.0
+    create-require: ^1.1.0
+    diff: ^4.0.1
+    make-error: ^1.1.1
+    source-map-support: ^0.5.17
+    yn: 3.1.1
+  peerDependencies:
+    typescript: ">=2.7"
+  bin:
+    ts-node: dist/bin.js
+    ts-node-script: dist/bin-script.js
+    ts-node-transpile-only: dist/bin-transpile.js
+    ts-script: dist/bin-script-deprecated.js
+  checksum: 356e2647b8b1e6ab00380c0537fa569b63bd9b6f006cc40fd650f81fae1817bd8fecc075300036950d8f45c1d85b95be33cd1e48a1a424a7d86c3dbb42bf60e5
+  languageName: node
+  linkType: hard
+
 "tsconfig-paths@npm:^3.12.0":
   version: 3.14.0
   resolution: "tsconfig-paths@npm:3.14.0"
@@ -11775,6 +16927,25 @@ __metadata:
   languageName: node
   linkType: hard
 
+"tsconfig-paths@npm:^3.14.1":
+  version: 3.14.1
+  resolution: "tsconfig-paths@npm:3.14.1"
+  dependencies:
+    "@types/json5": ^0.0.29
+    json5: ^1.0.1
+    minimist: ^1.2.6
+    strip-bom: ^3.0.0
+  checksum: 8afa01c673ebb4782ba53d3a12df97fa837ce524f8ad38ee4e2b2fd57f5ac79abc21c574e9e9eb014d93efe7fe8214001b96233b5c6ea75bd1ea82afe17a4c6d
+  languageName: node
+  linkType: hard
+
+"tslib@npm:2.1.0":
+  version: 2.1.0
+  resolution: "tslib@npm:2.1.0"
+  checksum: aa189c8179de0427b0906da30926fd53c59d96ec239dff87d6e6bc831f608df0cbd6f77c61dabc074408bd0aa0b9ae4ec35cb2c15f729e32f37274db5730cb78
+  languageName: node
+  linkType: hard
+
 "tslib@npm:^1.8.1, tslib@npm:^1.9.0":
   version: 1.14.1
   resolution: "tslib@npm:1.14.1"
@@ -11782,7 +16953,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"tslib@npm:^2.1.0":
+"tslib@npm:^2, tslib@npm:^2.1.0, tslib@npm:^2.3.1":
   version: 2.3.1
   resolution: "tslib@npm:2.3.1"
   checksum: de17a98d4614481f7fcb5cd53ffc1aaf8654313be0291e1bfaee4b4bb31a20494b7d218ff2e15017883e8ea9626599b3b0e0229c18383ba9dce89da2adf15cb9
@@ -11832,6 +17003,36 @@ __metadata:
   languageName: node
   linkType: hard
 
+"type-check@npm:~0.3.2":
+  version: 0.3.2
+  resolution: "type-check@npm:0.3.2"
+  dependencies:
+    prelude-ls: ~1.1.2
+  checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124
+  languageName: node
+  linkType: hard
+
+"type-detect@npm:4.0.8":
+  version: 4.0.8
+  resolution: "type-detect@npm:4.0.8"
+  checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15
+  languageName: node
+  linkType: hard
+
+"type-fest@npm:^0.10.0":
+  version: 0.10.0
+  resolution: "type-fest@npm:0.10.0"
+  checksum: 83411824cac9aa3b130704ea53de8ab3a0607e20eca3590a73a4bb79a5a1eaccc502181b86916e9d1965d48dfc8343a2fe373c2262322d1d8e00f65c14bab506
+  languageName: node
+  linkType: hard
+
+"type-fest@npm:^0.13.1":
+  version: 0.13.1
+  resolution: "type-fest@npm:0.13.1"
+  checksum: e6bf2e3c449f27d4ef5d56faf8b86feafbc3aec3025fc9a5fbe2db0a2587c44714521f9c30d8516a833c8c506d6263f5cc11267522b10c6ccdb6cc55b0a9d1c4
+  languageName: node
+  linkType: hard
+
 "type-fest@npm:^0.16.0":
   version: 0.16.0
   resolution: "type-fest@npm:0.16.0"
@@ -11881,6 +17082,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"typedarray-to-buffer@npm:^3.1.5":
+  version: 3.1.5
+  resolution: "typedarray-to-buffer@npm:3.1.5"
+  dependencies:
+    is-typedarray: ^1.0.0
+  checksum: 99c11aaa8f45189fcfba6b8a4825fd684a321caa9bd7a76a27cf0c7732c174d198b99f449c52c3818107430b5f41c0ccbbfb75cb2ee3ca4a9451710986d61a60
+  languageName: node
+  linkType: hard
+
 "typedarray@npm:^0.0.6":
   version: 0.0.6
   resolution: "typedarray@npm:0.0.6"
@@ -11888,6 +17098,43 @@ __metadata:
   languageName: node
   linkType: hard
 
+"typedoc-default-themes@npm:^0.12.10":
+  version: 0.12.10
+  resolution: "typedoc-default-themes@npm:0.12.10"
+  checksum: 4c19a0fecdf24777bd153c6ae4a4f2b23c95521a83483cdbee89aaeef985d7e37f2665b37d55f809ef36d0eb4433a921209dc45a1055791d81464bffeea77dfd
+  languageName: node
+  linkType: hard
+
+"typedoc@npm:^0.21.9":
+  version: 0.21.10
+  resolution: "typedoc@npm:0.21.10"
+  dependencies:
+    glob: ^7.1.7
+    handlebars: ^4.7.7
+    lunr: ^2.3.9
+    marked: ^4.0.10
+    minimatch: ^3.0.0
+    progress: ^2.0.3
+    shiki: ^0.9.8
+    typedoc-default-themes: ^0.12.10
+  peerDependencies:
+    typescript: 4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x
+  bin:
+    typedoc: bin/typedoc
+  checksum: b4f957ad4b3db9e83ecf030629ec45661c2080ab6b91df0a9af6aeb889ade3c5d54b6169cf0db67a6dbc563c3f7cd972c5525aa605c628c51a59175195281f96
+  languageName: node
+  linkType: hard
+
+"typescript@npm:^4.4.3":
+  version: 4.6.3
+  resolution: "typescript@npm:4.6.3"
+  bin:
+    tsc: bin/tsc
+    tsserver: bin/tsserver
+  checksum: 255bb26c8cb846ca689dd1c3a56587af4f69055907aa2c154796ea28ee0dea871535b1c78f85a6212c77f2657843a269c3a742d09d81495b97b914bf7920415b
+  languageName: node
+  linkType: hard
+
 "typescript@npm:^4.5.4":
   version: 4.6.2
   resolution: "typescript@npm:4.6.2"
@@ -11898,6 +17145,26 @@ __metadata:
   languageName: node
   linkType: hard
 
+"typescript@npm:~4.4.3, typescript@npm:~4.4.4":
+  version: 4.4.4
+  resolution: "typescript@npm:4.4.4"
+  bin:
+    tsc: bin/tsc
+    tsserver: bin/tsserver
+  checksum: 89ecb8436bb48ef5594d49289f5f89103071716b6e4844278f4fb3362856e31203e187a9c76d205c3f0b674d221a058fd28310dbcbcf5d95e9a57229bb5203f1
+  languageName: node
+  linkType: hard
+
+"typescript@patch:typescript@^4.4.3#~builtin<compat/typescript>":
+  version: 4.6.3
+  resolution: "typescript@patch:typescript@npm%3A4.6.3#~builtin<compat/typescript>::version=4.6.3&hash=bda367"
+  bin:
+    tsc: bin/tsc
+    tsserver: bin/tsserver
+  checksum: 6bf45caf847062420592e711bc9c28bf5f9a9a7fa8245343b81493e4ededae33f1774009d1234d911422d1646a2c839f44e1a23ecb111b40a60ac2ea4c1482a8
+  languageName: node
+  linkType: hard
+
 "typescript@patch:typescript@^4.5.4#~builtin<compat/typescript>":
   version: 4.6.2
   resolution: "typescript@patch:typescript@npm%3A4.6.2#~builtin<compat/typescript>::version=4.6.2&hash=bda367"
@@ -11908,6 +17175,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"typescript@patch:typescript@~4.4.3#~builtin<compat/typescript>, typescript@patch:typescript@~4.4.4#~builtin<compat/typescript>":
+  version: 4.4.4
+  resolution: "typescript@patch:typescript@npm%3A4.4.4#~builtin<compat/typescript>::version=4.4.4&hash=bda367"
+  bin:
+    tsc: bin/tsc
+    tsserver: bin/tsserver
+  checksum: 3d1b04449662193544b81d055479d03b4c5dca95f1a82f8922596f089d894c9fefbe16639d1d9dfe26a7054419645530cef44001bc17aed1fe1eb3c237e9b3c7
+  languageName: node
+  linkType: hard
+
 "uglify-js@npm:^3.1.4":
   version: 3.15.3
   resolution: "uglify-js@npm:3.15.3"
@@ -11944,9 +17221,10 @@ __metadata:
     axios: ^0.26.1
     bootstrap: ^4.6.1
     bootstrap-icons: ^1.8.1
-    bootstrap-vue: ^2.21.2
+    bootstrap-vue: ^2.22.0
     conventional-changelog-eslint: ^3.0.9
     core-js: ^3.21.1
+    deep-object-diff: ^1.1.7
     eslint: ^8.11.0
     eslint-import-resolver-node: ^0.3.6
     eslint-plugin-eslint-comments: ^3.2.0
@@ -12043,6 +17321,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"universalify@npm:^0.1.0, universalify@npm:^0.1.2":
+  version: 0.1.2
+  resolution: "universalify@npm:0.1.2"
+  checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff
+  languageName: node
+  linkType: hard
+
 "universalify@npm:^2.0.0":
   version: 2.0.0
   resolution: "universalify@npm:2.0.0"
@@ -12137,6 +17422,31 @@ __metadata:
   languageName: node
   linkType: hard
 
+"url-parse-lax@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "url-parse-lax@npm:1.0.0"
+  dependencies:
+    prepend-http: ^1.0.1
+  checksum: 03316acff753845329652258c16d1688765ee34f7d242a94dadf9ff6e43ea567ec062cec7aa27c37f76f2c57f95e0660695afff32fb97b527591c7340a3090fa
+  languageName: node
+  linkType: hard
+
+"url-parse-lax@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "url-parse-lax@npm:3.0.0"
+  dependencies:
+    prepend-http: ^2.0.0
+  checksum: 1040e357750451173132228036aff1fd04abbd43eac1fb3e4fca7495a078bcb8d33cb765fe71ad7e473d9c94d98fd67adca63bd2716c815a2da066198dd37217
+  languageName: node
+  linkType: hard
+
+"url-to-options@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "url-to-options@npm:1.0.1"
+  checksum: 20e59f4578525fb0d30ffc22b13b5aa60bc9e57cefd4f5842720f5b57211b6dec54abeae2d675381ac4486fd1a2e987f1318725dea996e503ff89f8c8ce2c17e
+  languageName: node
+  linkType: hard
+
 "url@npm:^0.11.0":
   version: 0.11.0
   resolution: "url@npm:0.11.0"
@@ -12197,6 +17507,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"v8-compile-cache-lib@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "v8-compile-cache-lib@npm:3.0.0"
+  checksum: 674e312bbca796584b61dc915f33c7e7dc4e06d196e0048cb772c8964493a1ec723f1dd014d9419fd55c24a6eae148f60769da23f622e05cd13268063fa1ed6b
+  languageName: node
+  linkType: hard
+
 "v8-compile-cache@npm:^2.0.3":
   version: 2.3.0
   resolution: "v8-compile-cache@npm:2.3.0"
@@ -12204,6 +17521,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"v8-to-istanbul@npm:^8.1.0":
+  version: 8.1.1
+  resolution: "v8-to-istanbul@npm:8.1.1"
+  dependencies:
+    "@types/istanbul-lib-coverage": ^2.0.1
+    convert-source-map: ^1.6.0
+    source-map: ^0.7.3
+  checksum: 54ce92bec2727879626f623d02c8d193f0c7e919941fa373ec135189a8382265117f5316ea317a1e12a5f9c13d84d8449052a731fe3306fa4beaafbfa4cab229
+  languageName: node
+  linkType: hard
+
 "validate-npm-package-license@npm:^3.0.1, validate-npm-package-license@npm:^3.0.4":
   version: 3.0.4
   resolution: "validate-npm-package-license@npm:3.0.4"
@@ -12322,6 +17650,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"vlq@npm:^0.2.2":
+  version: 0.2.3
+  resolution: "vlq@npm:0.2.3"
+  checksum: 2231d8caeb5b2c1a438677ab029e9a94aa6fb61ab05819c72691b792aea0456dab29576aff5ae29309ee45bad0a309e832dc45173119bca1393f3b87709d8f8d
+  languageName: node
+  linkType: hard
+
 "vm-browserify@npm:^1.0.1":
   version: 1.1.2
   resolution: "vm-browserify@npm:1.1.2"
@@ -12329,6 +17664,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"vscode-oniguruma@npm:^1.6.1":
+  version: 1.6.2
+  resolution: "vscode-oniguruma@npm:1.6.2"
+  checksum: 6b754acdafd5b68242ea5938bb00a32effc16c77f471d4f0f337d879d0e8e592622998e2441f42d9a7ff799c1593f31c11f26ca8d9bf9917e3ca881d3c1f3e19
+  languageName: node
+  linkType: hard
+
+"vscode-textmate@npm:5.2.0":
+  version: 5.2.0
+  resolution: "vscode-textmate@npm:5.2.0"
+  checksum: 5449b42d451080f6f3649b66948f4b5ee4643c4e88cfe3558a3b31c84c78060cfdd288c4958c1690eaa5cd65d09992fa6b7c3bef9d4aa72b3651054a04624d20
+  languageName: node
+  linkType: hard
+
 "vue-demi@npm:*, vue-demi@npm:^0.12.1":
   version: 0.12.2
   resolution: "vue-demi@npm:0.12.2"
@@ -12471,6 +17820,24 @@ __metadata:
   languageName: node
   linkType: hard
 
+"w3c-hr-time@npm:^1.0.2":
+  version: 1.0.2
+  resolution: "w3c-hr-time@npm:1.0.2"
+  dependencies:
+    browser-process-hrtime: ^1.0.0
+  checksum: ec3c2dacbf8050d917bbf89537a101a08c2e333b4c19155f7d3bedde43529d4339db6b3d049d9610789cb915f9515f8be037e0c54c079e9d4735c50b37ed52b9
+  languageName: node
+  linkType: hard
+
+"w3c-xmlserializer@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "w3c-xmlserializer@npm:2.0.0"
+  dependencies:
+    xml-name-validator: ^3.0.0
+  checksum: ae25c51cf71f1fb2516df1ab33a481f83461a117565b95e3d0927432522323f93b1b2846cbb60196d337970c421adb604fc2d0d180c6a47a839da01db5b9973b
+  languageName: node
+  linkType: hard
+
 "walk-up-path@npm:^1.0.0":
   version: 1.0.0
   resolution: "walk-up-path@npm:1.0.0"
@@ -12478,6 +17845,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"walker@npm:^1.0.7":
+  version: 1.0.8
+  resolution: "walker@npm:1.0.8"
+  dependencies:
+    makeerror: 1.0.12
+  checksum: ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c
+  languageName: node
+  linkType: hard
+
 "watchpack-chokidar2@npm:^2.0.1":
   version: 2.0.1
   resolution: "watchpack-chokidar2@npm:2.0.1"
@@ -12538,6 +17914,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"webidl-conversions@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "webidl-conversions@npm:5.0.0"
+  checksum: ccf1ec2ca7c0b5671e5440ace4a66806ae09c49016ab821481bec0c05b1b82695082dc0a27d1fe9d804d475a408ba0c691e6803fd21be608e710955d4589cd69
+  languageName: node
+  linkType: hard
+
+"webidl-conversions@npm:^6.1.0":
+  version: 6.1.0
+  resolution: "webidl-conversions@npm:6.1.0"
+  checksum: 1f526507aa491f972a0c1409d07f8444e1d28778dfa269a9971f2e157182f3d496dc33296e4ed45b157fdb3bf535bb90c90bf10c50dcf1dd6caacb2a34cc84fb
+  languageName: node
+  linkType: hard
+
 "webpack-sources@npm:^1.4.0, webpack-sources@npm:^1.4.1":
   version: 1.4.3
   resolution: "webpack-sources@npm:1.4.3"
@@ -12593,6 +17983,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"whatwg-encoding@npm:^1.0.5":
+  version: 1.0.5
+  resolution: "whatwg-encoding@npm:1.0.5"
+  dependencies:
+    iconv-lite: 0.4.24
+  checksum: 5be4efe111dce29ddee3448d3915477fcc3b28f991d9cf1300b4e50d6d189010d47bca2f51140a844cf9b726e8f066f4aee72a04d687bfe4f2ee2767b2f5b1e6
+  languageName: node
+  linkType: hard
+
+"whatwg-mimetype@npm:^2.3.0":
+  version: 2.3.0
+  resolution: "whatwg-mimetype@npm:2.3.0"
+  checksum: 23eb885940bcbcca4ff841c40a78e9cbb893ec42743993a42bf7aed16085b048b44b06f3402018931687153550f9a32d259dfa524e4f03577ab898b6965e5383
+  languageName: node
+  linkType: hard
+
 "whatwg-url@npm:^5.0.0":
   version: 5.0.0
   resolution: "whatwg-url@npm:5.0.0"
@@ -12603,6 +18009,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"whatwg-url@npm:^8.0.0, whatwg-url@npm:^8.5.0":
+  version: 8.7.0
+  resolution: "whatwg-url@npm:8.7.0"
+  dependencies:
+    lodash: ^4.7.0
+    tr46: ^2.1.0
+    webidl-conversions: ^6.1.0
+  checksum: a87abcc6cefcece5311eb642858c8fdb234e51ec74196bfacf8def2edae1bfbffdf6acb251646ed6301f8cee44262642d8769c707256125a91387e33f405dd1e
+  languageName: node
+  linkType: hard
+
 "which-boxed-primitive@npm:^1.0.2":
   version: 1.0.2
   resolution: "which-boxed-primitive@npm:1.0.2"
@@ -12627,7 +18044,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"which@npm:^1.2.9":
+"which@npm:^1.2.14, which@npm:^1.2.9":
   version: 1.3.1
   resolution: "which@npm:1.3.1"
   dependencies:
@@ -12656,7 +18073,21 @@ __metadata:
   languageName: node
   linkType: hard
 
-"word-wrap@npm:^1.2.3":
+"winston@npm:2.x":
+  version: 2.4.5
+  resolution: "winston@npm:2.4.5"
+  dependencies:
+    async: ~1.0.0
+    colors: 1.0.x
+    cycle: 1.0.x
+    eyes: 0.1.x
+    isstream: 0.1.x
+    stack-trace: 0.0.x
+  checksum: aba54cae4c97df6f01c6ad98b5ecbf79eaa79326b5f99c379063e91a9bd6dd961b2958768d850546b7a54ef159ecc67bcaf08a6fec4029592be7436d955460f0
+  languageName: node
+  linkType: hard
+
+"word-wrap@npm:^1.0.3, word-wrap@npm:^1.2.3, word-wrap@npm:~1.2.3":
   version: 1.2.3
   resolution: "word-wrap@npm:1.2.3"
   checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f
@@ -12718,6 +18149,47 @@ __metadata:
   languageName: node
   linkType: hard
 
+"write-file-atomic@npm:^3.0.0":
+  version: 3.0.3
+  resolution: "write-file-atomic@npm:3.0.3"
+  dependencies:
+    imurmurhash: ^0.1.4
+    is-typedarray: ^1.0.0
+    signal-exit: ^3.0.2
+    typedarray-to-buffer: ^3.1.5
+  checksum: c55b24617cc61c3a4379f425fc62a386cc51916a9b9d993f39734d005a09d5a4bb748bc251f1304e7abd71d0a26d339996c275955f527a131b1dcded67878280
+  languageName: node
+  linkType: hard
+
+"ws@npm:^7.4.6":
+  version: 7.5.7
+  resolution: "ws@npm:7.5.7"
+  peerDependencies:
+    bufferutil: ^4.0.1
+    utf-8-validate: ^5.0.2
+  peerDependenciesMeta:
+    bufferutil:
+      optional: true
+    utf-8-validate:
+      optional: true
+  checksum: 5c1f669a166fb57560b4e07f201375137fa31d9186afde78b1508926345ce546332f109081574ddc4e38cc474c5406b5fc71c18d71eb75f6e2d2245576976cba
+  languageName: node
+  linkType: hard
+
+"xml-name-validator@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "xml-name-validator@npm:3.0.0"
+  checksum: b3ac459afed783c285bb98e4960bd1f3ba12754fd4f2320efa0f9181ca28928c53cc75ca660d15d205e81f92304419afe94c531c7cfb3e0649aa6d140d53ecb0
+  languageName: node
+  linkType: hard
+
+"xmlchars@npm:^2.2.0":
+  version: 2.2.0
+  resolution: "xmlchars@npm:2.2.0"
+  checksum: 8c70ac94070ccca03f47a81fcce3b271bd1f37a591bf5424e787ae313fcb9c212f5f6786e1fa82076a2c632c0141552babcd85698c437506dfa6ae2d58723062
+  languageName: node
+  linkType: hard
+
 "xtend@npm:^4.0.0, xtend@npm:~4.0.1":
   version: 4.0.2
   resolution: "xtend@npm:4.0.2"
@@ -12767,13 +18239,39 @@ __metadata:
   languageName: node
   linkType: hard
 
-"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3":
+"yargs-parser@npm:20.x, yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3":
   version: 20.2.9
   resolution: "yargs-parser@npm:20.2.9"
   checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3
   languageName: node
   linkType: hard
 
+"yargs-parser@npm:^10.0.0":
+  version: 10.1.0
+  resolution: "yargs-parser@npm:10.1.0"
+  dependencies:
+    camelcase: ^4.1.0
+  checksum: 4cd46207839192785675893ae2d69ebc9acb31237f0f1a4016002fecdd92715656fd44facc27172e437ac503dbd5793f534cb2d412347e525b426ffcac727080
+  languageName: node
+  linkType: hard
+
+"yargs-parser@npm:^18.1.3":
+  version: 18.1.3
+  resolution: "yargs-parser@npm:18.1.3"
+  dependencies:
+    camelcase: ^5.0.0
+    decamelize: ^1.2.0
+  checksum: 60e8c7d1b85814594d3719300ecad4e6ae3796748b0926137bfec1f3042581b8646d67e83c6fc80a692ef08b8390f21ddcacb9464476c39bbdf52e34961dd4d9
+  languageName: node
+  linkType: hard
+
+"yargs-parser@npm:^21.0.0":
+  version: 21.0.1
+  resolution: "yargs-parser@npm:21.0.1"
+  checksum: c3ea2ed12cad0377ce3096b3f138df8267edf7b1aa7d710cd502fe16af417bafe4443dd71b28158c22fcd1be5dfd0e86319597e47badf42ff83815485887323a
+  languageName: node
+  linkType: hard
+
 "yargs@npm:^16.2.0":
   version: 16.2.0
   resolution: "yargs@npm:16.2.0"
@@ -12789,6 +18287,35 @@ __metadata:
   languageName: node
   linkType: hard
 
+"yargs@npm:^17.0.0, yargs@npm:^17.2.1":
+  version: 17.4.1
+  resolution: "yargs@npm:17.4.1"
+  dependencies:
+    cliui: ^7.0.2
+    escalade: ^3.1.1
+    get-caller-file: ^2.0.5
+    require-directory: ^2.1.1
+    string-width: ^4.2.3
+    y18n: ^5.0.5
+    yargs-parser: ^21.0.0
+  checksum: e9012322870d7e4e912a6ae1f63b203e365f911c0cf158be92c36edefddfb3bd38ce17eb9ef0d18858a4777f047c50589ea22dacb44bd949169ba37dc6d34bee
+  languageName: node
+  linkType: hard
+
+"yn@npm:3.1.1":
+  version: 3.1.1
+  resolution: "yn@npm:3.1.1"
+  checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6
+  languageName: node
+  linkType: hard
+
+"yocto-queue@npm:^0.1.0":
+  version: 0.1.0
+  resolution: "yocto-queue@npm:0.1.0"
+  checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700
+  languageName: node
+  linkType: hard
+
 "yorkie@npm:^2.0.0":
   version: 2.0.0
   resolution: "yorkie@npm:2.0.0"