diff --git a/app/.env b/app/.env
new file mode 100644
index 0000000000000000000000000000000000000000..f59016db67e56a27f19d06b57fa3900152193a2e
--- /dev/null
+++ b/app/.env
@@ -0,0 +1 @@
+VUE_APP_VERSION = ENVVERSION
\ No newline at end of file
diff --git a/app/.env.development b/app/.env.development
new file mode 100644
index 0000000000000000000000000000000000000000..11cd668bcee753cd0735e934d0c9ac267a32976e
--- /dev/null
+++ b/app/.env.development
@@ -0,0 +1 @@
+VUE_APP_VERSION = envVersion
diff --git a/app/.env.production b/app/.env.production
new file mode 100644
index 0000000000000000000000000000000000000000..69a8837feff20308618eca055e6036a6a41faa5b
--- /dev/null
+++ b/app/.env.production
@@ -0,0 +1 @@
+VUE_APP_VERSION = envProductionVersion
\ No newline at end of file
diff --git a/app/.env.staging b/app/.env.staging
new file mode 100644
index 0000000000000000000000000000000000000000..1889196533d60d9f6d82f9247573efb755fefa96
--- /dev/null
+++ b/app/.env.staging
@@ -0,0 +1,2 @@
+NODE_ENV = production
+VUE_APP_VERSION = envStagingVersion
\ No newline at end of file
diff --git a/app/.eslintignore b/app/.eslintignore
new file mode 100644
index 0000000000000000000000000000000000000000..05fcc48fb5720b6d46a74fe78c34b9e81acacb58
--- /dev/null
+++ b/app/.eslintignore
@@ -0,0 +1,3 @@
+build/*.js
+config/*.js
+src/*.js
\ No newline at end of file
diff --git a/app/.eslintrc.js b/app/.eslintrc.js
new file mode 100644
index 0000000000000000000000000000000000000000..2380cc7eb18ebe3db7047bfbca2387602bc59e48
--- /dev/null
+++ b/app/.eslintrc.js
@@ -0,0 +1,21 @@
+module.exports = {
+  root: true,
+  env: {
+    node: true
+  },
+  'extends': [
+    "@vue/standard",
+    "plugin:vue/vue3-strongly-recommended"
+  ],
+  rules: {
+  "template-curly-spacing" : "off",
+    "indent": ["error", 2, {
+      "ignoredNodes": ["TemplateLiteral"]
+    }],
+    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
+    },
+  parserOptions: {
+    parser: 'babel-eslint'
+  }
+}
\ No newline at end of file
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..99ffd2c8a6cde2b62960f2c67adbae22db4b6aa5
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1,25 @@
+.DS_Store
+node_modules
+/dist
+package-lock.json
+
+/tests/e2e/reports/
+selenium-debug.log
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*
diff --git a/app/README.md b/app/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..22c1025ba8d54dcbc2175e87780c969a89dd1286
--- /dev/null
+++ b/app/README.md
@@ -0,0 +1,118 @@
+# Node and npm environement:
+  Updated and tested with latest dependencies using node 18.12.1 and npm 8.19.2
+# Vue Client app
+# Vite CLI version 4.2.3
+# FormKit version 0.17.2
+# DaisyUI version 2.51.6
+# TailwindCSS version 3.3.2
+# Kindly do rename yor application in package.json name
+# Pre-requisite
+- NPM and/or Yarn installed
+# Steps
+- Install vue cli 3 [VUE CLI 3](https://cli.vuejs.org/guide/installation.html) 
+```sh
+    npm install -g @vue/cli
+    # OR
+    yarn global add @vue/cli
+    # Check using
+    vue --version
+```
+- Navigate to project client/app and execute
+```sh
+    npm install
+```
+- execute below command it start browser which help for run, build, testing etc
+```sh
+    vue ui
+```
+- You can also use cmd for executing
+```sh
+    "serve": "vite",
+    "build": "vite build",
+    "lint": "vue-cli-service lint",
+    "test:unit": "vue-cli-service test:unit",
+    "test:e2e": "vue-cli-service test:e2e"
+```
+- once vue ui started click on import and add your app (it emit error if node_module not installed )
+- go to tasks menu and click on Serve (for running app) 
+- Other option like build , analyzer, plugin installation etc.
+- You can also updating serve execution script in package.json by adding
+```sh
+Usage: vue-cli-service serve [options] [entry]
+
+Options:
+  --open    open browser on server start
+  --copy    copy url to clipboard on server start
+  --mode    specify env mode (default: development)
+  --host    specify host (default: 0.0.0.0)
+  --port    specify port (default: 8080)
+  --https   use https (default: false)
+```
+  VSCode Setting:
+  Install eslint extension
+  This is for vue client application formatting you can add your other plugins related to Golang, Python, todo Highlight, theme etc
+
+  {
+  "editor.fontFamily": "Fira Code, Menlo, Monaco, 'Courier New', monospace",
+  "editor.fontLigatures": true,
+  "editor.fontSize": 14,
+  "workbench.colorTheme": "Visual Studio Dark",
+  "nativescript.analytics.enabled": false,
+  "window.zoomLevel": 0,
+  "vetur.format.defaultFormatter.js": "vscode-typescript",
+  "vetur.format.defaultFormatter.html": "js-beautify-html",
+  "javascript.format.insertSpaceBeforeFunctionParenthesis": true,
+  "eslint.autoFixOnSave": true,
+  "eslint.validate": [
+    {
+      "language": "vue",
+      "autoFix": true
+    },
+    {
+      "language": "html",
+      "autoFix": true
+    },
+    {
+      "language": "javascript",
+      "autoFix": true
+    }
+  ],
+}
+  Ctrl + S => shall format your code (multiple save action may require)
+
+```
+  -- edit: .eslintrc.js file update "plugin:vue/recommended" to "plugin:vue/strongly-recommended"
+  -- edit: .eslintignore file add update src/* to src/*.js
+  -- run: npm run lint and resolve the issue you are facing refer : https://vuejs.github.io/eslint-plugin-vue/rules/ 
+```
+# Gulp task for 'en.json' and 'dv.json' creation
+
+Note: 'dv.json' is created for identifying which labels or places are left/skipped by developers for i18n changes.
+Steps To perform:-
+1. While doing i18n, developers should do it with following mentioned pattern:-
+
+    i. If i18n is done in curly braces like :-
+        <button>{{ $t('btn_confirm') }}</button>
+    Then it should be done with pattern:-
+        <button>{{ $t('##btn_confirm##@@Confirm@@') }}</button>
+
+    ii. If i18n is done at attribute level in element like :-
+        <button :label="$t('btn_confirm')"></button>
+    Then it should be done with pattern:-
+        <button :label="$t('##btn_confirm##@@Confirm@@')"></button>
+
+    iii. If i18n is done at script level like :-
+        this.$toast.error(this.$t('invalidUsername'), {
+            theme: 'bubble',
+            duration: 6000
+        })
+    Then it should be done with pattern:-
+        this.$toast.error(this.$t('##invalidUsername##@@User name is invalid@@'), {
+            theme: 'bubble',
+            duration: 6000
+        })
+
+2. After this just run command 'npm run geni18n'
+3. This will create backup of current 'en.json'
+4. Create new 'en.json' and 'dv.json'
+5. Further the 'en.json' can be used to do i18n in any language at 'https://cs.mkcl.org'
\ No newline at end of file
diff --git a/app/assets/css/template.scss b/app/assets/css/template.scss
new file mode 100644
index 0000000000000000000000000000000000000000..6cac4a5f0a57c40f2b9a0e0e9ebb290571e1c955
--- /dev/null
+++ b/app/assets/css/template.scss
@@ -0,0 +1,411 @@
+    // Variables
+    $gray-lightest: #85858d;
+    $blue: #B7CADB;
+    $yellow: #FAF4B7;
+    $pink: #F2D1D1;
+    $green: #C4DFAA;
+    $indigo: #D9D7F1;
+    $orange: #F6D7A7;
+    $red : #FFB3B3;
+    $gray-lighter: #5e5a49;
+
+    // Reset
+    *, *::after, *::before {
+        margin: 0;
+        padding: 0;
+        box-sizing: border-box;
+    }
+
+    // Body
+    body {
+        font-family: 'DM Sans', sans-serif;
+    }
+
+    // Img
+    img {
+        display: block;
+        max-width: 100%;
+        height: auto;
+    }
+
+    .wrapper {
+        display: flex;
+        flex-direction: column;
+        height: calc(100vh - 72px);
+        padding: 2.5rem;
+        overflow-y: auto;
+    }
+
+    // Buttons
+    .btn {
+        padding: 1rem;
+        border: 0;
+        border-radius: 8px;
+        outline: none;
+        background-color: transparent;
+        display: inline-flex;
+        align-items: center;
+        color: #212121;
+        font-weight: 600;
+        font-size: 1rem;
+        cursor: pointer;
+        .isax {
+            font-size: 1.25rem;
+            margin-right: 0.5rem;
+        }
+        &.btn-submit {
+            background-color: $green;
+            .isax {
+                font-size: 1.25rem;
+                margin-right: 0.5rem;
+            }
+        }
+        &.btn-show {
+            background-color: $orange;
+        }
+    }
+    // Home
+    .box {
+        .title {
+            text-align: center;
+            font-weight: 900;
+            color: #212121;
+        }
+        .desc {
+            text-align: center;
+            margin-top: 0.5rem;
+            font-size: 0.8125rem;
+            color: $gray-lightest;
+            font-weight: 500;
+            margin-bottom: 2.5rem;
+        }
+        .bx-card {
+            margin-bottom: 1.5rem;
+            .p-card {
+                height: 350px;
+                border-radius: 12px;
+                padding: 3rem;
+                display: flex;
+                flex-direction: column;
+                overflow: hidden;
+                cursor: pointer;
+                }
+                .icon-holder {
+                    margin-left: -0.5rem;
+                    .isax {
+                        font-size: 3rem;
+                        color: #212121;
+                    }
+                }
+                &-name {
+                    font-size: 1.5rem;
+                    font-weight: 700;
+                    color: var(--bluegray-900);
+                    margin-top: auto;
+                    transition: transform 0.3s ease;
+                    transform: translateY(66px);
+                    display: flex;
+                    align-items: center;
+                    justify-content: space-between;
+                    .isax {
+                        font-size: 2rem;
+                        transition: transform 0.3s ease;
+                        transform: translateX(350px);
+                    }
+                }
+                &-desc {
+                    color: #212121;
+                    font-weight: 500;
+                    line-height: 1.6;
+                    font-size: 0.875rem;
+                    transition: transform 0.3s ease;
+                    transform: translateY(450px);
+                }
+                &:hover {
+                    .bx-card-name {
+                        transform: translateY(-16px);
+                        .isax {
+                            transform: translateX(0);
+                        }
+                    }
+                    .bx-card-desc {
+                        transform: translateY(0);
+                    }
+                }
+            }
+            .col-3 {
+                    $colors: $blue, $yellow, $pink, $green,$indigo, $orange;
+                    $repeat: 26;
+                    @for $i from 1 through $repeat {
+                        &:nth-child(#{length($colors)}n + #{$i}) {
+                            .bx-card {
+                                .p-card {
+                                    background-color: (nth($colors, random(length($colors))));
+                                    box-shadow: 0 24px 50px rgba(#212121, 0.08);
+                                }
+                            }
+                        }
+                    }
+
+                    // &:nth-child(2n+2) {
+                    //     .bx-card {
+                    //         .p-card {
+                    //             background-color: $blue;
+                    //             box-shadow: 0 24px 50px rgba($blue, 0.3);
+                    //         }
+                    //     }
+                    // }
+
+
+                    // &:nth-child(3n+3) {
+                    //     .bx-card {
+                    //         .p-card {
+                    //             background-color: $yellow;
+                    //             box-shadow: 0 24px 50px rgba($yellow, 0.3);
+                    //         }
+                    //     }
+                    // }
+
+
+                    // &:nth-child(5n+5) {
+                    //     .bx-card {
+                    //         .p-card {
+                    //             background-color: $green;
+                    //             box-shadow: 0 24px 50px rgba($green, 0.3);
+                    //         }
+                    //     }
+                    // }
+
+                    // &:nth-child(7n+7) {
+                    //     .bx-card {
+                    //         .p-card {
+                    //             background-color: $orange;
+                    //             box-shadow: 0 24px 50px rgba($orange, 0.3);
+                    //         }
+                    //     }
+                    // }
+
+                }
+        }
+
+    // Login
+    .title.alt {
+        display: flex;
+        align-items: center;
+        .isax {
+            margin-right: 1rem;
+            font-size: 2rem;
+            cursor: pointer;
+        }
+     }
+    .box-login {
+        margin-top: 2.5rem;
+
+        &.clickable {
+            cursor: pointer;
+        }
+
+        .p-card {
+            padding: 2rem;
+            box-shadow: 0 24px 50px rgba(#212121, 0.04);
+
+            .icon-holder {
+                i {
+                    font-size: 2rem;
+                }
+            }
+
+            .bx-login-name {
+                margin-top: 1rem;
+                font-size: 1.125rem;
+                font-weight: 700;
+            }
+
+
+            .data {
+                display: flex;
+                justify-content: space-between;
+                align-items: center;
+                margin-bottom: 2rem;
+                .btn-wrapper {
+                    margin-top: 0;
+                }
+                &.alt {
+                    background-color: #f8f8f8;
+                    padding: 1rem 2rem;
+                    border-radius: 8px;
+                    margin-bottom: 0;
+                }
+            }
+
+            .field + .field {
+                margin-top: 2.5rem;
+            }
+
+            .form-text {
+                font-size: 0.8125rem;
+                margin-top: 0.25rem;
+            }
+            .btn-wrapper {
+                margin-top: 2rem;
+                .btn + .btn {
+                    margin-left: 1.5rem;
+                }
+            }
+
+            .field {
+                p {
+                    word-wrap: break-word;
+                }
+                .p-fileupload {
+                    .p-fileupload-files {
+                        .p-button-icon-only {
+                            .p-button-icon {
+                                &::before {
+                                    content: '\e9d9';
+                                    font-family: 'iconsax';
+                                    font-size: 1.5rem;
+                                }
+                          }
+                    }
+                }
+                .isax {
+                    font-size: 1.5rem;
+                }
+            }
+            }
+        }
+
+        .json-wrapper {
+            .jv-container.jv-light {
+                font-family: 'DM Sans', sans-serif;
+            }
+            .jv-container:hover {
+                box-shadow: none;
+                border-color: #eee;
+            }
+        }
+
+    }
+
+    // Registration
+    .reg {
+        .box-login {
+
+            .field {
+                .p-inputtext {
+                    width: 100%;
+                }
+            }
+            .field {
+                .p-password {
+                    width: 100%;
+                    .p-inputtext {
+                        width: 100%;
+                    }
+                }
+            }
+            .btn-wrapper {
+                text-align: center;
+            }
+        }
+    }
+
+    // Validator
+    #validator {
+        .box-login {
+            .p-card {
+                .field {
+                    .p-dropdown {
+                        width: 100%;
+                        height: 42px;
+                        margin-top: 0.5rem;
+                        padding: 0.75rem;
+                        font-size: 0.875rem;
+                    }
+                }
+            }
+
+            .p-card {
+                .field {
+                    .p-dropdown {
+                        .p-dropdown-item {
+                            font-size: 0.875rem;
+                        }
+                    }
+                }
+            }
+
+            .p-card {
+                .field {
+                    .invalid-feedback {
+                        color: $red;
+                        font-weight: 700;
+                        margin-top: 0.5rem;
+                    }
+                }
+            }
+            .p-card {
+                .field {
+                    .p-inputtext {
+                        width: 100%;
+                        margin-top: 0.5rem;
+                        font-size: 0.875rem;
+                    }
+                }
+            }
+
+            .p-card {
+                .field {
+                    .label-checkbox {
+                        margin-left: 0.5rem;
+                    }
+                }
+            }
+        }
+    }
+
+    // Accordion
+    .p-accordion-tab {
+        margin-bottom: 0;
+        & + .p-accordion-tab {
+            margin-top: 1rem;
+        }
+    }
+    // Footer
+    .box-footer {
+        padding: 0.25rem 1rem;
+        box-shadow: 0 -8px 16px rgba(#212121, 0.04);
+        margin-top: auto;
+        .bxf-container {
+            display: flex;
+            align-items: center;
+            img {
+                width: 64px;
+                height: 64px;
+                margin-right: 1rem;
+            }
+            &-info {
+                font-size: 0.8125rem;
+                color: var(--gray-500);
+                p + p {
+                    margin-top: 0.25rem;
+                }
+            }
+        }
+    }
+
+    // Custom Scrollbar
+    ::-webkit-scrollbar {
+        width: 6px;
+        background-color: transparent;
+    }
+
+    ::-webkit-scrollbar-track {
+        border-radius: 16px;
+    }
+
+    ::-webkit-scrollbar-thumb {
+        border-radius: 16px;
+        background: #f8f9fa;
+    }
\ No newline at end of file
diff --git a/app/assets/fonts/dm-500.woff2 b/app/assets/fonts/dm-500.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..43eb7ac349847723c628f4fce4d3ad12de88e6a3
Binary files /dev/null and b/app/assets/fonts/dm-500.woff2 differ
diff --git a/app/assets/fonts/dm-700.woff2 b/app/assets/fonts/dm-700.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..9a7696df2ade09b5a17828b68f3246cc6bb0b4ba
Binary files /dev/null and b/app/assets/fonts/dm-700.woff2 differ
diff --git a/app/assets/fonts/dm.woff2 b/app/assets/fonts/dm.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..b8f0bd8ae02f1838b2a0b0707eee6f1e12b9f385
Binary files /dev/null and b/app/assets/fonts/dm.woff2 differ
diff --git a/app/assets/fonts/iconsax/iconsax.woff b/app/assets/fonts/iconsax/iconsax.woff
new file mode 100644
index 0000000000000000000000000000000000000000..9e48773ad59685beaaeb75c1ef8c7ba403676243
Binary files /dev/null and b/app/assets/fonts/iconsax/iconsax.woff differ
diff --git a/app/assets/fonts/iconsax/style.css b/app/assets/fonts/iconsax/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..83d8cc4e835f53df958a797b070c910a4a22bfab
--- /dev/null
+++ b/app/assets/fonts/iconsax/style.css
@@ -0,0 +1,3083 @@
+@font-face {
+  font-family: 'iconsax';
+  src:
+    url('./iconsax.woff') format('woff');
+  font-weight: normal;
+  font-style: normal;
+  font-display: block;
+}
+
+.isax {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'iconsax' !important;
+  speak: never;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.isax-bold-3dcube:before {
+  content: "\e900";
+}
+.isax-bold-3d-cube-scan:before {
+  content: "\e901";
+}
+.isax-bold-3d-rotate:before {
+  content: "\e902";
+}
+.isax-bold-3d-square:before {
+  content: "\e903";
+}
+.isax-bold-3square:before {
+  content: "\e904";
+}
+.isax-bold-24-support:before {
+  content: "\e905";
+}
+.isax-bold-aave-aave:before {
+  content: "\e906";
+}
+.isax-bold-activity:before {
+  content: "\e907";
+}
+.isax-bold-add:before {
+  content: "\e908";
+}
+.isax-bold-add-circle:before {
+  content: "\e909";
+}
+.isax-bold-additem:before {
+  content: "\e90a";
+}
+.isax-bold-add-square:before {
+  content: "\e90b";
+}
+.isax-bold-airdrop:before {
+  content: "\e90c";
+}
+.isax-bold-airplane:before {
+  content: "\e90d";
+}
+.isax-bold-airplane-square:before {
+  content: "\e90e";
+}
+.isax-bold-airpod:before {
+  content: "\e90f";
+}
+.isax-bold-airpods:before {
+  content: "\e910";
+}
+.isax-bold-alarm:before {
+  content: "\e911";
+}
+.isax-bold-align-bottom:before {
+  content: "\e912";
+}
+.isax-bold-align-horizontally:before {
+  content: "\e913";
+}
+.isax-bold-align-left:before {
+  content: "\e914";
+}
+.isax-bold-align-right:before {
+  content: "\e915";
+}
+.isax-bold-align-vertically:before {
+  content: "\e916";
+}
+.isax-bold-android:before {
+  content: "\e917";
+}
+.isax-bold-ankr-ankr:before {
+  content: "\e918";
+}
+.isax-bold-apple:before {
+  content: "\e919";
+}
+.isax-bold-aquarius:before {
+  content: "\e91a";
+}
+.isax-bold-archive:before {
+  content: "\e91b";
+}
+.isax-bold-archive-1:before {
+  content: "\e91c";
+}
+.isax-bold-archive-2:before {
+  content: "\e91d";
+}
+.isax-bold-archive-add:before {
+  content: "\e91e";
+}
+.isax-bold-archive-book:before {
+  content: "\e91f";
+}
+.isax-bold-archive-minus:before {
+  content: "\e920";
+}
+.isax-bold-archive-slash:before {
+  content: "\e921";
+}
+.isax-bold-archive-tick:before {
+  content: "\e922";
+}
+.isax-bold-arrange-circle:before {
+  content: "\e923";
+}
+.isax-bold-arrange-circle-2:before {
+  content: "\e924";
+}
+.isax-bold-arrange-square:before {
+  content: "\e925";
+}
+.isax-bold-arrange-square-2:before {
+  content: "\e926";
+}
+.isax-bold-arrow:before {
+  content: "\e927";
+}
+.isax-bold-arrow-2:before {
+  content: "\e928";
+}
+.isax-bold-arrow-3:before {
+  content: "\e929";
+}
+.isax-bold-arrow-bottom:before {
+  content: "\e92a";
+}
+.isax-bold-arrow-circle-down:before {
+  content: "\e92b";
+}
+.isax-bold-arrow-circle-left:before {
+  content: "\e92c";
+}
+.isax-bold-arrow-circle-right:before {
+  content: "\e92d";
+}
+.isax-bold-arrow-circle-up:before {
+  content: "\e92e";
+}
+.isax-bold-arrow-down:before {
+  content: "\e92f";
+}
+.isax-bold-arrow-down-1:before {
+  content: "\e930";
+}
+.isax-bold-arrow-down-2:before {
+  content: "\e931";
+}
+.isax-bold-arrow-left:before {
+  content: "\e932";
+}
+.isax-bold-arrow-left-1:before {
+  content: "\e933";
+}
+.isax-bold-arrow-left-2:before {
+  content: "\e934";
+}
+.isax-bold-arrow-left-3:before {
+  content: "\e935";
+}
+.isax-bold-arrow-right:before {
+  content: "\e936";
+}
+.isax-bold-arrow-right-1:before {
+  content: "\e937";
+}
+.isax-bold-arrow-right-2:before {
+  content: "\e938";
+}
+.isax-bold-arrow-right-3:before {
+  content: "\e939";
+}
+.isax-bold-arrow-square:before {
+  content: "\e93a";
+}
+.isax-bold-arrow-square-down:before {
+  content: "\e93b";
+}
+.isax-bold-arrow-square-left:before {
+  content: "\e93c";
+}
+.isax-bold-arrow-square-right:before {
+  content: "\e93d";
+}
+.isax-bold-arrow-square-up:before {
+  content: "\e93e";
+}
+.isax-bold-arrow-swap:before {
+  content: "\e93f";
+}
+.isax-bold-arrow-swap-horizontal:before {
+  content: "\e940";
+}
+.isax-bold-arrow-up:before {
+  content: "\e941";
+}
+.isax-bold-arrow-up-1:before {
+  content: "\e942";
+}
+.isax-bold-arrow-up-2:before {
+  content: "\e943";
+}
+.isax-bold-arrow-up-3:before {
+  content: "\e944";
+}
+.isax-bold-attach-circle:before {
+  content: "\e945";
+}
+.isax-bold-attach-square:before {
+  content: "\e946";
+}
+.isax-bold-audio-square:before {
+  content: "\e947";
+}
+.isax-bold-augur-rep:before {
+  content: "\e948";
+}
+.isax-bold-autobrightness:before {
+  content: "\e949";
+}
+.isax-bold-autonio-niox:before {
+  content: "\e94a";
+}
+.isax-bold-avalanche-avax:before {
+  content: "\e94b";
+}
+.isax-bold-award:before {
+  content: "\e94c";
+}
+.isax-bold-back-square:before {
+  content: "\e94d";
+}
+.isax-bold-backward:before {
+  content: "\e94e";
+}
+.isax-bold-backward-5-seconds:before {
+  content: "\e94f";
+}
+.isax-bold-backward-10-seconds:before {
+  content: "\e950";
+}
+.isax-bold-backward-15-seconds:before {
+  content: "\e951";
+}
+.isax-bold-backward-item:before {
+  content: "\e952";
+}
+.isax-bold-bag:before {
+  content: "\e953";
+}
+.isax-bold-bag-2:before {
+  content: "\e954";
+}
+.isax-bold-bag-cross:before {
+  content: "\e955";
+}
+.isax-bold-bag-cross-1:before {
+  content: "\e956";
+}
+.isax-bold-bag-happy:before {
+  content: "\e957";
+}
+.isax-bold-bag-tick:before {
+  content: "\e958";
+}
+.isax-bold-bag-tick-2:before {
+  content: "\e959";
+}
+.isax-bold-bag-timer:before {
+  content: "\e95a";
+}
+.isax-bold-bank:before {
+  content: "\e95b";
+}
+.isax-bold-barcode:before {
+  content: "\e95c";
+}
+.isax-bold-battery-3full:before {
+  content: "\e95d";
+}
+.isax-bold-battery-charging:before {
+  content: "\e95e";
+}
+.isax-bold-battery-disable:before {
+  content: "\e95f";
+}
+.isax-bold-battery-empty:before {
+  content: "\e960";
+}
+.isax-bold-battery-empty-1:before {
+  content: "\e961";
+}
+.isax-bold-battery-full:before {
+  content: "\e962";
+}
+.isax-bold-be:before {
+  content: "\e963";
+}
+.isax-bold-bezier:before {
+  content: "\e964";
+}
+.isax-bold-bill:before {
+  content: "\e965";
+}
+.isax-bold-binance-coin-bnb:before {
+  content: "\e966";
+}
+.isax-bold-binance-usd-busd:before {
+  content: "\e967";
+}
+.isax-bold-bitcoin-btc:before {
+  content: "\e968";
+}
+.isax-bold-bitcoin-card:before {
+  content: "\e969";
+}
+.isax-bold-bitcoin-convert:before {
+  content: "\e96a";
+}
+.isax-bold-bitcoin-refresh:before {
+  content: "\e96b";
+}
+.isax-bold-blend:before {
+  content: "\e96c";
+}
+.isax-bold-blend-2:before {
+  content: "\e96d";
+}
+.isax-bold-blogger:before {
+  content: "\e96e";
+}
+.isax-bold-bluetooth:before {
+  content: "\e96f";
+}
+.isax-bold-bluetooth-2:before {
+  content: "\e970";
+}
+.isax-bold-bluetooth-circle:before {
+  content: "\e971";
+}
+.isax-bold-bluetooth-rectangle:before {
+  content: "\e972";
+}
+.isax-bold-blur:before {
+  content: "\e973";
+}
+.isax-bold-book:before {
+  content: "\e974";
+}
+.isax-bold-book-1:before {
+  content: "\e975";
+}
+.isax-bold-bookmark:before {
+  content: "\e976";
+}
+.isax-bold-bookmark-2:before {
+  content: "\e977";
+}
+.isax-bold-book-saved:before {
+  content: "\e978";
+}
+.isax-bold-book-square:before {
+  content: "\e979";
+}
+.isax-bold-bootsrap:before {
+  content: "\e97a";
+}
+.isax-bold-box:before {
+  content: "\e97b";
+}
+.isax-bold-box-1:before {
+  content: "\e97c";
+}
+.isax-bold-box-2:before {
+  content: "\e97d";
+}
+.isax-bold-box-add:before {
+  content: "\e97e";
+}
+.isax-bold-box-remove:before {
+  content: "\e97f";
+}
+.isax-bold-box-search:before {
+  content: "\e980";
+}
+.isax-bold-box-tick:before {
+  content: "\e981";
+}
+.isax-bold-box-time:before {
+  content: "\e982";
+}
+.isax-bold-briefcase:before {
+  content: "\e983";
+}
+.isax-bold-brifecase-cross:before {
+  content: "\e984";
+}
+.isax-bold-brifecase-tick:before {
+  content: "\e985";
+}
+.isax-bold-brifecase-timer:before {
+  content: "\e986";
+}
+.isax-bold-broom:before {
+  content: "\e987";
+}
+.isax-bold-brush:before {
+  content: "\e988";
+}
+.isax-bold-brush-1:before {
+  content: "\e989";
+}
+.isax-bold-brush-2:before {
+  content: "\e98a";
+}
+.isax-bold-brush-3:before {
+  content: "\e98b";
+}
+.isax-bold-brush-4:before {
+  content: "\e98c";
+}
+.isax-bold-bubble:before {
+  content: "\e98d";
+}
+.isax-bold-bucket:before {
+  content: "\e98e";
+}
+.isax-bold-bucket-circle:before {
+  content: "\e98f";
+}
+.isax-bold-bucket-square:before {
+  content: "\e990";
+}
+.isax-bold-building:before {
+  content: "\e991";
+}
+.isax-bold-building-3:before {
+  content: "\e992";
+}
+.isax-bold-building-4:before {
+  content: "\e993";
+}
+.isax-bold-buildings:before {
+  content: "\e994";
+}
+.isax-bold-buildings-2:before {
+  content: "\e995";
+}
+.isax-bold-buliding:before {
+  content: "\e996";
+}
+.isax-bold-bus:before {
+  content: "\e997";
+}
+.isax-bold-buy-crypto:before {
+  content: "\e998";
+}
+.isax-bold-cake:before {
+  content: "\e999";
+}
+.isax-bold-calculator:before {
+  content: "\e99a";
+}
+.isax-bold-calendar:before {
+  content: "\e99b";
+}
+.isax-bold-calendar-1:before {
+  content: "\e99c";
+}
+.isax-bold-calendar-2:before {
+  content: "\e99d";
+}
+.isax-bold-calendar-add:before {
+  content: "\e99e";
+}
+.isax-bold-calendar-circle:before {
+  content: "\e99f";
+}
+.isax-bold-calendar-edit:before {
+  content: "\e9a0";
+}
+.isax-bold-calendar-remove:before {
+  content: "\e9a1";
+}
+.isax-bold-calendar-search:before {
+  content: "\e9a2";
+}
+.isax-bold-calendar-tick:before {
+  content: "\e9a3";
+}
+.isax-bold-call:before {
+  content: "\e9a4";
+}
+.isax-bold-call-add:before {
+  content: "\e9a5";
+}
+.isax-bold-call-calling:before {
+  content: "\e9a6";
+}
+.isax-bold-call-incoming:before {
+  content: "\e9a7";
+}
+.isax-bold-call-minus:before {
+  content: "\e9a8";
+}
+.isax-bold-call-outgoing:before {
+  content: "\e9a9";
+}
+.isax-bold-call-received:before {
+  content: "\e9aa";
+}
+.isax-bold-call-remove:before {
+  content: "\e9ab";
+}
+.isax-bold-call-slash:before {
+  content: "\e9ac";
+}
+.isax-bold-camera:before {
+  content: "\e9ad";
+}
+.isax-bold-camera-slash:before {
+  content: "\e9ae";
+}
+.isax-bold-candle:before {
+  content: "\e9af";
+}
+.isax-bold-candle-2:before {
+  content: "\e9b0";
+}
+.isax-bold-car:before {
+  content: "\e9b1";
+}
+.isax-bold-card:before {
+  content: "\e9b2";
+}
+.isax-bold-card-add:before {
+  content: "\e9b3";
+}
+.isax-bold-cardano-ada:before {
+  content: "\e9b4";
+}
+.isax-bold-card-coin:before {
+  content: "\e9b5";
+}
+.isax-bold-card-edit:before {
+  content: "\e9b6";
+}
+.isax-bold-card-pos:before {
+  content: "\e9b7";
+}
+.isax-bold-card-receive:before {
+  content: "\e9b8";
+}
+.isax-bold-card-remove:before {
+  content: "\e9b9";
+}
+.isax-bold-card-remove-1:before {
+  content: "\e9ba";
+}
+.isax-bold-cards:before {
+  content: "\e9bb";
+}
+.isax-bold-card-send:before {
+  content: "\e9bc";
+}
+.isax-bold-card-slash:before {
+  content: "\e9bd";
+}
+.isax-bold-card-tick:before {
+  content: "\e9be";
+}
+.isax-bold-card-tick-1:before {
+  content: "\e9bf";
+}
+.isax-bold-category:before {
+  content: "\e9c0";
+}
+.isax-bold-category-2:before {
+  content: "\e9c1";
+}
+.isax-bold-cd:before {
+  content: "\e9c2";
+}
+.isax-bold-celo-celo:before {
+  content: "\e9c3";
+}
+.isax-bold-celsius-cel:before {
+  content: "\e9c4";
+}
+.isax-bold-chainlink-link:before {
+  content: "\e9c5";
+}
+.isax-bold-chart:before {
+  content: "\e9c6";
+}
+.isax-bold-chart-1:before {
+  content: "\e9c7";
+}
+.isax-bold-chart-2:before {
+  content: "\e9c8";
+}
+.isax-bold-chart-3:before {
+  content: "\e9c9";
+}
+.isax-bold-chart-21:before {
+  content: "\e9ca";
+}
+.isax-bold-chart-fail:before {
+  content: "\e9cb";
+}
+.isax-bold-chart-square:before {
+  content: "\e9cc";
+}
+.isax-bold-chart-success:before {
+  content: "\e9cd";
+}
+.isax-bold-check:before {
+  content: "\e9ce";
+}
+.isax-bold-chrome:before {
+  content: "\e9cf";
+}
+.isax-bold-civic-cvc:before {
+  content: "\e9d0";
+}
+.isax-bold-clipboard:before {
+  content: "\e9d1";
+}
+.isax-bold-clipboard-close:before {
+  content: "\e9d2";
+}
+.isax-bold-clipboard-export:before {
+  content: "\e9d3";
+}
+.isax-bold-clipboard-import:before {
+  content: "\e9d4";
+}
+.isax-bold-clipboard-text:before {
+  content: "\e9d5";
+}
+.isax-bold-clipboard-tick:before {
+  content: "\e9d6";
+}
+.isax-bold-clock:before {
+  content: "\e9d7";
+}
+.isax-bold-clock-1:before {
+  content: "\e9d8";
+}
+.isax-bold-close-circle:before {
+  content: "\e9d9";
+}
+.isax-bold-close-square:before {
+  content: "\e9da";
+}
+.isax-bold-cloud:before {
+  content: "\e9db";
+}
+.isax-bold-cloud-add:before {
+  content: "\e9dc";
+}
+.isax-bold-cloud-change:before {
+  content: "\e9dd";
+}
+.isax-bold-cloud-connection:before {
+  content: "\e9de";
+}
+.isax-bold-cloud-cross:before {
+  content: "\e9df";
+}
+.isax-bold-cloud-drizzle:before {
+  content: "\e9e0";
+}
+.isax-bold-cloud-fog:before {
+  content: "\e9e1";
+}
+.isax-bold-cloud-lightning:before {
+  content: "\e9e2";
+}
+.isax-bold-cloud-minus:before {
+  content: "\e9e3";
+}
+.isax-bold-cloud-notif:before {
+  content: "\e9e4";
+}
+.isax-bold-cloud-plus:before {
+  content: "\e9e5";
+}
+.isax-bold-cloud-remove:before {
+  content: "\e9e6";
+}
+.isax-bold-cloud-snow:before {
+  content: "\e9e7";
+}
+.isax-bold-cloud-sunny:before {
+  content: "\e9e8";
+}
+.isax-bold-code:before {
+  content: "\e9e9";
+}
+.isax-bold-code-1:before {
+  content: "\e9ea";
+}
+.isax-bold-code-circle:before {
+  content: "\e9eb";
+}
+.isax-bold-coffee:before {
+  content: "\e9ec";
+}
+.isax-bold-coin:before {
+  content: "\e9ed";
+}
+.isax-bold-coin-1:before {
+  content: "\e9ee";
+}
+.isax-bold-colorfilter:before {
+  content: "\e9ef";
+}
+.isax-bold-colors-square:before {
+  content: "\e9f0";
+}
+.isax-bold-color-swatch:before {
+  content: "\e9f1";
+}
+.isax-bold-command:before {
+  content: "\e9f2";
+}
+.isax-bold-command-square:before {
+  content: "\e9f3";
+}
+.isax-bold-component:before {
+  content: "\e9f4";
+}
+.isax-bold-computing:before {
+  content: "\e9f5";
+}
+.isax-bold-convert:before {
+  content: "\e9f6";
+}
+.isax-bold-convert-3d-cube:before {
+  content: "\e9f7";
+}
+.isax-bold-convert-card:before {
+  content: "\e9f8";
+}
+.isax-bold-convertshape:before {
+  content: "\e9f9";
+}
+.isax-bold-convertshape-2:before {
+  content: "\e9fa";
+}
+.isax-bold-copy:before {
+  content: "\e9fb";
+}
+.isax-bold-copyright:before {
+  content: "\e9fc";
+}
+.isax-bold-copy-success:before {
+  content: "\e9fd";
+}
+.isax-bold-courthouse:before {
+  content: "\e9fe";
+}
+.isax-bold-cpu:before {
+  content: "\e9ff";
+}
+.isax-bold-cpu-charge:before {
+  content: "\ea00";
+}
+.isax-bold-cpu-setting:before {
+  content: "\ea01";
+}
+.isax-bold-creative-commons:before {
+  content: "\ea02";
+}
+.isax-bold-crop:before {
+  content: "\ea03";
+}
+.isax-bold-crown:before {
+  content: "\ea04";
+}
+.isax-bold-crown-1:before {
+  content: "\ea05";
+}
+.isax-bold-cup:before {
+  content: "\ea06";
+}
+.isax-bold-dai-dai:before {
+  content: "\ea07";
+}
+.isax-bold-danger:before {
+  content: "\ea08";
+}
+.isax-bold-dash-dash:before {
+  content: "\ea09";
+}
+.isax-bold-data:before {
+  content: "\ea0a";
+}
+.isax-bold-data-2 .path1:before {
+  content: "\ea0b";
+  color: rgb(41, 45, 50);
+}
+.isax-bold-data-2 .path2:before {
+  content: "\ea0c";
+  margin-left: -1em;
+  color: rgb(41, 45, 50);
+}
+.isax-bold-data-2 .path3:before {
+  content: "\ea0d";
+  margin-left: -1em;
+  color: rgb(41, 45, 50);
+}
+.isax-bold-data-2 .path4:before {
+  content: "\ea0e";
+  margin-left: -1em;
+  color: rgb(41, 45, 50);
+  opacity: 0.96;
+}
+.isax-bold-data-2 .path5:before {
+  content: "\ea0f";
+  margin-left: -1em;
+  color: rgb(41, 45, 50);
+}
+.isax-bold-decred-dcr:before {
+  content: "\ea10";
+}
+.isax-bold-dent-dent:before {
+  content: "\ea11";
+}
+.isax-bold-designtools:before {
+  content: "\ea12";
+}
+.isax-bold-device-message:before {
+  content: "\ea13";
+}
+.isax-bold-devices:before {
+  content: "\ea14";
+}
+.isax-bold-devices-1:before {
+  content: "\ea15";
+}
+.isax-bold-diagram:before {
+  content: "\ea16";
+}
+.isax-bold-diamonds:before {
+  content: "\ea17";
+}
+.isax-bold-direct:before {
+  content: "\ea18";
+}
+.isax-bold-directbox-default:before {
+  content: "\ea19";
+}
+.isax-bold-directbox-notif:before {
+  content: "\ea1a";
+}
+.isax-bold-directbox-receive:before {
+  content: "\ea1b";
+}
+.isax-bold-directbox-send:before {
+  content: "\ea1c";
+}
+.isax-bold-direct-down:before {
+  content: "\ea1d";
+}
+.isax-bold-direct-inbox:before {
+  content: "\ea1e";
+}
+.isax-bold-direct-left:before {
+  content: "\ea1f";
+}
+.isax-bold-direct-normal:before {
+  content: "\ea20";
+}
+.isax-bold-direct-notification:before {
+  content: "\ea21";
+}
+.isax-bold-direct-right:before {
+  content: "\ea22";
+}
+.isax-bold-direct-send:before {
+  content: "\ea23";
+}
+.isax-bold-direct-up:before {
+  content: "\ea24";
+}
+.isax-bold-discount-circle:before {
+  content: "\ea25";
+}
+.isax-bold-discount-shape:before {
+  content: "\ea26";
+}
+.isax-bold-discover:before {
+  content: "\ea27";
+}
+.isax-bold-discover-1:before {
+  content: "\ea28";
+}
+.isax-bold-dislike:before {
+  content: "\ea29";
+}
+.isax-bold-document:before {
+  content: "\ea2a";
+}
+.isax-bold-document-1:before {
+  content: "\ea2b";
+}
+.isax-bold-document-cloud:before {
+  content: "\ea2c";
+}
+.isax-bold-document-code:before {
+  content: "\ea2d";
+}
+.isax-bold-document-code-2:before {
+  content: "\ea2e";
+}
+.isax-bold-document-copy:before {
+  content: "\ea2f";
+}
+.isax-bold-document-download:before {
+  content: "\ea30";
+}
+.isax-bold-document-favorite:before {
+  content: "\ea31";
+}
+.isax-bold-document-filter:before {
+  content: "\ea32";
+}
+.isax-bold-document-forward:before {
+  content: "\ea33";
+}
+.isax-bold-document-like:before {
+  content: "\ea34";
+}
+.isax-bold-document-normal:before {
+  content: "\ea35";
+}
+.isax-bold-document-previous:before {
+  content: "\ea36";
+}
+.isax-bold-document-sketch:before {
+  content: "\ea37";
+}
+.isax-bold-document-text:before {
+  content: "\ea38";
+}
+.isax-bold-document-text-1:before {
+  content: "\ea39";
+}
+.isax-bold-document-upload:before {
+  content: "\ea3a";
+}
+.isax-bold-dollar-circle:before {
+  content: "\ea3b";
+}
+.isax-bold-dollar-square:before {
+  content: "\ea3c";
+}
+.isax-bold-dribbble:before {
+  content: "\ea3d";
+}
+.isax-bold-driver:before {
+  content: "\ea3e";
+}
+.isax-bold-driver-2:before {
+  content: "\ea3f";
+}
+.isax-bold-driver-refresh:before {
+  content: "\ea40";
+}
+.isax-bold-driving:before {
+  content: "\ea41";
+}
+.isax-bold-drop:before {
+  content: "\ea42";
+}
+.isax-bold-dropbox:before {
+  content: "\ea43";
+}
+.isax-bold-edit:before {
+  content: "\ea44";
+}
+.isax-bold-edit-2:before {
+  content: "\ea45";
+}
+.isax-bold-educare-ekt:before {
+  content: "\ea46";
+}
+.isax-bold-electricity:before {
+  content: "\ea47";
+}
+.isax-bold-element-2:before {
+  content: "\ea48";
+}
+.isax-bold-element-3:before {
+  content: "\ea49";
+}
+.isax-bold-element-4:before {
+  content: "\ea4a";
+}
+.isax-bold-element-equal:before {
+  content: "\ea4b";
+}
+.isax-bold-element-plus:before {
+  content: "\ea4c";
+}
+.isax-bold-emercoin-emc:before {
+  content: "\ea4d";
+}
+.isax-bold-emoji-happy:before {
+  content: "\ea4e";
+}
+.isax-bold-emoji-normal:before {
+  content: "\ea4f";
+}
+.isax-bold-emoji-sad:before {
+  content: "\ea50";
+}
+.isax-bold-empty-wallet:before {
+  content: "\ea51";
+}
+.isax-bold-empty-wallet-add:before {
+  content: "\ea52";
+}
+.isax-bold-empty-wallet-change:before {
+  content: "\ea53";
+}
+.isax-bold-empty-wallet-remove:before {
+  content: "\ea54";
+}
+.isax-bold-empty-wallet-tick:before {
+  content: "\ea55";
+}
+.isax-bold-empty-wallet-time:before {
+  content: "\ea56";
+}
+.isax-bold-enjin-coin-enj:before {
+  content: "\ea57";
+}
+.isax-bold-eos-eos:before {
+  content: "\ea58";
+}
+.isax-bold-eraser:before {
+  content: "\ea59";
+}
+.isax-bold-eraser-1:before {
+  content: "\ea5a";
+}
+.isax-bold-ethereum-eth:before {
+  content: "\ea5b";
+}
+.isax-bold-ethereum-classic-etc:before {
+  content: "\ea5c";
+}
+.isax-bold-export:before {
+  content: "\ea5d";
+}
+.isax-bold-export-1:before {
+  content: "\ea5e";
+}
+.isax-bold-export-2:before {
+  content: "\ea5f";
+}
+.isax-bold-export-3:before {
+  content: "\ea60";
+}
+.isax-bold-external-drive:before {
+  content: "\ea61";
+}
+.isax-bold-eye:before {
+  content: "\ea62";
+}
+.isax-bold-eye-slash:before {
+  content: "\ea63";
+}
+.isax-bold-facebook:before {
+  content: "\ea64";
+}
+.isax-bold-fatrows:before {
+  content: "\ea65";
+}
+.isax-bold-favorite-chart:before {
+  content: "\ea66";
+}
+.isax-bold-figma:before {
+  content: "\ea67";
+}
+.isax-bold-figma-1:before {
+  content: "\ea68";
+}
+.isax-bold-filter:before {
+  content: "\ea69";
+}
+.isax-bold-filter-add:before {
+  content: "\ea6a";
+}
+.isax-bold-filter-edit:before {
+  content: "\ea6b";
+}
+.isax-bold-filter-remove:before {
+  content: "\ea6c";
+}
+.isax-bold-filter-search:before {
+  content: "\ea6d";
+}
+.isax-bold-filter-square:before {
+  content: "\ea6e";
+}
+.isax-bold-filter-tick:before {
+  content: "\ea6f";
+}
+.isax-bold-finger-cricle:before {
+  content: "\ea70";
+}
+.isax-bold-finger-scan:before {
+  content: "\ea71";
+}
+.isax-bold-firstline:before {
+  content: "\ea72";
+}
+.isax-bold-flag:before {
+  content: "\ea73";
+}
+.isax-bold-flag-2:before {
+  content: "\ea74";
+}
+.isax-bold-flash:before {
+  content: "\ea75";
+}
+.isax-bold-flash-1:before {
+  content: "\ea76";
+}
+.isax-bold-flash-circle:before {
+  content: "\ea77";
+}
+.isax-bold-flash-circle-1:before {
+  content: "\ea78";
+}
+.isax-bold-flash-slash:before {
+  content: "\ea79";
+}
+.isax-bold-folder:before {
+  content: "\ea7a";
+}
+.isax-bold-folder-2:before {
+  content: "\ea7b";
+}
+.isax-bold-folder-add:before {
+  content: "\ea7c";
+}
+.isax-bold-folder-cloud:before {
+  content: "\ea7d";
+}
+.isax-bold-folder-connection:before {
+  content: "\ea7e";
+}
+.isax-bold-folder-cross:before {
+  content: "\ea7f";
+}
+.isax-bold-folder-favorite:before {
+  content: "\ea80";
+}
+.isax-bold-folder-minus:before {
+  content: "\ea81";
+}
+.isax-bold-folder-open:before {
+  content: "\ea82";
+}
+.isax-bold-forbidden:before {
+  content: "\ea83";
+}
+.isax-bold-forbidden-2:before {
+  content: "\ea84";
+}
+.isax-bold-format-circle:before {
+  content: "\ea85";
+}
+.isax-bold-format-square:before {
+  content: "\ea86";
+}
+.isax-bold-forward:before {
+  content: "\ea87";
+}
+.isax-bold-forward-5-seconds:before {
+  content: "\ea88";
+}
+.isax-bold-forward-10-seconds:before {
+  content: "\ea89";
+}
+.isax-bold-forward-15-seconds:before {
+  content: "\ea8a";
+}
+.isax-bold-forward-item:before {
+  content: "\ea8b";
+}
+.isax-bold-forward-square:before {
+  content: "\ea8c";
+}
+.isax-bold-frame:before {
+  content: "\ea8d";
+}
+.isax-bold-frame-1:before {
+  content: "\ea8e";
+}
+.isax-bold-frame-2:before {
+  content: "\ea8f";
+}
+.isax-bold-frame-3:before {
+  content: "\ea90";
+}
+.isax-bold-frame-4:before {
+  content: "\ea91";
+}
+.isax-bold-framer:before {
+  content: "\ea92";
+}
+.isax-bold-ftx-token-ftt:before {
+  content: "\ea93";
+}
+.isax-bold-gallery:before {
+  content: "\ea94";
+}
+.isax-bold-gallery-add:before {
+  content: "\ea95";
+}
+.isax-bold-gallery-edit:before {
+  content: "\ea96";
+}
+.isax-bold-gallery-export:before {
+  content: "\ea97";
+}
+.isax-bold-gallery-favorite:before {
+  content: "\ea98";
+}
+.isax-bold-gallery-import:before {
+  content: "\ea99";
+}
+.isax-bold-gallery-remove:before {
+  content: "\ea9a";
+}
+.isax-bold-gallery-slash:before {
+  content: "\ea9b";
+}
+.isax-bold-gallery-tick:before {
+  content: "\ea9c";
+}
+.isax-bold-game:before {
+  content: "\ea9d";
+}
+.isax-bold-gameboy:before {
+  content: "\ea9e";
+}
+.isax-bold-gas-station:before {
+  content: "\ea9f";
+}
+.isax-bold-gemini:before {
+  content: "\eaa0";
+}
+.isax-bold-gemini-2:before {
+  content: "\eaa1";
+}
+.isax-bold-ghost:before {
+  content: "\eaa2";
+}
+.isax-bold-gift:before {
+  content: "\eaa3";
+}
+.isax-bold-glass:before {
+  content: "\eaa4";
+}
+.isax-bold-glass-1:before {
+  content: "\eaa5";
+}
+.isax-bold-global:before {
+  content: "\eaa6";
+}
+.isax-bold-global-edit:before {
+  content: "\eaa7";
+}
+.isax-bold-global-refresh:before {
+  content: "\eaa8";
+}
+.isax-bold-global-search:before {
+  content: "\eaa9";
+}
+.isax-bold-google:before {
+  content: "\eaaa";
+}
+.isax-bold-google-1:before {
+  content: "\eaab";
+}
+.isax-bold-google-play:before {
+  content: "\eaac";
+}
+.isax-bold-gps:before {
+  content: "\eaad";
+}
+.isax-bold-gps-slash:before {
+  content: "\eaae";
+}
+.isax-bold-grammerly:before {
+  content: "\eaaf";
+}
+.isax-bold-graph:before {
+  content: "\eab0";
+}
+.isax-bold-grid-1:before {
+  content: "\eab1";
+}
+.isax-bold-grid-2:before {
+  content: "\eab2";
+}
+.isax-bold-grid-3:before {
+  content: "\eab3";
+}
+.isax-bold-grid-4:before {
+  content: "\eab4";
+}
+.isax-bold-grid-5:before {
+  content: "\eab5";
+}
+.isax-bold-grid-6:before {
+  content: "\eab6";
+}
+.isax-bold-grid-7:before {
+  content: "\eab7";
+}
+.isax-bold-grid-8:before {
+  content: "\eab8";
+}
+.isax-bold-grid-9:before {
+  content: "\eab9";
+}
+.isax-bold-grid-edit:before {
+  content: "\eaba";
+}
+.isax-bold-grid-eraser:before {
+  content: "\eabb";
+}
+.isax-bold-grid-lock:before {
+  content: "\eabc";
+}
+.isax-bold-happyemoji:before {
+  content: "\eabd";
+}
+.isax-bold-harmony-one:before {
+  content: "\eabe";
+}
+.isax-bold-hashtag:before {
+  content: "\eabf";
+}
+.isax-bold-hashtag-1:before {
+  content: "\eac0";
+}
+.isax-bold-hashtag-down:before {
+  content: "\eac1";
+}
+.isax-bold-hashtag-up:before {
+  content: "\eac2";
+}
+.isax-bold-headphone:before {
+  content: "\eac3";
+}
+.isax-bold-headphones:before {
+  content: "\eac4";
+}
+.isax-bold-health:before {
+  content: "\eac5";
+}
+.isax-bold-heart:before {
+  content: "\eac6";
+}
+.isax-bold-heart-add:before {
+  content: "\eac7";
+}
+.isax-bold-heart-circle:before {
+  content: "\eac8";
+}
+.isax-bold-heart-edit:before {
+  content: "\eac9";
+}
+.isax-bold-heart-remove:before {
+  content: "\eaca";
+}
+.isax-bold-heart-search:before {
+  content: "\eacb";
+}
+.isax-bold-heart-slash:before {
+  content: "\eacc";
+}
+.isax-bold-heart-tick:before {
+  content: "\eacd";
+}
+.isax-bold-hedera-hashgraph-hbar:before {
+  content: "\eace";
+}
+.isax-bold-hex-hex .path1:before {
+  content: "\eacf";
+  color: rgb(0, 0, 0);
+  opacity: 0.13;
+}
+.isax-bold-hex-hex .path2:before {
+  content: "\ead0";
+  margin-left: -1em;
+  color: rgb(0, 0, 0);
+}
+.isax-bold-hex-hex .path3:before {
+  content: "\ead1";
+  margin-left: -1em;
+  color: rgb(0, 0, 0);
+}
+.isax-bold-hex-hex .path4:before {
+  content: "\ead2";
+  margin-left: -1em;
+  color: rgb(0, 0, 0);
+}
+.isax-bold-hierarchy:before {
+  content: "\ead3";
+}
+.isax-bold-hierarchy-2:before {
+  content: "\ead4";
+}
+.isax-bold-hierarchy-3:before {
+  content: "\ead5";
+}
+.isax-bold-hierarchy-square:before {
+  content: "\ead6";
+}
+.isax-bold-hierarchy-square-2:before {
+  content: "\ead7";
+}
+.isax-bold-hierarchy-square-3:before {
+  content: "\ead8";
+}
+.isax-bold-home:before {
+  content: "\ead9";
+}
+.isax-bold-home-1:before {
+  content: "\eada";
+}
+.isax-bold-home-2:before {
+  content: "\eadb";
+}
+.isax-bold-home-hashtag:before {
+  content: "\eadc";
+}
+.isax-bold-home-trend-down:before {
+  content: "\eadd";
+}
+.isax-bold-home-trend-up:before {
+  content: "\eade";
+}
+.isax-bold-home-wifi:before {
+  content: "\eadf";
+}
+.isax-bold-hospital:before {
+  content: "\eae0";
+}
+.isax-bold-house:before {
+  content: "\eae1";
+}
+.isax-bold-house-2:before {
+  content: "\eae2";
+}
+.isax-bold-html-3:before {
+  content: "\eae3";
+}
+.isax-bold-html-5:before {
+  content: "\eae4";
+}
+.isax-bold-huobi-token-ht:before {
+  content: "\eae5";
+}
+.isax-bold-icon-icx:before {
+  content: "\eae6";
+}
+.isax-bold-icon:before {
+  content: "\eae7";
+}
+.isax-bold-icon-1:before {
+  content: "\eae8";
+}
+.isax-bold-illustrator:before {
+  content: "\eae9";
+}
+.isax-bold-image:before {
+  content: "\eaea";
+}
+.isax-bold-import:before {
+  content: "\eaeb";
+}
+.isax-bold-import-1:before {
+  content: "\eaec";
+}
+.isax-bold-import-2:before {
+  content: "\eaed";
+}
+.isax-bold-import-3:before {
+  content: "\eaee";
+}
+.isax-bold-info-circle:before {
+  content: "\eaef";
+}
+.isax-bold-information:before {
+  content: "\eaf0";
+}
+.isax-bold-instagram:before {
+  content: "\eaf1";
+}
+.isax-bold-iost-iost:before {
+  content: "\eaf2";
+}
+.isax-bold-java-script:before {
+  content: "\eaf3";
+}
+.isax-bold-js:before {
+  content: "\eaf4";
+}
+.isax-bold-judge:before {
+  content: "\eaf5";
+}
+.isax-bold-kanban:before {
+  content: "\eaf6";
+}
+.isax-bold-key:before {
+  content: "\eaf7";
+}
+.isax-bold-keyboard:before {
+  content: "\eaf8";
+}
+.isax-bold-keyboard-open:before {
+  content: "\eaf9";
+}
+.isax-bold-key-square:before {
+  content: "\eafa";
+}
+.isax-bold-kyber-network-knc:before {
+  content: "\eafb";
+}
+.isax-bold-lamp:before {
+  content: "\eafc";
+}
+.isax-bold-lamp-1:before {
+  content: "\eafd";
+}
+.isax-bold-lamp-charge:before {
+  content: "\eafe";
+}
+.isax-bold-lamp-on:before {
+  content: "\eaff";
+}
+.isax-bold-lamp-slash:before {
+  content: "\eb00";
+}
+.isax-bold-language-circle:before {
+  content: "\eb01";
+}
+.isax-bold-language-square:before {
+  content: "\eb02";
+}
+.isax-bold-layer:before {
+  content: "\eb03";
+}
+.isax-bold-level:before {
+  content: "\eb04";
+}
+.isax-bold-lifebuoy:before {
+  content: "\eb05";
+}
+.isax-bold-like:before {
+  content: "\eb06";
+}
+.isax-bold-like-1:before {
+  content: "\eb07";
+}
+.isax-bold-like-dislike:before {
+  content: "\eb08";
+}
+.isax-bold-like-shapes:before {
+  content: "\eb09";
+}
+.isax-bold-like-tag:before {
+  content: "\eb0a";
+}
+.isax-bold-link:before {
+  content: "\eb0b";
+}
+.isax-bold-link-1:before {
+  content: "\eb0c";
+}
+.isax-bold-link-2:before {
+  content: "\eb0d";
+}
+.isax-bold-link-21:before {
+  content: "\eb0e";
+}
+.isax-bold-link-circle:before {
+  content: "\eb0f";
+}
+.isax-bold-link-square:before {
+  content: "\eb10";
+}
+.isax-bold-litecoinltc:before {
+  content: "\eb11";
+}
+.isax-bold-location:before {
+  content: "\eb12";
+}
+.isax-bold-location-add:before {
+  content: "\eb13";
+}
+.isax-bold-location-cross:before {
+  content: "\eb14";
+}
+.isax-bold-location-minus:before {
+  content: "\eb15";
+}
+.isax-bold-location-slash:before {
+  content: "\eb16";
+}
+.isax-bold-location-tick:before {
+  content: "\eb17";
+}
+.isax-bold-lock:before {
+  content: "\eb18";
+}
+.isax-bold-lock-1:before {
+  content: "\eb19";
+}
+.isax-bold-lock-circle:before {
+  content: "\eb1a";
+}
+.isax-bold-lock-slash:before {
+  content: "\eb1b";
+}
+.isax-bold-login:before {
+  content: "\eb1c";
+}
+.isax-bold-login-1:before {
+  content: "\eb1d";
+}
+.isax-bold-logout:before {
+  content: "\eb1e";
+}
+.isax-bold-logout-1:before {
+  content: "\eb1f";
+}
+.isax-bold-lovely:before {
+  content: "\eb20";
+}
+.isax-bold-magicpen:before {
+  content: "\eb21";
+}
+.isax-bold-magic-star:before {
+  content: "\eb22";
+}
+.isax-bold-main-component:before {
+  content: "\eb23";
+}
+.isax-bold-maker-mkr:before {
+  content: "\eb24";
+}
+.isax-bold-man:before {
+  content: "\eb25";
+}
+.isax-bold-map:before {
+  content: "\eb26";
+}
+.isax-bold-map-1:before {
+  content: "\eb27";
+}
+.isax-bold-mask:before {
+  content: "\eb28";
+}
+.isax-bold-mask-1:before {
+  content: "\eb29";
+}
+.isax-bold-mask-2:before {
+  content: "\eb2a";
+}
+.isax-bold-math:before {
+  content: "\eb2b";
+}
+.isax-bold-maximize:before {
+  content: "\eb2c";
+}
+.isax-bold-maximize-1:before {
+  content: "\eb2d";
+}
+.isax-bold-maximize-2:before {
+  content: "\eb2e";
+}
+.isax-bold-maximize-3:before {
+  content: "\eb2f";
+}
+.isax-bold-maximize-4:before {
+  content: "\eb30";
+}
+.isax-bold-maximize-21:before {
+  content: "\eb31";
+}
+.isax-bold-maximize-circle:before {
+  content: "\eb32";
+}
+.isax-bold-medal:before {
+  content: "\eb33";
+}
+.isax-bold-medal-star:before {
+  content: "\eb34";
+}
+.isax-bold-menu:before {
+  content: "\eb35";
+}
+.isax-bold-menu-1:before {
+  content: "\eb36";
+}
+.isax-bold-menu-board:before {
+  content: "\eb37";
+}
+.isax-bold-message:before {
+  content: "\eb38";
+}
+.isax-bold-message-2:before {
+  content: "\eb39";
+}
+.isax-bold-message-add:before {
+  content: "\eb3a";
+}
+.isax-bold-message-add-1:before {
+  content: "\eb3b";
+}
+.isax-bold-message-circle:before {
+  content: "\eb3c";
+}
+.isax-bold-message-edit:before {
+  content: "\eb3d";
+}
+.isax-bold-message-favorite:before {
+  content: "\eb3e";
+}
+.isax-bold-message-minus:before {
+  content: "\eb3f";
+}
+.isax-bold-message-notif:before {
+  content: "\eb40";
+}
+.isax-bold-message-programming:before {
+  content: "\eb41";
+}
+.isax-bold-message-question:before {
+  content: "\eb42";
+}
+.isax-bold-message-remove:before {
+  content: "\eb43";
+}
+.isax-bold-messages:before {
+  content: "\eb44";
+}
+.isax-bold-messages-1:before {
+  content: "\eb45";
+}
+.isax-bold-messages-2:before {
+  content: "\eb46";
+}
+.isax-bold-messages-3:before {
+  content: "\eb47";
+}
+.isax-bold-message-search:before {
+  content: "\eb48";
+}
+.isax-bold-message-square:before {
+  content: "\eb49";
+}
+.isax-bold-message-text:before {
+  content: "\eb4a";
+}
+.isax-bold-message-text-1:before {
+  content: "\eb4b";
+}
+.isax-bold-message-tick:before {
+  content: "\eb4c";
+}
+.isax-bold-message-time:before {
+  content: "\eb4d";
+}
+.isax-bold-messenger:before {
+  content: "\eb4e";
+}
+.isax-bold-microphone:before {
+  content: "\eb4f";
+}
+.isax-bold-microphone-2:before {
+  content: "\eb50";
+}
+.isax-bold-microphone-slash:before {
+  content: "\eb51";
+}
+.isax-bold-microphone-slash-1:before {
+  content: "\eb52";
+}
+.isax-bold-microscope:before {
+  content: "\eb53";
+}
+.isax-bold-milk:before {
+  content: "\eb54";
+}
+.isax-bold-mini-music-sqaure .path1:before {
+  content: "\eb55";
+  color: rgb(41, 45, 50);
+  opacity: 0.4;
+}
+.isax-bold-mini-music-sqaure .path2:before {
+  content: "\eb56";
+  margin-left: -1em;
+  color: rgb(41, 45, 50);
+}
+.isax-bold-mini-music-sqaure .path3:before {
+  content: "\eb57";
+  margin-left: -1em;
+  color: rgb(41, 45, 50);
+}
+.isax-bold-minus:before {
+  content: "\eb58";
+}
+.isax-bold-minus-cirlce:before {
+  content: "\eb59";
+}
+.isax-bold-minus-square:before {
+  content: "\eb5a";
+}
+.isax-bold-mirror:before {
+  content: "\eb5b";
+}
+.isax-bold-mirroring-screen:before {
+  content: "\eb5c";
+}
+.isax-bold-mobile:before {
+  content: "\eb5d";
+}
+.isax-bold-mobile-programming:before {
+  content: "\eb5e";
+}
+.isax-bold-monero-xmr:before {
+  content: "\eb5f";
+}
+.isax-bold-money:before {
+  content: "\eb60";
+}
+.isax-bold-money-2:before {
+  content: "\eb61";
+}
+.isax-bold-money-3:before {
+  content: "\eb62";
+}
+.isax-bold-money-4:before {
+  content: "\eb63";
+}
+.isax-bold-money-add:before {
+  content: "\eb64";
+}
+.isax-bold-money-change:before {
+  content: "\eb65";
+}
+.isax-bold-money-forbidden:before {
+  content: "\eb66";
+}
+.isax-bold-money-recive:before {
+  content: "\eb67";
+}
+.isax-bold-money-remove:before {
+  content: "\eb68";
+}
+.isax-bold-moneys:before {
+  content: "\eb69";
+}
+.isax-bold-money-send:before {
+  content: "\eb6a";
+}
+.isax-bold-money-tick:before {
+  content: "\eb6b";
+}
+.isax-bold-money-time:before {
+  content: "\eb6c";
+}
+.isax-bold-monitor:before {
+  content: "\eb6d";
+}
+.isax-bold-monitor-mobbile:before {
+  content: "\eb6e";
+}
+.isax-bold-monitor-recorder:before {
+  content: "\eb6f";
+}
+.isax-bold-moon:before {
+  content: "\eb70";
+}
+.isax-bold-more:before {
+  content: "\eb71";
+}
+.isax-bold-more-2:before {
+  content: "\eb72";
+}
+.isax-bold-more-circle:before {
+  content: "\eb73";
+}
+.isax-bold-more-square:before {
+  content: "\eb74";
+}
+.isax-bold-mouse:before {
+  content: "\eb75";
+}
+.isax-bold-mouse-1:before {
+  content: "\eb76";
+}
+.isax-bold-mouse-circle:before {
+  content: "\eb77";
+}
+.isax-bold-mouse-square:before {
+  content: "\eb78";
+}
+.isax-bold-music:before {
+  content: "\eb79";
+}
+.isax-bold-music-circle:before {
+  content: "\eb7a";
+}
+.isax-bold-music-dashboard:before {
+  content: "\eb7b";
+}
+.isax-bold-music-filter:before {
+  content: "\eb7c";
+}
+.isax-bold-music-library-2:before {
+  content: "\eb7d";
+}
+.isax-bold-musicnote:before {
+  content: "\eb7e";
+}
+.isax-bold-music-play:before {
+  content: "\eb7f";
+}
+.isax-bold-music-playlist:before {
+  content: "\eb80";
+}
+.isax-bold-music-square:before {
+  content: "\eb81";
+}
+.isax-bold-music-square-add:before {
+  content: "\eb82";
+}
+.isax-bold-music-square-remove:before {
+  content: "\eb83";
+}
+.isax-bold-music-square-search:before {
+  content: "\eb84";
+}
+.isax-bold-nebulas-nas:before {
+  content: "\eb85";
+}
+.isax-bold-nem-xem:before {
+  content: "\eb86";
+}
+.isax-bold-nexo-nexo:before {
+  content: "\eb87";
+}
+.isax-bold-next:before {
+  content: "\eb88";
+}
+.isax-bold-note:before {
+  content: "\eb89";
+}
+.isax-bold-note-1:before {
+  content: "\eb8a";
+}
+.isax-bold-note-2:before {
+  content: "\eb8b";
+}
+.isax-bold-note-21:before {
+  content: "\eb8c";
+}
+.isax-bold-note-add:before {
+  content: "\eb8d";
+}
+.isax-bold-note-favorite:before {
+  content: "\eb8e";
+}
+.isax-bold-note-remove:before {
+  content: "\eb8f";
+}
+.isax-bold-note-square:before {
+  content: "\eb90";
+}
+.isax-bold-note-text:before {
+  content: "\eb91";
+}
+.isax-bold-notification:before {
+  content: "\eb92";
+}
+.isax-bold-notification-1:before {
+  content: "\eb93";
+}
+.isax-bold-notification-bing:before {
+  content: "\eb94";
+}
+.isax-bold-notification-favorite:before {
+  content: "\eb95";
+}
+.isax-bold-notification-status:before {
+  content: "\eb96";
+}
+.isax-bold-ocean-protocol-ocean:before {
+  content: "\eb97";
+}
+.isax-bold-okb-okb:before {
+  content: "\eb98";
+}
+.isax-bold-omega-circle:before {
+  content: "\eb99";
+}
+.isax-bold-omega-square:before {
+  content: "\eb9a";
+}
+.isax-bold-ontology-ont:before {
+  content: "\eb9b";
+}
+.isax-bold-paintbucket:before {
+  content: "\eb9c";
+}
+.isax-bold-paperclip:before {
+  content: "\eb9d";
+}
+.isax-bold-paperclip-2:before {
+  content: "\eb9e";
+}
+.isax-bold-password-check:before {
+  content: "\eb9f";
+}
+.isax-bold-path:before {
+  content: "\eba0";
+}
+.isax-bold-path-2:before {
+  content: "\eba1";
+}
+.isax-bold-path-square:before {
+  content: "\eba2";
+}
+.isax-bold-pause:before {
+  content: "\eba3";
+}
+.isax-bold-pause-circle:before {
+  content: "\eba4";
+}
+.isax-bold-paypal:before {
+  content: "\eba5";
+}
+.isax-bold-pen-add:before {
+  content: "\eba6";
+}
+.isax-bold-pen-close:before {
+  content: "\eba7";
+}
+.isax-bold-pen-remove:before {
+  content: "\eba8";
+}
+.isax-bold-pen-tool:before {
+  content: "\eba9";
+}
+.isax-bold-pen-tool-2:before {
+  content: "\ebaa";
+}
+.isax-bold-people:before {
+  content: "\ebab";
+}
+.isax-bold-percentage-circle:before {
+  content: "\ebac";
+}
+.isax-bold-percentage-square:before {
+  content: "\ebad";
+}
+.isax-bold-personalcard:before {
+  content: "\ebae";
+}
+.isax-bold-pet:before {
+  content: "\ebaf";
+}
+.isax-bold-pharagraphspacing:before {
+  content: "\ebb0";
+}
+.isax-bold-photoshop:before {
+  content: "\ebb1";
+}
+.isax-bold-picture-frame:before {
+  content: "\ebb2";
+}
+.isax-bold-play:before {
+  content: "\ebb3";
+}
+.isax-bold-play-add:before {
+  content: "\ebb4";
+}
+.isax-bold-play-circle:before {
+  content: "\ebb5";
+}
+.isax-bold-play-cricle:before {
+  content: "\ebb6";
+}
+.isax-bold-play-remove:before {
+  content: "\ebb7";
+}
+.isax-bold-polkadot-dot:before {
+  content: "\ebb8";
+}
+.isax-bold-polygon-matic:before {
+  content: "\ebb9";
+}
+.isax-bold-polyswarm-nct:before {
+  content: "\ebba";
+}
+.isax-bold-presention-chart:before {
+  content: "\ebbb";
+}
+.isax-bold-previous:before {
+  content: "\ebbc";
+}
+.isax-bold-printer:before {
+  content: "\ebbd";
+}
+.isax-bold-printer-slash:before {
+  content: "\ebbe";
+}
+.isax-bold-profile-2user:before {
+  content: "\ebbf";
+}
+.isax-bold-profile-add:before {
+  content: "\ebc0";
+}
+.isax-bold-profile-circle:before {
+  content: "\ebc1";
+}
+.isax-bold-profile-delete:before {
+  content: "\ebc2";
+}
+.isax-bold-profile-remove:before {
+  content: "\ebc3";
+}
+.isax-bold-profile-tick:before {
+  content: "\ebc4";
+}
+.isax-bold-programming-arrow:before {
+  content: "\ebc5";
+}
+.isax-bold-programming-arrows:before {
+  content: "\ebc6";
+}
+.isax-bold-python:before {
+  content: "\ebc7";
+}
+.isax-bold-quant-qnt:before {
+  content: "\ebc8";
+}
+.isax-bold-quote-down:before {
+  content: "\ebc9";
+}
+.isax-bold-quote-down-circle:before {
+  content: "\ebca";
+}
+.isax-bold-quote-down-square:before {
+  content: "\ebcb";
+}
+.isax-bold-quote-up:before {
+  content: "\ebcc";
+}
+.isax-bold-quote-up-circle:before {
+  content: "\ebcd";
+}
+.isax-bold-quote-up-square:before {
+  content: "\ebce";
+}
+.isax-bold-radar:before {
+  content: "\ebcf";
+}
+.isax-bold-radar-1:before {
+  content: "\ebd0";
+}
+.isax-bold-radar-2:before {
+  content: "\ebd1";
+}
+.isax-bold-radio:before {
+  content: "\ebd2";
+}
+.isax-bold-ram:before {
+  content: "\ebd3";
+}
+.isax-bold-ram-2:before {
+  content: "\ebd4";
+}
+.isax-bold-ranking:before {
+  content: "\ebd5";
+}
+.isax-bold-ranking-1:before {
+  content: "\ebd6";
+}
+.isax-bold-receipt:before {
+  content: "\ebd7";
+}
+.isax-bold-receipt-1:before {
+  content: "\ebd8";
+}
+.isax-bold-receipt-2:before {
+  content: "\ebd9";
+}
+.isax-bold-receipt-2-1:before {
+  content: "\ebda";
+}
+.isax-bold-receipt-add:before {
+  content: "\ebdb";
+}
+.isax-bold-receipt-discount:before {
+  content: "\ebdc";
+}
+.isax-bold-receipt-disscount:before {
+  content: "\ebdd";
+}
+.isax-bold-receipt-edit:before {
+  content: "\ebde";
+}
+.isax-bold-receipt-item:before {
+  content: "\ebdf";
+}
+.isax-bold-receipt-minus:before {
+  content: "\ebe0";
+}
+.isax-bold-receipt-search:before {
+  content: "\ebe1";
+}
+.isax-bold-receipt-square:before {
+  content: "\ebe2";
+}
+.isax-bold-receipt-text:before {
+  content: "\ebe3";
+}
+.isax-bold-received:before {
+  content: "\ebe4";
+}
+.isax-bold-receive-square:before {
+  content: "\ebe5";
+}
+.isax-bold-receive-square-2:before {
+  content: "\ebe6";
+}
+.isax-bold-record:before {
+  content: "\ebe7";
+}
+.isax-bold-record-circle:before {
+  content: "\ebe8";
+}
+.isax-bold-recovery-convert:before {
+  content: "\ebe9";
+}
+.isax-bold-redo:before {
+  content: "\ebea";
+}
+.isax-bold-refresh:before {
+  content: "\ebeb";
+}
+.isax-bold-refresh-2:before {
+  content: "\ebec";
+}
+.isax-bold-refresh-circle:before {
+  content: "\ebed";
+}
+.isax-bold-refresh-left-square:before {
+  content: "\ebee";
+}
+.isax-bold-refresh-right-square:before {
+  content: "\ebef";
+}
+.isax-bold-refresh-square-2:before {
+  content: "\ebf0";
+}
+.isax-bold-repeat:before {
+  content: "\ebf1";
+}
+.isax-bold-repeat-circle:before {
+  content: "\ebf2";
+}
+.isax-bold-repeate-music:before {
+  content: "\ebf3";
+}
+.isax-bold-repeate-one:before {
+  content: "\ebf4";
+}
+.isax-bold-reserve:before {
+  content: "\ebf5";
+}
+.isax-bold-rotate-left:before {
+  content: "\ebf6";
+}
+.isax-bold-rotate-left-1:before {
+  content: "\ebf7";
+}
+.isax-bold-rotate-right:before {
+  content: "\ebf8";
+}
+.isax-bold-rotate-right-1:before {
+  content: "\ebf9";
+}
+.isax-bold-route-square:before {
+  content: "\ebfa";
+}
+.isax-bold-routing:before {
+  content: "\ebfb";
+}
+.isax-bold-routing-2:before {
+  content: "\ebfc";
+}
+.isax-bold-row-horizontal:before {
+  content: "\ebfd";
+}
+.isax-bold-row-vertical:before {
+  content: "\ebfe";
+}
+.isax-bold-rulerpen:before {
+  content: "\ebff";
+}
+.isax-bold-ruler:before {
+  content: "\ec00";
+}
+.isax-bold-safe-home:before {
+  content: "\ec01";
+}
+.isax-bold-sagittarius:before {
+  content: "\ec02";
+}
+.isax-bold-save-2:before {
+  content: "\ec03";
+}
+.isax-bold-save-add:before {
+  content: "\ec04";
+}
+.isax-bold-save-minus:before {
+  content: "\ec05";
+}
+.isax-bold-save-remove:before {
+  content: "\ec06";
+}
+.isax-bold-scan:before {
+  content: "\ec07";
+}
+.isax-bold-scan-barcode:before {
+  content: "\ec08";
+}
+.isax-bold-scanner:before {
+  content: "\ec09";
+}
+.isax-bold-scanning:before {
+  content: "\ec0a";
+}
+.isax-bold-scissor:before {
+  content: "\ec0b";
+}
+.isax-bold-scissor-1:before {
+  content: "\ec0c";
+}
+.isax-bold-screenmirroring:before {
+  content: "\ec0d";
+}
+.isax-bold-scroll:before {
+  content: "\ec0e";
+}
+.isax-bold-search-favorite:before {
+  content: "\ec0f";
+}
+.isax-bold-search-favorite-1:before {
+  content: "\ec10";
+}
+.isax-bold-search-normal:before {
+  content: "\ec11";
+}
+.isax-bold-search-normal-1:before {
+  content: "\ec12";
+}
+.isax-bold-search-status:before {
+  content: "\ec13";
+}
+.isax-bold-search-status-1:before {
+  content: "\ec14";
+}
+.isax-bold-search-zoom-in:before {
+  content: "\ec15";
+}
+.isax-bold-search-zoom-in-1:before {
+  content: "\ec16";
+}
+.isax-bold-search-zoom-out:before {
+  content: "\ec17";
+}
+.isax-bold-search-zoom-out-1:before {
+  content: "\ec18";
+}
+.isax-bold-security:before {
+  content: "\ec19";
+}
+.isax-bold-security-card:before {
+  content: "\ec1a";
+}
+.isax-bold-security-safe:before {
+  content: "\ec1b";
+}
+.isax-bold-security-time:before {
+  content: "\ec1c";
+}
+.isax-bold-security-user:before {
+  content: "\ec1d";
+}
+.isax-bold-send:before {
+  content: "\ec1e";
+}
+.isax-bold-send-1:before {
+  content: "\ec1f";
+}
+.isax-bold-send-2:before {
+  content: "\ec20";
+}
+.isax-bold-send-sqaure-2:before {
+  content: "\ec21";
+}
+.isax-bold-send-square:before {
+  content: "\ec22";
+}
+.isax-bold-setting:before {
+  content: "\ec23";
+}
+.isax-bold-setting-2:before {
+  content: "\ec24";
+}
+.isax-bold-setting-3:before {
+  content: "\ec25";
+}
+.isax-bold-setting-4:before {
+  content: "\ec26";
+}
+.isax-bold-setting-5:before {
+  content: "\ec27";
+}
+.isax-bold-settings:before {
+  content: "\ec28";
+}
+.isax-bold-shapes:before {
+  content: "\ec29";
+}
+.isax-bold-shapes-1:before {
+  content: "\ec2a";
+}
+.isax-bold-share:before {
+  content: "\ec2b";
+}
+.isax-bold-shield-cross:before {
+  content: "\ec2c";
+}
+.isax-bold-shield-search:before {
+  content: "\ec2d";
+}
+.isax-bold-shield-security:before {
+  content: "\ec2e";
+}
+.isax-bold-shield-slash:before {
+  content: "\ec2f";
+}
+.isax-bold-shield-tick:before {
+  content: "\ec30";
+}
+.isax-bold-ship:before {
+  content: "\ec31";
+}
+.isax-bold-shop:before {
+  content: "\ec32";
+}
+.isax-bold-shop-add:before {
+  content: "\ec33";
+}
+.isax-bold-shopping-bag:before {
+  content: "\ec34";
+}
+.isax-bold-shopping-cart:before {
+  content: "\ec35";
+}
+.isax-bold-shop-remove:before {
+  content: "\ec36";
+}
+.isax-bold-shuffle:before {
+  content: "\ec37";
+}
+.isax-bold-siacoin-sc:before {
+  content: "\ec38";
+}
+.isax-bold-sidebar-bottom:before {
+  content: "\ec39";
+}
+.isax-bold-sidebar-left:before {
+  content: "\ec3a";
+}
+.isax-bold-sidebar-right:before {
+  content: "\ec3b";
+}
+.isax-bold-sidebar-top:before {
+  content: "\ec3c";
+}
+.isax-bold-signpost:before {
+  content: "\ec3d";
+}
+.isax-bold-simcard:before {
+  content: "\ec3e";
+}
+.isax-bold-simcard-1:before {
+  content: "\ec3f";
+}
+.isax-bold-simcard-2:before {
+  content: "\ec40";
+}
+.isax-bold-size:before {
+  content: "\ec41";
+}
+.isax-bold-slack:before {
+  content: "\ec42";
+}
+.isax-bold-slash:before {
+  content: "\ec43";
+}
+.isax-bold-slider:before {
+  content: "\ec44";
+}
+.isax-bold-slider-horizontal:before {
+  content: "\ec45";
+}
+.isax-bold-slider-horizontal-1:before {
+  content: "\ec46";
+}
+.isax-bold-slider-vertical:before {
+  content: "\ec47";
+}
+.isax-bold-slider-vertical-1:before {
+  content: "\ec48";
+}
+.isax-bold-smallcaps:before {
+  content: "\ec49";
+}
+.isax-bold-smart-car:before {
+  content: "\ec4a";
+}
+.isax-bold-smart-home:before {
+  content: "\ec4b";
+}
+.isax-bold-smileys:before {
+  content: "\ec4c";
+}
+.isax-bold-sms:before {
+  content: "\ec4d";
+}
+.isax-bold-sms-edit:before {
+  content: "\ec4e";
+}
+.isax-bold-sms-notification:before {
+  content: "\ec4f";
+}
+.isax-bold-sms-search:before {
+  content: "\ec50";
+}
+.isax-bold-sms-star:before {
+  content: "\ec51";
+}
+.isax-bold-sms-tracking:before {
+  content: "\ec52";
+}
+.isax-bold-snapchat:before {
+  content: "\ec53";
+}
+.isax-bold-solana-sol:before {
+  content: "\ec54";
+}
+.isax-bold-sort:before {
+  content: "\ec55";
+}
+.isax-bold-sound:before {
+  content: "\ec56";
+}
+.isax-bold-speaker:before {
+  content: "\ec57";
+}
+.isax-bold-speedometer:before {
+  content: "\ec58";
+}
+.isax-bold-spotify:before {
+  content: "\ec59";
+}
+.isax-bold-stacks-stx:before {
+  content: "\ec5a";
+}
+.isax-bold-star:before {
+  content: "\ec5b";
+}
+.isax-bold-star-1:before {
+  content: "\ec5c";
+}
+.isax-bold-star-slash:before {
+  content: "\ec5d";
+}
+.isax-bold-status:before {
+  content: "\ec5e";
+}
+.isax-bold-status-up:before {
+  content: "\ec5f";
+}
+.isax-bold-stellar-xlm:before {
+  content: "\ec60";
+}
+.isax-bold-sticker:before {
+  content: "\ec61";
+}
+.isax-bold-stickynote:before {
+  content: "\ec62";
+}
+.isax-bold-stop:before {
+  content: "\ec63";
+}
+.isax-bold-stop-circle:before {
+  content: "\ec64";
+}
+.isax-bold-story:before {
+  content: "\ec65";
+}
+.isax-bold-strongbox:before {
+  content: "\ec66";
+}
+.isax-bold-strongbox-2:before {
+  content: "\ec67";
+}
+.isax-bold-subtitle:before {
+  content: "\ec68";
+}
+.isax-bold-sun:before {
+  content: "\ec69";
+}
+.isax-bold-sun-1:before {
+  content: "\ec6a";
+}
+.isax-bold-sun-fog:before {
+  content: "\ec6b";
+}
+.isax-bold-tag:before {
+  content: "\ec6c";
+}
+.isax-bold-tag-2:before {
+  content: "\ec6d";
+}
+.isax-bold-tag-cross:before {
+  content: "\ec6e";
+}
+.isax-bold-tag-right:before {
+  content: "\ec6f";
+}
+.isax-bold-tag-user:before {
+  content: "\ec70";
+}
+.isax-bold-task:before {
+  content: "\ec71";
+}
+.isax-bold-task-square:before {
+  content: "\ec72";
+}
+.isax-bold-teacher:before {
+  content: "\ec73";
+}
+.isax-bold-tenx-pay:before {
+  content: "\ec74";
+}
+.isax-bold-tether-usdt:before {
+  content: "\ec75";
+}
+.isax-bold-text:before {
+  content: "\ec76";
+}
+.isax-bold-textalign-center:before {
+  content: "\ec77";
+}
+.isax-bold-textalign-justifycenter:before {
+  content: "\ec78";
+}
+.isax-bold-textalign-justifyleft:before {
+  content: "\ec79";
+}
+.isax-bold-textalign-justifyright:before {
+  content: "\ec7a";
+}
+.isax-bold-textalign-left:before {
+  content: "\ec7b";
+}
+.isax-bold-textalign-right:before {
+  content: "\ec7c";
+}
+.isax-bold-text-block:before {
+  content: "\ec7d";
+}
+.isax-bold-text-bold:before {
+  content: "\ec7e";
+}
+.isax-bold-text-italic:before {
+  content: "\ec7f";
+}
+.isax-bold-text-underline:before {
+  content: "\ec80";
+}
+.isax-bold-the-graph-grt:before {
+  content: "\ec81";
+}
+.isax-bold-theta-theta:before {
+  content: "\ec82";
+}
+.isax-bold-thorchain-rune:before {
+  content: "\ec83";
+}
+.isax-bold-tick-circle:before {
+  content: "\ec84";
+}
+.isax-bold-ticket:before {
+  content: "\ec85";
+}
+.isax-bold-ticket-2:before {
+  content: "\ec86";
+}
+.isax-bold-ticket-discount:before {
+  content: "\ec87";
+}
+.isax-bold-ticket-expired:before {
+  content: "\ec88";
+}
+.isax-bold-ticket-star:before {
+  content: "\ec89";
+}
+.isax-bold-tick-square:before {
+  content: "\ec8a";
+}
+.isax-bold-timer:before {
+  content: "\ec8b";
+}
+.isax-bold-timer-1:before {
+  content: "\ec8c";
+}
+.isax-bold-timer-pause:before {
+  content: "\ec8d";
+}
+.isax-bold-timer-start:before {
+  content: "\ec8e";
+}
+.isax-bold-toggle-off:before {
+  content: "\ec8f";
+}
+.isax-bold-toggle-off-circle:before {
+  content: "\ec90";
+}
+.isax-bold-toggle-on:before {
+  content: "\ec91";
+}
+.isax-bold-toggle-on-circle:before {
+  content: "\ec92";
+}
+.isax-bold-trade:before {
+  content: "\ec93";
+}
+.isax-bold-transaction-minus:before {
+  content: "\ec94";
+}
+.isax-bold-translate:before {
+  content: "\ec95";
+}
+.isax-bold-trash:before {
+  content: "\ec96";
+}
+.isax-bold-tree:before {
+  content: "\ec97";
+}
+.isax-bold-trello:before {
+  content: "\ec98";
+}
+.isax-bold-trend-down:before {
+  content: "\ec99";
+}
+.isax-bold-trend-up:before {
+  content: "\ec9a";
+}
+.isax-bold-triangle:before {
+  content: "\ec9b";
+}
+.isax-bold-triangle-crypto:before {
+  content: "\ec9c";
+}
+.isax-bold-trontron-trx:before {
+  content: "\ec9d";
+}
+.isax-bold-truck:before {
+  content: "\ec9e";
+}
+.isax-bold-truck-fast:before {
+  content: "\ec9f";
+}
+.isax-bold-truck-remove:before {
+  content: "\eca0";
+}
+.isax-bold-truck-tick:before {
+  content: "\eca1";
+}
+.isax-bold-truck-time:before {
+  content: "\eca2";
+}
+.isax-bold-trush-square:before {
+  content: "\eca3";
+}
+.isax-bold-twitch:before {
+  content: "\eca4";
+}
+.isax-bold-ui8:before {
+  content: "\eca5";
+}
+.isax-bold-undo:before {
+  content: "\eca6";
+}
+.isax-bold-unlimited:before {
+  content: "\eca7";
+}
+.isax-bold-unlock:before {
+  content: "\eca8";
+}
+.isax-bold-usd-coin-usdc:before {
+  content: "\eca9";
+}
+.isax-bold-user:before {
+  content: "\ecaa";
+}
+.isax-bold-user-add:before {
+  content: "\ecab";
+}
+.isax-bold-user-cirlce-add:before {
+  content: "\ecac";
+}
+.isax-bold-user-edit:before {
+  content: "\ecad";
+}
+.isax-bold-user-minus:before {
+  content: "\ecae";
+}
+.isax-bold-user-octagon:before {
+  content: "\ecaf";
+}
+.isax-bold-user-remove:before {
+  content: "\ecb0";
+}
+.isax-bold-user-search:before {
+  content: "\ecb1";
+}
+.isax-bold-user-square:before {
+  content: "\ecb2";
+}
+.isax-bold-user-tag:before {
+  content: "\ecb3";
+}
+.isax-bold-user-tick:before {
+  content: "\ecb4";
+}
+.isax-bold-velas-vlx:before {
+  content: "\ecb5";
+}
+.isax-bold-verify:before {
+  content: "\ecb6";
+}
+.isax-bold-vibe-vibe:before {
+  content: "\ecb7";
+}
+.isax-bold-video:before {
+  content: "\ecb8";
+}
+.isax-bold-video-add:before {
+  content: "\ecb9";
+}
+.isax-bold-video-circle:before {
+  content: "\ecba";
+}
+.isax-bold-video-horizontal:before {
+  content: "\ecbb";
+}
+.isax-bold-video-octagon:before {
+  content: "\ecbc";
+}
+.isax-bold-video-play:before {
+  content: "\ecbd";
+}
+.isax-bold-video-remove:before {
+  content: "\ecbe";
+}
+.isax-bold-video-slash .path1:before {
+  content: "\ecbf";
+  color: rgb(41, 45, 50);
+  opacity: 0.4;
+}
+.isax-bold-video-slash .path2:before {
+  content: "\ecc0";
+  margin-left: -1em;
+  color: rgb(41, 45, 50);
+}
+.isax-bold-video-slash .path3:before {
+  content: "\ecc1";
+  margin-left: -1em;
+  color: rgb(41, 45, 50);
+}
+.isax-bold-video-slash .path4:before {
+  content: "\ecc2";
+  margin-left: -1em;
+  color: rgb(41, 45, 50);
+}
+.isax-bold-video-square:before {
+  content: "\ecc3";
+}
+.isax-bold-video-tick:before {
+  content: "\ecc4";
+}
+.isax-bold-video-time:before {
+  content: "\ecc5";
+}
+.isax-bold-video-vertical:before {
+  content: "\ecc6";
+}
+.isax-bold-voice-cricle:before {
+  content: "\ecc7";
+}
+.isax-bold-voice-square:before {
+  content: "\ecc8";
+}
+.isax-bold-volume-cross:before {
+  content: "\ecc9";
+}
+.isax-bold-volume-high:before {
+  content: "\ecca";
+}
+.isax-bold-volume-low:before {
+  content: "\eccb";
+}
+.isax-bold-volume-low-1:before {
+  content: "\eccc";
+}
+.isax-bold-volume-mute:before {
+  content: "\eccd";
+}
+.isax-bold-volume-slash:before {
+  content: "\ecce";
+}
+.isax-bold-volume-up:before {
+  content: "\eccf";
+}
+.isax-bold-vuesax:before {
+  content: "\ecd0";
+}
+.isax-bold-wallet:before {
+  content: "\ecd1";
+}
+.isax-bold-wallet-1:before {
+  content: "\ecd2";
+}
+.isax-bold-wallet-2:before {
+  content: "\ecd3";
+}
+.isax-bold-wallet-3:before {
+  content: "\ecd4";
+}
+.isax-bold-wallet-add:before {
+  content: "\ecd5";
+}
+.isax-bold-wallet-add-1:before {
+  content: "\ecd6";
+}
+.isax-bold-wallet-check:before {
+  content: "\ecd7";
+}
+.isax-bold-wallet-minus:before {
+  content: "\ecd8";
+}
+.isax-bold-wallet-money:before {
+  content: "\ecd9";
+}
+.isax-bold-wallet-remove:before {
+  content: "\ecda";
+}
+.isax-bold-wallet-search:before {
+  content: "\ecdb";
+}
+.isax-bold-wanchain-wan:before {
+  content: "\ecdc";
+}
+.isax-bold-wanchain-wan-1:before {
+  content: "\ecdd";
+}
+.isax-bold-warning-2:before {
+  content: "\ecde";
+}
+.isax-bold-watch:before {
+  content: "\ecdf";
+}
+.isax-bold-watch-status:before {
+  content: "\ece0";
+}
+.isax-bold-weight:before {
+  content: "\ece1";
+}
+.isax-bold-weight-1:before {
+  content: "\ece2";
+}
+.isax-bold-whatsapp:before {
+  content: "\ece3";
+}
+.isax-bold-wifi:before {
+  content: "\ece4";
+}
+.isax-bold-wifi-square:before {
+  content: "\ece5";
+}
+.isax-bold-wind:before {
+  content: "\ece6";
+}
+.isax-bold-wind-2:before {
+  content: "\ece7";
+}
+.isax-bold-windows:before {
+  content: "\ece8";
+}
+.isax-bold-wing-wing:before {
+  content: "\ece9";
+}
+.isax-bold-woman:before {
+  content: "\ecea";
+}
+.isax-bold-xd:before {
+  content: "\eceb";
+}
+.isax-bold-xiaomi:before {
+  content: "\ecec";
+}
+.isax-bold-xrp-xrp:before {
+  content: "\eced";
+}
+.isax-bold-youtube:before {
+  content: "\ecee";
+}
+.isax-bold-zel-zel:before {
+  content: "\ecef";
+}
+.isax-bold-zoom:before {
+  content: "\ecf0";
+}
diff --git a/app/assets/plugins/bootstrap/bootstrap-grid.min.css b/app/assets/plugins/bootstrap/bootstrap-grid.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..e0922219988c91cd5218383d1f6485be7e0869b4
--- /dev/null
+++ b/app/assets/plugins/bootstrap/bootstrap-grid.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap Grid v5.0.2 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}
+/*# sourceMappingURL=bootstrap-grid.min.css.map */
\ No newline at end of file
diff --git a/app/assets/plugins/bootstrap/bootstrap-utilities.min.css b/app/assets/plugins/bootstrap/bootstrap-utilities.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..bd71a55c531ccc3f09b95d311b2ed369fb593927
--- /dev/null
+++ b/app/assets/plugins/bootstrap/bootstrap-utilities.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap Utilities v5.0.2 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}
+/*# sourceMappingURL=bootstrap-utilities.min.css.map */
\ No newline at end of file
diff --git a/app/babel.config.js b/app/babel.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..a16fff7ccba1a3218e72b19a8b9230dd62d6a333
--- /dev/null
+++ b/app/babel.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+  presets: [
+    '@babel/preset-env',
+    '@vue/cli-plugin-babel/preset'
+  ]
+}
diff --git a/app/favicon.ico b/app/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..8939fc850569e98ed0c8489ae3e116e1d9987674
Binary files /dev/null and b/app/favicon.ico differ
diff --git a/app/gulpfile.js b/app/gulpfile.js
new file mode 100644
index 0000000000000000000000000000000000000000..98911857e7f403cfec1aa7e897ea733a5672a812
--- /dev/null
+++ b/app/gulpfile.js
@@ -0,0 +1,149 @@
+const path = require('path')
+const fs = require('fs')
+const gulp = require('gulp')
+// const readlineSync = require('readline-sync')
+const fsExtra = require('fs-extra')
+
+let objToWrite = {}
+let paths = {
+  langFolder: path.join(__dirname, 'src/lang/'),
+  srcFolder: path.join(__dirname, 'src/')
+}
+
+gulp.task('geni18n', function (done) {
+  // let projPath = readlineSync.question("Please enter project path (path of 'src' folder)  ")
+  // projPath = projPath + '/'
+  let projPath = paths.srcFolder
+  readPrevi18n()
+  backUpI18nFile(projPath)
+  i18nGenerator(projPath, ['en'], 'en')
+  done()
+})
+
+function backUpI18nFile (projPath) {
+  let d = new Date()
+  let dformat = [paddingZero(d.getDate()), paddingZero(d.getMonth() + 1),
+    paddingZero(d.getFullYear())].join('_') + '_' +
+    [paddingZero(d.getHours()),
+      paddingZero(d.getMinutes()),
+      paddingZero(d.getSeconds()), paddingZero(d.getMilliseconds())].join('_')
+  let backUpFolderPath = paths.langFolder + 'backup'
+  let backUpFilePath = backUpFolderPath + '/en_' + dformat + '.json'
+  try {
+    fsExtra.ensureDirSync(backUpFolderPath)
+  } catch (error) {
+    console.log('Cannot create backup folder...')
+  }
+  let enFilePath = paths.langFolder + 'en.json'
+  let content = fs.readFileSync(enFilePath, 'utf8')
+  fs.writeFileSync(backUpFilePath, JSON.parse(JSON.stringify(content)))
+}
+
+function paddingZero (number) {
+  if (number <= 9) {
+    let temp = '0' + number.toString()
+    return temp
+  }
+  return number.toString()
+}
+
+function createDvJson (projPath, objToWrite) {
+  for (let key in objToWrite) {
+    if (typeof objToWrite[key] === 'object') {
+      let temp = objToWrite[key]
+      for (let newKey in temp) {
+        if (temp.hasOwnProperty(newKey)) {
+          temp[newKey] = newKey
+        }
+      }
+    }
+  }
+  let dvFilePath = paths.langFolder + 'dv.json'
+  fs.writeFileSync(dvFilePath, JSON.stringify(objToWrite))
+}
+
+function readPrevi18n () {
+  let enFilePath = paths.langFolder + 'en.json'
+  try {
+    fs.accessSync(enFilePath, fs.R_OK | fs.W_OK)
+    let content = fs.readFileSync(enFilePath, 'utf8')
+    objToWrite = JSON.parse(content)
+  } catch (e) {
+    console.log('en.json file is missing...')
+    fsExtra.ensureFileSync(enFilePath)
+    console.log('Created en.json file...')
+    objToWrite = {}
+  }
+}
+
+function i18nGenerator (projPath, langArray, defaultLanguage) {
+  let fileList = walkSync(projPath)
+  let flag = 0
+  let i
+  let len = fileList.length
+  let regexString = `([$]t[(]('|")##(.+?)##)(\\s*\\s*)(@@([\\s\\S]*?)@@('|")[)])`
+  let regex = new RegExp(regexString, 'gi')
+
+  if (fileList != null && fileList !== undefined && fileList.length > 0) {
+    for (i = 0; i < fileList.length; i++) {
+      flag++
+      if (flag === len) {
+        let fileList = walkSync(projPath)
+        let i; let len = fileList.length
+        if (fileList !== null && fileList !== undefined && fileList.length > 0) {
+          for (i = 0; i < len; i++) {
+            let file = fileList[i]
+            let keyPrefix = path.basename(file).split('.')[0]
+            let content = fs.readFileSync(file, 'utf8')
+            let i18nContentsToBeReplaced = content.match(regex)
+            let translatedAdded = content
+            if (i18nContentsToBeReplaced != null && i18nContentsToBeReplaced !== '' && i18nContentsToBeReplaced !== undefined && i18nContentsToBeReplaced.length > 0) {
+              for (let j = 0; j < i18nContentsToBeReplaced.length; j++) {
+                let extractKeyFrom = i18nContentsToBeReplaced[j].toString()
+                let key = extractKeyFrom.substring(extractKeyFrom.indexOf('##') + 2, extractKeyFrom.lastIndexOf('##')).trim()
+                let value = extractKeyFrom.substring(extractKeyFrom.indexOf('@@') + 2, extractKeyFrom.lastIndexOf('@@')).trim()
+                // let replacement = "{{'" + key + "' | translate}}";
+                let replacement = "$t('" + keyPrefix + '.' + key + "')"
+                // console.log('keyPrefix + key', keyPrefix, key)
+                translatedAdded = translatedAdded.replace(extractKeyFrom, replacement)
+                prepareI18nObject(keyPrefix, key, value)
+              }
+              fs.writeFileSync(file, translatedAdded)
+            }
+            if (i === (len - 1)) {
+              console.log('\n\n')
+              console.log('Internationalization successfully done on ' + (i + 1) + ' files')
+              console.log('\n\n')
+              let enFilePath = paths.langFolder + 'en.json'
+              fs.writeFileSync(enFilePath, JSON.stringify(objToWrite))
+              createDvJson(projPath, objToWrite)
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+let walkSync = function (dir, filelist) {
+  let files = fs.readdirSync(dir)
+  filelist = filelist || []
+  files.forEach(function (file) {
+    if (fs.statSync(dir + file).isDirectory()) {
+      filelist = walkSync(dir + file + '/', filelist)
+    } else {
+      if (path.extname(file) === '.vue') {
+        filelist.push(dir + file)
+      }
+    }
+  })
+  return filelist
+}
+
+function prepareI18nObject (keyPrefix, key, value) {
+  if (!objToWrite.hasOwnProperty(keyPrefix)) {
+    objToWrite[keyPrefix] = {}
+  }
+  let parentObj = objToWrite[keyPrefix]
+  parentObj[key] = value
+}
diff --git a/app/img/icons/android-icon-144x144.png b/app/img/icons/android-icon-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..d847ba9c695d74bb4deebeabc87bea0561b6113c
Binary files /dev/null and b/app/img/icons/android-icon-144x144.png differ
diff --git a/app/img/icons/android-icon-192x192.png b/app/img/icons/android-icon-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..6536205b1da4c612bff91e3e88eb792748cd67c4
Binary files /dev/null and b/app/img/icons/android-icon-192x192.png differ
diff --git a/app/img/icons/android-icon-36x36.png b/app/img/icons/android-icon-36x36.png
new file mode 100644
index 0000000000000000000000000000000000000000..921624faf1e19289acaec61fda3f2f1e34648490
Binary files /dev/null and b/app/img/icons/android-icon-36x36.png differ
diff --git a/app/img/icons/android-icon-48x48.png b/app/img/icons/android-icon-48x48.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4a4855e713f5cfc39d2f9e6a9ea0d85916104e0
Binary files /dev/null and b/app/img/icons/android-icon-48x48.png differ
diff --git a/app/img/icons/android-icon-72x72.png b/app/img/icons/android-icon-72x72.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f76cf2cf791aa68b758677f5615422539969553
Binary files /dev/null and b/app/img/icons/android-icon-72x72.png differ
diff --git a/app/img/icons/android-icon-96x96.png b/app/img/icons/android-icon-96x96.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6abfa1517f558c745363424da08f41ab7a0e931
Binary files /dev/null and b/app/img/icons/android-icon-96x96.png differ
diff --git a/app/img/icons/apple-icon-114x114.png b/app/img/icons/apple-icon-114x114.png
new file mode 100644
index 0000000000000000000000000000000000000000..8cef596dfae46a8df123635acaac7d02ffeeba34
Binary files /dev/null and b/app/img/icons/apple-icon-114x114.png differ
diff --git a/app/img/icons/apple-icon-120x120.png b/app/img/icons/apple-icon-120x120.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c44f22d0d70e4383a6ebfe074cf5eb6c4be64f6
Binary files /dev/null and b/app/img/icons/apple-icon-120x120.png differ
diff --git a/app/img/icons/apple-icon-144x144.png b/app/img/icons/apple-icon-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..d847ba9c695d74bb4deebeabc87bea0561b6113c
Binary files /dev/null and b/app/img/icons/apple-icon-144x144.png differ
diff --git a/app/img/icons/apple-icon-152x152.png b/app/img/icons/apple-icon-152x152.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca1b6808a3cae4d3a49eca1235c2888f99f48dfe
Binary files /dev/null and b/app/img/icons/apple-icon-152x152.png differ
diff --git a/app/img/icons/apple-icon-180x180.png b/app/img/icons/apple-icon-180x180.png
new file mode 100644
index 0000000000000000000000000000000000000000..902836042ecfc8c74b7a3a2f51212c75e61d6f4f
Binary files /dev/null and b/app/img/icons/apple-icon-180x180.png differ
diff --git a/app/img/icons/apple-icon-57x57.png b/app/img/icons/apple-icon-57x57.png
new file mode 100644
index 0000000000000000000000000000000000000000..910d55410aa1b663bdf60c5992826f4e99fd4320
Binary files /dev/null and b/app/img/icons/apple-icon-57x57.png differ
diff --git a/app/img/icons/apple-icon-60x60.png b/app/img/icons/apple-icon-60x60.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cd3950bf2bd8367ac06dcf860b76580b447f2fd
Binary files /dev/null and b/app/img/icons/apple-icon-60x60.png differ
diff --git a/app/img/icons/apple-icon-72x72.png b/app/img/icons/apple-icon-72x72.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f76cf2cf791aa68b758677f5615422539969553
Binary files /dev/null and b/app/img/icons/apple-icon-72x72.png differ
diff --git a/app/img/icons/apple-icon-76x76.png b/app/img/icons/apple-icon-76x76.png
new file mode 100644
index 0000000000000000000000000000000000000000..495afd8e5a6a123c9ecc4df9a535581c81495fac
Binary files /dev/null and b/app/img/icons/apple-icon-76x76.png differ
diff --git a/app/img/icons/apple-icon-precomposed.png b/app/img/icons/apple-icon-precomposed.png
new file mode 100644
index 0000000000000000000000000000000000000000..3de117800f7e844ae32ee4b8187cef69565c9790
Binary files /dev/null and b/app/img/icons/apple-icon-precomposed.png differ
diff --git a/app/img/icons/apple-icon.png b/app/img/icons/apple-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3de117800f7e844ae32ee4b8187cef69565c9790
Binary files /dev/null and b/app/img/icons/apple-icon.png differ
diff --git a/app/img/icons/favicon-16x16.png b/app/img/icons/favicon-16x16.png
new file mode 100644
index 0000000000000000000000000000000000000000..775fdb7a5a87bb24e5d347b801a00af46c44b0a8
Binary files /dev/null and b/app/img/icons/favicon-16x16.png differ
diff --git a/app/img/icons/favicon-32x32.png b/app/img/icons/favicon-32x32.png
new file mode 100644
index 0000000000000000000000000000000000000000..7757820c7c6535cffcf17197c4fb0e5c1243e44b
Binary files /dev/null and b/app/img/icons/favicon-32x32.png differ
diff --git a/app/img/icons/favicon-96x96.png b/app/img/icons/favicon-96x96.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6abfa1517f558c745363424da08f41ab7a0e931
Binary files /dev/null and b/app/img/icons/favicon-96x96.png differ
diff --git a/app/img/icons/favicon.ico b/app/img/icons/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..8939fc850569e98ed0c8489ae3e116e1d9987674
Binary files /dev/null and b/app/img/icons/favicon.ico differ
diff --git a/app/img/icons/ms-icon-144x144.png b/app/img/icons/ms-icon-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..d847ba9c695d74bb4deebeabc87bea0561b6113c
Binary files /dev/null and b/app/img/icons/ms-icon-144x144.png differ
diff --git a/app/img/icons/ms-icon-150x150.png b/app/img/icons/ms-icon-150x150.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc35e8964686644474140d608a4ae4e5d28f9af4
Binary files /dev/null and b/app/img/icons/ms-icon-150x150.png differ
diff --git a/app/img/icons/ms-icon-310x310.png b/app/img/icons/ms-icon-310x310.png
new file mode 100644
index 0000000000000000000000000000000000000000..22488404e4c5401ed7be4e1a54f6da79aee8e5bc
Binary files /dev/null and b/app/img/icons/ms-icon-310x310.png differ
diff --git a/app/img/icons/ms-icon-70x70.png b/app/img/icons/ms-icon-70x70.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b53808f91a86cc7f16de54f5b9f354c611535f9
Binary files /dev/null and b/app/img/icons/ms-icon-70x70.png differ
diff --git a/app/index.html b/app/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..6e831e8ffb4a7c7cb587d2359694d9c8a9b6be24
--- /dev/null
+++ b/app/index.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
+    <link rel="shortcut icon" href="/favicon.ico?v=gAdelrOOOm" />
+    <link
+      href="https://fonts.googleapis.com/icon?family=Material+Icons"
+      rel="stylesheet"
+    />
+    <link
+      href="https://fonts.googleapis.com/icon?family=Material+Icons"
+      rel="stylesheet"
+    />
+    <title>GoFullStack</title>
+    <style>
+      @font-face {
+        font-family: "DM Sans";
+        font-style: normal;
+        font-weight: 400;
+        src: url("./assets/fonts/dm.woff2") format("woff2");
+      }
+
+      @font-face {
+        font-family: "DM Sans";
+        font-style: normal;
+        font-weight: 500;
+        src: url("./assets/fonts/dm-500.woff2") format("woff2");
+      }
+
+      @font-face {
+        font-family: "DM Sans";
+        font-style: normal;
+        font-weight: 700;
+        src: url("./assets/fonts/dm-700.woff2") format("woff2");
+      }
+    </style>
+  </head>
+  <body>
+    <noscript>
+      <strong
+        >We're sorry but template2 doesn't work properly without JavaScript
+        enabled. Please enable it to continue.</strong
+      >
+    </noscript>
+    <div id="app"></div>
+    <script type="module" src="/src/main.js"></script>
+    <!-- built files will be auto injected -->
+  </body>
+</html>
diff --git a/app/jest.config.js b/app/jest.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..40186da6af8b331e3db8b00ff610e3460f7086c6
--- /dev/null
+++ b/app/jest.config.js
@@ -0,0 +1,22 @@
+module.exports = {
+  moduleFileExtensions: [
+    'js',
+    'jsx',
+    'json',
+    'vue'
+  ],
+  transform: {
+    '^.+\\.vue$': 'vue-jest',
+    '.+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
+    '^.+\\.jsx?$': 'babel-jest'
+  },
+  moduleNameMapper: {
+    '^@/(.*)$': '<rootDir>/src/$1'
+  },
+  snapshotSerializers: [
+    'jest-serializer-vue'
+  ],
+  testMatch: [
+    '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
+  ]
+}
diff --git a/app/package.json b/app/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..3fb4eab0e7d42e60f3f714313c2d4acd8068a7b7
--- /dev/null
+++ b/app/package.json
@@ -0,0 +1,81 @@
+{
+  "name": "app",
+  "version": "1.0.1",
+  "private": true,
+  "scripts": {
+    "serve": "vite",
+    "build": "vite build",
+    "geni18n": "gulp geni18n"
+  },
+  "dependencies": {
+    "@formkit/icons": "^0.17.2",
+    "@formkit/vue": "^0.17.2",
+    "@meforma/vue-toaster": "^1.2.2",
+    "@popperjs/core": "^2.11.6",
+    "@vueform/multiselect": "^2.6.2",
+    "@vuepic/vue-datepicker": "^5.1.2",
+    "axios": "^0.21.1",
+    "core-js": "^3.24.1",
+    "crypto-js": "^3.1.9-1",
+    "daisyui": "^2.51.6",
+    "fs-extra": "^8.1.0",
+    "material-design-icons": "^3.0.1",
+    "pinia": "^2.1.3",
+    "readline-sync": "^1.4.10",
+    "register-service-worker": "^1.6.2",
+    "sass": "^1.54.4",
+    "sweetalert2": "^11.7.5",
+    "tailwind-scrollbar": "^3.0.4",
+    "vee-validate": "^4.5.4",
+    "vue": "^3.3.1",
+    "vue-i18n": "^9.2.0-beta.15",
+    "vue-json-viewer": "^3.0.4",
+    "vue-meta": "^3.0.0-alpha.9",
+    "vue-router": "^4.0.12",
+    "vue3-clipboard": "^1.0.0",
+    "vue3-confirm-dialog": "^0.1.1",
+    "vuex": "^4.0.0-alpha.1",
+    "vuex-persistedstate": "^4.1.0",
+    "yup": "^0.32.11"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-vue": "^4.2.3",
+    "@vue/cli-plugin-babel": "^5.0.8",
+    "@vue/cli-plugin-e2e-nightwatch": "^5.0.8",
+    "@vue/cli-plugin-pwa": "^5.0.8",
+    "@vue/cli-plugin-unit-jest": "^5.0.8",
+    "@vue/cli-service": "^5.0.8",
+    "@vue/compiler-sfc": "^3.0.0-beta.1",
+    "@vue/eslint-config-standard": "^4.0.0",
+    "@vue/test-utils": "^2.0.0-alpha.1",
+    "autoprefixer": "^10.4.14",
+    "babel-core": "7.0.0-bridge.0",
+    "babel-eslint": "^10.0.1",
+    "babel-jest": "^29.1.2",
+    "compression-webpack-plugin": "^10.0.0",
+    "eslint": "^7.32.0",
+    "eslint-plugin-vue": "^7.2.2",
+    "gulp": "^4.0.2",
+    "gulp-cli": "^2.2.0",
+    "node-sass": "^8.0.0",
+    "postcss": "^8.4.23",
+    "sass-loader": "^10.2.0",
+    "tailwindcss": "^3.3.2",
+    "vite": "^4.3.5",
+    "vite-plugin-compression": "^0.5.1",
+    "vite-plugin-eslint": "1.8.1",
+    "vite-plugin-linter": "^1.2.0",
+    "vite-plugin-require": "0.0.8",
+    "vite-plugin-vue-devtools": "0.0.20"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ],
+  "overrides": {
+    "glob-parent": "6.0.2",
+    "chokidar": "3.5.3"
+  },
+  "type": "module"
+}
diff --git a/app/postcss.config.js b/app/postcss.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..fbe14a4c98ae1e88685c21b79c95250d724fd43f
--- /dev/null
+++ b/app/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+};
\ No newline at end of file
diff --git a/app/robots.txt b/app/robots.txt
new file mode 100644
index 0000000000000000000000000000000000000000..eb0536286f3081c6c0646817037faf5446e3547d
--- /dev/null
+++ b/app/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/app/src/App.vue b/app/src/App.vue
new file mode 100644
index 0000000000000000000000000000000000000000..dc605cf0365db1294bdace73c10d87dde08fef78
--- /dev/null
+++ b/app/src/App.vue
@@ -0,0 +1,70 @@
+<template>
+	<div id="app">
+		<div id="app-loader" v-if="mainStore.isPageBlocked">
+			<div class="bg-gray-200 w-full min-h-screen flex justify-center items-center">
+				<div class="flex min-h-screen w-full items-center justify-center bg-gray-200">
+					<div
+						class="flex h-14 w-14 items-center justify-center rounded-full bg-gradient-to-tr from-indigo-500 to-pink-500 animate-spin"
+					>
+						<div class="h-9 w-9 rounded-full bg-gray-200"></div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div class="wrapper">
+			<router-view :key="$route.fullPath" />
+		</div>
+		<Toast></Toast>
+		<ConfirmDialog></ConfirmDialog>
+		<Footer></Footer>
+	</div>
+</template>
+
+<script>
+	import { useMeta } from "vue-meta"
+	import Footer from "./components/common/Footer.vue"
+	import { main } from './store/index'
+
+	export default {
+		name: "App",
+		components: {
+			Footer,
+		},
+		data() {
+			return {}
+		},
+		setup() {
+			useMeta({
+				title: "",
+				htmlAttrs: { lang: "en", amp: true },
+			})
+			const mainStore = main()
+			return {mainStore}
+		},
+		metaInfo: {
+			meta: [
+				{
+					vmid: "description",
+					name: "description",
+					content: "Test title",
+					template: (chunk) => `${chunk} - FullStack`,
+				},
+			],
+		},
+	}
+</script>
+
+<style lang="scss">
+	#app-loader {
+		position: absolute;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		left: 0;
+		background: rgba(255, 255, 255, 0.8);
+		z-index: 2000;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+</style>
diff --git a/app/src/assets/logo.png b/app/src/assets/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43
Binary files /dev/null and b/app/src/assets/logo.png differ
diff --git a/app/src/assets/logo_mkcl.svg b/app/src/assets/logo_mkcl.svg
new file mode 100644
index 0000000000000000000000000000000000000000..726616f9bf2609c95975725a2b9a6df5332101c0
--- /dev/null
+++ b/app/src/assets/logo_mkcl.svg
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Creator: CorelDRAW X6 -->
+<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="8in" height="6in" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
+viewBox="0 0 8000 6000"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+  <style type="text/css">
+   <![CDATA[
+    .str0 {stroke:#848688;stroke-width:3}
+    .fil11 {fill:none;fill-rule:nonzero}
+    .fil7 {fill:#96989A}
+    .fil5 {fill:#C7C9CB}
+    .fil13 {fill:#F37435}
+    .fil12 {fill:#FFCC29}
+    .fil6 {fill:#FEFEFE}
+    .fil8 {fill:#848587;fill-rule:nonzero}
+    .fil10 {fill:#848688;fill-rule:nonzero}
+    .fil4 {fill:#373435;fill-rule:nonzero}
+    .fil14 {fill:#F58634;fill-rule:nonzero}
+    .fil9 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil2 {fill:url(#id0)}
+    .fil1 {fill:url(#id1)}
+    .fil3 {fill:url(#id2)}
+    .fil0 {fill:url(#id3)}
+   ]]>
+  </style>
+  <linearGradient id="id0" gradientUnits="userSpaceOnUse" x1="7065.15" y1="1389.45" x2="7236.49" y2="1218.11">
+   <stop offset="0" style="stop-color:#64B074"/>
+   <stop offset="1" style="stop-color:#98BD26"/>
+  </linearGradient>
+  <linearGradient id="id1" gradientUnits="userSpaceOnUse" x1="6440.12" y1="1620.81" x2="6735.08" y2="1325.85">
+   <stop offset="0" style="stop-color:#209CBA"/>
+   <stop offset="1" style="stop-color:#1B7387"/>
+  </linearGradient>
+  <linearGradient id="id2" gradientUnits="userSpaceOnUse" xlink:href="#id1" x1="6531.31" y1="1216.64" x2="6797" y2="950.957">
+  </linearGradient>
+  <linearGradient id="id3" gradientUnits="userSpaceOnUse" xlink:href="#id1" x1="7060.18" y1="1834.44" x2="7194.5" y2="1700.12">
+  </linearGradient>
+ </defs>
+<symbol id="Symbol6" viewBox="7060 1701 129 131">
+ <path class="fil0" d="M7151 1701l-54 0c-35,0 -37,37 -37,37l0 52c0,44 39,42 39,42l47 0c49,0 42,-47 42,-47l0 -44c0,-39 -37,-39 -37,-39z"/>
+</symbol>
+<symbol id="Symbol2" viewBox="7060 1701 129 131">
+ <path class="fil0" d="M7151 1701l-54 0c-35,0 -37,37 -37,37l0 52c0,44 39,42 39,42l47 0c49,0 42,-47 42,-47l0 -44c0,-39 -37,-39 -37,-39z"/>
+</symbol>
+<symbol id="Symbol7" viewBox="6456 1336 280 271">
+ <path class="fil1" d="M6736 1507l0 -77c0,-104 -86,-95 -86,-95l-108 9c-104,9 -86,117 -86,117l0 72c-5,86 86,72 86,72l99 -5c86,-9 95,-95 95,-95z"/>
+</symbol>
+<symbol id="Symbol3" viewBox="7064 1219 164 167">
+ <path class="fil2" d="M7181 1219l-69 0c-44,0 -47,47 -47,47l0 66c0,57 50,53 50,53l60 0c63,0 53,-60 53,-60l0 -57c0,-50 -47,-50 -47,-50z"/>
+</symbol>
+<symbol id="Symbol4" viewBox="6546 962 245 244">
+ <path class="fil3" d="M6547 1084c0,0 -18,-113 95,-117l68 -5c0,0 81,-9 81,72l0 63c0,0 9,95 -77,99l-90 9c0,0 -77,9 -77,-59l0 -63z"/>
+</symbol>
+<symbol id="Symbol1" viewBox="6456 1336 280 271">
+ <path class="fil1" d="M6736 1507l0 -77c0,-104 -86,-95 -86,-95l-108 9c-104,9 -86,117 -86,117l0 72c-5,86 86,72 86,72l99 -5c86,-9 95,-95 95,-95z"/>
+</symbol>
+<symbol id="Symbol8" viewBox="6546 962 245 244">
+ <path class="fil3" d="M6547 1084c0,0 -18,-113 95,-117l68 -5c0,0 81,-9 81,72l0 63c0,0 9,95 -77,99l-90 9c0,0 -77,9 -77,-59l0 -63z"/>
+</symbol>
+<symbol id="Symbol5" viewBox="7064 1219 164 167">
+ <path class="fil2" d="M7181 1219l-69 0c-44,0 -47,47 -47,47l0 66c0,57 50,53 50,53l60 0c63,0 53,-60 53,-60l0 -57c0,-50 -47,-50 -47,-50z"/>
+</symbol>
+ <g id="Layer_x0020_1">
+  <metadata id="CorelCorpID_0Corel-Layer"/>
+  <g id="_880697104">
+   <path class="fil4" d="M427 5469l53 16c-12,55 -32,96 -62,123 -29,27 -65,40 -107,40 -37,0 -69,-9 -95,-27 -26,-18 -48,-47 -65,-87 -17,-40 -25,-87 -25,-141 0,-54 8,-99 25,-136 17,-37 39,-65 68,-84 29,-19 61,-28 96,-28 39,0 72,12 100,36 28,24 47,59 58,106l-52 15c-18,-68 -53,-102 -107,-102 -27,0 -50,7 -69,20 -20,14 -35,35 -47,64 -12,29 -17,65 -17,110 0,67 12,117 35,150 24,33 55,50 94,50 29,0 54,-10 75,-31 21,-21 35,-52 42,-93zm112 171l0 -353 44 0 0 54c11,-25 22,-41 31,-49 9,-8 20,-12 32,-12 16,0 33,6 50,19l-17 56c-12,-9 -24,-13 -36,-13 -10,0 -20,4 -29,11 -9,7 -15,17 -18,31 -6,23 -9,47 -9,73l0 185 -49 0zm385 -114l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm463 167c-16,17 -33,30 -51,39 -18,9 -36,13 -55,13 -30,0 -54,-9 -72,-27 -18,-18 -27,-43 -27,-74 0,-20 4,-39 13,-54 8,-16 20,-28 35,-37 15,-9 37,-15 67,-20 40,-6 69,-13 88,-21l0 -15c0,-24 -4,-41 -13,-51 -12,-14 -31,-21 -56,-21 -23,0 -40,5 -51,14 -11,9 -20,27 -25,53l-48 -8c7,-38 21,-66 42,-83 21,-17 51,-26 90,-26 30,0 54,6 72,17 17,11 28,26 33,42 5,17 7,41 7,74l0 80c0,56 1,91 3,106 2,15 6,29 12,42l-51 0c-5,-12 -8,-27 -10,-44zm-4 -134c-18,9 -45,16 -80,23 -21,4 -35,8 -43,12 -8,5 -15,11 -19,19 -5,8 -7,18 -7,29 0,17 5,30 16,40 10,10 25,15 43,15 18,0 34,-5 48,-14 14,-9 25,-21 32,-36 7,-15 11,-37 11,-66l0 -22zm235 124l7 53c-14,4 -26,5 -37,5 -17,0 -31,-3 -41,-10 -10,-7 -18,-16 -21,-28 -4,-12 -6,-35 -6,-70l0 -203 -36 0 0 -47 36 0 0 -88 49 -36 0 123 50 0 0 47 -50 0 0 207c0,19 1,31 4,37 4,8 12,12 24,12 6,0 13,-1 22,-2zm46 -365l0 -69 49 0 0 69 -49 0zm0 419l0 -353 49 0 0 353 -49 0zm124 0l0 -353 44 0 0 50c11,-20 24,-34 39,-44 15,-10 33,-15 53,-15 15,0 30,3 43,9 13,6 24,14 32,24 8,10 14,23 18,38 4,16 6,40 6,73l0 217 -49 0 0 -215c0,-26 -2,-45 -7,-57 -4,-12 -11,-21 -21,-28 -9,-7 -20,-10 -33,-10 -24,0 -42,9 -56,26 -14,17 -21,48 -21,90l0 193 -49 0zm302 29l48 9c2,19 9,33 20,42 11,9 26,14 46,14 22,0 39,-5 51,-15 13,-10 21,-26 26,-46 3,-12 4,-39 4,-79 -11,15 -23,27 -36,35 -13,8 -28,12 -44,12 -35,0 -63,-15 -86,-44 -26,-34 -39,-79 -39,-135 0,-38 6,-71 17,-100 11,-28 27,-49 45,-63 19,-13 40,-20 63,-20 17,0 33,4 47,13 14,8 27,21 37,38l0 -43 45 0 0 306c0,54 -4,93 -13,116 -9,23 -23,41 -44,55 -20,14 -45,20 -73,20 -37,0 -66,-10 -87,-30 -20,-20 -30,-48 -29,-84zm41 -212c0,46 8,80 23,101 15,21 34,32 56,32 22,0 41,-10 57,-31 16,-21 23,-54 23,-100 0,-44 -8,-77 -24,-99 -16,-22 -35,-32 -58,-32 -20,0 -38,11 -54,32 -15,22 -23,54 -23,96zm624 139c-16,17 -33,30 -51,39 -18,9 -36,13 -55,13 -30,0 -54,-9 -72,-27 -18,-18 -27,-43 -27,-74 0,-20 4,-39 13,-54 8,-16 20,-28 35,-37 15,-9 37,-15 67,-20 40,-6 69,-13 88,-21l0 -15c0,-24 -4,-41 -13,-51 -12,-14 -31,-21 -56,-21 -23,0 -40,5 -51,14 -11,9 -20,27 -25,53l-48 -8c7,-38 21,-66 42,-83 21,-17 51,-26 90,-26 30,0 54,6 72,17 17,11 28,26 33,42 5,17 7,41 7,74l0 80c0,56 1,91 3,106 2,15 6,29 12,42l-51 0c-5,-12 -8,-27 -10,-44zm-4 -134c-18,9 -45,16 -80,23 -21,4 -35,8 -43,12 -8,5 -15,11 -19,19 -5,8 -7,18 -7,29 0,17 5,30 16,40 10,10 25,15 43,15 18,0 34,-5 48,-14 14,-9 25,-21 32,-36 7,-15 11,-37 11,-66l0 -22zm287 177l0 -488 53 0 0 242 199 -242 72 0 -168 198 175 290 -70 0 -142 -247 -66 78 0 169 -53 0zm367 0l0 -353 44 0 0 50c11,-20 24,-34 39,-44 15,-10 33,-15 53,-15 15,0 30,3 43,9 13,6 24,14 32,24 8,10 14,23 18,38 4,16 6,40 6,73l0 217 -49 0 0 -215c0,-26 -2,-45 -7,-57 -4,-12 -11,-21 -21,-28 -9,-7 -20,-10 -33,-10 -24,0 -42,9 -56,26 -14,17 -21,48 -21,90l0 193 -49 0zm293 -177c0,-61 13,-107 39,-138 26,-31 58,-47 97,-47 39,0 71,16 97,47 26,31 39,76 39,134 0,64 -13,111 -38,142 -26,31 -58,47 -97,47 -39,0 -71,-16 -97,-47 -26,-31 -39,-77 -39,-138zm50 0c0,46 8,80 25,102 17,22 37,34 62,34 23,0 43,-11 59,-34 17,-22 25,-56 25,-102 0,-45 -8,-79 -25,-102 -17,-22 -37,-33 -62,-33 -23,0 -43,11 -60,34 -16,22 -25,56 -25,101zm332 177l-89 -353 51 0 46 204 17 76 15 -73 46 -207 51 0 43 205 15 68 17 -68 50 -204 48 0 -91 353 -51 0 -46 -212 -11 -60 -59 272 -52 0zm349 0l0 -488 49 0 0 488 -49 0zm324 -114l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm462 211l0 -45c-9,17 -20,30 -34,39 -14,9 -29,13 -45,13 -34,0 -64,-16 -89,-48 -25,-32 -37,-78 -37,-136 0,-40 6,-74 17,-102 11,-28 26,-49 44,-62 19,-14 39,-20 62,-20 16,0 31,4 45,13 14,9 25,20 34,36l0 -175 49 0 0 488 -46 0zm-155 -176c0,46 8,80 24,102 16,22 34,33 55,33 21,0 39,-11 54,-32 15,-21 23,-53 23,-96 0,-50 -8,-86 -23,-108 -15,-23 -35,-34 -58,-34 -21,0 -38,11 -53,33 -15,22 -22,56 -22,103zm269 206l48 9c2,19 9,33 20,42 11,9 26,14 46,14 22,0 39,-5 51,-15 13,-10 21,-26 26,-46 3,-12 4,-39 4,-79 -11,15 -23,27 -36,35 -13,8 -28,12 -44,12 -35,0 -63,-15 -86,-44 -26,-34 -39,-79 -39,-135 0,-38 6,-71 17,-100 11,-28 27,-49 45,-63 19,-13 40,-20 63,-20 17,0 33,4 47,13 14,8 27,21 37,38l0 -43 45 0 0 306c0,54 -4,93 -13,116 -9,23 -23,41 -44,55 -20,14 -45,20 -73,20 -37,0 -66,-10 -87,-30 -20,-20 -30,-48 -29,-84zm41 -212c0,46 8,80 23,101 15,21 34,32 56,32 22,0 41,-10 57,-31 16,-21 23,-54 23,-100 0,-44 -8,-77 -24,-99 -16,-22 -35,-32 -58,-32 -20,0 -38,11 -54,32 -15,22 -23,54 -23,96zm478 69l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm433 211l0 -488 53 0 0 430 197 0 0 58 -250 0zm307 -419l0 -69 49 0 0 69 -49 0zm0 419l0 -353 49 0 0 353 -49 0zm234 -54l7 53c-14,4 -26,5 -37,5 -17,0 -31,-3 -41,-10 -10,-7 -18,-16 -21,-28 -4,-12 -6,-35 -6,-70l0 -203 -36 0 0 -47 36 0 0 -88 49 -36 0 123 50 0 0 47 -50 0 0 207c0,19 1,31 4,37 4,8 12,12 24,12 6,0 13,-1 22,-2zm279 54l-106 -488 54 0 61 320c6,33 12,66 17,100l18 -90 76 -329 64 0 57 247c14,60 24,118 31,173 5,-32 12,-67 20,-106l63 -314 53 0 -110 488 -51 0 -85 -372 -13 -57c-4,21 -8,40 -12,57l-85 372 -54 0zm422 -177c0,-61 13,-107 39,-138 26,-31 58,-47 97,-47 39,0 71,16 97,47 26,31 39,76 39,134 0,64 -13,111 -38,142 -26,31 -58,47 -97,47 -39,0 -71,-16 -97,-47 -26,-31 -39,-77 -39,-138zm50 0c0,46 8,80 25,102 17,22 37,34 62,34 23,0 43,-11 59,-34 17,-22 25,-56 25,-102 0,-45 -8,-79 -25,-102 -17,-22 -37,-33 -62,-33 -23,0 -43,11 -60,34 -16,22 -25,56 -25,101zm279 177l0 -353 44 0 0 54c11,-25 22,-41 31,-49 9,-8 20,-12 32,-12 16,0 33,6 50,19l-17 56c-12,-9 -24,-13 -36,-13 -10,0 -20,4 -29,11 -9,7 -15,17 -18,31 -6,23 -9,47 -9,73l0 185 -49 0zm185 0l0 -488 49 0 0 488 -49 0zm314 0l0 -45c-9,17 -20,30 -34,39 -14,9 -29,13 -45,13 -34,0 -64,-16 -89,-48 -25,-32 -37,-78 -37,-136 0,-40 6,-74 17,-102 11,-28 26,-49 44,-62 19,-14 39,-20 62,-20 16,0 31,4 45,13 14,9 25,20 34,36l0 -175 49 0 0 488 -46 0zm-155 -176c0,46 8,80 24,102 16,22 34,33 55,33 21,0 39,-11 54,-32 15,-21 23,-53 23,-96 0,-50 -8,-86 -23,-108 -15,-23 -35,-34 -58,-34 -21,0 -38,11 -53,33 -15,22 -22,56 -22,103z"/>
+   <g>
+    <path class="fil5" d="M4021 272c926,0 1680,755 1680,1680 0,926 -755,1680 -1680,1680 -925,0 -1680,-755 -1680,-1680 0,-925 755,-1680 1680,-1680z"/>
+    <path class="fil6" d="M4021 506c797,0 1446,650 1446,1446 0,797 -650,1446 -1446,1446 -797,0 -1446,-650 -1446,-1446 0,-797 650,-1446 1446,-1446z"/>
+    <path class="fil7" d="M3261 397c179,-97 445,426 751,426 312,28 574,-505 750,-433 187,79 -56,613 135,852 172,262 753,134 806,316 55,196 -514,339 -582,637 -97,298 365,672 255,828 -119,165 -585,-191 -861,-58 -293,110 -298,704 -488,716 -203,10 -216,-577 -491,-709 -269,-161 -736,207 -864,65 -134,-153 316,-528 248,-826 -42,-311 -620,-447 -589,-635 36,-200 610,-82 801,-321 217,-226 -37,-764 129,-856z"/>
+    <path class="fil5" d="M3307 469c126,-53 405,440 705,428 323,26 609,-483 726,-424 120,66 -92,591 105,818 181,269 757,175 784,303 23,135 -519,297 -574,592 -98,309 335,701 252,802 -91,102 -555,-221 -820,-80 -302,117 -339,699 -470,697 -137,-7 -174,-572 -449,-691 -280,-164 -758,171 -838,67 -80,-111 339,-492 260,-782 -46,-321 -606,-486 -575,-613 38,-132 596,-42 774,-284 222,-236 2,-777 121,-832z"/>
+    <path class="fil8" d="M3014 1959c0,552 449,1001 1001,1001 552,0 1001,-449 1001,-1001 0,-552 -449,-1000 -1001,-1000 -552,0 -1001,449 -1001,1000zm1001 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/>
+    <path class="fil9" d="M4013 962c546,0 991,445 991,991 0,546 -445,991 -991,991 -546,0 -991,-445 -991,-991 0,-546 445,-991 991,-991z"/>
+    <path class="fil10" d="M3543 1083c86,-20 247,10 470,90l8 3 -5 -7c-54,-75 -110,-138 -170,-192l-3 4c60,54 115,117 170,191l3 -4c-224,-80 -382,-110 -469,-91l-2 5z"/>
+    <path class="fil10" d="M3069 2289c-8,-143 5,-275 37,-392 33,-120 88,-227 163,-320 77,-95 178,-177 299,-243 124,-68 274,-122 445,-160l0 -5c-239,-12 -436,14 -587,76 -152,63 -261,165 -325,303l5 2c63,-137 172,-238 322,-300 151,-63 348,-88 585,-76l0 -5c-172,38 -322,93 -447,161 -122,67 -223,149 -301,244 -76,93 -131,201 -164,322 -33,117 -45,250 -37,394l5 0z"/>
+    <path class="fil10" d="M3793 2933c-27,-383 -23,-723 13,-1012 36,-298 107,-550 210,-749l4 -8 -7 4c-131,74 -244,159 -338,254 -97,98 -176,210 -234,331 -60,125 -100,265 -118,416 -19,155 -17,326 8,508l5 -1c-24,-182 -27,-352 -8,-507 19,-150 58,-289 118,-414 58,-121 136,-232 233,-330 93,-95 207,-180 337,-253l-4 -3c-103,200 -174,452 -211,750 -35,289 -40,630 -13,1013l5 0z"/>
+    <path class="fil10" d="M4481 1078c-87,-20 -244,10 -468,90l3 4c54,-75 110,-137 169,-191l-3 -4c-60,54 -115,117 -170,191l-5 7 8 -3c223,-79 379,-110 465,-90l1 -5z"/>
+    <path class="fil10" d="M4963 2276c8,-143 -5,-275 -37,-391 -33,-119 -89,-226 -165,-318 -77,-94 -179,-174 -301,-240 -124,-67 -274,-120 -446,-159l0 5c237,-12 433,14 584,76 150,62 258,163 321,300l5 -2c-64,-138 -173,-239 -324,-302 -151,-63 -348,-88 -586,-76l0 5c171,38 320,92 444,158 122,65 222,146 299,239 75,91 130,197 164,316 32,116 45,247 37,390l5 0z"/>
+    <path class="fil10" d="M4307 2907c25,-358 9,-694 -47,-1000 -50,-274 -132,-522 -244,-738l-4 3c130,73 243,158 336,253 96,98 174,208 232,329 59,124 99,263 117,413 19,154 16,327 -8,509l5 -3c24,-182 27,-352 8,-507 -19,-150 -58,-289 -118,-414 -58,-121 -136,-232 -233,-330 -93,-95 -207,-180 -337,-253l-7 -4 4 8c111,215 193,463 243,736 56,305 72,641 47,999l5 0z"/>
+    <path class="fil10" d="M3030 2182c84,236 291,370 449,441 200,90 409,120 537,118 155,-2 344,-50 506,-129 145,-71 344,-202 464,-427l-5 -2c-120,224 -317,354 -462,425 -161,78 -350,127 -504,129 -128,2 -336,-28 -535,-118 -157,-71 -362,-204 -446,-438l-5 2z"/>
+    <path class="fil10" d="M3047 1692c-35,176 8,342 123,482 174,211 499,341 846,338 169,-1 334,-32 479,-90 148,-59 271,-144 355,-247 114,-139 157,-307 123,-488l-5 1c34,178 -8,346 -122,483 -84,102 -206,187 -353,245 -144,57 -309,88 -477,89 -346,2 -669,-127 -842,-337 -114,-138 -156,-303 -122,-477l-5 -1z"/>
+    <path class="fil10" d="M3238 1328c-128,150 -159,312 -88,469 115,255 479,444 866,451 183,3 371,-44 530,-131 154,-86 270,-203 324,-331 34,-79 44,-158 29,-236 -16,-84 -60,-163 -131,-236l-4 4c70,72 114,150 130,233 15,77 5,155 -29,233 -115,268 -480,465 -849,459 -385,-7 -748,-195 -862,-448 -70,-155 -39,-315 88,-463l-4 -3z"/>
+    <path class="fil10" d="M3508 1092c-196,141 -277,320 -222,490 34,105 121,200 243,267 132,71 298,109 483,108 186,-1 355,-48 487,-136 120,-80 202,-187 229,-303 19,-81 11,-161 -24,-233 -38,-77 -105,-141 -199,-190l-2 5c93,48 159,111 196,188 35,70 43,150 24,229 -50,208 -294,433 -712,435 -358,2 -648,-147 -721,-371 -55,-168 26,-344 220,-484l-3 -4z"/>
+    <path class="fil10" d="M3729 1004c-92,56 -158,118 -196,185 -34,60 -44,124 -27,185 42,160 251,276 506,283 126,3 250,-28 349,-87 95,-57 157,-135 176,-219 14,-64 1,-129 -38,-187 -44,-65 -118,-121 -222,-166l-2 5c102,45 176,101 220,165 38,57 51,121 37,183 -40,176 -268,309 -520,302 -253,-7 -460,-121 -502,-279 -16,-60 -7,-121 27,-181 37,-66 108,-132 199,-188l-8 0z"/>
+    <path class="fil10" d="M3752 1234c0,41 28,82 76,112 50,31 116,48 186,48 146,0 274,-75 274,-160 0,-41 -29,-80 -82,-109 -52,-29 -120,-45 -192,-45 -71,0 -137,16 -186,45 -49,29 -76,68 -76,109zm262 -149c146,0 269,68 269,149 0,83 -125,155 -269,155 -139,0 -256,-71 -256,-155 0,-84 113,-149 256,-149z"/>
+    <polygon class="fil10" points="4010,1170 4015,1170 4015,966 4010,966 "/>
+    <path class="fil10" d="M3006 1958c0,552 449,1000 1000,1000 552,0 1000,-449 1000,-1000 0,-552 -449,-1000 -1000,-1000 -551,0 -1000,449 -1000,1000zm1000 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/>
+    <path class="fil11 str0" d="M3006 1958c0,552 449,1000 1000,1000 552,0 1000,-449 1000,-1000 0,-552 -449,-1000 -1000,-1000 -551,0 -1000,449 -1000,1000zm1000 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/>
+    <path class="fil10" d="M4019 756l-15 0 0 -71 15 0 0 71zm31 31l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 105l-15 0 0 -71 15 0 0 71zm31 30l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 105l-15 0 0 -71 15 0 0 71zm31 31l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-3 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 110l-15 0 0 -77 15 0 0 77zm27 30l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-25 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-3 -5,-8l0 -118c0,-5 3,-8 5,-8l7 0c3,9 8,15 15,15l24 0c7,0 13,-6 15,-15l2 0c2,0 5,4 5,8zm-46 115c0,-4 0,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 117c0,4 0,7 -1,9l-13 0c0,-2 -1,-5 -1,-9l0 -83 15 0 0 83zm-11 -1121c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm-23 11c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l64 0c2,0 5,4 5,8l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0zm64 22c15,0 28,-14 28,-30l0 -118c0,-17 -12,-30 -28,-30l-64 0c-15,0 -28,14 -28,30l0 118c0,17 12,30 28,30l0 0 0 71 0 0c-15,0 -28,14 -28,31l0 118c0,17 12,31 28,31l0 0 0 71 0 0c-15,0 -28,14 -28,30l0 118c0,17 12,31 28,31l0 0 0 71 0 0c-15,0 -28,14 -28,31l0 118c0,17 12,30 28,30l0 0 0 77 -4 0c-15,0 -28,14 -28,30l0 118c0,17 12,31 28,31l0 0 0 83c0,19 7,31 18,31l25 0c11,0 18,-12 18,-31l0 -83 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-30 -27,-30l0 -77 3 0c15,0 28,-14 28,-30l0 -118c0,-17 -12,-31 -28,-31l-3 0 0 -71 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-30 -28,-30l-3 0 0 -71 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-31 -28,-31l-3 0 0 -71 3 0z"/>
+    <path class="fil12" d="M3465 2569l1079 0c9,0 23,11 16,16 -48,34 -80,66 -66,88 5,7 -7,16 -16,16l-959 0c-9,0 -19,-8 -16,-16 9,-29 -13,-59 -54,-88 -7,-5 7,-16 16,-16z"/>
+    <path class="fil13" d="M4487 2676c-1,2 -5,4 -9,4l-959 0c-3,0 -6,-2 -8,-4 -1,-1 -1,-1 -1,-1 10,-30 -8,-61 -53,-94 2,-2 5,-4 8,-4l1079 0c2,0 5,2 8,4 -40,29 -82,66 -65,95zm83 -98c-3,-9 -17,-17 -26,-17l-1079 0c-9,0 -23,8 -26,17 -2,5 0,11 5,14 41,29 58,55 51,78 -2,6 -1,11 3,16 5,6 13,11 21,11l959 0c9,0 20,-6 24,-13 3,-5 3,-11 0,-16 -6,-9 -1,-30 63,-76 5,-3 7,-9 5,-14z"/>
+    <path class="fil12" d="M3555 2720l901 0c17,0 31,11 31,24l0 33c0,13 -14,24 -31,24l-901 0c-17,0 -31,-11 -31,-24l0 -33c0,-13 14,-24 31,-24z"/>
+    <path class="fil13" d="M4478 2777c0,8 -10,16 -23,16l-901 0c-12,0 -23,-7 -23,-16l0 -33c0,-8 10,-16 23,-16l901 0c12,0 23,7 23,16l0 33zm-23 -65l-901 0c-22,0 -39,15 -39,32l0 33c0,18 18,32 39,32l901 0c22,0 39,-14 39,-32l0 -33c0,-18 -18,-32 -39,-32z"/>
+    <path class="fil12" d="M3554 2837l901 0c17,0 31,9 31,19l0 27c0,11 -14,19 -31,19l-901 0c-17,0 -31,-9 -31,-19l0 -27c0,-11 14,-19 31,-19z"/>
+    <path class="fil13" d="M4477 2883c0,4 -9,11 -22,11l-901 0c-14,0 -23,-7 -23,-11l0 -27c0,-4 9,-11 23,-11l901 0c7,0 13,2 17,4 3,2 5,5 5,7l0 27zm4 -48c-7,-4 -17,-7 -26,-7l-901 0c-22,0 -39,12 -39,28l0 27c0,15 17,28 39,28l901 0c22,0 39,-12 39,-28l0 -27c0,-8 -5,-16 -13,-21z"/>
+    <path class="fil12" d="M3807 2938l393 0c13,0 24,44 24,99 -176,7 -107,99 -120,99l-194 0c-13,0 46,-91 -127,-99 0,-54 11,-99 24,-99z"/>
+    <path class="fil13" d="M4105 3067c-16,21 -11,45 -8,59 0,0 0,0 0,1l-179 0c0,-1 0,-1 0,-2 2,-13 5,-37 -13,-58 -19,-23 -56,-35 -113,-38 1,-49 11,-79 16,-83l392 0c6,3 15,33 16,83 -57,3 -94,16 -111,39zm96 -138l-393 0c-26,0 -32,67 -32,107l0 8 8 0c55,2 92,14 108,33 13,15 11,33 9,45 -1,7 -2,13 2,17 2,2 5,4 8,4l194 0c3,0 6,-1 8,-4 4,-4 2,-10 1,-17 -3,-12 -7,-29 5,-45 15,-19 51,-30 107,-33l8 0 0 -8c0,-40 -7,-107 -32,-107z"/>
+    <path class="fil12" d="M4007 2531l-155 0c8,-29 26,-48 55,-55 28,-76 -46,-64 -50,-181 -21,-143 112,-205 137,-328 -85,-58 -82,-127 13,-180 95,53 98,122 13,180 25,123 157,185 137,328 -4,117 -78,106 -50,181 29,8 47,26 55,55l-155 0z"/>
+    <path class="fil13" d="M3864 2522c8,-20 23,-33 45,-39l4 -1 2 -4c15,-42 2,-61 -14,-83 -15,-20 -33,-45 -35,-101l0 0 0 0c-11,-80 27,-133 67,-189 29,-40 59,-82 70,-136l1 -5 -5 -3c-39,-27 -59,-55 -57,-83 1,-28 24,-56 66,-80 42,24 64,51 66,80 1,28 -19,57 -57,83l-5 3 1 6c11,53 41,95 70,136 40,56 78,109 67,189l0 0 0 0c-2,56 -20,81 -35,101 -16,22 -30,41 -14,83l2 4 4 1c22,6 37,19 45,39l-143 0 -143 0zm306 6c-8,-30 -27,-50 -56,-59 -10,-31 -2,-44 13,-64 16,-22 36,-49 38,-111l0 1c13,-87 -29,-145 -70,-201 -27,-38 -55,-77 -66,-124 40,-29 61,-61 60,-94 -2,-35 -29,-69 -78,-96l-4 -2 -4 2c-50,28 -77,61 -78,96 -2,33 20,65 60,94 -11,47 -39,87 -66,125 -40,56 -82,115 -70,201l0 -1c2,61 22,89 38,111 15,20 23,33 13,64 -29,9 -48,29 -56,59l-3 11 11 0 155 0 155 0 11 0 -3 -11z"/>
+    <path class="fil13" d="M4557 2528c-61,16 -110,-59 -110,-205 0,-146 90,-348 86,-310 -4,45 -32,146 15,275 41,112 116,213 9,240z"/>
+    <path class="fil12" d="M3907 3172l201 0c9,0 37,50 37,109 0,59 -7,107 -16,107 -43,0 -82,115 -125,115 -42,0 -88,-115 -130,-115 -9,0 -16,-48 -16,-107 0,-59 40,-109 49,-109z"/>
+    <path class="fil13" d="M4126 3380c-25,2 -45,31 -66,61 -18,25 -39,54 -56,54 -17,0 -39,-29 -58,-54 -23,-30 -45,-58 -68,-60 -4,-7 -10,-40 -10,-99 0,-53 34,-96 41,-101l198 0c8,6 30,50 30,101 0,59 -7,92 -11,99zm-18 -217l-201 0c-18,0 -57,60 -57,118 0,53 4,115 24,115 17,0 39,29 58,54 24,31 47,61 72,61 26,0 47,-30 69,-61 18,-25 38,-54 56,-54 20,0 24,-63 24,-115 0,-56 -27,-118 -45,-118z"/>
+   </g>
+   <path class="fil14" d="M3270 4935l-157 0 0 -738 -226 652c-22,62 -56,94 -103,94 -48,0 -81,-28 -99,-84l-220 -648 0 725 -157 0 0 -915c0,-48 8,-83 23,-104 24,-33 55,-49 94,-49 58,0 102,41 130,124l230 683 243 -703c24,-68 65,-102 122,-102 38,0 67,13 88,40 21,26 31,63 31,112l0 915zm1028 0l-207 0 -304 -457c-19,-28 -28,-55 -28,-80 0,-31 10,-62 29,-93l267 -429 192 0 -329 514 381 544zm-546 0l-168 0 0 -1059 168 0 0 1059zm1250 -163l0 163c-89,-1 -152,-3 -189,-7 -93,-10 -178,-46 -256,-109 -70,-56 -121,-125 -155,-207 -26,-62 -39,-130 -39,-204 0,-158 56,-289 169,-394 86,-80 185,-124 295,-133 38,-3 96,-5 174,-5l0 164c-18,0 -30,0 -35,0 -83,0 -140,5 -174,15 -80,23 -145,69 -194,138 -44,62 -67,134 -67,214 0,66 16,125 49,180 50,83 119,138 208,165 40,12 95,19 166,19 8,1 24,1 47,1zm723 163l-318 0c-62,0 -106,-12 -130,-36 -24,-24 -36,-67 -36,-129l0 -894 168 0 0 895 316 0 0 163z"/>
+  </g>
+ </g>
+</svg>
diff --git a/app/src/assets/logo_mkcl_w.svg b/app/src/assets/logo_mkcl_w.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c6f49975a7a939a740aa775b276585d7d0a7b07b
--- /dev/null
+++ b/app/src/assets/logo_mkcl_w.svg
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Creator: CorelDRAW X6 -->
+<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="8in" height="6in" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
+viewBox="0 0 8000 6000"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+  <style type="text/css">
+   <![CDATA[
+    .str0 {stroke:#848688;stroke-width:3}
+    .fil11 {fill:none;fill-rule:nonzero}
+    .fil7 {fill:#96989A}
+    .fil5 {fill:#C7C9CB}
+    .fil13 {fill:#F37435}
+    .fil12 {fill:#FFCC29}
+    .fil6 {fill:#FEFEFE}
+    .fil8 {fill:#848587;fill-rule:nonzero}
+    .fil10 {fill:#848688;fill-rule:nonzero}
+    .fil4 {fill:#FFFFFF;fill-rule:nonzero}
+    .fil14 {fill:#F58634;fill-rule:nonzero}
+    .fil9 {fill:#FEFEFE;fill-rule:nonzero}
+    .fil2 {fill:url(#id0)}
+    .fil1 {fill:url(#id1)}
+    .fil3 {fill:url(#id2)}
+    .fil0 {fill:url(#id3)}
+   ]]>
+  </style>
+  <linearGradient id="id0" gradientUnits="userSpaceOnUse" x1="7065.15" y1="1389.45" x2="7236.49" y2="1218.11">
+   <stop offset="0" style="stop-color:#64B074"/>
+   <stop offset="1" style="stop-color:#98BD26"/>
+  </linearGradient>
+  <linearGradient id="id1" gradientUnits="userSpaceOnUse" x1="6440.12" y1="1620.81" x2="6735.08" y2="1325.85">
+   <stop offset="0" style="stop-color:#209CBA"/>
+   <stop offset="1" style="stop-color:#1B7387"/>
+  </linearGradient>
+  <linearGradient id="id2" gradientUnits="userSpaceOnUse" xlink:href="#id1" x1="6531.31" y1="1216.64" x2="6797" y2="950.957">
+  </linearGradient>
+  <linearGradient id="id3" gradientUnits="userSpaceOnUse" xlink:href="#id1" x1="7060.18" y1="1834.44" x2="7194.5" y2="1700.12">
+  </linearGradient>
+ </defs>
+<symbol id="Symbol6" viewBox="7060 1701 129 131">
+ <path class="fil0" d="M7151 1701l-54 0c-35,0 -37,37 -37,37l0 52c0,44 39,42 39,42l47 0c49,0 42,-47 42,-47l0 -44c0,-39 -37,-39 -37,-39z"/>
+</symbol>
+<symbol id="Symbol2" viewBox="7060 1701 129 131">
+ <path class="fil0" d="M7151 1701l-54 0c-35,0 -37,37 -37,37l0 52c0,44 39,42 39,42l47 0c49,0 42,-47 42,-47l0 -44c0,-39 -37,-39 -37,-39z"/>
+</symbol>
+<symbol id="Symbol7" viewBox="6456 1336 280 271">
+ <path class="fil1" d="M6736 1507l0 -77c0,-104 -86,-95 -86,-95l-108 9c-104,9 -86,117 -86,117l0 72c-5,86 86,72 86,72l99 -5c86,-9 95,-95 95,-95z"/>
+</symbol>
+<symbol id="Symbol3" viewBox="7064 1219 164 167">
+ <path class="fil2" d="M7181 1219l-69 0c-44,0 -47,47 -47,47l0 66c0,57 50,53 50,53l60 0c63,0 53,-60 53,-60l0 -57c0,-50 -47,-50 -47,-50z"/>
+</symbol>
+<symbol id="Symbol4" viewBox="6546 962 245 244">
+ <path class="fil3" d="M6547 1084c0,0 -18,-113 95,-117l68 -5c0,0 81,-9 81,72l0 63c0,0 9,95 -77,99l-90 9c0,0 -77,9 -77,-59l0 -63z"/>
+</symbol>
+<symbol id="Symbol1" viewBox="6456 1336 280 271">
+ <path class="fil1" d="M6736 1507l0 -77c0,-104 -86,-95 -86,-95l-108 9c-104,9 -86,117 -86,117l0 72c-5,86 86,72 86,72l99 -5c86,-9 95,-95 95,-95z"/>
+</symbol>
+<symbol id="Symbol8" viewBox="6546 962 245 244">
+ <path class="fil3" d="M6547 1084c0,0 -18,-113 95,-117l68 -5c0,0 81,-9 81,72l0 63c0,0 9,95 -77,99l-90 9c0,0 -77,9 -77,-59l0 -63z"/>
+</symbol>
+<symbol id="Symbol5" viewBox="7064 1219 164 167">
+ <path class="fil2" d="M7181 1219l-69 0c-44,0 -47,47 -47,47l0 66c0,57 50,53 50,53l60 0c63,0 53,-60 53,-60l0 -57c0,-50 -47,-50 -47,-50z"/>
+</symbol>
+ <g id="Layer_x0020_1">
+  <metadata id="CorelCorpID_0Corel-Layer"/>
+  <g id="_880697104">
+   <path class="fil4" d="M427 5469l53 16c-12,55 -32,96 -62,123 -29,27 -65,40 -107,40 -37,0 -69,-9 -95,-27 -26,-18 -48,-47 -65,-87 -17,-40 -25,-87 -25,-141 0,-54 8,-99 25,-136 17,-37 39,-65 68,-84 29,-19 61,-28 96,-28 39,0 72,12 100,36 28,24 47,59 58,106l-52 15c-18,-68 -53,-102 -107,-102 -27,0 -50,7 -69,20 -20,14 -35,35 -47,64 -12,29 -17,65 -17,110 0,67 12,117 35,150 24,33 55,50 94,50 29,0 54,-10 75,-31 21,-21 35,-52 42,-93zm112 171l0 -353 44 0 0 54c11,-25 22,-41 31,-49 9,-8 20,-12 32,-12 16,0 33,6 50,19l-17 56c-12,-9 -24,-13 -36,-13 -10,0 -20,4 -29,11 -9,7 -15,17 -18,31 -6,23 -9,47 -9,73l0 185 -49 0zm385 -114l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm463 167c-16,17 -33,30 -51,39 -18,9 -36,13 -55,13 -30,0 -54,-9 -72,-27 -18,-18 -27,-43 -27,-74 0,-20 4,-39 13,-54 8,-16 20,-28 35,-37 15,-9 37,-15 67,-20 40,-6 69,-13 88,-21l0 -15c0,-24 -4,-41 -13,-51 -12,-14 -31,-21 -56,-21 -23,0 -40,5 -51,14 -11,9 -20,27 -25,53l-48 -8c7,-38 21,-66 42,-83 21,-17 51,-26 90,-26 30,0 54,6 72,17 17,11 28,26 33,42 5,17 7,41 7,74l0 80c0,56 1,91 3,106 2,15 6,29 12,42l-51 0c-5,-12 -8,-27 -10,-44zm-4 -134c-18,9 -45,16 -80,23 -21,4 -35,8 -43,12 -8,5 -15,11 -19,19 -5,8 -7,18 -7,29 0,17 5,30 16,40 10,10 25,15 43,15 18,0 34,-5 48,-14 14,-9 25,-21 32,-36 7,-15 11,-37 11,-66l0 -22zm235 124l7 53c-14,4 -26,5 -37,5 -17,0 -31,-3 -41,-10 -10,-7 -18,-16 -21,-28 -4,-12 -6,-35 -6,-70l0 -203 -36 0 0 -47 36 0 0 -88 49 -36 0 123 50 0 0 47 -50 0 0 207c0,19 1,31 4,37 4,8 12,12 24,12 6,0 13,-1 22,-2zm46 -365l0 -69 49 0 0 69 -49 0zm0 419l0 -353 49 0 0 353 -49 0zm124 0l0 -353 44 0 0 50c11,-20 24,-34 39,-44 15,-10 33,-15 53,-15 15,0 30,3 43,9 13,6 24,14 32,24 8,10 14,23 18,38 4,16 6,40 6,73l0 217 -49 0 0 -215c0,-26 -2,-45 -7,-57 -4,-12 -11,-21 -21,-28 -9,-7 -20,-10 -33,-10 -24,0 -42,9 -56,26 -14,17 -21,48 -21,90l0 193 -49 0zm302 29l48 9c2,19 9,33 20,42 11,9 26,14 46,14 22,0 39,-5 51,-15 13,-10 21,-26 26,-46 3,-12 4,-39 4,-79 -11,15 -23,27 -36,35 -13,8 -28,12 -44,12 -35,0 -63,-15 -86,-44 -26,-34 -39,-79 -39,-135 0,-38 6,-71 17,-100 11,-28 27,-49 45,-63 19,-13 40,-20 63,-20 17,0 33,4 47,13 14,8 27,21 37,38l0 -43 45 0 0 306c0,54 -4,93 -13,116 -9,23 -23,41 -44,55 -20,14 -45,20 -73,20 -37,0 -66,-10 -87,-30 -20,-20 -30,-48 -29,-84zm41 -212c0,46 8,80 23,101 15,21 34,32 56,32 22,0 41,-10 57,-31 16,-21 23,-54 23,-100 0,-44 -8,-77 -24,-99 -16,-22 -35,-32 -58,-32 -20,0 -38,11 -54,32 -15,22 -23,54 -23,96zm624 139c-16,17 -33,30 -51,39 -18,9 -36,13 -55,13 -30,0 -54,-9 -72,-27 -18,-18 -27,-43 -27,-74 0,-20 4,-39 13,-54 8,-16 20,-28 35,-37 15,-9 37,-15 67,-20 40,-6 69,-13 88,-21l0 -15c0,-24 -4,-41 -13,-51 -12,-14 -31,-21 -56,-21 -23,0 -40,5 -51,14 -11,9 -20,27 -25,53l-48 -8c7,-38 21,-66 42,-83 21,-17 51,-26 90,-26 30,0 54,6 72,17 17,11 28,26 33,42 5,17 7,41 7,74l0 80c0,56 1,91 3,106 2,15 6,29 12,42l-51 0c-5,-12 -8,-27 -10,-44zm-4 -134c-18,9 -45,16 -80,23 -21,4 -35,8 -43,12 -8,5 -15,11 -19,19 -5,8 -7,18 -7,29 0,17 5,30 16,40 10,10 25,15 43,15 18,0 34,-5 48,-14 14,-9 25,-21 32,-36 7,-15 11,-37 11,-66l0 -22zm287 177l0 -488 53 0 0 242 199 -242 72 0 -168 198 175 290 -70 0 -142 -247 -66 78 0 169 -53 0zm367 0l0 -353 44 0 0 50c11,-20 24,-34 39,-44 15,-10 33,-15 53,-15 15,0 30,3 43,9 13,6 24,14 32,24 8,10 14,23 18,38 4,16 6,40 6,73l0 217 -49 0 0 -215c0,-26 -2,-45 -7,-57 -4,-12 -11,-21 -21,-28 -9,-7 -20,-10 -33,-10 -24,0 -42,9 -56,26 -14,17 -21,48 -21,90l0 193 -49 0zm293 -177c0,-61 13,-107 39,-138 26,-31 58,-47 97,-47 39,0 71,16 97,47 26,31 39,76 39,134 0,64 -13,111 -38,142 -26,31 -58,47 -97,47 -39,0 -71,-16 -97,-47 -26,-31 -39,-77 -39,-138zm50 0c0,46 8,80 25,102 17,22 37,34 62,34 23,0 43,-11 59,-34 17,-22 25,-56 25,-102 0,-45 -8,-79 -25,-102 -17,-22 -37,-33 -62,-33 -23,0 -43,11 -60,34 -16,22 -25,56 -25,101zm332 177l-89 -353 51 0 46 204 17 76 15 -73 46 -207 51 0 43 205 15 68 17 -68 50 -204 48 0 -91 353 -51 0 -46 -212 -11 -60 -59 272 -52 0zm349 0l0 -488 49 0 0 488 -49 0zm324 -114l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm462 211l0 -45c-9,17 -20,30 -34,39 -14,9 -29,13 -45,13 -34,0 -64,-16 -89,-48 -25,-32 -37,-78 -37,-136 0,-40 6,-74 17,-102 11,-28 26,-49 44,-62 19,-14 39,-20 62,-20 16,0 31,4 45,13 14,9 25,20 34,36l0 -175 49 0 0 488 -46 0zm-155 -176c0,46 8,80 24,102 16,22 34,33 55,33 21,0 39,-11 54,-32 15,-21 23,-53 23,-96 0,-50 -8,-86 -23,-108 -15,-23 -35,-34 -58,-34 -21,0 -38,11 -53,33 -15,22 -22,56 -22,103zm269 206l48 9c2,19 9,33 20,42 11,9 26,14 46,14 22,0 39,-5 51,-15 13,-10 21,-26 26,-46 3,-12 4,-39 4,-79 -11,15 -23,27 -36,35 -13,8 -28,12 -44,12 -35,0 -63,-15 -86,-44 -26,-34 -39,-79 -39,-135 0,-38 6,-71 17,-100 11,-28 27,-49 45,-63 19,-13 40,-20 63,-20 17,0 33,4 47,13 14,8 27,21 37,38l0 -43 45 0 0 306c0,54 -4,93 -13,116 -9,23 -23,41 -44,55 -20,14 -45,20 -73,20 -37,0 -66,-10 -87,-30 -20,-20 -30,-48 -29,-84zm41 -212c0,46 8,80 23,101 15,21 34,32 56,32 22,0 41,-10 57,-31 16,-21 23,-54 23,-100 0,-44 -8,-77 -24,-99 -16,-22 -35,-32 -58,-32 -20,0 -38,11 -54,32 -15,22 -23,54 -23,96zm478 69l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm433 211l0 -488 53 0 0 430 197 0 0 58 -250 0zm307 -419l0 -69 49 0 0 69 -49 0zm0 419l0 -353 49 0 0 353 -49 0zm234 -54l7 53c-14,4 -26,5 -37,5 -17,0 -31,-3 -41,-10 -10,-7 -18,-16 -21,-28 -4,-12 -6,-35 -6,-70l0 -203 -36 0 0 -47 36 0 0 -88 49 -36 0 123 50 0 0 47 -50 0 0 207c0,19 1,31 4,37 4,8 12,12 24,12 6,0 13,-1 22,-2zm279 54l-106 -488 54 0 61 320c6,33 12,66 17,100l18 -90 76 -329 64 0 57 247c14,60 24,118 31,173 5,-32 12,-67 20,-106l63 -314 53 0 -110 488 -51 0 -85 -372 -13 -57c-4,21 -8,40 -12,57l-85 372 -54 0zm422 -177c0,-61 13,-107 39,-138 26,-31 58,-47 97,-47 39,0 71,16 97,47 26,31 39,76 39,134 0,64 -13,111 -38,142 -26,31 -58,47 -97,47 -39,0 -71,-16 -97,-47 -26,-31 -39,-77 -39,-138zm50 0c0,46 8,80 25,102 17,22 37,34 62,34 23,0 43,-11 59,-34 17,-22 25,-56 25,-102 0,-45 -8,-79 -25,-102 -17,-22 -37,-33 -62,-33 -23,0 -43,11 -60,34 -16,22 -25,56 -25,101zm279 177l0 -353 44 0 0 54c11,-25 22,-41 31,-49 9,-8 20,-12 32,-12 16,0 33,6 50,19l-17 56c-12,-9 -24,-13 -36,-13 -10,0 -20,4 -29,11 -9,7 -15,17 -18,31 -6,23 -9,47 -9,73l0 185 -49 0zm185 0l0 -488 49 0 0 488 -49 0zm314 0l0 -45c-9,17 -20,30 -34,39 -14,9 -29,13 -45,13 -34,0 -64,-16 -89,-48 -25,-32 -37,-78 -37,-136 0,-40 6,-74 17,-102 11,-28 26,-49 44,-62 19,-14 39,-20 62,-20 16,0 31,4 45,13 14,9 25,20 34,36l0 -175 49 0 0 488 -46 0zm-155 -176c0,46 8,80 24,102 16,22 34,33 55,33 21,0 39,-11 54,-32 15,-21 23,-53 23,-96 0,-50 -8,-86 -23,-108 -15,-23 -35,-34 -58,-34 -21,0 -38,11 -53,33 -15,22 -22,56 -22,103z"/>
+   <g>
+    <path class="fil5" d="M4021 272c926,0 1680,755 1680,1680 0,926 -755,1680 -1680,1680 -925,0 -1680,-755 -1680,-1680 0,-925 755,-1680 1680,-1680z"/>
+    <path class="fil6" d="M4021 506c797,0 1446,650 1446,1446 0,797 -650,1446 -1446,1446 -797,0 -1446,-650 -1446,-1446 0,-797 650,-1446 1446,-1446z"/>
+    <path class="fil7" d="M3261 397c179,-97 445,426 751,426 312,28 574,-505 750,-433 187,79 -56,613 135,852 172,262 753,134 806,316 55,196 -514,339 -582,637 -97,298 365,672 255,828 -119,165 -585,-191 -861,-58 -293,110 -298,704 -488,716 -203,10 -216,-577 -491,-709 -269,-161 -736,207 -864,65 -134,-153 316,-528 248,-826 -42,-311 -620,-447 -589,-635 36,-200 610,-82 801,-321 217,-226 -37,-764 129,-856z"/>
+    <path class="fil5" d="M3307 469c126,-53 405,440 705,428 323,26 609,-483 726,-424 120,66 -92,591 105,818 181,269 757,175 784,303 23,135 -519,297 -574,592 -98,309 335,701 252,802 -91,102 -555,-221 -820,-80 -302,117 -339,699 -470,697 -137,-7 -174,-572 -449,-691 -280,-164 -758,171 -838,67 -80,-111 339,-492 260,-782 -46,-321 -606,-486 -575,-613 38,-132 596,-42 774,-284 222,-236 2,-777 121,-832z"/>
+    <path class="fil8" d="M3014 1959c0,552 449,1001 1001,1001 552,0 1001,-449 1001,-1001 0,-552 -449,-1000 -1001,-1000 -552,0 -1001,449 -1001,1000zm1001 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/>
+    <path class="fil9" d="M4013 962c546,0 991,445 991,991 0,546 -445,991 -991,991 -546,0 -991,-445 -991,-991 0,-546 445,-991 991,-991z"/>
+    <path class="fil10" d="M3543 1083c86,-20 247,10 470,90l8 3 -5 -7c-54,-75 -110,-138 -170,-192l-3 4c60,54 115,117 170,191l3 -4c-224,-80 -382,-110 -469,-91l-2 5z"/>
+    <path class="fil10" d="M3069 2289c-8,-143 5,-275 37,-392 33,-120 88,-227 163,-320 77,-95 178,-177 299,-243 124,-68 274,-122 445,-160l0 -5c-239,-12 -436,14 -587,76 -152,63 -261,165 -325,303l5 2c63,-137 172,-238 322,-300 151,-63 348,-88 585,-76l0 -5c-172,38 -322,93 -447,161 -122,67 -223,149 -301,244 -76,93 -131,201 -164,322 -33,117 -45,250 -37,394l5 0z"/>
+    <path class="fil10" d="M3793 2933c-27,-383 -23,-723 13,-1012 36,-298 107,-550 210,-749l4 -8 -7 4c-131,74 -244,159 -338,254 -97,98 -176,210 -234,331 -60,125 -100,265 -118,416 -19,155 -17,326 8,508l5 -1c-24,-182 -27,-352 -8,-507 19,-150 58,-289 118,-414 58,-121 136,-232 233,-330 93,-95 207,-180 337,-253l-4 -3c-103,200 -174,452 -211,750 -35,289 -40,630 -13,1013l5 0z"/>
+    <path class="fil10" d="M4481 1078c-87,-20 -244,10 -468,90l3 4c54,-75 110,-137 169,-191l-3 -4c-60,54 -115,117 -170,191l-5 7 8 -3c223,-79 379,-110 465,-90l1 -5z"/>
+    <path class="fil10" d="M4963 2276c8,-143 -5,-275 -37,-391 -33,-119 -89,-226 -165,-318 -77,-94 -179,-174 -301,-240 -124,-67 -274,-120 -446,-159l0 5c237,-12 433,14 584,76 150,62 258,163 321,300l5 -2c-64,-138 -173,-239 -324,-302 -151,-63 -348,-88 -586,-76l0 5c171,38 320,92 444,158 122,65 222,146 299,239 75,91 130,197 164,316 32,116 45,247 37,390l5 0z"/>
+    <path class="fil10" d="M4307 2907c25,-358 9,-694 -47,-1000 -50,-274 -132,-522 -244,-738l-4 3c130,73 243,158 336,253 96,98 174,208 232,329 59,124 99,263 117,413 19,154 16,327 -8,509l5 -3c24,-182 27,-352 8,-507 -19,-150 -58,-289 -118,-414 -58,-121 -136,-232 -233,-330 -93,-95 -207,-180 -337,-253l-7 -4 4 8c111,215 193,463 243,736 56,305 72,641 47,999l5 0z"/>
+    <path class="fil10" d="M3030 2182c84,236 291,370 449,441 200,90 409,120 537,118 155,-2 344,-50 506,-129 145,-71 344,-202 464,-427l-5 -2c-120,224 -317,354 -462,425 -161,78 -350,127 -504,129 -128,2 -336,-28 -535,-118 -157,-71 -362,-204 -446,-438l-5 2z"/>
+    <path class="fil10" d="M3047 1692c-35,176 8,342 123,482 174,211 499,341 846,338 169,-1 334,-32 479,-90 148,-59 271,-144 355,-247 114,-139 157,-307 123,-488l-5 1c34,178 -8,346 -122,483 -84,102 -206,187 -353,245 -144,57 -309,88 -477,89 -346,2 -669,-127 -842,-337 -114,-138 -156,-303 -122,-477l-5 -1z"/>
+    <path class="fil10" d="M3238 1328c-128,150 -159,312 -88,469 115,255 479,444 866,451 183,3 371,-44 530,-131 154,-86 270,-203 324,-331 34,-79 44,-158 29,-236 -16,-84 -60,-163 -131,-236l-4 4c70,72 114,150 130,233 15,77 5,155 -29,233 -115,268 -480,465 -849,459 -385,-7 -748,-195 -862,-448 -70,-155 -39,-315 88,-463l-4 -3z"/>
+    <path class="fil10" d="M3508 1092c-196,141 -277,320 -222,490 34,105 121,200 243,267 132,71 298,109 483,108 186,-1 355,-48 487,-136 120,-80 202,-187 229,-303 19,-81 11,-161 -24,-233 -38,-77 -105,-141 -199,-190l-2 5c93,48 159,111 196,188 35,70 43,150 24,229 -50,208 -294,433 -712,435 -358,2 -648,-147 -721,-371 -55,-168 26,-344 220,-484l-3 -4z"/>
+    <path class="fil10" d="M3729 1004c-92,56 -158,118 -196,185 -34,60 -44,124 -27,185 42,160 251,276 506,283 126,3 250,-28 349,-87 95,-57 157,-135 176,-219 14,-64 1,-129 -38,-187 -44,-65 -118,-121 -222,-166l-2 5c102,45 176,101 220,165 38,57 51,121 37,183 -40,176 -268,309 -520,302 -253,-7 -460,-121 -502,-279 -16,-60 -7,-121 27,-181 37,-66 108,-132 199,-188l-8 0z"/>
+    <path class="fil10" d="M3752 1234c0,41 28,82 76,112 50,31 116,48 186,48 146,0 274,-75 274,-160 0,-41 -29,-80 -82,-109 -52,-29 -120,-45 -192,-45 -71,0 -137,16 -186,45 -49,29 -76,68 -76,109zm262 -149c146,0 269,68 269,149 0,83 -125,155 -269,155 -139,0 -256,-71 -256,-155 0,-84 113,-149 256,-149z"/>
+    <polygon class="fil10" points="4010,1170 4015,1170 4015,966 4010,966 "/>
+    <path class="fil10" d="M3006 1958c0,552 449,1000 1000,1000 552,0 1000,-449 1000,-1000 0,-552 -449,-1000 -1000,-1000 -551,0 -1000,449 -1000,1000zm1000 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/>
+    <path class="fil11 str0" d="M3006 1958c0,552 449,1000 1000,1000 552,0 1000,-449 1000,-1000 0,-552 -449,-1000 -1000,-1000 -551,0 -1000,449 -1000,1000zm1000 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/>
+    <path class="fil10" d="M4019 756l-15 0 0 -71 15 0 0 71zm31 31l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 105l-15 0 0 -71 15 0 0 71zm31 30l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 105l-15 0 0 -71 15 0 0 71zm31 31l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-3 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 110l-15 0 0 -77 15 0 0 77zm27 30l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-25 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-3 -5,-8l0 -118c0,-5 3,-8 5,-8l7 0c3,9 8,15 15,15l24 0c7,0 13,-6 15,-15l2 0c2,0 5,4 5,8zm-46 115c0,-4 0,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 117c0,4 0,7 -1,9l-13 0c0,-2 -1,-5 -1,-9l0 -83 15 0 0 83zm-11 -1121c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm-23 11c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l64 0c2,0 5,4 5,8l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0zm64 22c15,0 28,-14 28,-30l0 -118c0,-17 -12,-30 -28,-30l-64 0c-15,0 -28,14 -28,30l0 118c0,17 12,30 28,30l0 0 0 71 0 0c-15,0 -28,14 -28,31l0 118c0,17 12,31 28,31l0 0 0 71 0 0c-15,0 -28,14 -28,30l0 118c0,17 12,31 28,31l0 0 0 71 0 0c-15,0 -28,14 -28,31l0 118c0,17 12,30 28,30l0 0 0 77 -4 0c-15,0 -28,14 -28,30l0 118c0,17 12,31 28,31l0 0 0 83c0,19 7,31 18,31l25 0c11,0 18,-12 18,-31l0 -83 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-30 -27,-30l0 -77 3 0c15,0 28,-14 28,-30l0 -118c0,-17 -12,-31 -28,-31l-3 0 0 -71 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-30 -28,-30l-3 0 0 -71 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-31 -28,-31l-3 0 0 -71 3 0z"/>
+    <path class="fil12" d="M3465 2569l1079 0c9,0 23,11 16,16 -48,34 -80,66 -66,88 5,7 -7,16 -16,16l-959 0c-9,0 -19,-8 -16,-16 9,-29 -13,-59 -54,-88 -7,-5 7,-16 16,-16z"/>
+    <path class="fil13" d="M4487 2676c-1,2 -5,4 -9,4l-959 0c-3,0 -6,-2 -8,-4 -1,-1 -1,-1 -1,-1 10,-30 -8,-61 -53,-94 2,-2 5,-4 8,-4l1079 0c2,0 5,2 8,4 -40,29 -82,66 -65,95zm83 -98c-3,-9 -17,-17 -26,-17l-1079 0c-9,0 -23,8 -26,17 -2,5 0,11 5,14 41,29 58,55 51,78 -2,6 -1,11 3,16 5,6 13,11 21,11l959 0c9,0 20,-6 24,-13 3,-5 3,-11 0,-16 -6,-9 -1,-30 63,-76 5,-3 7,-9 5,-14z"/>
+    <path class="fil12" d="M3555 2720l901 0c17,0 31,11 31,24l0 33c0,13 -14,24 -31,24l-901 0c-17,0 -31,-11 -31,-24l0 -33c0,-13 14,-24 31,-24z"/>
+    <path class="fil13" d="M4478 2777c0,8 -10,16 -23,16l-901 0c-12,0 -23,-7 -23,-16l0 -33c0,-8 10,-16 23,-16l901 0c12,0 23,7 23,16l0 33zm-23 -65l-901 0c-22,0 -39,15 -39,32l0 33c0,18 18,32 39,32l901 0c22,0 39,-14 39,-32l0 -33c0,-18 -18,-32 -39,-32z"/>
+    <path class="fil12" d="M3554 2837l901 0c17,0 31,9 31,19l0 27c0,11 -14,19 -31,19l-901 0c-17,0 -31,-9 -31,-19l0 -27c0,-11 14,-19 31,-19z"/>
+    <path class="fil13" d="M4477 2883c0,4 -9,11 -22,11l-901 0c-14,0 -23,-7 -23,-11l0 -27c0,-4 9,-11 23,-11l901 0c7,0 13,2 17,4 3,2 5,5 5,7l0 27zm4 -48c-7,-4 -17,-7 -26,-7l-901 0c-22,0 -39,12 -39,28l0 27c0,15 17,28 39,28l901 0c22,0 39,-12 39,-28l0 -27c0,-8 -5,-16 -13,-21z"/>
+    <path class="fil12" d="M3807 2938l393 0c13,0 24,44 24,99 -176,7 -107,99 -120,99l-194 0c-13,0 46,-91 -127,-99 0,-54 11,-99 24,-99z"/>
+    <path class="fil13" d="M4105 3067c-16,21 -11,45 -8,59 0,0 0,0 0,1l-179 0c0,-1 0,-1 0,-2 2,-13 5,-37 -13,-58 -19,-23 -56,-35 -113,-38 1,-49 11,-79 16,-83l392 0c6,3 15,33 16,83 -57,3 -94,16 -111,39zm96 -138l-393 0c-26,0 -32,67 -32,107l0 8 8 0c55,2 92,14 108,33 13,15 11,33 9,45 -1,7 -2,13 2,17 2,2 5,4 8,4l194 0c3,0 6,-1 8,-4 4,-4 2,-10 1,-17 -3,-12 -7,-29 5,-45 15,-19 51,-30 107,-33l8 0 0 -8c0,-40 -7,-107 -32,-107z"/>
+    <path class="fil12" d="M4007 2531l-155 0c8,-29 26,-48 55,-55 28,-76 -46,-64 -50,-181 -21,-143 112,-205 137,-328 -85,-58 -82,-127 13,-180 95,53 98,122 13,180 25,123 157,185 137,328 -4,117 -78,106 -50,181 29,8 47,26 55,55l-155 0z"/>
+    <path class="fil13" d="M3864 2522c8,-20 23,-33 45,-39l4 -1 2 -4c15,-42 2,-61 -14,-83 -15,-20 -33,-45 -35,-101l0 0 0 0c-11,-80 27,-133 67,-189 29,-40 59,-82 70,-136l1 -5 -5 -3c-39,-27 -59,-55 -57,-83 1,-28 24,-56 66,-80 42,24 64,51 66,80 1,28 -19,57 -57,83l-5 3 1 6c11,53 41,95 70,136 40,56 78,109 67,189l0 0 0 0c-2,56 -20,81 -35,101 -16,22 -30,41 -14,83l2 4 4 1c22,6 37,19 45,39l-143 0 -143 0zm306 6c-8,-30 -27,-50 -56,-59 -10,-31 -2,-44 13,-64 16,-22 36,-49 38,-111l0 1c13,-87 -29,-145 -70,-201 -27,-38 -55,-77 -66,-124 40,-29 61,-61 60,-94 -2,-35 -29,-69 -78,-96l-4 -2 -4 2c-50,28 -77,61 -78,96 -2,33 20,65 60,94 -11,47 -39,87 -66,125 -40,56 -82,115 -70,201l0 -1c2,61 22,89 38,111 15,20 23,33 13,64 -29,9 -48,29 -56,59l-3 11 11 0 155 0 155 0 11 0 -3 -11z"/>
+    <path class="fil13" d="M4557 2528c-61,16 -110,-59 -110,-205 0,-146 90,-348 86,-310 -4,45 -32,146 15,275 41,112 116,213 9,240z"/>
+    <path class="fil12" d="M3907 3172l201 0c9,0 37,50 37,109 0,59 -7,107 -16,107 -43,0 -82,115 -125,115 -42,0 -88,-115 -130,-115 -9,0 -16,-48 -16,-107 0,-59 40,-109 49,-109z"/>
+    <path class="fil13" d="M4126 3380c-25,2 -45,31 -66,61 -18,25 -39,54 -56,54 -17,0 -39,-29 -58,-54 -23,-30 -45,-58 -68,-60 -4,-7 -10,-40 -10,-99 0,-53 34,-96 41,-101l198 0c8,6 30,50 30,101 0,59 -7,92 -11,99zm-18 -217l-201 0c-18,0 -57,60 -57,118 0,53 4,115 24,115 17,0 39,29 58,54 24,31 47,61 72,61 26,0 47,-30 69,-61 18,-25 38,-54 56,-54 20,0 24,-63 24,-115 0,-56 -27,-118 -45,-118z"/>
+   </g>
+   <path class="fil14" d="M3270 4935l-157 0 0 -738 -226 652c-22,62 -56,94 -103,94 -48,0 -81,-28 -99,-84l-220 -648 0 725 -157 0 0 -915c0,-48 8,-83 23,-104 24,-33 55,-49 94,-49 58,0 102,41 130,124l230 683 243 -703c24,-68 65,-102 122,-102 38,0 67,13 88,40 21,26 31,63 31,112l0 915zm1028 0l-207 0 -304 -457c-19,-28 -28,-55 -28,-80 0,-31 10,-62 29,-93l267 -429 192 0 -329 514 381 544zm-546 0l-168 0 0 -1059 168 0 0 1059zm1250 -163l0 163c-89,-1 -152,-3 -189,-7 -93,-10 -178,-46 -256,-109 -70,-56 -121,-125 -155,-207 -26,-62 -39,-130 -39,-204 0,-158 56,-289 169,-394 86,-80 185,-124 295,-133 38,-3 96,-5 174,-5l0 164c-18,0 -30,0 -35,0 -83,0 -140,5 -174,15 -80,23 -145,69 -194,138 -44,62 -67,134 -67,214 0,66 16,125 49,180 50,83 119,138 208,165 40,12 95,19 166,19 8,1 24,1 47,1zm723 163l-318 0c-62,0 -106,-12 -130,-36 -24,-24 -36,-67 -36,-129l0 -894 168 0 0 895 316 0 0 163z"/>
+  </g>
+ </g>
+</svg>
diff --git a/app/src/assets/mkcl-logo.png b/app/src/assets/mkcl-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..d620ad13206d3fe96bc84d6cec6ab8968d9d367d
Binary files /dev/null and b/app/src/assets/mkcl-logo.png differ
diff --git a/app/src/components/BL/updateDbSave.vue b/app/src/components/BL/updateDbSave.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c8010ba4e8cc12c5390ab424d657c8839805ff46
--- /dev/null
+++ b/app/src/components/BL/updateDbSave.vue
@@ -0,0 +1,73 @@
+<template>
+  <div id="updateAndSave" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Updated and Save in Database
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-6">
+        <div class="box-login">
+          <div class="p-card p-conponent">
+            <h3>
+              Note
+            </h3>
+            <div class="mt-2">
+              This feature updates the user age. Server can add 5 for given age and saves data in database.
+            </div>
+            <div class="field mt-4">
+              <div class="p-float-label">
+                <input type="text" class="p-inputtext p-component w-100" :class="sobj.name ? 'p-filled' : ''" v-model="sobj.name"  id="name">
+                <label for="name">Enter name</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" class="p-inputtext p-component w-100" :class="sobj.age ? 'p-filled' : ''" v-model="sobj.age"  id="age">
+                <label for="age">Enter age</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" class="p-inputtext p-component w-100" :class="sobj.address ? 'p-filled' : ''" v-model="sobj.address"  id="address">
+                <label for="address">Enter address</label>
+              </div>
+            </div>
+            <div class="btn-wrapper">
+              <button class="btn btn-submit" @click.prevent="updateObjectUsingBLAndSave">
+                <i class="isax isax-bold-document-upload"></i>
+                Update and Save
+              </button>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      sobj: {}
+    }
+  },
+  methods: {
+    updateObjectUsingBLAndSave () {
+      new MQL()
+        .setActivity('o.[UpdateObjectUsingBLAndSave]')
+        .setData(this.sobj)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('UpdateObjectUsingBLAndSave', true)
+          if (rs.isValid('UpdateObjectUsingBLAndSave')) {
+            this.$toast.add({ severity: 'success', summary: 'UpdateObjectUsingBLAndSave', detail: 'Update Object UsingBL And Save Successfully', life: 3000 })
+          } else {
+            rs.showErrorToast('UpdateObjectUsingBLAndSave')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/components/BL/updateUser.vue b/app/src/components/BL/updateUser.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ffed7092b40b1f373ee4fb387e74b11c53fb95e1
--- /dev/null
+++ b/app/src/components/BL/updateUser.vue
@@ -0,0 +1,91 @@
+<template>
+  <div id="updateUser" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Update User
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-6">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" required v-model="obj.name" id="name" class="p-inputtext p-component w-100" :class="obj.name ? 'p-filled': ''">
+                <label for="name">Enter name</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" required v-model="obj.age" id="age" class="p-inputtext p-component w-100" :class="obj.age ? 'p-filled': ''">
+                <label for="age">Enter age</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" required v-model="obj.address" id="address" class="p-inputtext p-component w-100" :class="obj.address ? 'p-filled': ''">
+                <label for="address">Enter address</label>
+              </div>
+            </div>
+            <div class="btn-wrapper">
+              <button class="btn btn-submit" @click.prevent="updateObjectUsingBL">
+                <i class="isax isax-bold-tick-circle"></i>
+                Update Data
+              </button>
+            </div>
+          </div>
+      </div>
+      </div>
+      <div class="col-6">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <h3>
+              Note
+            </h3>
+            <div class="mt-2">
+              This feature update the user age, Server can add 5 in given age & save data in database.
+            </div>
+            <h3 class="mt-5">
+              Result
+            </h3>
+            <div class="mt-2">
+              <json-viewer :value="result" boxed :expanded="true"></json-viewer>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+import jsonViewer from 'vue-json-viewer'
+export default {
+  data () {
+    return {
+      obj: {},
+      result: ''
+    }
+  },
+  components: {
+    jsonViewer
+  },
+  methods: {
+    updateObjectUsingBL () {
+      new MQL()
+        .setActivity('o.[UpdateObjectUsingBL]')
+        .setData(this.obj)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('UpdateObjectUsingBL', true)
+          if (rs.isValid('UpdateObjectUsingBL')) {
+            alert('Data update success')
+            this.result = res.result
+          } else {
+            rs.showErrorToast('UpdateObjectUsingBL')
+          }
+        })
+    }
+  }
+}
+</script>
diff --git a/app/src/components/DaiseUIComponents/Toast.vue b/app/src/components/DaiseUIComponents/Toast.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2ee07eca83a3935bebf29329bac5b21646eb0030
--- /dev/null
+++ b/app/src/components/DaiseUIComponents/Toast.vue
@@ -0,0 +1,29 @@
+<template>
+	<div class="toast toast-top toast-end">
+		<div v-if="type==='info'" class="alert alert-info">
+			<div>
+				<span>New mail arrived.</span>
+			</div>
+		</div>
+		<div v-if="type==='success'"  class="alert alert-success">
+			<div>
+				<span>Message sent successfully.</span>
+			</div>
+		</div>
+	</div>
+</template>
+<script>
+export default {
+    name:"Toast",
+    props:{
+        type:String,
+        data:String
+    },
+    data(){
+        return {
+            
+        }
+    }
+}
+</script>
+
diff --git a/app/src/components/MTable.vue b/app/src/components/MTable.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7f8f65c8e175c3d4c1a7626a7481797866cb61d2
--- /dev/null
+++ b/app/src/components/MTable.vue
@@ -0,0 +1,89 @@
+<template>
+	<div id="mTable" class="container-fluid">
+		<div class="row justify-content-center">
+			<div class="col-4">
+				<div class="box-login">
+					<div class="p-card p-component">
+						<h3 class="mb-4">
+							{{ msg }}
+						</h3>
+						<div class="overflow-x-auto">
+							<table class="table w-full">
+								<thead>
+									<tr>
+										<th>id</th>
+										<th>age</th>
+									</tr>
+								</thead>
+								<tbody v-for="(item, index) in itemList" v-bind:key="index">
+									<tr>
+										<th>{{ item.id }}</th>
+										<td>{{ item.age }}</td>
+									</tr>
+								</tbody>
+							</table>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import MQL from "@/plugins/mql.js"
+	export default {
+		name: "MTable",
+		props: {
+			msg: {
+				type: String,
+				default: null,
+			},
+			activity: {
+				type: String,
+				required: true,
+				default: null,
+			},
+			restriction: {
+				type: String,
+				required: true,
+				default: null,
+			},
+		},
+		data() {
+			return {
+				itemList: [],
+			}
+		},
+		mounted() {
+			this.getActivityData()
+		},
+		methods: {
+			// call for activity specific mql
+			getActivityData() {
+				new MQL()
+					.setActivity(this.restriction + ".[" + this.activity + "]")
+					// In case params not provided it will go with empty object
+					.setData()
+					.fetch()
+					.then((rs) => {
+						let res = rs.getActivity(this.activity, false)
+						if (rs.isValid(this.activity)) {
+							// Check if the request is of query type
+							if (this.activity.startsWith("query_")) {
+								// Request is of query type
+								console.log(res)
+								this.itemList = res
+							} else {
+								// Request is of activity type
+								this.itemList = res.result[this.resultKey || []]
+							}
+						} else {
+							// In case there is error from server side
+							rs.showErrorToast(this.activity, this.$toast)
+						}
+					})
+			},
+		},
+	}
+</script>
diff --git a/app/src/components/common/Footer.vue b/app/src/components/common/Footer.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2f151af26a0a25a34790003fc0376b3f11957b1f
--- /dev/null
+++ b/app/src/components/common/Footer.vue
@@ -0,0 +1,26 @@
+<template>
+  <div class="box-footer">
+    <div class="bxf-container">
+        <img src="../../assets/logo_mkcl.svg" alt="MKCL Logo">
+        <div class="bxf-container-info">
+            <p>
+                &copy; Maharashtra Knowledge Corporation Limited.
+            </p>
+            <p>
+                All Rights Reserved.
+            </p>
+        </div>
+    </div>
+
+  </div>
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style>
+
+</style>
\ No newline at end of file
diff --git a/app/src/components/date-range-pickr.vue b/app/src/components/date-range-pickr.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0daae539b4329ea164e1c3ee0edd0a35e1cc6a92
--- /dev/null
+++ b/app/src/components/date-range-pickr.vue
@@ -0,0 +1,24 @@
+<script setup>
+	import { ref, onMounted } from "vue"
+	import VueDatePicker from "@vuepic/vue-datepicker"
+	import "@vuepic/vue-datepicker/dist/main.css"
+	const props = defineProps({
+		context: Object,
+	})
+	function handleInput(e) {
+		console.log("props", e)
+		props.context.node.input(e)
+	}
+	const selectedDate = [new Date(), new Date(new Date().getTime() + 9 * 24 * 60 * 60 * 1000)]
+	const date = ref()
+	onMounted(() => {
+		const startDate = new Date()
+		const endDate = new Date(new Date().setDate(startDate.getDate() + 7))
+		date.value = [startDate, endDate]
+	})
+</script>
+
+<template>
+	<VueDatePicker v-model="date" @update:model-value="handleInput" range multi-calendars></VueDatePicker>
+</template>
+<style src="@vueform/multiselect/themes/default.css"></style>
diff --git a/app/src/components/download-manager/downloadFile.vue b/app/src/components/download-manager/downloadFile.vue
new file mode 100644
index 0000000000000000000000000000000000000000..67f2138c36b7521034cfcdc15225ef3c9e950cc3
--- /dev/null
+++ b/app/src/components/download-manager/downloadFile.vue
@@ -0,0 +1,128 @@
+<template>
+  <div class="container-fluid" id="downloadFileInner">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Download File
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-6">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="download.cdnBaseUrl" class="p-inputtext p-component w-100"
+                  :class="download.cdnBaseUrl ? 'p-filled': ''" id="url">
+                <label for="url">Enter Base Url</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="download.downloadFileUrl" class="p-inputtext p-component w-100"
+                  :class="download.downloadFileUrl ? 'p-filled': ''" id="downloadFileUrl">
+                <label for="downloadFileUrl">Enter Download File Url</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="download.destinationFileUrl" class="p-inputtext p-component w-100"
+                  :class="download.destinationFileUrl ? 'p-filled': ''" id="destinationFileUrl">
+                <label for="destinationFileUrl">Enter Destination Url</label>
+              </div>
+            </div>
+            <div class="btn-wrapper">
+              <button class="btn btn-submit" @click.prevent="downloadFile">
+                <i class="isax isax-bold-document-download"></i>
+                Download File
+              </button>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-6">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <h4> Testing Parameters </h4>
+            <ul class="list">
+              <li>
+                Base URL
+                <div>
+                  https://csdev.mkcl.org/
+                </div> 
+              </li>
+              <li>
+                Download File URL
+                <div>
+                  server/sls/ProjectConfigBackup/1Mg6VkbM1MQhhKh8z2qGSa42HIY/02_04_2021/1Mg6VkbM1MQhhKh8z2qGSa42HIY_1617343458.json
+                </div>
+              </li>
+              <li>Destination File URL
+                <div>
+                  02_04_2021/
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data() {
+    return {
+      download: {},
+      downloadId: '',
+      downloadResult: '',
+      progressResult: ''
+    }
+  },
+  methods: {
+    downloadFile() {
+      var a = []
+      a.push(this.download.downloadFileUrl)
+      this.download.downloadFileUrl = a
+      new MQL()
+        .setActivity('o.[DownloadFileUsingDM]')
+        .setData(this.download)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('DownloadFileUsingDM', true)
+          if (rs.isValid('DownloadFileUsingDM')) {
+            this.download = {}
+            this.downloadResult = res.result
+            this.$toast.add({ severity: 'success', summary: 'File Download ', detail: 'File Downloaded Successfully', life: 3000 })
+          } else {
+            rs.showErrorToast('DownloadFileUsingDM')
+          }
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+h4 {
+  margin-bottom: 1rem;
+}
+
+.list {
+  padding: 0 1rem;
+
+  li {
+    font-weight: 600;
+
+    div {
+      font-weight: 400;
+      word-break: break-word;
+    }
+
+    &+li {
+      margin-top: 0.75rem;
+    }
+  }
+
+}
+</style>
\ No newline at end of file
diff --git a/app/src/components/download-manager/downloadProgress.vue b/app/src/components/download-manager/downloadProgress.vue
new file mode 100644
index 0000000000000000000000000000000000000000..446d45dddaa226ccb071c87b7508ac792e1735a8
--- /dev/null
+++ b/app/src/components/download-manager/downloadProgress.vue
@@ -0,0 +1,84 @@
+<template>
+	<div class="container-fluid" id="downloadFIleProgress">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Check Progress
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-6">
+				<div class="box-login">
+					<div class="p-card p-component">
+						<div class="field">
+							<div class="p-float-label">
+								<input
+									type="text"
+									v-model="downloadId"
+									class="p-inputtext p-component"
+									:class="downloadId ? 'p-filled' : ''"
+									id="progress"
+								/>
+								<label for="progress">Download Id</label>
+							</div>
+						</div>
+						<div class="btn-wrapper">
+							<button class="btn btn-submit" @click="checkDownloadProgress">
+								<i class="isax isax-bold-tick-circle"></i>
+								Check Progress
+							</button>
+						</div>
+						<div class="field mt-4">
+							<h3>Result</h3>
+							<div class="json-wrapper">
+								<json-viewer :value="progressResult" boxed :expanded="true"></json-viewer>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import MQL from '@/plugins/mql.js'
+  import jsonViewer from 'vue-json-viewer'
+	export default {
+		data() {
+			return {
+				downloadId: '',
+				progressResult: '',
+			}
+		},
+		components: {
+			jsonViewer
+		},
+		methods: {
+			checkDownloadProgress() {
+				new MQL()
+					.setActivity('o.[CheckDownloadedFileProgress]')
+					.setData({ downloadFileId: this.downloadId })
+					.fetch()
+					.then((rs) => {
+						let res = rs.getActivity('CheckDownloadedFileProgress', true)
+						if (rs.isValid('CheckDownloadedFileProgress')) {
+							if (res && res.result) {
+								this.progressResult = res.result
+								this.downloadId = ''
+							} else {
+								// alert('Progress checking failed')
+								this.$toast.add({
+									severity: 'error',
+									summary: 'Progress Check ',
+									detail: 'Progress Check Failed',
+									life: 3000,
+								})
+
+							}
+						} else {
+							rs.showErrorToast('CheckDownloadedFileProgress')
+						}
+					})
+			},
+		},
+	}
+</script>
diff --git a/app/src/components/excel/clientData.vue b/app/src/components/excel/clientData.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c0e369ed4cd558c2a72907dfbb9bb1d38078b5e2
--- /dev/null
+++ b/app/src/components/excel/clientData.vue
@@ -0,0 +1,69 @@
+<template>
+  <div class="container-fluid" id="clientData">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Save Client Data
+    </h2>
+    <div class="subtext">This client data is saved in "Employee" collection of "cs playground" database.</div>
+    <div class="row justify-content-center">
+        <div class="col-6">
+            <div class="box-login">
+                <div class="p-card p-component">
+                   <DataTable :value="empList" v-if="empList && empList.length > 0">
+                    <Column field="name" header="name"></Column>
+                    <Column field="age" header="age"></Column>
+                    <Column field="address" header="address"></Column>
+                   </DataTable>
+                   <div class="empty-state" v-else>Records not found</div>
+                   <div class="btn-wrapper">
+                    <button class="btn btn-submit" @click="saveClientDataUsingExcel">
+                      <i class="isax isax-bold-tick-circle"></i>
+                      Save Data
+                    </button>
+                   </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      empList: [
+        { name: 'vikram', age: 27, address: 'pune' },
+        { name: 'kunal', age: 28, address: 'satara' },
+        { name: 'akshay', age: 29, address: 'mumbai' }
+      ],
+      url: '',
+      excel: {}
+    }
+  },
+  methods: {
+    saveClientDataUsingExcel () {
+      new MQL()
+        .setActivity('o.[SaveClientDataUsingExcel]')
+        .setData(this.empList)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SaveClientDataUsingExcel', true)
+          if (rs.isValid('SaveClientDataUsingExcel')) {
+            this.$toast.add({severity:'success', summary: 'Employees Data ', detail:'Data saved successfully', life: 3000})
+          } else {
+            rs.showErrorToast('SaveClientDataUsingExcel')
+          }
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.subtext {
+  margin-top: 0.25rem;
+  margin-left: 48px;
+}
+</style>
\ No newline at end of file
diff --git a/app/src/components/excel/saveWActivity.vue b/app/src/components/excel/saveWActivity.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2186be84ad7fc6d3f54942f1c0fa49d441ba6f1a
--- /dev/null
+++ b/app/src/components/excel/saveWActivity.vue
@@ -0,0 +1,82 @@
+<template>
+  <div class="container-fluid" id="saveData">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Save excel data
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-6">
+            <div class="box-login">
+                <div class="p-card p-component">
+                    <div class="field">
+                    <label for="text">Activity</label>
+                    <input type="text" class="p-inputtext p-component w-100 mt-2" id="activity">
+                    </div>
+                    <div class="btn-wrapper">
+                        <button class="btn btn-submit" @click.prevent="saveExcelDataUsingActivity">
+                            <i class="isax isax-bold-tick-circle"></i>
+                          Save excel data
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="col-6">
+          <div class="box-login">
+            <div class="p-card p-component">
+              <h4>
+                Testing CDN File
+              </h4>
+              <div class="mt-3">
+                <a href="https://testcdncs.mkcl.org/1TxYD2KhMcczFlxXntsueOYN46J/demoFolder/Test.xlsx">
+                  https://testcdncs.mkcl.org/1TxYD2KhMcczFlxXntsueOYN46J/demoFolder/Test.xlsx
+                </a>
+              </div>
+            </div>
+          </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      url: ''
+    }
+  },
+  components: {
+  },
+  methods: {
+    saveExcelDataUsingActivity () {
+      new MQL()
+        .setActivity('o.[SaveActivityDataUsingExcel]')
+        .setData({ excelURL: this.url })
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SaveActivityDataUsingExcel', true)
+          if (rs.isValid('SaveActivityDataUsingExcel')) {
+            // alert('Excel data saved successfully using activity') 
+            this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Excel data saved successfully using activity', life: 3000})
+            this.url = ''
+          } else {
+            rs.showErrorToast('SaveActivityDataUsingExcel')
+          }
+        })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.subtext {
+  margin-top: 0.75rem;
+  margin-left: 3rem;
+}
+
+h4 + div {
+  word-break: break-word;
+}
+
+</style>
\ No newline at end of file
diff --git a/app/src/components/excel/updateData.vue b/app/src/components/excel/updateData.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e93ae53a5992a283bb52331e266c7044ed4dabf4
--- /dev/null
+++ b/app/src/components/excel/updateData.vue
@@ -0,0 +1,68 @@
+<template>
+  <div class="container-fluid" id="updateData">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Update Data
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-auto">
+            <div class="box-login">
+                <div class="p-card p-component">
+                    <div class="field">
+                      <label for="name">Enter name</label>
+                      <input type="text" class="p-inputtext p-component w-100 mt-2" id="name" v-model="excel.name" required>
+                    </div>
+                    <div class="field">
+                      <label for="mobile">Enter age</label>
+                      <input type="text" class="p-inputtext p-component w-100 mt-2" id="mobile" v-model="excel.age" required>
+                    </div>
+                    <div class="btn-wrapper">
+                        <button class="btn btn-submit" @click.prevent="updateData">
+                            <i class="isax isax-bold-tick-circle"></i>
+                            Submit
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      empList: [
+        { name: 'vikram', age: 27, address: 'pune' },
+        { name: 'kunal', age: 28, address: 'satara' },
+        { name: 'akshay', age: 29, address: 'mumbai' }
+      ],
+
+      mobile: '',
+      excel: {}
+    }
+  },
+  components: {
+  },
+  methods: {
+    updateData () {
+      new MQL()
+        .setActivity('o.[UpdateDataUsingExcel]')
+        .setData([this.excel])
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('UpdateDataUsingExcel', true)
+          if (rs.isValid('UpdateDataUsingExcel')) {
+            // alert('Excel data updated successfully')
+            this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Excel Data Updated Successfully', life: 3000})
+            this.excel = {}
+          } else {
+            rs.showErrorToast('UpdateDataUsingExcel')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/components/i18Demo/Component1.vue b/app/src/components/i18Demo/Component1.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ee5cf4e4503c824e820a6355c65f2ec52b23c399
--- /dev/null
+++ b/app/src/components/i18Demo/Component1.vue
@@ -0,0 +1,33 @@
+<template>
+  <div>
+    <h2>Component 1</h2>
+    <h4 class="mt-2 mb-3">
+      <b>{{ $t('demo.demoHeading') }}</b>
+    </h4>
+    <button class="btn btn-primary" @click="changeLanguage('en')">English</button>
+    <button class="btn btn-secondary" @click="changeLanguage('hi')">Hindi</button>
+    <button class="btn btn-warning" @click="changeLanguage('mr')" >Marathi</button>
+  </div>
+</template>
+
+<script>
+  import { loadLanguageAsync } from '@/setup/i18n-setup.js'
+
+export default {
+  mounted () {
+    this.$i18n.locale = 'hi'
+  },
+  methods: {
+    changeLanguage (lang) {
+      this.$i18n.locale = lang
+      this.$i18n.locale = lang
+      this.$i18n.fallbackLocale = lang
+      loadLanguageAsync(lang)
+      console.log(lang)
+    }
+  }
+}
+</script>
+
+<style>
+</style>
diff --git a/app/src/components/i18Demo/Component2.vue b/app/src/components/i18Demo/Component2.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c0cec42fdbea3c8d8af32ff50464c97b40e8909a
--- /dev/null
+++ b/app/src/components/i18Demo/Component2.vue
@@ -0,0 +1,40 @@
+<template>
+  <div>
+    <h2>Component 2</h2>
+    <h4 class="mt-2 mb-3">
+      <b>{{ $t('component2.title') }}</b>
+    </h4>
+    <button class="btn btn-primary" @click="changeLanguage('en')">English</button>
+    <button class="btn btn-secondary" @click="changeLanguage('hi')">Hindi</button>
+    <button class="btn btn-warning" @click="changeLanguage('mr')" >Marathi</button>
+  </div>
+</template>
+
+<script>
+import { createI18n } from 'vue-i18n'
+export default {
+  i18n: createI18n({ // `i18n` option, setup locale info for component
+    locale: 'mr'
+  }),
+  mounted () {
+    this.loadMessagesFromFile()
+  },
+  methods: {
+    changeLanguage (lang) {
+      this.$i18n.locale = lang
+      this.loadMessagesFromFile()
+    },
+    loadMessagesFromFile () {
+      return new Promise((resolve) => {
+        return import(`../../lang/${this.$i18n.locale}.json`).then(res => {
+          this.$i18n.setLocaleMessage(this.$i18n.locale, res.default)
+          resolve(true)
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style>
+</style>
diff --git a/app/src/components/keymappers/decryptData.vue b/app/src/components/keymappers/decryptData.vue
new file mode 100644
index 0000000000000000000000000000000000000000..96e5100ad1dbde7204202f38b4ffcbfbff142a2d
--- /dev/null
+++ b/app/src/components/keymappers/decryptData.vue
@@ -0,0 +1,66 @@
+<template>
+  <div id="decryptData" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Decrypt Data
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-auto">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text"  v-model="dname" class="p-inputtext p-component" id="dname" :class="dname ? 'p-filled': ''"
+                >
+                  <label for="dname">Decrypt Data</label>
+              </div>
+            </div>
+            <div class="btn-wrapper">
+              <button class="btn btn-submit" @click.prevent="decryptData">
+                <i class="isax isax-bold-shield-slash"></i>
+                Decrypt
+              </button>
+            </div>
+            <div class="field mt-4">
+              <h3>Result</h3>
+              <json-viewer :value="decryptResult" boxed :expanded="true"></json-viewer>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import MQL from '@/plugins/mql.js'
+import jsonViewer from 'vue-json-viewer'
+export default {
+  data() {
+    return {
+      name: '',
+      decryptResult: '',
+      dname: ''
+    }
+  },
+  components: {
+    jsonViewer
+  },
+  methods: {
+    decryptData() {
+      new MQL()
+        .setActivity('o.[DecryptData]')
+        .setData({ name: this.dname })
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('DecryptData', true)
+          if (rs.isValid('DecryptData')) {
+            this.decryptResult = res.result
+            this.dname = ''
+          } else {
+            rs.showErrorToast('DecryptData')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/components/keymappers/encryptData.vue b/app/src/components/keymappers/encryptData.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a3e1e86fbf1d5405ac54be5b797af3750c573093
--- /dev/null
+++ b/app/src/components/keymappers/encryptData.vue
@@ -0,0 +1,72 @@
+<template>
+  <div class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Encrypt Data
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-auto">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" class="p-inputtext p-component" id="ename"  v-model="ename" :class="ename ? 'p-filled': ''"
+                >
+                <label for="ename">Data to Encrypt</label>
+              </div>
+            </div>
+            <div class="btn-wrapper">
+              <button class="btn btn-submit" @click.prevent="encryptData">
+                <i class="isax isax-bold-security-safe"></i>
+                Encrypt Data
+              </button>
+            </div>
+            <div class="field mt-4">
+              <h3>Result</h3>
+              <json-viewer :value="encryptResult" boxed :expanded="true"></json-viewer>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+import jsonViewer from 'vue-json-viewer'
+export default {
+  data() {
+    return {
+      ename: '',
+      name: '',
+      encryptResult: ''
+    }
+  },
+  components: {
+    jsonViewer
+  },
+  methods: {
+    encryptData() {
+      new MQL()
+        .setActivity('o.[EncryptData]')
+        .setData({ name: this.ename })
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('EncryptData', true)
+          if (rs.isValid('EncryptData')) {
+            this.encryptResult = res.result
+            this.ename = ''
+          } else {
+            rs.showErrorToast('EncryptData')
+          }
+        })
+    }
+  }
+}
+</script>
+
+<style>
+
+</style>
\ No newline at end of file
diff --git a/app/src/components/keymappers/hashData.vue b/app/src/components/keymappers/hashData.vue
new file mode 100644
index 0000000000000000000000000000000000000000..662221e872b21fa71c30434ba334dd7e6002e944
--- /dev/null
+++ b/app/src/components/keymappers/hashData.vue
@@ -0,0 +1,69 @@
+<template>
+  <div class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Hash Data
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-auto">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" class="p-inputtext p-component" v-model="name" id="hashName" :class="name ? 'p-filled': ''">
+                <label for="hashName">Enter data to hash</label>
+              </div>
+            </div>
+            <div class="btn-wrapper">
+              <button class="btn btn-submit" @click.prevent="hashData">
+                <i class="isax isax-bold-shield-tick"></i>
+                Hash
+              </button>
+            </div>
+            <div class="field mt-4">
+              <h3>Result</h3>
+              <json-viewer :value="hashResult" boxed :expanded="true"></json-viewer>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+import jsonViewer from 'vue-json-viewer'
+export default {
+  data() {
+    return {
+      hashResult: '',
+      name: ''
+    }
+  },
+  components: {
+    jsonViewer
+  },
+  methods: {
+    hashData() {
+      new MQL()
+        .setActivity('o.[GenerateHash]')
+        .setData({ name: this.name })
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('GenerateHash', true)
+          if (rs.isValid('GenerateHash')) {
+            this.hashResult = res.result
+            this.name = ''
+          } else {
+            rs.showErrorToast('GenerateHash')
+          }
+        })
+    }
+  }
+}
+</script>
+
+<style>
+
+</style>
\ No newline at end of file
diff --git a/app/src/components/keymappers/hashSalt.vue b/app/src/components/keymappers/hashSalt.vue
new file mode 100644
index 0000000000000000000000000000000000000000..fde90ec0264453094cdbd90d91dc45e9cf793a3e
--- /dev/null
+++ b/app/src/components/keymappers/hashSalt.vue
@@ -0,0 +1,74 @@
+<template>
+  <div class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Hash Salt
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-auto">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" class="p-inputtext p-component" :class="sname ? 'active' : ''" v-model="sname" id="sname">
+                <label for="sname">Generate Salt</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" class="p-inputtext p-component" :class="saltKey ? 'active' : ''" v-model="saltKey" id="saltKey">
+                <label for="saltKey">Enter Salt Key</label>
+              </div>
+            </div>
+            <div class="btn-wrapper">
+              <button class="btn btn-submit" @click.prevent="generateSalt">
+                <i class="isax isax-bold-security-card"></i>
+                Generate Salt
+              </button>
+            </div>
+            <div class="field mt-4">
+              <h3>Result</h3>
+              <json-viewer :value="saltResult" boxed :expanded="true"></json-viewer>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+import jsonViewer from 'vue-json-viewer'
+export default {
+  data() {
+    return {
+      sname: '',
+      saltKey: '',
+      name: ''
+    }
+  },
+  components: {
+    jsonViewer
+  },
+  methods: {
+    generateSalt() {
+      new MQL()
+        .setActivity('o.[GenerateSalt]')
+        .setData({ name: this.sname, saltKey: this.saltKey })
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('GenerateSalt', true)
+          if (rs.isValid('GenerateSalt')) {
+            this.saltResult = res.result
+            this.sname = ''
+            this.saltKey = ''
+          } else {
+            rs.showErrorToast('GenerateSalt')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/components/mongodbID/customID.vue b/app/src/components/mongodbID/customID.vue
new file mode 100644
index 0000000000000000000000000000000000000000..278b18c7ec79a14168c2c8983ee16e0886d57d94
--- /dev/null
+++ b/app/src/components/mongodbID/customID.vue
@@ -0,0 +1,68 @@
+<template>
+  <div id="customID" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Custom ID
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-auto">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="obj.objectId" class="p-inputtext p-component" :class="obj.objectId ? 'p-filled' : ''" id="objectID">
+                <label for="objectID">Enter object ID</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="obj.name" class="p-inputtext p-component" :class="obj.name ? 'p-filled' : ''" id="name">
+                <label for="name">Enter name</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="obj.address" class="p-inputtext p-component" :class="obj.address ? 'p-filled' : ''" id="address">
+                <label for="address">Enter address</label>
+              </div>
+            </div>
+            <div class="btn-wrapper">
+              <button class="btn btn-submit" @click="saveCustomId">
+                <i class="isax isax-bold-tick-circle"></i>
+                Save
+              </button>
+            </div>
+
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      obj: {}
+    }
+  },
+  methods: {
+    saveCustomId () {
+      new MQL()
+        .setActivity('o.[SaveCustomObjectID]')
+        .setData(this.obj)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SaveCustomObjectID', true)
+          if (rs.isValid('SaveCustomObjectID')) {
+            this.obj = {}
+          } else {
+            rs.showErrorToast('SaveCustomObjectID')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/components/mongodbID/hexID.vue b/app/src/components/mongodbID/hexID.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8f87adba6e40f94eb6613fe3893aab0717cc20e4
--- /dev/null
+++ b/app/src/components/mongodbID/hexID.vue
@@ -0,0 +1,69 @@
+<template>
+  <div id="hexID" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Insert Custom Hex MongoDB ID
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-auto">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="hobj._id" class="p-inputtext p-component" :class="hobj._id ? 'p-filled' : ''" id="hexObject">
+                <label for="hexObject">Enter Hex Object ID</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="hobj.name" class="p-inputtext p-component" :class="hobj.name ? 'p-filled' : ''" id="name">
+                <label for="name">Enter name</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="hobj.address" class="p-inputtext p-component" :class="hobj.address ? 'p-filled' : ''" id="address">
+                <label for="address">Enter address</label>
+              </div>
+            </div>
+            <div class="btn-wrapper">
+              <button class="btn btn-submit" @click.prevent="saveCustomHexId">
+              <i class="isax isax-bold-tick-circle"></i>
+                Submit
+              </button>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      hobj: {}
+    }
+  },
+  methods: {
+    saveCustomHexId () {
+      new MQL()
+        .setActivity('o.[SaveCustomHexObjectID]')
+        .setData(this.hobj)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SaveCustomHexObjectID', true)
+          if (rs.isValid('SaveCustomHexObjectID')) {
+            this.hobj = {}
+            alert('Custom hex objectId saved successfully')
+          } else {
+            rs.showErrorToast('SaveCustomHexObjectID')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/components/multiselect.vue b/app/src/components/multiselect.vue
new file mode 100644
index 0000000000000000000000000000000000000000..5bb72e11c1748722fc109077179cc8633b307311
--- /dev/null
+++ b/app/src/components/multiselect.vue
@@ -0,0 +1,27 @@
+<script setup>
+	import Multiselect from "@vueform/multiselect"
+	import { ref, onMounted } from "vue"
+	import VueDatePicker from "@vuepic/vue-datepicker"
+	import "@vuepic/vue-datepicker/dist/main.css"
+	const props = defineProps({
+		context: Object,
+	})
+	function handleInput(e) {
+		console.log("props", e)
+		props.context.node.input(e)
+	}
+	const selectedDate = [new Date(), new Date(new Date().getTime() + 9 * 24 * 60 * 60 * 1000)]
+	const options = ["Batman", "Robin", "Joker"]
+	const value = []
+	const date = ref()
+	onMounted(() => {
+		const startDate = new Date()
+		const endDate = new Date(new Date().setDate(startDate.getDate() + 7))
+		date.value = [startDate, endDate]
+	})
+</script>
+
+<template>
+		<Multiselect @change="handleInput" mode="multiple" v-model="value" :options="['Batman', 'Robin', 'Joker']" />
+</template>
+<style src="@vueform/multiselect/themes/default.css"></style>
diff --git a/app/src/components/sessionmanager/deleteData.vue b/app/src/components/sessionmanager/deleteData.vue
new file mode 100644
index 0000000000000000000000000000000000000000..43ce39b9d1ef06ea85a57d2c188fd88f07bf0a0d
--- /dev/null
+++ b/app/src/components/sessionmanager/deleteData.vue
@@ -0,0 +1,72 @@
+<template>
+  <div id="deleteData" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Delete Data from Session
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-auto">
+        <div class="box-login">
+          <FormKit
+						type="form"
+						id="registration-example"
+						:form-class="submitted ? 'hide' : 'show'"
+						submit-label="Register"
+						@submit="deleteSessionData"
+						:actions="false"
+						#default="{ value }"
+					>
+						<FormKit
+							type="text"
+							name="sessionName"
+							label="Session Key"
+							v-model="deleteKey"
+							placeholder="Session Key"
+							help="Enter Session Key"
+							validation="required"
+						/>
+						<button class="btn btn-error" type="submit" label="Delete">Delete</button>
+					</FormKit>
+        </div>
+      </div>
+    </div>
+  </div>
+
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      session: '',
+      deleteKey: ''
+    }
+  },
+  components: {
+  },
+  methods: {
+    deleteSessionData () {
+      new MQL()
+        .setActivity('o.[DeleteDataFromSession]')
+        .setData({ name: this.deleteKey })
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('DeleteDataFromSession', true)
+          if (rs.isValid('DeleteDataFromSession')) {
+            if (res && res.result) {
+              this.sessionResult = res.result
+              this.deleteKey = ''
+              // alert('Data deleted successfully')
+              this.$toast.add({severity:'success', summary: 'Data Delete ', detail:'Data Deleted Successfully', life: 3000})
+            } else {
+              this.$toast.add({severity:'error', summary: 'Data Delete', detail:'Data Deletion Failed', life: 3000})
+            }
+          } else {
+            rs.showErrorToast('DeleteDataFromSession')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/components/sessionmanager/fetchData.vue b/app/src/components/sessionmanager/fetchData.vue
new file mode 100644
index 0000000000000000000000000000000000000000..9b572c0f72fc60c2f68bbcbc615856af436a6b60
--- /dev/null
+++ b/app/src/components/sessionmanager/fetchData.vue
@@ -0,0 +1,87 @@
+<template>
+	<div id="fetchData" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Fetch Data in Session
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-auto">
+				<div class="box-login">
+					<FormKit
+						type="form"
+						id="registration-example"
+						:form-class="submitted ? 'hide' : 'show'"
+						submit-label="Register"
+						@submit="fetchSessionData"
+						:actions="false"
+						#default="{ value }"
+					>
+						<FormKit
+							type="text"
+							name="sessionName"
+							label="Session Key"
+							v-model="fetchKey"
+							placeholder="Session Key"
+							help="Enter Session Key"
+							validation="required"
+						/>
+						<FormKit type="submit" label="Save" />
+					</FormKit>
+					<div class="field">
+						<h3>Result</h3>
+						<json-viewer :value="sessionResult" boxed :expanded="true"></json-viewer>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import MQL from "@/plugins/mql.js"
+	import jsonViewer from "vue-json-viewer"
+	export default {
+		data() {
+			return {
+				session: {},
+				fetchKey: "",
+				sessionResult: "",
+			}
+		},
+		components: {
+			jsonViewer,
+		},
+		methods: {
+			fetchSessionData() {
+				new MQL()
+					.setActivity("o.[FetchDataFromSession]")
+					.setData({ name: this.fetchKey })
+					.fetch()
+					.then((rs) => {
+						let res = rs.getActivity("FetchDataFromSession", true)
+						if (rs.isValid("FetchDataFromSession")) {
+							if (res && res.result) {
+								this.sessionResult = res.result
+								this.fetchKey = ""
+								this.$toast.add({
+									severity: "success",
+									summary: "Fetch Data in Session",
+									detail: "Data fetched successfully",
+									life: 3000,
+								})
+							} else {
+								this.$toast.add({
+									severity: "error",
+									summary: "Fetch Data in Session",
+									detail: "Data fetched failed",
+									life: 3000,
+								})
+							}
+						} else {
+							rs.showErrorToast("FetchDataFromSession")
+						}
+					})
+			},
+		},
+	}
+</script>
diff --git a/app/src/components/sessionmanager/storeData.vue b/app/src/components/sessionmanager/storeData.vue
new file mode 100644
index 0000000000000000000000000000000000000000..9b24ebae13610eaa19fdbfe0aa58df681e7aad2b
--- /dev/null
+++ b/app/src/components/sessionmanager/storeData.vue
@@ -0,0 +1,77 @@
+<template>
+	<div id="storeData" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"> </i>
+			Store Data in Session
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-auto">
+				<div class="box-login">
+					<FormKit
+						type="form"
+						id="registration-example"
+						:form-class="submitted ? 'hide' : 'show'"
+						submit-label="Register"
+						@submit="saveSessionData"
+						:actions="false"
+						#default="{ value }"
+					>
+						<FormKit
+							type="text"
+							name="sessionName"
+							label="Session Key"
+							v-model="session.name"
+							placeholder="Session Key"
+							help="Enter Session Key"
+							validation="required"
+						/>
+						<FormKit
+							type="text"
+							name="sessionName"
+							label="Session Name Value"
+							v-model="session.nameValue"
+							placeholder="Session Name Value"
+							help="Session value is automatically deleted after 5 minutes because session expiration time is set to 5 minute in `StoreDataInSession` activity."
+							validation="required"
+						/>
+            <FormKit type="submit" label="Save"/>
+					</FormKit>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import MQL from "@/plugins/mql.js"
+	export default {
+		data() {
+			return {
+				session: {},
+			}
+		},
+		components: {},
+		methods: {
+			saveSessionData() {
+				new MQL()
+					.setActivity("o.[StoreDataInSession]")
+					.setData(this.session)
+					.fetch()
+					.then((rs) => {
+						rs.getActivity("StoreDataInSession", true)
+						if (rs.isValid("StoreDataInSession")) {
+							this.session = {}
+							this.$toast.add({
+								severity: "success",
+								summary: "Data Saved ",
+								detail: "Data Saved Successfully",
+								life: 3000,
+							})
+						} else {
+							rs.showErrorToast("StoreDataInSession")
+						}
+					})
+			},
+		},
+	}
+</script>
diff --git a/app/src/components/svgs/account_circle_black_24dp.svg b/app/src/components/svgs/account_circle_black_24dp.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3d0f00f7cf65d1c829656f753c5698c0e614c955
--- /dev/null
+++ b/app/src/components/svgs/account_circle_black_24dp.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM7.07 18.28c.43-.9 3.05-1.78 4.93-1.78s4.51.88 4.93 1.78C15.57 19.36 13.86 20 12 20s-3.57-.64-4.93-1.72zm11.29-1.45c-1.43-1.74-4.9-2.33-6.36-2.33s-4.93.59-6.36 2.33C4.62 15.49 4 13.82 4 12c0-4.41 3.59-8 8-8s8 3.59 8 8c0 1.82-.62 3.49-1.64 4.83zM12 6c-1.94 0-3.5 1.56-3.5 3.5S10.06 13 12 13s3.5-1.56 3.5-3.5S13.94 6 12 6zm0 5c-.83 0-1.5-.67-1.5-1.5S11.17 8 12 8s1.5.67 1.5 1.5S12.83 11 12 11z"/></svg>
\ No newline at end of file
diff --git a/app/src/components/upload-manager/uploadFile.vue b/app/src/components/upload-manager/uploadFile.vue
new file mode 100644
index 0000000000000000000000000000000000000000..dae880b66aaad80bf45867087dba045bb6cc4731
--- /dev/null
+++ b/app/src/components/upload-manager/uploadFile.vue
@@ -0,0 +1,169 @@
+<template>
+	<div id="uploadFile" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Upload File
+		</h2>
+		<div class="row">
+			<div class="col-6">
+				<div class="box-login">
+					<!-- <div class="p-card p-component">
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="upload.cdnBaseUrl" class="p-inputtext p-component w-100"
+                  :class="upload.cdnBaseUrl ? 'p-filled' : ''" id="cdnBaseUrl">
+                <label for="cdnBaseUrl">CDN Base Url</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="upload.uploadFileUrl" class="p-inputtext p-component w-100"
+                  :class="upload.uploadFileUrl ? 'p-filled' : ''" id="uploadFileUrl">
+                <label for="uploadFileUrl">File Upload Url</label>
+              </div>
+            </div>
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="upload.destinationFileUrl" class="p-inputtext p-component w-100"
+                  :class="upload.destinationFileUrl ? 'p-filled' : ''" id="destinationFileUrl">
+                <label for="destinationFileUrl">Destination File Url</label>
+              </div>
+            </div>
+            <div class="btn-wrapper">
+              <button class="btn btn-submit" @click.prevent="uploadFile">
+                <i class="isax isax-bold-document-upload"></i>
+                Upload File
+              </button>
+            </div>
+            <div class="field mt-4">
+              <h3>Result</h3>
+              <json-viewer :value="uploadResult" boxed :expanded="true"></json-viewer>
+            </div>
+          </div> -->
+					<FormKit
+						type="form"
+						id="registration-example"
+						:form-class="submitted ? 'hide' : 'show'"
+						submit-label="Upload"
+						@submit="uploadFile"
+						:actions="false"
+						#default="{ value }"
+					>
+						<FormKit
+							type="text"
+							name="sessionName"
+							label="CDN Base Url"
+							v-model="upload.cdnBaseUrl"
+							placeholder="CDN Base Url"
+							help="Enter CDN Base Url"
+							validation="required"
+						/>
+						<FormKit
+							type="text"
+							name="sessionName"
+							label="File Upload Url"
+							v-model="upload.uploadFileUrl"
+							placeholder="File Upload Url"
+							help="Enter File Upload Url"
+							validation="required"
+						/>
+						<FormKit
+							type="text"
+							name="sessionName"
+							label="Destination File Url"
+							v-model="upload.destinationFileUrl"
+							placeholder="Destination File Url"
+							help="Enter Destination File Url"
+							validation="required"
+						/>
+						<FormKit type="submit" label="Upload File" />
+					</FormKit>
+					<div class="field mt-4">
+						<h3>Result</h3>
+						<json-viewer :value="uploadResult" boxed :expanded="true"></json-viewer>
+					</div>
+				</div>
+			</div>
+			<div class="col-6">
+				<div class="box-login">
+						<h4>Please start the multipart server before uploading files testing</h4>
+						<ul class="list">
+							<li>
+								cdnBaseUrl:
+								<div>"https://cstest.mkcl.org/uploadFile/uploadsinglefile"</div>
+							</li>
+							<li>
+								uploadFileUrl:
+								<div>
+									"/app/CoreSLS/ProjectConfigBackup/1JFfwe3g8vHuNOtxk2BsH09pBA5/05_06_2021/1JFfwe3g8vHuNOtxk2BsH09pBA5_1622894824.json"
+								</div>
+							</li>
+							<li>destinationFileUrl: ""</li>
+						</ul>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import MQL from "@/plugins/mql.js"
+	import jsonViewer from "vue-json-viewer"
+	export default {
+		data() {
+			return {
+				upload: {},
+				uploadId: "",
+				uploadResult: "",
+			}
+		},
+		components: {
+			jsonViewer,
+		},
+		methods: {
+			uploadFile() {
+				// var a = []
+				// a.push(this.upload.uploadFileUrl)
+				// this.upload.uploadFileUrl = a
+				var a = {
+					cdnBaseUrl: [this.upload.cdnBaseUrl],
+					uploadFileUrl: [this.upload.uploadFileUrl],
+					destinationFileUrl: [this.upload.destinationFileUrl],
+				}
+				new MQL()
+					.setActivity("o.[UploadFileUsingUM]")
+					.setData(a)
+					.fetch()
+					.then((rs) => {
+						let res = rs.getActivity("UploadFileUsingUM", true)
+						if (rs.isValid("UploadFileUsingUM")) {
+							this.upload = {}
+							this.uploadResult = res.result
+							this.$toast.success("Upload Success")
+						} else {
+							rs.showErrorToast("UploadFileUsingUM")
+						}
+					})
+			},
+		},
+	}
+</script>
+
+<style scoped lang="scss">
+	h4 {
+		margin-bottom: 1rem;
+	}
+	.list {
+		padding: 0 1rem;
+		li {
+			font-weight: 600;
+			div {
+				font-weight: 400;
+				word-break: break-word;
+			}
+			& + li {
+				margin-top: 0.75rem;
+			}
+		}
+	}
+</style>
diff --git a/app/src/components/upload-manager/uploadProgessFile.vue b/app/src/components/upload-manager/uploadProgessFile.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a5f02894773a5faad17ce71ee6afa04f2c331743
--- /dev/null
+++ b/app/src/components/upload-manager/uploadProgessFile.vue
@@ -0,0 +1,106 @@
+<template>
+	<div id="progessFile" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Check Progress
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-auto">
+				<div class="box-login">
+					<!-- <div class="p-card p-component">
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="text" v-model="uploadId" class="p-inputtext p-component" :class="uploadId ? 'p-filled' : ''" id="uploadId">
+                        <label for="uploadId">Upload Id</label>
+                      </div>
+                    </div>
+                    <div class="btn-wrapper">
+                        <button class="btn btn-submit" @click.prevent="checkUploadProgress">
+                            <i class="isax isax-bold-tick-circle"></i>
+                          Check Progress
+                        </button>
+                    </div>
+                    <div class="field mt-4">
+                      <h3>Result</h3>
+                      <json-viewer :value="progressResult" boxed :expanded="true"></json-viewer>
+                    </div>
+                </div> -->
+					<FormKit
+						type="form"
+						id="registration-example"
+						:form-class="submitted ? 'hide' : 'show'"
+						submit-label="Upload"
+						@submit="checkUploadProgress"
+						:actions="false"
+						#default="{ value }"
+					>
+						<FormKit
+							type="text"
+							name="sessionName"
+							label="Upload Id"
+							v-model="uploadId"
+							placeholder="Upload Id"
+							help="Enter Upload Id"
+							validation="required"
+						/>
+						<FormKit type="submit" label="Check Progress" />
+					</FormKit>
+					<div class="field mt-4">
+						<h3>Result</h3>
+						<json-viewer :value="progressResult" boxed :expanded="true"></json-viewer>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import MQL from "@/plugins/mql.js"
+	import jsonViewer from "vue-json-viewer"
+	export default {
+		data() {
+			return {
+				uploadId: "",
+				progressResult: "",
+			}
+		},
+		components: {
+			jsonViewer,
+		},
+		methods: {
+			checkUploadProgress() {
+				new MQL()
+					.setActivity("o.[CheckUploadedFileProgress]")
+					.setData({ uploadFileId: this.uploadId })
+					.fetch()
+					.then((rs) => {
+						let res = rs.getActivity("CheckUploadedFileProgress", true)
+						if (rs.isValid("CheckUploadedFileProgress")) {
+							if (res && res.result) {
+								this.progressResult = res.result
+								this.uploadId = ""
+								this.$toast.add({
+									severity: "success",
+									summary: "Upload Progress",
+									detail: "File Uploaded Successfully",
+									life: 3000,
+								})
+							} else {
+								this.$toast.add({
+									severity: "error",
+									summary: "Upload Progress",
+									detail: "File Upload Failed",
+									life: 3000,
+								})
+							}
+						} else {
+							rs.showErrorToast("CheckUploadedFileProgress")
+						}
+					})
+			},
+		},
+	}
+</script>
+
+<style></style>
diff --git a/app/src/formkit.config.js b/app/src/formkit.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..295521806bfe6bc3ce5c23d5d8e873fa4da540fc
--- /dev/null
+++ b/app/src/formkit.config.js
@@ -0,0 +1,8 @@
+import "@formkit/themes/genesis"
+import { genesisIcons } from "@formkit/icons"
+
+const config = {
+  icons: { ...genesisIcons }
+}
+
+export default config
diff --git a/app/src/index.css b/app/src/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..bd6213e1dfe6b0a79ce7d8b37d0d2dc70f0250bb
--- /dev/null
+++ b/app/src/index.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
\ No newline at end of file
diff --git a/app/src/lang/dv.json b/app/src/lang/dv.json
new file mode 100644
index 0000000000000000000000000000000000000000..3de7ad26f40f361212cef7411347de56ceeaaa88
--- /dev/null
+++ b/app/src/lang/dv.json
@@ -0,0 +1,28 @@
+{
+    "about": {
+      "aboutHeading": "aboutHeading"
+    },
+    "home": {
+      "homeTitle": "homeTitle"
+    },
+    "demo": {
+      "demoHeading": "demoHeading"
+    },
+    "component2": {
+      "title": "title"
+    },
+    "validation": {
+      "nameRequired": "nameRequired",
+      "nameAlpha": "nameAlpha",
+      "emailValid": "emailValid",
+      "emailRequired": "emailRequired",
+      "phoneNumeric": "phoneNumeric",
+      "phoneRequired": "phoneRequired",
+      "fullnameRequired": "fullnameRequired",
+      "fullnameValidate": "fullnameValidate",
+      "credit_cardRequired": "credit_cardRequired",
+      "credit_cardValidate": "credit_cardValidate",
+      "ipValid": "ipValid",
+      "phoneMinLength": "phoneMinLength"
+    }
+  }
\ No newline at end of file
diff --git a/app/src/lang/en.json b/app/src/lang/en.json
new file mode 100644
index 0000000000000000000000000000000000000000..d2eccae7d61203bdd43793be2d3846dce927db38
--- /dev/null
+++ b/app/src/lang/en.json
@@ -0,0 +1,31 @@
+{
+  "about": {
+    "aboutHeading": "This is an about page"
+  },
+  "home": {
+    "homeTitle": "This is home page"
+  },
+  "demo": {
+    "demoHeading": "This is text"
+  },
+  "component2": {
+    "title": "English text (Loaded from file)"
+  },
+  "validation": {
+    "nameRequired": "The Name field is required",
+    "nameAlpha": "The Name field may only contain alphabetic characters.",
+    "emailValid": "The Email field must be a valid email.",
+    "emailRequired": "The Email field is required.",
+    "phoneNumeric": "The Phone number field format is invalid.",
+    "phoneRequired": "Phone no field is required.",
+    "fullnameRequired": "The fullname field is required.",
+    "fullnameValidate": "The fullname field may only contain alphabetic characters as well as spaces.",
+    "credit_cardRequired": "The credit card field is required.",
+    "credit_cardValidate": "The credit card field is invalid.",
+    "credit_cardMinimum":"The credit card field must be of 16 characters.",
+    "ipRequired": "The ip field is required.",
+    "ipValid": "The ip field must be a valid ip address.",
+    "phoneMinLength": "The phone field must be at least 10 characters.",
+    "stateRequired": "The state field is required."
+  }
+}
diff --git a/app/src/lang/hi.json b/app/src/lang/hi.json
new file mode 100644
index 0000000000000000000000000000000000000000..a3924e1044a1be009e9f1c7804449edc15433889
--- /dev/null
+++ b/app/src/lang/hi.json
@@ -0,0 +1 @@
+{"about":{"aboutHeading":"यह एक पेज के बारे में है"},"component2":{"title":"अंग्रेजी पाठ (फ़ाइल से लोड)"},"demo":{"demoHeading":"यह पाठ है"},"home":{"homeTitle":"यह होम पेज है"},"validation":{"credit_cardMinimum":"क्रेडिट कार्ड फ़ील्ड 16 वर्णों की होनी चाहिए।","credit_cardRequired":"क्रेडिट कार्ड फ़ील्ड आवश्यक है।","credit_cardValidate":"क्रेडिट कार्ड फ़ील्ड अमान्य है।","emailRequired":"ईमेल क्षेत्र की आवश्यकता है।","emailValid":"ईमेल फ़ील्ड एक मान्य ईमेल होनी चाहिए।","fullnameRequired":"फुलनाम फ़ील्ड आवश्यक है।","fullnameValidate":"पूर्ण नाम फ़ील्ड में केवल वर्णमाला के साथ-साथ रिक्त स्थान हो सकते हैं।","ipRequired":"आईपी फ़ील्ड की आवश्यकता है।","ipValid":"आईपी फ़ील्ड एक मान्य आईपी पता होना चाहिए।","nameAlpha":"नाम फ़ील्ड में केवल वर्णमाला वर्ण हो सकते हैं।","nameRequired":"नाम का फील्ड आवश्यक है","phoneMinLength":"फोन फ़ील्ड में कम से कम 10 अक्षर होने चाहिए।","phoneNumeric":"फ़ोन नंबर फ़ील्ड प्रारूप अमान्य है।","phoneRequired":"फ़ोन नहीं फ़ील्ड की आवश्यकता है।","stateRequired":"राज्य क्षेत्र की आवश्यकता है।"}}
\ No newline at end of file
diff --git a/app/src/lang/mr.json b/app/src/lang/mr.json
new file mode 100644
index 0000000000000000000000000000000000000000..f48f5ec2423c79f3b96852c06aefc4a5e31e1975
--- /dev/null
+++ b/app/src/lang/mr.json
@@ -0,0 +1,31 @@
+{
+  "about": {
+    "aboutHeading": "हे एक पृष्ठ बद्दल आहे"
+  },
+  "component2": {
+    "title": "इंग्रजी मजकूर (फाइलमधून लोड)"
+  },
+  "demo": {
+    "demoHeading": "हा मजकूर आहे"
+  },
+  "home": {
+    "homeTitle": "हे मुख्यपृष्ठ आहे"
+  },
+  "validation": {
+    "credit_cardMinimum": "क्रेडिट कार्ड फील्ड 16 वर्णांचे असणे आवश्यक आहे.",
+    "credit_cardRequired": "क्रेडिट कार्ड फील्ड आवश्यक आहे.",
+    "credit_cardValidate": "क्रेडिट कार्ड फील्ड अवैध आहे.",
+    "emailRequired": "ईमेल फील्ड आवश्यक आहे.",
+    "emailValid": "ईमेल फील्ड वैध ईमेल असणे आवश्यक आहे.",
+    "fullnameRequired": "पूर्ण नाव फील्ड आवश्यक आहे.",
+    "fullnameValidate": "पूर्ण नाव फील्डमध्ये फक्त वर्णमाला तसेच रिक्त स्थान असू शकतात.",
+    "ipRequired": "आयपी फील्ड आवश्यक आहे.",
+    "ipValid": "आयपी फील्ड वैध आयपी पत्ता असणे आवश्यक आहे.",
+    "nameAlpha": "नेम फील्डमध्ये फक्त वर्णमाला वर्ण असू शकतात.",
+    "nameRequired": "नाव फील्ड आवश्यक आहे",
+    "phoneMinLength": "फोन फील्ड किमान 10 वर्णांचे असणे आवश्यक आहे.",
+    "phoneNumeric": "फोन नंबर फील्ड स्वरूपन अवैध आहे.",
+    "phoneRequired": "फोन फील्ड आवश्यक नाही.",
+    "stateRequired": "राज्य फील्ड आवश्यक आहे."
+  }
+}
diff --git a/app/src/main.js b/app/src/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..be890ac4444e81a082e5e2c6bebb989a59b6e0b2
--- /dev/null
+++ b/app/src/main.js
@@ -0,0 +1,98 @@
+import { createApp, h } from 'vue'
+import VueClipboard from 'vue3-clipboard'
+import App from './App.vue'
+import router from './router'
+import './registerServiceWorker'
+import mqlOptions from './plugins/mqlOptions.js'
+import { loadLanguageAsync, i18n } from './setup/i18n-setup.js'
+import { createMetaManager } from "vue-meta";
+import Toaster from '@meforma/vue-toaster'
+import '/assets/plugins/bootstrap/bootstrap-grid.min.css'
+import '/assets/plugins/bootstrap/bootstrap-utilities.min.css'
+import '../assets/fonts/iconsax/style.css'
+import '../assets/css/template.scss'
+import "./index.css"
+import { plugin, defaultConfig } from '@formkit/vue'
+import formKitConfig from './formkit.config'
+import { createPinia } from 'pinia'
+const piniaStore = createPinia()
+var vm = createApp({
+  render: () => h(App),
+})
+// window.app = vm
+vm.use(piniaStore)
+vm.$router = router
+vm.use(i18n)
+vm.use(router)
+vm.use(plugin, defaultConfig(formKitConfig))
+vm.use(defaultConfig)
+vm.use(createMetaManager())
+vm.use(VueClipboard, {
+  autoSetContainer: true,
+  appendToBody: true,
+})
+vm.use(Toaster, {
+  position: "top-right",
+  duration: 3000
+})
+var baseURL = '/server'
+var cdnBaseURL = '/cdnserver'
+
+vm.use(mqlOptions, {
+  baseURL: baseURL,
+  cdnBaseURL: cdnBaseURL,
+  cdnConfig: [],
+})
+
+// axios.defaults.baseURL = baseURL
+// TODO: set axios header on login  to session storage
+// axios.defaults.headers.common['Authorization'] = 'Bearer ' + token
+
+// TODO: delete axios header on logout and clear session storage
+// delete axios.defaults.headers.common['Authorization']
+// sessionStorage.setItem(
+//   'user-token',
+//   'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.qCJ-hcgSTLgkaT7kfI6--xRm4IEpPFQmMj3UZ94gNo4'
+// )
+
+// vm.use(VueLocalStorage);
+
+router.beforeEach((to, from, next) => {
+
+  const nearestWithTitle = to.matched
+    .slice()
+    .reverse()
+    .find((r) => r.meta && r.meta.title)
+  const nearestWithMeta = to.matched
+    .slice()
+    .reverse()
+    .find((r) => r.meta && r.meta.metaTags)
+
+  if (nearestWithTitle) document.title = nearestWithTitle.meta.title
+
+  Array.from(document.querySelectorAll('[data-vue-router-controlled]')).map((el) => el.parentNode.removeChild(el))
+
+  if (!nearestWithMeta) return loadLanguageAsync(to.meta.lang).then(() => next())
+  nearestWithMeta.meta.metaTags
+    .map((tagDef) => {
+      const tag = document.createElement('meta')
+      Object.keys(tagDef).forEach((key) => {
+        tag.setAttribute(key, tagDef[key])
+      })
+      tag.setAttribute('data-vue-router-controlled', '')
+      return tag
+    })
+    .forEach((tag) => document.head.appendChild(tag))
+  next()
+})
+// axios.interceptors.request.use(function (config) {
+//   // if (config.url.indexOf('/r/') !== -1) {  // Check for restricted request
+//   if (config.headers.common['Authorization']) {
+//   } else {
+//   }
+//   // }
+//   return config
+// }, function (error) {
+//   return Promise.reject(error)
+// })
+vm.mount('#app')
diff --git a/app/src/plugins/mql.js b/app/src/plugins/mql.js
new file mode 100644
index 0000000000000000000000000000000000000000..1f196b206e912413931b4cc98b81b12c74e7f352
--- /dev/null
+++ b/app/src/plugins/mql.js
@@ -0,0 +1,348 @@
+import axios from 'axios'
+import Response from '@/plugins/response.js'
+import Swal from 'sweetalert2'
+import {main} from "../store/index"
+
+function dialogConfirm({ title, text, errMsg }) {
+  return new Promise((resolve, reject) => {
+    Swal.fire({
+      title: title,
+      text: text,
+      confirmButtonText: 'Yes',
+      showCancelButton: true,
+      cancelButtonText: 'Cancel'
+    }).then((obj) => {
+      if (obj.isConfirmed) {
+        resolve()
+      } else {
+        console.log("in reject", new Error(errMsg));
+        reject(new Error(errMsg))
+      }
+    })
+  })
+}
+
+class MQL {
+  constructor(strActivities = null) {
+    let cancel
+    let isDevelopment = process.env.NODE_ENV !== 'production'
+    let CancelToken = axios.CancelToken
+    this.strActivities = strActivities
+    this.isQuery = false
+    this.isActivity = false
+    this.fetchableMap = new Map()
+    this.version = window.app.getVersion()
+    this.region = window.app.getRegion()
+    this.appCode = window.app.getAppCode()
+    this.activityType = 'o'
+    this.mqlString = '/mql'
+    this.isConfirm = false
+    this.showPageLoader = true
+    const QueryActivityKey = 'FetchQueryData'
+    this.mainStore = main()
+    const ActivitySplitter = '.['
+
+    const ObjActivityNameKey = 'ActivityName'
+
+    const ObjActivityData = 'Data'
+    const mqlInstance = axios.create({
+      baseURL: window.app.getBaseURL()
+      // baseURL: window.location.host,
+      // transformRequest: axios.defaults.transformRequest.concat(
+      //   function (data, headers) {
+      //     // compress strings if over 1KB
+      //     if (typeof data === 'string' && data.length > 10) {
+      //       headers['Content-Encoding'] = 'gzip';
+      //       return pako.gzip(data);
+      //     } else {
+      //       // delete is slow apparently, faster to set to undefined
+      //       //headers['Content-Encoding'] = undefined;
+      //       return data;
+      //     }
+      //   }
+      // )
+    })
+    mqlInstance.interceptors.request.use(
+      function (config) {
+        if (config.url.indexOf('r/mql') !== -1 || config.url.indexOf('r/c/mql') !== -1) {
+          // Check for restricted request
+          if (sessionStorage.getItem('user-token') === null) {
+            cancel('Operation canceled by the MQL interceptor.')
+            // TODO: Uncomment below code for dispatch
+            // this.mainStore .dispatch('AUTH_LOGOUT')
+          }
+        }
+        return config
+      },
+      function (error) {
+        return Promise.reject(error)
+      }
+    )
+    // mqlInstance.interceptors.response.use(
+    //   function (config) {
+    //     if (config.url.indexOf('r/') !== -1) {
+    //       // Check for restricted request
+    //       if (sessionStorage.getItem('user-token') === null) {
+    //         cancel('Operation canceled by the MQL interceptor.')
+    //         //TODO: Uncomment below code for dispatch
+    //         // this.mainStore .dispatch('AUTH_LOGOUT')
+    //       }
+    //     }
+    //     return config
+    //   },
+    //   function (error) {
+    //     return Promise.reject(error)
+    //   }
+    // )
+    this.formatActivity = function (activityStr) {
+      let activityArray = []
+      this.activityType = activityStr.split(ActivitySplitter)[0]
+      this.fetchableMap.set('ActivityType', this.activityType)
+      activityArray = activityStr
+        .split(ActivitySplitter)[1]
+        .substring(0, activityStr.split(ActivitySplitter)[1].length - 1)
+        .split(',')
+      activityArray.map((item) => {
+        let obj = {}
+
+        let srvName
+        obj[ObjActivityData] = null
+        if (item.match(/query_/) !== null && item.match(/query_/).length > 0) {
+          obj[item] = item.trim()
+          srvName = item.trim()
+          this.isQuery = true
+        } else {
+          obj[ObjActivityNameKey] = item.trim()
+          srvName = item.trim()
+          this.isActivity = true
+        }
+        this.fetchableMap.set(srvName, obj)
+      })
+    }
+    this.deepFreeze = (object) => {
+      // Retrieve the property names defined on object
+      var propNames = Object.getOwnPropertyNames(object)
+      // Freeze properties before freezing self
+      for (let name of propNames) {
+        let value = object[name]
+        object[name] = value && typeof value === 'object' ? this.deepFreeze(value) : value
+      }
+      // return Object.freeze(object)
+      return object
+    }
+    this.generateURL = (activityType, customURL) => {
+      if (customURL != null && customURL !== undefined) {
+        return customURL + this.getVersion() + this.getRegion() + this.getAppCode() + this.getServiceURL(activityType)
+      } else {
+        return this.getVersion() + this.getRegion() + this.getAppCode() + this.getServiceURL(activityType)
+      }
+    }
+    this.getServiceURL = (activityType) => {
+      return (
+        (activityType.toLowerCase() === 'c' ? 'r/' + activityType.toLowerCase() : activityType.toLowerCase()) +
+        this.mqlString
+      )
+    }
+    this.generateHeaders = (activityType, activities, headers = {}, isQuery = false) => {
+      headers['Service-Header'] = isQuery ? QueryActivityKey : activities
+      if (activityType !== 'o') {
+        headers['Authorization'] = 'Bearer ' + sessionStorage.getItem('user-token')
+      }
+      return headers
+    }
+    this.getVersion = function () {
+      // return ''
+      return this.version != null || this.version !== undefined ? this.version + '/' : ''
+    }
+    this.getRegion = function () {
+      // return ''
+      return this.region != null || undefined !== this.region ? this.region + '/' : ''
+    }
+    this.getAppCode = function () {
+      // return ''
+      return this.appCode != null || this.appCode !== undefined ? this.appCode + '/' : ''
+    }
+    /* Setter methods */
+    this.setActivity = function (strActivities = null) {
+      this.strActivities = strActivities
+      this.formatActivity(this.strActivities)
+      return this
+    }
+    this.setData = function (strActivity = null, strDataObj = null) {
+      if (strActivity === null) {
+      } else if (strDataObj === null) {
+        // common data
+        for (let [key, value] of this.fetchableMap) {
+          if (value[ObjActivityData] === null) {
+            value[ObjActivityData] = strActivity
+            this.fetchableMap.set(key, value)
+          }
+        }
+      } else {
+        // service specific
+        let activityValue = this.fetchableMap.get(strActivity)
+        activityValue[ObjActivityData] = strDataObj
+        this.fetchableMap.set(strActivity, activityValue)
+      }
+      return this
+    }
+    this.setHeader = function (obj_header = {}) {
+      this.fetchableMap.set('Header', obj_header)
+      return this
+    }
+    this.setCustomURL = function (str_customURL = null) {
+      this.fetchableMap.set('CustomURL', str_customURL)
+      return this
+    }
+    this.showConfirmDialog = function (boolConfirmation = false) {
+      this.isConfirm = boolConfirmation
+      return this
+    }
+    this.enablePageLoader = function (boolShowPageLoader = false) {
+      this.showPageLoader = boolShowPageLoader
+      return this
+    }
+    this.setLoginActivity = function () {
+      this.setActivity('o.[ldapLogin]')
+      // this.setCustomURL('/o/mql/login')
+      // this.activityType = ''
+      // this.mqlString = ''
+      return this
+    }
+    this.fetch = function (docId = null) {
+      return new Promise((resolve, reject) => {
+        let self = this
+        if (this.isConfirm) {
+          dialogConfirm({
+            title: 'Confirmation',
+            text: 'Are you sure you want to continue ?',
+            errMsg: 'Cancelled by User',
+          })
+            .then(() => {
+              let rs = self.run(docId, self.isQuery, self.isActivity, self.fetchableMap, self.activityType)
+              resolve(rs)
+            })
+            .catch(e => {
+              // eslint-disable-next-line prefer-promise-reject-errors
+              resolve(new Response({
+                data: {
+                  error: e.message,
+                  errorCode: 1990,
+                  result: null
+                }
+              }))
+            })
+        } else {
+          let rs = self.run(docId, self.isQuery, self.isActivity, self.fetchableMap, self.activityType)
+          resolve(rs)
+        }
+      }).catch((error) => {
+        // Handling development related errors
+        if (isDevelopment) {
+          alert(error)
+        }
+      })
+    }
+    this.run = function (docId = null, isQuery = false, isActivity = false, fetchableMap = null, activityType = 'o') {
+      return new Promise((resolve) => {
+        // TODO: seperate this in new function
+        let txt = 'Processing'
+        if (this.showPageLoader && this.mainStore !== undefined && this.mainStore !== null) {
+          this.mainStore.MUTATE_PAGE_BLOCKER(true)
+        }
+        if (docId !== null && document.getElementById(docId) !== null) {
+          txt = document.getElementById(docId).innerHTML
+          document.getElementById(docId).disabled = true
+          document.getElementById(docId).innerHTML = 'Processing'
+        }
+        let postParamObject = {}
+        let activities = ''
+        if (isQuery && isActivity) {
+          let obj = {}
+          obj.data = {}
+          obj.data.error = 'Can not support query and activity in a single execution'
+          obj.data.errorCode = 1990
+          obj.data.result = null
+
+          resolve(new Response(obj))
+        } else {
+          fetchableMap.set('isQuery', isQuery)
+        }
+        let payloadObject = {}
+        for (var [key, value] of fetchableMap) {
+          if (
+            key.search('ActivityType') < 0 &&
+            key.search('Header') < 0 &&
+            key.search('CustomURL') < 0 &&
+            key.search('isQuery') < 0
+          ) {
+            activities = activities + ',' + key
+            // eslint-disable-next-line standard/computed-property-even-spacing
+            payloadObject[
+              key.match(/query_/) !== null && key.match(/query_/).length > 0
+                ? key.substring('query_'.length, key.length)
+                : key
+            ] = value.Data
+          }
+        }
+        if (this.isQuery) {
+          payloadObject['fetchGroup'] = activities
+            .substring(1, activities.length)
+            .split(',')
+            .map((item) => {
+              return item.substring('query_'.length, item.length)
+            })
+          postParamObject[QueryActivityKey] = payloadObject
+        } else {
+          postParamObject = payloadObject
+        }
+        mqlInstance({
+          url: this.generateURL(activityType, fetchableMap.get('CustomURL')),
+          method: 'Post',
+          headers: this.generateHeaders(
+            activityType,
+            activities.substring(1, activities.length),
+            fetchableMap.get('Header'),
+            isQuery
+          ),
+          data: postParamObject,
+          cancelToken: new CancelToken(function executor(c) {
+            cancel = c
+          })
+        })
+          .then((res) => {
+            if (docId !== null && document.getElementById(docId) !== null) {
+              document.getElementById(docId).disabled = false
+              document.getElementById(docId).innerHTML = txt
+            }
+            if (this.showPageLoader) {
+              this.mainStore.MUTATE_PAGE_BLOCKER(false)
+            }
+            resolve(new Response(res))
+          })
+          .catch((error) => {
+            let obj = {}
+            obj.data = {}
+            if (docId !== null && document.getElementById(docId) !== null) {
+              document.getElementById(docId).disabled = false
+              document.getElementById(docId).innerHTML = txt
+            }
+            if (this.showPageLoader) {
+              this.mainStore.MUTATE_PAGE_BLOCKER(false)
+            }
+            obj.data.error = error.message
+            obj.data.errorCode = 1990
+            obj.data.result = null
+            resolve(new Response(obj))
+          })
+      }).catch((error) => {
+        // Handling development related errors
+        if (isDevelopment) {
+          alert(error)
+        }
+      })
+    }
+  }
+}
+
+export default MQL
diff --git a/app/src/plugins/mqlAssetFDB.js b/app/src/plugins/mqlAssetFDB.js
new file mode 100644
index 0000000000000000000000000000000000000000..28abefa521bf07096fba1f362516aef3fcdd32f4
--- /dev/null
+++ b/app/src/plugins/mqlAssetFDB.js
@@ -0,0 +1,294 @@
+import axios from "axios"
+import Response from "@/plugins/response.js"
+import { main } from "../store/index"
+const Vue = window.app
+
+class mqlAssetFDB {
+  constructor(indexId = null) {
+    let cancel
+    let isDevelopment = process.env.NODE_ENV !== "production"
+    let CancelToken = axios.CancelToken
+    this.assetData = new FormData()
+    this.route = "assetfdb"
+    this.downloadRoute = "assetdownload"
+    this.hostName = ""
+    this.fileName = ""
+    this.indexType = "o"
+    this.indexId = indexId
+    this.recordId = ""
+    const IndexSplitter = "."
+    this.customURL = ""
+    this.mainStore = main()
+    const mqlInstance = axios.create({
+      baseURL: Vue.getBaseURL(),
+    })
+
+    mqlInstance.interceptors.request.use(
+      function (config) {
+        if (config.url.indexOf("r/mql") !== -1 || config.url.indexOf("r/c/mql") !== -1) {
+          if (sessionStorage.getItem("user-token") === null) {
+            cancel("Operation canceled by the MQL interceptor.")
+          }
+        }
+        return config
+      },
+      function (error) {
+        return Promise.reject(error)
+      }
+    )
+
+    const setHeaders = (headers = {}) => {
+      headers["Authorization"] = "Bearer " + sessionStorage.getItem("user-token")
+      headers["Content-Type"] = "multipart/form-data"
+      return headers
+    }
+
+    this.formatIndex = function (indexIdStr) {
+      this.indexType = indexIdStr.split(IndexSplitter)[0]
+      this.indexId = indexIdStr.split(IndexSplitter)[1]
+    }
+
+    // TODO: Validate the necessary params by creating a helper function
+    // to generate url for uploading an asset
+    this.generateUploadURL = () => {
+      let url = `${this.indexType}/${this.route}/${this.hostName}/${this.indexId}`
+      if (this.customURL) {
+        url = `${this.customURL}/${url}`
+      } else {
+        url = `/${url}`
+      }
+      return url
+    }
+    this.generateUpdateURL = () => {
+      let url = `${this.indexType}/${this.route}/${this.hostName}/${this.indexId}`
+      if (this.recordId) {
+        url = `${url}/${this.recordId}`
+      } else {
+        url = `${url}/`
+        return url
+      }
+      if (this.customURL) {
+        url = `${this.customURL}/${url}`
+        return url
+      } else {
+        url = `/${url}`
+        return url
+      }
+    }
+    this.generateStreamURL = (assetPath) => {
+      let url = `${this.indexType}/${this.route}`
+      if (assetPath) {
+        url = `${url}/${assetPath}`
+      } else {
+        console.error("Asset Path cannot be null")
+        return
+      }
+      if (this.customURL) {
+        url = `${this.customURL}/${url}`
+        return url
+      } else {
+        url = `/server/${url}`
+        return url
+      }
+    }
+    this.generateDownloadURL = (assetPath) => {
+      let url = `${this.indexType}/${this.downloadRoute}`
+      if (assetPath) {
+        url = `${url}/${assetPath}`
+      } else {
+        console.error("Asset Path cannot be null")
+        return
+      }
+      if (this.customURL) {
+        url = `${this.customURL}/${url}`
+        return url
+      } else {
+        url = `/server/${url}`
+        return url
+      }
+    }
+    this.setIndex = function (indexId) {
+      this.formatIndex(indexId)
+      return this
+    }
+
+    this.setHostName = function (hostName) {
+      this.hostName = hostName
+      return this
+    }
+    this.setFormData = (formData) => {
+      this.fileName = formData.get("file").name
+      this.assetData.append("asset", formData.get("file"))
+      return this
+    }
+
+    this.setCustomURL = (customURL) => {
+      this.customURL = customURL
+      return this
+    }
+
+    this.setAssetData = function (assetData) {
+      assetData = JSON.stringify(assetData)
+      this.assetData.set("data", assetData)
+      return this
+    }
+
+    this.enablePageLoader = function (boolShowPageLoader = false) {
+      this.showPageLoader = boolShowPageLoader
+      return this
+    }
+
+    this.setUpdateWithRecordId = function (recordId) {
+      this.recordId = recordId
+      return this
+    }
+
+    this.uploadAssetFile = (docId = null) => {
+      let txt = ""
+      if (this.showPageLoader) {
+        // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', true)
+        this.mainStore.MUTATE_PAGE_BLOCKER(true)
+      }
+      return new Promise((resolve) => {
+        if (docId !== null && document.getElementById(docId) !== null) {
+          txt = document.getElementById(docId).innerHTML
+          document.getElementById(docId).disabled = true
+          document.getElementById(docId).innerHTML = "Processing"
+        }
+        let url = ""
+        if (this.recordId) {
+          url = this.generateUpdateURL()
+        } else {
+          url = this.generateUploadURL()
+        }
+        if (this.indexId) {
+          mqlInstance({
+            url: url,
+            method: "POST",
+            headers: setHeaders(),
+            data: this.assetData,
+            cancelToken: new CancelToken(function executor(c) {
+              cancel = c
+            }),
+          })
+            .then((res) => {
+              if (this.showPageLoader) {
+                // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false)
+                this.mainStore.MUTATE_PAGE_BLOCKER(true)
+              }
+              if (docId !== null && document.getElementById(docId) !== null) {
+                document.getElementById(docId).disabled = false
+                document.getElementById(docId).innerHTML = txt
+              }
+              let obj = {}
+              obj.data = {}
+              obj.data.errorCode = 1000
+              obj.data.result = res.data
+              resolve(new Response(obj))
+            })
+            .catch((error) => {
+              let obj = {}
+              obj.data = {}
+              if (docId !== null && document.getElementById(docId) !== null) {
+                document.getElementById(docId).disabled = false
+                document.getElementById(docId).innerHTML = txt
+              }
+              if (this.showPageLoader) {
+                // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false)
+                this.mainStore.MUTATE_PAGE_BLOCKER(false)
+              }
+              obj.data.error = error.message
+              obj.data.errorCode = 1990
+              obj.data.result = null
+              resolve(new Response(obj))
+            })
+        } else {
+          if (docId !== null && document.getElementById(docId) !== null) {
+            document.getElementById(docId).disabled = false
+            document.getElementById(docId).innerHTML = txt
+          }
+          let obj = {}
+          obj.data = {}
+          obj.data.error = "Data Not Found" + this.assetData
+          obj.data.errorCode = 1990
+          obj.data.result = null
+          resolve(new Response(obj))
+        }
+      }).catch((error) => {
+        // Handling development related errors
+        if (isDevelopment) {
+          alert(error)
+        }
+      })
+    }
+
+    this.download = (assetPath, docId = null) => {
+      let txt = ""
+      if (this.showPageLoader) {
+        // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', true)
+        this.mainStore.MUTATE_PAGE_BLOCKER(true)
+      }
+      return new Promise((resolve) => {
+        if (docId !== null && document.getElementById(docId) !== null) {
+          txt = document.getElementById(docId).innerHTML
+          document.getElementById(docId).disabled = true
+          document.getElementById(docId).innerHTML = "Processing"
+        }
+        if (assetPath) {
+          window.open(this.generateDownloadURL(assetPath), "_blank")
+        } else {
+          if (docId !== null && document.getElementById(docId) !== null) {
+            document.getElementById(docId).disabled = false
+            document.getElementById(docId).innerHTML = txt
+          }
+          let obj = {}
+          obj.data = {}
+          obj.data.error = "No Data Found" + this.assetData
+          obj.data.errorCode = 1990
+          obj.data.result = null
+          resolve(new Response(obj))
+        }
+      }).catch((error) => {
+        // Handling development related errors
+        if (isDevelopment) {
+          alert(error)
+        }
+      })
+    }
+    this.render = (assetPath, docId = null) => {
+      let txt = ""
+      if (this.showPageLoader) {
+        // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', true)
+        this.mainStore.MUTATE_PAGE_BLOCKER(true)
+      }
+      return new Promise((resolve) => {
+        if (docId !== null && document.getElementById(docId) !== null) {
+          txt = document.getElementById(docId).innerHTML
+          document.getElementById(docId).disabled = true
+          document.getElementById(docId).innerHTML = "Processing"
+        }
+        if (assetPath) {
+          window.open(this.generateStreamURL(assetPath), "_blank")
+        } else {
+          if (docId !== null && document.getElementById(docId) !== null) {
+            document.getElementById(docId).disabled = false
+            document.getElementById(docId).innerHTML = txt
+          }
+          let obj = {}
+          obj.data = {}
+          obj.data.error = "No Data Found" + this.assetData
+          obj.data.errorCode = 1990
+          obj.data.result = null
+          resolve(new Response(obj))
+        }
+      }).catch((error) => {
+        // Handling development related errors
+        if (isDevelopment) {
+          alert(error)
+        }
+      })
+    }
+  }
+}
+
+export default mqlAssetFDB
diff --git a/app/src/plugins/mqlCdn.js b/app/src/plugins/mqlCdn.js
new file mode 100644
index 0000000000000000000000000000000000000000..e7a83b11741ee65ad435c61136cc08b0008dfa87
--- /dev/null
+++ b/app/src/plugins/mqlCdn.js
@@ -0,0 +1,341 @@
+import axios from 'axios'
+import Response from '@/plugins/response.js'
+import { main } from "../store/index"
+const Vue = window.app
+
+class MQLCdn {
+  constructor() {
+    // eslint-disable-next-line
+    let cancel
+    let requestProcessedWithoutErrorCode = 1000
+    let isDevelopment = process.env.NODE_ENV !== 'production'
+    this.fileName = ''
+    this.formData = new FormData()
+    this.formData.set('enctype', 'multipart/form-data')
+    this.clientId = ''
+    this.bucketId = ''
+    this.isPrivateBucket = false
+    this.cdnURL = ''
+    this.cdnPath = ''
+    this.directoryPath = ''
+    this.forceCreateDirectory = true
+    this.showPageLoader = false
+    this.GateWayConfigObj = {}
+    this.savedConfig = {}
+    this.mainStore = main()
+    let CancelToken = axios.CancelToken
+    const mqlInstance = axios.create({
+      baseURL: Vue.getCDNBaseURL()
+    })
+
+    // To set cdnPath and authorization header in request
+    const setHeaders = (headers = {}) => {
+      headers['Authorization'] = 'Bearer ' + sessionStorage.getItem('user-token')
+      if (this.directoryPath) {
+        headers['directoryPath'] = this.directoryPath
+      }
+      return headers
+    }
+
+    // To set the bucket config data in multipart formrequest data to send to cdn
+    const setBucketConfigInFormData = (data) => {
+      this.formData.append('BucketId', this.bucketId)
+      this.formData.append('JWTKey', data.jwtKey)
+      this.formData.append('IsPrivateBucket', data.isPrivateBucket)
+      this.formData.append('forceCreateDirectory', this.forceCreateDirectory)
+    }
+
+    // To get the filename from the request url for download
+    const getFilenameFromUrl = (url) => {
+      const pathname = decodeURIComponent(new URL(url).pathname)
+      const index = pathname.lastIndexOf('/')
+      return (index !== -1 ? pathname.substring(index + 1) : pathname)
+    }
+
+    // To prepare post request to actual cdn server
+    const prepareMQLCDNRequest = (requestType, cdnURL, docId, txt) => {
+      return new Promise((resolve) => {
+        // client side file size check
+        if (this.bucketId !== undefined) {
+          if (this.savedConfig.maxFileSize && this.formData.get('file') && this.formData.get('file').size > this.savedConfig.maxFileSize) {
+            if (docId !== null && document.getElementById(docId) !== null) {
+              document.getElementById(docId).disabled = false
+              document.getElementById(docId).innerHTML = txt
+            }
+            let obj = {}
+            obj.data = {}
+            obj.data.error = 'File size exceeds the maximum limit of ' + this.savedConfig.maxFileSize / (1024 * 1024) + ' MB.'
+            obj.data.errorCode = 1990
+            obj.data.result = null
+            return resolve(new Response(obj))
+          }
+
+          mqlInstance({
+            url: this.cdnURL,
+            method: requestType,
+            headers: setHeaders(),
+            data: this.formData,
+            cancelToken: new CancelToken(function executor(c) {
+              cancel = c
+            })
+          })
+            .then(res => {
+              let obj = {}
+              obj.data = {}
+              obj.data.errorCode = 1000
+              obj.data.result = res.data.result
+              if (res.data.errorCode !== requestProcessedWithoutErrorCode) {
+                obj.data.errorCode = res.data.errorCode
+                obj.data.error = res.data.error
+                if (this.showPageLoader) {
+                  this.mainStore.MUTATE_PAGE_BLOCKER(false)
+                }
+                if (docId !== null && document.getElementById(docId) !== null) {
+                  document.getElementById(docId).disabled = false
+                  document.getElementById(docId).innerHTML = txt
+                }
+              }
+              resolve(new Response(obj))
+            })
+            .catch(error => {
+              console.log('fail error', error.message)
+              let obj = {}
+              obj.data = {}
+              if (docId !== null && document.getElementById(docId) !== null) {
+                document.getElementById(docId).disabled = false
+                document.getElementById(docId).innerHTML = txt
+              }
+              if (this.showPageLoader) {
+                // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false)
+                this.mainStore.MUTATE_PAGE_BLOCKER(false)
+
+              }
+              obj.data.error = error.message
+              obj.data.errorCode = 1990
+              obj.data.result = null
+              resolve(new Response(obj))
+            })
+        } else {
+          if (docId !== null && document.getElementById(docId) !== null) {
+            document.getElementById(docId).disabled = false
+            document.getElementById(docId).innerHTML = txt
+          }
+          let obj = {}
+          obj.data = {}
+          obj.data.error = 'Invalid Bucket Key ' + this.bucketId
+          obj.data.errorCode = 1990
+          obj.data.result = null
+          resolve(new Response(obj))
+        }
+      }).catch(error => {
+        // Handling development related errors
+        if (isDevelopment) {
+          alert(error)
+        }
+      })
+    }
+
+    // To route request to actual cdn server
+    const uploadFileToCDN = (docId = null, cdnURL = '') => {
+      let txt = ''
+      if (this.showPageLoader) {
+        // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', true)
+        this.mainStore.MUTATE_PAGE_BLOCKER(true)
+
+      }
+      return new Promise((resolve) => {
+        if (docId !== null && document.getElementById(docId) !== null) {
+          txt = document.getElementById(docId).innerHTML
+          document.getElementById(docId).disabled = true
+          document.getElementById(docId).innerHTML = 'Processing'
+        }
+        prepareMQLCDNRequest('POST', cdnURL, docId, txt).then(cdnResponse => {
+          if (this.showPageLoader) {
+            // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false)
+            this.mainStore.MUTATE_PAGE_BLOCKER(false)
+
+          }
+          if (docId !== null && document.getElementById(docId) !== null) {
+            document.getElementById(docId).disabled = false
+            document.getElementById(docId).innerHTML = txt
+          }
+          resolve(cdnResponse)
+        })
+      }).catch(error => {
+        // Handling development related errors
+        console.log(error)
+        if (isDevelopment) {
+          alert(error)
+        }
+      })
+    }
+
+    // To set the filename in formData of multipart request
+    this.setFileName = (fileName) => {
+      if (fileName !== '' && fileName !== undefined) {
+        this.fileName = fileName.trim()
+        this.formData.append('fileName', this.fileName)
+      } else {
+        this.fileName = ''
+      }
+      return this
+    }
+
+    // To set the path of file to be saved in
+    this.setCDNPath = (cdnPath) => {
+      this.cdnPath = cdnPath
+      return this
+    }
+    // To set the path of file to be saved in
+    this.setDirectoryPath = (directoryPath, forceCreate = true) => {
+      this.directoryPath = directoryPath
+      this.forceCreateDirectory = forceCreate
+      return this
+    }
+
+    // To prepare formData
+    this.setFormData = (formData) => {
+      this.formData = formData
+      return this
+    }
+
+    // To activate page loader while request completes processing
+    this.enablePageLoader = function (boolShowPageLoader = false) {
+      this.showPageLoader = boolShowPageLoader
+      return this
+    }
+
+    // To get the bucket config from bucket name
+    this.setBucketKey = (bucketId) => {
+      this.bucketId = bucketId
+      // fetchBucketConfigFromKey(bucketId)
+      this.GateWayConfigObj.bucketConfig = []
+      let data = {
+        'bucketId': bucketId
+      }
+      this.GateWayConfigObj.bucketConfig.push(data)
+      return this
+    }
+
+    // To set the purposeId for cdn
+    this.setPurposeId = (purposeId) => {
+      this.GateWayConfigObj.purposeId = purposeId
+      return this
+    }
+
+    // To set the clientId for cdn
+    this.setClientId = (clientId) => {
+      this.GateWayConfigObj.clientId = clientId
+      return this
+    }
+
+    // To set the userId for cdn
+    this.setUserId = (userId) => {
+      this.GateWayConfigObj.userId = userId
+      return this
+    }
+
+    const getFileFromCDN = (cdnURL = '') => {
+      return new Promise((resolve) => {
+        mqlInstance({
+          url: cdnURL,
+          method: 'GET',
+          headers: setHeaders(),
+          responseType: 'blob',
+          cancelToken: new CancelToken(function executor(c) {
+            cancel = c
+          })
+        })
+          .then(res => {
+            this.fileName = getFilenameFromUrl(this.cdnURL)
+            const url = window.URL.createObjectURL(new Blob([res.data], { type: 'application/octet-stream' }))
+            var a = document.createElement('a')
+            a.href = url
+            a.download = this.fileName
+            a.target = '_blank'
+            a.click()
+          })
+          .catch(error => {
+            console.log('fail error', error.message)
+            let obj = {}
+            obj.data = {}
+            if (this.showPageLoader) {
+              // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false)
+              this.mainStore.MUTATE_PAGE_BLOCKER(false)
+
+            }
+            obj.data.error = error.message
+            obj.data.errorCode = 1990
+            obj.data.result = null
+            resolve(new Response(obj))
+          })
+      }).catch(error => {
+        // Handling development related errors
+        console.log(error)
+        if (isDevelopment) {
+          alert(error)
+        }
+      })
+    }
+
+    this.uploadFile = (docId = null) => {
+      this.cdnURL = '/uploadfile'
+      let obj = {}
+      obj.data = {}
+
+      this.savedConfig.jwtKey = ''
+      this.savedConfig.isPrivateBucket = true
+
+      setBucketConfigInFormData(this.savedConfig)
+      return new Promise((resolve) => {
+        // uploadFileToCDN(docId, this.savedConfig.cdnURL).then(cdnres => {
+        uploadFileToCDN(docId, this.cdnURL).then(cdnres => {
+          obj.data = cdnres.raw
+          resolve(new Response(obj))
+        })
+      })
+    }
+
+    this.downloadFile = (docId = null) => {
+      let txt = ''
+      if (this.showPageLoader) {
+        // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', true)
+        this.mainStore.MUTATE_PAGE_BLOCKER(true)
+
+      }
+      if (docId !== null && document.getElementById(docId) !== null) {
+        txt = document.getElementById(docId).innerHTML
+        document.getElementById(docId).disabled = true
+        document.getElementById(docId).innerHTML = 'Processing'
+      }
+
+      return new Promise((resolve) => {
+        if (this.cdnPath.includes('http://') || this.cdnPath.includes('https://')) {
+          this.cdnURL = this.cdnPath
+          getFileFromCDN(this.cdnURL).then(res => {
+            resolve(res)
+          })
+        } else {
+          this.cdnURL = window.location.origin + Vue.getCDNBaseURL() + '/' + this.cdnPath
+          getFileFromCDN(this.cdnURL).then(res => {
+            resolve(res)
+          })
+        }
+        if (this.showPageLoader) {
+          // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false)
+          this.mainStore.MUTATE_PAGE_BLOCKER(false)
+        }
+        if (docId !== null && document.getElementById(docId) !== null) {
+          document.getElementById(docId).disabled = false
+          document.getElementById(docId).innerHTML = txt
+        }
+      }).catch(error => {
+        // Handling development related errors
+        if (isDevelopment) {
+          alert(error)
+        }
+      })
+    }
+  }
+}
+export default MQLCdn
diff --git a/app/src/plugins/mqlOptions.js b/app/src/plugins/mqlOptions.js
new file mode 100644
index 0000000000000000000000000000000000000000..820e26fe3498c3bf4cad4d8f98d4da975e839664
--- /dev/null
+++ b/app/src/plugins/mqlOptions.js
@@ -0,0 +1,60 @@
+export default {
+  install: (Vue, options) => {
+    let cdnServerList = []
+    let baseURL = options.baseURL
+    let cdnBaseURL = options.cdnBaseURL
+    let version = options.version
+    let region = options.region
+    let appCode = options.appCode
+    let pageLoader = false
+    // TODO: check for values on staging /development/ production
+    let bucketConfigurations = process.env.NODE_ENV !== 'production' ? options.cdnConfig : null
+
+    Vue.getBucketConfigByKey = (bucketId) => {
+      let result = bucketConfigurations.find(bucket => bucket.bucketId === bucketId)
+      return result
+    }
+    Vue.$PageLoader = pageLoader
+    Vue.setPageLoader = (show = false) => {
+      alert(show)
+      pageLoader = show
+    }
+    Vue.getBaseURL = () => {
+      return baseURL
+    }
+    Vue.getCDNBaseURL = () => {
+      return cdnBaseURL
+    }
+    Vue.setBaseURL = (str) => {
+      baseURL = str
+    }
+
+    Vue.getVersion = function () {
+      return version
+    }
+    Vue.setVersion = function (str) {
+      version = str
+    }
+
+    Vue.getRegion = function () {
+      return region
+    }
+    Vue.setRegion = function (str) {
+      region = str
+    }
+
+    Vue.getAppCode = function () {
+      return appCode
+    }
+    Vue.setAppCode = function (str) {
+      appCode = str
+    }
+    Vue.getServerList = function (purposeId, bucketId) {
+      let result = cdnServerList.find(purpose => (purpose.purposeId === purposeId && purpose.bucketId === bucketId))
+      return result
+    }
+    Vue.setServerList = function (obj) {
+      cdnServerList.push(obj)
+    }
+  }
+}
diff --git a/app/src/plugins/response.js b/app/src/plugins/response.js
new file mode 100644
index 0000000000000000000000000000000000000000..cdc8bb39bbb33a5bbb7d4867ed3fc4834e0eb494
--- /dev/null
+++ b/app/src/plugins/response.js
@@ -0,0 +1,124 @@
+import router from '@/router.js'
+class Response {
+  constructor(objRaw) {
+    this.raw = objRaw.data
+    this.headers = objRaw.headers
+    this.isReactive = false
+    if (this.headers !== undefined) {
+      if (this.headers.authorization !== undefined) {
+        sessionStorage.setItem('user-token', this.headers.authorization)
+      }
+    }
+
+    this.setReactivity = isReactive => {
+      this.isReactive = isReactive
+    }
+    this.deepFreeze = object => {
+      // Retrieve the property names defined on object
+      if (object === undefined || object === null) {
+        return object
+      }
+      var propNames = Object.getOwnPropertyNames(object)
+      // Freeze properties before freezing self
+      for (let name of propNames) {
+        let value = object[name]
+        object[name] =
+          value && typeof value === 'object' ? this.deepFreeze(value) : value
+      }
+      return Object.freeze(object)
+    }
+    this.getRaw = function (isReactive = false) {
+      return isReactive ? this.raw : this.deepFreeze(this.raw)
+    }
+    this.getHeaders = function () {
+      return this.headers
+    }
+    this.showElement = function (strDocId) {
+      if (strDocId != null) {
+        var x = document.getElementById(strDocId)
+        if (x.style.display === 'none') {
+          x.style.display = 'block'
+        }
+      }
+    }
+    this.hideElement = function (strDocId) {
+      if (strDocId != null) {
+        var x = document.getElementById(strDocId)
+        x.style.display = 'none'
+      }
+    }
+    this.getActivity = function (strActivity, isReactive = false) {
+      // TODO: if calling auto set the local cache property
+
+      if (strActivity.split('_').length > 1) {
+        //     alert('query')
+        return isReactive
+          ? this.raw.FetchQueryData.result[strActivity.substring('query_'.length, strActivity.length)]
+          : this.deepFreeze(
+            this.raw.FetchQueryData.result[strActivity.substring('query_'.length, strActivity.length)]
+          )
+      } else {
+        return isReactive
+          ? this.raw[strActivity]
+          : this.deepFreeze(this.raw[strActivity])
+      }
+    }
+    this.Navigate = function (
+      str_routeName = null,
+      str_activityData = null,
+      str_key = null
+    ) {
+      router.push({
+        name: str_routeName,
+        params: { [str_key]: this.getActivity(str_activityData, true) }
+      })
+    }
+
+    this.isValid = function (strActivity = null) {
+      // NOTE: check global error and activity specific error
+      if (strActivity === null) {
+        // check for global errorCode
+        return !!(this.raw.errorCode === 1000 || this.raw.errorCode === 0)
+      } else {
+        // check for specific
+        if (strActivity.split('_').length > 1) {
+          // query activity
+          return !!(
+            this.raw['FetchQueryData'].errorCode === 1000 ||
+            this.raw['FetchQueryData'].errorCode === 0
+          )
+        } else {
+          return !!(
+            this.raw[strActivity].errorCode === 1000 ||
+            this.raw[strActivity].errorCode === 0
+          )
+        }
+      }
+    }
+    this.uploadedFileURL = function () {
+      return this.raw.result
+    }
+
+    this.getAssetPath = function () {
+      return this.raw.result.path // returns path where your asset is stored
+    }
+
+    // this.getAssetContent = function () {
+    //   return this.raw.result // returns the data in your asset
+    // }
+
+    this.showErrorToast = function (strActivity = null) {
+      if (strActivity === null) {
+         window.app.$toast.error(this.raw.error)
+      } else {
+        if (strActivity.split('_').length > 1) {
+            window.app.$toast.error(this.raw['FetchQueryData'].error)
+        } else {
+          window.app.$toast.error(this.raw[strActivity].error)
+        }
+      }
+      return this
+    }
+  }
+}
+export default Response
diff --git a/app/src/registerServiceWorker.js b/app/src/registerServiceWorker.js
new file mode 100644
index 0000000000000000000000000000000000000000..83f1b482f07ec347bfb1c2161a7a5065a08fb2f1
--- /dev/null
+++ b/app/src/registerServiceWorker.js
@@ -0,0 +1,23 @@
+import { register } from 'register-service-worker'
+
+if (process.env.NODE_ENV === 'production') {
+  register(`${process.env.BASE_URL}sw.js`, {
+    ready () {
+      console.log(
+        'App is being served from cache by a service worker.\n'
+      )
+    },
+    cached () {
+      console.log('Content has been cached for offline use.')
+    },
+    updated () {
+      console.log('New content is available; please refresh.')
+    },
+    offline () {
+      console.log('No internet connection found. App is running in offline mode.')
+    },
+    error (error) {
+      console.error('Error during service worker registration:', error)
+    }
+  })
+}
\ No newline at end of file
diff --git a/app/src/router.js b/app/src/router.js
new file mode 100644
index 0000000000000000000000000000000000000000..705ccae16eef977f8937d5ce422c8b4bd7e4fb0b
--- /dev/null
+++ b/app/src/router.js
@@ -0,0 +1,394 @@
+import { createRouter, createWebHashHistory } from 'vue-router'
+
+function loadView(view) {
+  return () =>
+    import(/* webpackChunkName: "view-[request]" */ `@/views/${view}.vue`)
+}
+
+function loadHashComponent(component) {
+  return () =>
+    import(/* webpackChunkName: "component-[request]" */ `@/components/keymappers/${component}.vue`)
+}
+
+function loadBLComponent(component) {
+  return () =>
+    import(/* webpackChunkName: "component-[request]" */ `@/components/BL/${component}.vue`)
+}
+
+function loadMongoComponent(component) {
+  return () =>
+    import(/* webpackChunkName: "component-[request]" */ `@/components/mongodbID/${component}.vue`)
+}
+
+function loadExcelComponent(component) {
+  return () =>
+    import(/* webpackChunkName: "component-[request]" */ `@/components/excel/${component}.vue`)
+}
+function loadUploadManagerComponent(component) {
+  return () =>
+    import(/* webpackChunkName: "component-[request]" */ `@/components/upload-manager/${component}.vue`)
+}
+function loadSessionManagerComponent(component) {
+  return () =>
+    import(/* webpackChunkName: "component-[request]" */ `@/components/sessionmanager/${component}.vue`)
+}
+function loadDownloadManagerComponent(component) {
+  return () =>
+    import(/* webpackChunkName: "component-[request]" */ `@/components/download-manager/${component}.vue`)
+}
+export default createRouter({
+  history: createWebHashHistory(),
+  routes: [
+    {
+      path: '/',
+      name: 'home',
+      component: loadView('Home'),
+      meta: { title: 'Home', lang: 'en', icon: 'mdi mdi-home-outline' },
+    },
+    {
+      path: '/formkitcomposition',
+      name: 'FormKitComposition',
+      component: loadView('FormKitCustomComposition'),
+      meta: { title: 'FormKitComposition', lang: 'en', icon: 'mdi mdi-home-outline' },
+    },
+    {
+      path: '/formkitoption',
+      name: 'FormKitOption',
+      component: loadView('FormKitCustomOption'),
+      meta: { title: 'FormKitOption', lang: 'en', icon: 'mdi mdi-home-outline' },
+    },
+    {
+      path: '/about',
+      name: 'about',
+      component: loadView('About'),
+      meta: { title: 'About', lang: 'en', icon: 'mdi mdi-information-variant' },
+    },
+    {
+      path: '/login',
+      name: 'login',
+      component: loadView('Login'),
+      meta: { title: 'Login', lang: 'mr', icon: 'mdi mdi-account' },
+    },
+    {
+      path: '/registration',
+      name: 'registration',
+      component: loadView('Registration'),
+      meta: { title: 'Registration', lang: 'mr', icon: 'mdi mdi-account-edit' },
+    },
+    {
+      path: '/mqlRequestDemo',
+      name: 'mqlRequestDemo',
+      component: loadView('MQLRequestDemo'),
+      meta: { title: 'MQLRequestDemo', lang: 'en', icon: 'mdi mdi-presentation-play' },
+    },
+    {
+      path: '/i18Demo',
+      name: 'i18Demo',
+      component: loadView('I18Demo'),
+      meta: { title: 'Language Demo', lang: 'en', icon: 'mdi mdi-eject-outline' },
+    },
+    {
+      path: '/validator',
+      name: 'validator',
+      component: loadView('Validator'),
+      meta: { title: 'Validator', lang: 'en', icon: 'mdi mdi-check-all' },
+    },
+    {
+      path: '/encryption',
+      name: 'encryption',
+      component: loadView('Encryption'),
+      meta: { title: 'Encrypt', lang: 'en', icon: 'mdi mdi-laptop' },
+    },
+    {
+      path: '/cdnUpload',
+      name: 'cdnUpload',
+      component: loadView('CdnUpload'),
+      meta: { title: 'Cdn Upload', lang: 'en', icon: 'mdi mdi-upload' },
+    },
+    {
+      path: '/tableDemo',
+      name: 'tableDemo',
+      component: loadView('TableDemo'),
+      meta: { title: 'Table Demo', lang: 'en', icon: 'mdi mdi-file-table-outline' },
+    },
+    {
+      path: '/vueMetaExample/:title',
+      name: 'vueMetaExample',
+      component: loadView('vueMetaExample'),
+      meta: { title: 'vueMetaExample', lang: 'en', icon: 'mdi mdi-arrow-expand' },
+    },
+    {
+      path: '/clipboard',
+      name: 'clipboard',
+      component: loadView('vueClipboard'),
+      meta: { title: 'vueClipboard', lang: 'en', icon: 'mdi mdi-arrow-expand' },
+    },
+    {
+      path: '/MqlAssetFDBDemo',
+      name: 'MqlAssetFDBDemo',
+      component: loadView('MqlAssetFDBDemo'),
+      meta: {
+        title: 'Mql Request For Asset FDB Demo', lang: 'en',
+        icon: 'mdi mdi-database-plus',
+      },
+    },
+    {
+      path: '/sessionmgr',
+      name: 'sessionmgr',
+      component: loadView('SessionManager'),
+      meta: {
+        title: 'Session Manager Demo', lang: 'en',
+        icon: 'mdi mdi-compass',
+      },
+    },
+    {
+      path: '/uploadmanager',
+      name: 'uploadmanager',
+      component: loadView('UploadManager'),
+      meta: {
+        title: 'Upload Manager Demo', lang: 'en',
+        icon: 'mdi mdi-upload',
+      },
+    },
+    {
+      path: '/downloadmanager',
+      name: 'downloadmanager',
+      component: loadView('DownloadManager'),
+      meta: {
+        title: 'Download Manager Demo', lang: 'en',
+        icon: 'mdi mdi-download',
+      },
+    },
+    {
+      path: '/serversidepagination',
+      name: 'serversidepagination',
+      component: loadView('ServerSidePagination'),
+      meta: {
+        title: 'Server Side Pagination Demo', lang: 'en',
+        icon: 'mdi mdi-google-pages',
+      },
+    },
+    {
+      path: '/keymapper',
+      name: 'keymapper',
+      component: loadView('KeyMapper'),
+      meta: {
+        title: 'Key Mapper Demo', lang: 'en',
+        icon: 'mdi mdi-sort',
+      },
+    },
+    {
+      path: '/excel',
+      name: 'excel',
+      component: loadView('Excel'),
+      meta: {
+        title: 'Excel Demo', lang: 'en',
+        icon: 'mdi mdi-file-excel',
+      },
+    },
+    {
+      path: '/lastinsertedId',
+      name: 'lastinsertedId',
+      component: loadView('LastInsertedId'),
+      meta: {
+        title: 'Last Inserted Id Demo',
+        icon: 'mdi  mdi-border-color',
+      },
+    },
+    {
+      path: '/forloop',
+      name: 'forloop',
+      component: loadView('ForLoop'),
+      meta: {
+        title: 'For Loop Demo', lang: 'en',
+        icon: 'mdi  mdi-refresh',
+      },
+    },
+    {
+      path: '/sendSms',
+      name: 'sendSms',
+      component: loadView('sms'),
+      meta: {
+        title: 'SMS Demo', lang: 'en',
+        icon: 'mdi  mdi-comment-text-outline',
+      },
+    },
+    {
+      path: '/sendEmail',
+      name: 'sendEmail',
+      component: loadView('email'),
+      meta: {
+        title: 'Email Demo', lang: 'en',
+        icon: 'mdi  mdi-email',
+      },
+    },
+    {
+      path: '/sendOtp',
+      name: 'sendOtp',
+      component: loadView('otp'),
+      meta: {
+        title: 'OTP Demo', lang: 'en',
+        icon: 'mdi  mdi-numeric-0-box',
+      },
+    },
+    {
+      path: '/autoBL',
+      name: 'autoBL',
+      component: loadView('autoBL'),
+      meta: {
+        title: 'AutoBL Demo', lang: 'en',
+        icon: 'mdi  mdi-code-array',
+      },
+    },
+    {
+      path: '/updateUserDataUsingBL',
+      name: 'updateUserDataUsingBL',
+      component: loadView('updateUserDataUsingBL'),
+      meta: {
+        title: 'Update User Data Using BL Demo', lang: 'en',
+        icon: 'mdi  mdi-crop-free',
+      },
+    },
+    {
+      path: '/insertCustomMongoId',
+      name: 'insertCustomMongoId',
+      component: loadView('insertCustomMongoId'),
+      meta: {
+        title: 'Insert Custom Mongo Id', lang: 'en',
+        icon: 'mdi  mdi-code-braces',
+      },
+    },
+    {
+      path: '/classroom',
+      name: 'classroom',
+      component: loadView('Classroom'),
+      meta: {
+        title: 'Insert Custom Mongo Id', lang: 'en',
+        icon: 'mdi  mdi-library-books',
+      },
+    },
+    {
+      path: '/tailwindForm',
+      name: 'tailwindForm',
+      component: loadView('tailwindForm'),
+      meta: {
+        title: 'Insert Custom Mongo Id', lang: 'en',
+        icon: 'mdi  mdi-library-books',
+      },
+    },
+    {
+      path: '/sendStaticMessages',
+      component: loadView('sendStaticMessages'),
+    },
+    {
+      path: '/sendDynamicMessages',
+      component: loadView('sendDynamicMessages'),
+    },
+    {
+      path: '/sendStaticEmails',
+      component: loadView('sendStaticEmails'),
+    },
+    {
+      path: '/sendDynamicEmails',
+      component: loadView('sendDynamicEmails'),
+    },
+    {
+      path: '/generateOTP',
+      component: loadView('generateOTP'),
+    },
+    {
+      path: '/validateOTP',
+      component: loadView('validateOTP'),
+    },
+    {
+      path: '/hashData',
+      name: 'hashData',
+      component: loadHashComponent('hashData'),
+    },
+    {
+      path: '/hashSalt',
+      name: 'hashSalt',
+      component: loadHashComponent('hashSalt'),
+    },
+    {
+      path: '/encryptData',
+      name: 'encrpytData',
+      component: loadHashComponent('encryptData')
+    },
+    {
+      path: '/decryptData',
+      name: 'decrpytData',
+      component: loadHashComponent('decryptData'),
+    },
+    {
+      path: '/clientData',
+      name: 'clientData',
+      component: loadExcelComponent('clientData'),
+    },
+    {
+      path: '/updateData',
+      name: 'updateData',
+      component: loadExcelComponent('updateData'),
+    },
+    {
+      path: '/saveWActivity',
+      name: 'saveWActivity',
+      component: loadExcelComponent('saveWActivity'),
+    },
+    {
+      path: '/storeData',
+      name: 'storeData',
+      component: loadSessionManagerComponent('storeData'),
+    },
+    {
+      path: '/fetchData',
+      name: 'fetchData',
+      component: loadSessionManagerComponent('fetchData'),
+    },
+    {
+      path: '/deleteData',
+      name: 'deleteData',
+      component: loadSessionManagerComponent('deleteData'),
+    },
+    {
+      path: '/updateUser',
+      name: 'updateUser',
+      component: loadBLComponent('updateUser'),
+    },
+    {
+      path: '/updateDbSave',
+      name: 'updateDbSave',
+      component: loadBLComponent('updateDbSave'),
+    },
+    {
+      path: '/customID',
+      name: 'customID',
+      component: loadMongoComponent('customID'),
+    },
+    {
+      path: '/hexID',
+      name: 'hexID',
+      component: loadMongoComponent('hexID'),
+    },
+    {
+      path: '/uploadFile',
+      name: 'uploadFile',
+      component: loadUploadManagerComponent('uploadFile'),
+    },
+    {
+      path: '/uploadProgessFile',
+      name: 'uploadProgessFile',
+      component: loadUploadManagerComponent('uploadProgessFile'),
+    },
+    {
+      path: '/downloadFile',
+      name: 'downloadFile',
+      component: loadDownloadManagerComponent('downloadFile'),
+    },
+    {
+      path: '/downloadProgress',
+      name: 'downloadProgress',
+      component: loadDownloadManagerComponent('downloadProgress'),
+    },
+  ],
+})
diff --git a/app/src/setup/i18n-setup.js b/app/src/setup/i18n-setup.js
new file mode 100644
index 0000000000000000000000000000000000000000..ced6330f94f18e6149fa363ef894ddb2dcb9b441
--- /dev/null
+++ b/app/src/setup/i18n-setup.js
@@ -0,0 +1,45 @@
+import { createI18n } from 'vue-i18n'
+import messages from '@/lang/en.json'
+import axios from 'axios'
+export const i18n = createI18n({
+  locale: 'en', // set locale
+  fallbackLocale: 'en',
+  messages, // set locale messages
+  silentTranslationWarn: true,
+  silentFallbackWarn: true,
+  missingWarn: false,
+  fallbackWarn: false,
+})
+
+const loadedLanguages = [] // our default language that is preloaded
+
+function setI18nLanguage (lang) {
+  i18n.global.locale = lang
+  i18n.global.fallbackLocale = lang
+  axios.defaults.headers.common['Accept-Language'] = lang
+  document.querySelector('html').setAttribute('lang', lang)
+  return lang
+}
+export async function loadLanguageAsync(lang) {
+  if (lang === "" || lang === undefined) {
+    const msgs = await import(
+      /* webpackChunkName: "locale-[request]" */ `../lang/${lang}.json`
+    );
+    i18n.global.setLocaleMessage("en", msgs.default);
+    return setI18nLanguage("en");
+  } else {
+    if (!i18n.global.locale.value !== lang) {
+      if (!loadedLanguages.includes(lang)) {
+        const msgs_1 = await import(
+          /* webpackChunkName: "locale-[request]" */ `../lang/${lang}.json`
+        );
+        i18n.global.setLocaleMessage(lang, msgs_1.default);
+        loadedLanguages.push(lang);
+        return setI18nLanguage(lang);
+      }
+      return Promise.resolve(setI18nLanguage(lang));
+    }
+  }
+
+  return Promise.resolve(lang);
+}
diff --git a/app/src/setup/init.js b/app/src/setup/init.js
new file mode 100644
index 0000000000000000000000000000000000000000..fc140a421adbc7d020a16cfcd1486fb89ddfcaee
--- /dev/null
+++ b/app/src/setup/init.js
@@ -0,0 +1 @@
+// function that shall call during application loading
diff --git a/app/src/store/index.js b/app/src/store/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..0c37efaf3a1d26e18e84d753d23003ee6c80aa23
--- /dev/null
+++ b/app/src/store/index.js
@@ -0,0 +1,13 @@
+import { defineStore } from 'pinia'
+
+export const main = defineStore('main', {
+  state: () => ({ isPageBlocked: false }),
+  getters: {
+    Boolean: state => state.isPageBlocked
+  },
+  actions: {
+    MUTATE_PAGE_BLOCKER(payload){
+      this.isPageBlocked=payload
+    }
+  },
+})
diff --git a/app/src/store/modules/login.js b/app/src/store/modules/login.js
new file mode 100644
index 0000000000000000000000000000000000000000..ab46248b57dbb4124e2d5b6467d0405d774ff3d3
--- /dev/null
+++ b/app/src/store/modules/login.js
@@ -0,0 +1,68 @@
+import router from '../../router'
+import { defineStore } from 'pinia'
+import MQL from '@/plugins/mql.js'
+export const login = defineStore('login', {
+  persist: {
+    storage: sessionStorage,
+    // paths:['token','status']
+  },
+    state: () => ({ 
+        token: sessionStorage.getItem('user-token') || '',
+        status: '',
+    }),
+    getters:{
+      isAuthenticated:(state) => !!state.token,
+      authStatus:(state)=>state.status
+    },
+    actions:{
+      MUTATE_AUTH_REQUEST(){
+        this.status = 'loading'
+      },
+      MUTATE_AUTH_SUCCESS(token){
+        this.status = 'sucess'
+        this.token = token
+      },
+      MUTATE_AUTH_ERROR(){
+        this.status = 'error'
+      },
+      AUTH_REQUEST(payload) {
+        return new Promise((resolve) => {
+         this.MUTATE_AUTH_REQUEST()
+          sessionStorage.setItem('user-token', 'token')
+          // axios.defaults.headers.common['Authorization'] = 'token'
+          new MQL()
+            .setLoginActivity()
+            .setData(payload)
+          // .showConfirmDialog(true)
+            .fetch('loginBtn')
+            .then((response) => {
+              let res = response.getActivity('ldapLogin', false)
+              // response.hideElement('loginFormId')
+              if (response.isValid('ldapLogin')) {
+                let token = response.getHeaders().authorization
+                sessionStorage.setItem('user-token', token)
+                this.MUTATE_AUTH_SUCCESS(token)
+                resolve(res.result)
+              } else {
+                this.MUTATE_AUTH_ERROR()
+                sessionStorage.removeItem('user-token')
+                response.showErrorToast('ldapLogin')
+              }
+            })
+        })
+      },
+    
+      AUTH_LOGOUT () {
+        return new Promise((resolve) => {
+          sessionStorage.removeItem('user-token')
+          // remove the axios default header
+          // delete axios.defaults.headers.common['Authorization']
+          router.push({
+            name: 'login',
+          })
+          resolve()
+        })
+      },
+    
+    }
+})
\ No newline at end of file
diff --git a/app/src/store/types.js b/app/src/store/types.js
new file mode 100644
index 0000000000000000000000000000000000000000..f5c5dd0416eac966cab0a02b5274c4b39e35a1b7
--- /dev/null
+++ b/app/src/store/types.js
@@ -0,0 +1,8 @@
+// Login Actions
+export const AUTH_REQUEST = 'AUTH_REQUEST'
+export const AUTH_LOGOUT = 'login/AUTH_REQUEST'
+
+// Login Mutations
+export const MUTATE_AUTH_REQUEST = 'login/MUTATE_AUTH_REQUEST'
+export const MUTATE_AUTH_SUCCESS = 'login/MUTATE_AUTH_LOGOUT'
+export const MUTATE_AUTH_ERROR = 'login/MUTATE_AUTH_LOGOUT'
diff --git a/app/src/views/About.vue b/app/src/views/About.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d84abb785c72f4bacea88c5652543b06da13d137
--- /dev/null
+++ b/app/src/views/About.vue
@@ -0,0 +1,46 @@
+<template>
+  <FormKit
+    type="form"
+    #default="{ value }"
+    :actions="false"
+  >
+   <FormKit
+      type="dropdown"
+      name="framework"
+      label="Choose a frontend framework"
+      placeholder="Example placeholder"
+      :options="frameworks"
+    >
+      <!--OPTION SLOT-->
+      <template #option="{ option }">
+        <div class="formkit-option">
+          <img
+            :src="option.asset"
+            alt="optionAvatar"
+          />
+          <span>
+            {{ option.label }}
+          </span>
+        </div>
+      </template>
+      <!---->
+    </FormKit>
+    <pre wrap>{{ value }}</pre>
+  </FormKit>
+</template>
+
+<script setup>
+const frameworks = [
+  { label: 'React', value: 'react' },
+  { label: 'Vue', value: 'vue' },
+  { label: 'Angular', value: 'angular' },
+  { label: 'Svelte', value: 'svelte' }
+]
+</script>
+
+<style>
+/*
+vanilla CSS can go here. If you are using
+Tailwind you can also use @apply rules.
+*/
+</style>
\ No newline at end of file
diff --git a/app/src/views/CdnUpload.vue b/app/src/views/CdnUpload.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ff5031cc0e4d5feb0138f0591d45a37cf4f7a312
--- /dev/null
+++ b/app/src/views/CdnUpload.vue
@@ -0,0 +1,116 @@
+<template>
+	<div id="cdnUpload" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			MarketPlace Applications
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-4">
+				<div class="box-login">
+					<div class="p-card p-component">
+						<h3>Upload File</h3>
+						<div class="field mt-5">
+							<FormKit
+								type="text"
+								name="inputFileName"
+								label="Input File Name"
+								v-model="inputFileName"
+								placeholder="File name"
+								help="Enter file name"
+							/>
+							<FormKit
+								type="file"
+								label="Your files"
+								help="This input starts with files already “attached”."
+								multiple="true"
+								:value="file_2"
+								v-model="file"
+							/><FormKit @click="cdnProfileUpload" type="submit" label="Upload" />
+						</div>
+						<div v-if="uploadedFilePath">
+							<h3>cdnServer</h3>
+							<div class="field">
+								<p>{{ uploadedFilePath.cdnServer }}</p>
+							</div>
+							<h3>File Path</h3>
+							<p>{{ uploadedFilePath.filePath }}</p>
+						</div>
+						<h3>Download File</h3>
+						<div class="field mt-5">
+							<FormKit
+								type="text"
+								name="inputFileName"
+								label="Uploaded File Name"
+								v-model="fileURL"
+								placeholder="File path"
+								help="Enter File URI for Download"
+							/><FormKit @click="downloadFile" type="submit" label="Download" />
+						</div>
+						<div class="field" v-if="uploadedFilePath.filePath">
+							<h3>Show Image</h3>
+							<img :src="'https://testcdncs.mkcl.org/' + uploadedFilePath.filePath" />
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import MQLCdn from "@/plugins/mqlCdn.js"
+	export default {
+		data() {
+			return {
+				url: "https://testcdncs.mkcl.org/upload",
+				inputFileName: "",
+				fileURL: "",
+				file: "",
+				uploadedFilePath: "",
+			}
+		},
+		methods: {
+			cdnProfileUpload() {
+				let formData = new FormData()
+				formData.append("file", this.file[0].file) // append your file as 'file' in formdata.
+				new MQLCdn()
+					.enablePageLoader(true)
+					// FIXED: change this to directory path
+					.setDirectoryPath("/demoFolder") // (optional field) if you want to save  file to specific directory path
+					.setFormData(formData) // (required) sets file data
+					.setFileName(this.inputFileName) // (optional field) if you want to set name to file that is being uploaded
+					// FIXED: pass buckeyKey instead of name
+					.setBucketKey("1TxYD2KhMcczFlxXntsueOYN46J") // (required) valid bucket key need to set in which file will be uploaded.
+					.setPurposeId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) valid purposeId need to set in which file will be uploaded.
+					.setClientId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) valid purposeId need to set in which file will be uploaded.
+					.uploadFile("uploadtBtn")
+					.then((res) => {
+						// (required) this will upload file takes element id (optional param) which will be blocked while file upload..
+						if (res.isValid()) {
+							this.uploadedFilePath = res.uploadedFileURL() // returns uploaded file url..
+							this.$toast.add({ severity: "success", summary: "File", detail: "file uploaded.", life: 3000 })
+						} else {
+							res.showErrorToast()
+						}
+					})
+			},
+			downloadFile() {
+				if (this.fileURL !== "") {
+					new MQLCdn()
+						.setCDNPath(this.fileURL) // (required) set a filepath whihch needs to be download.
+						.setBucketKey("1TxYD2KhMcczFlxXntsueOYN46J")
+						.setPurposeId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) valid purposeId need to set in which file will be uploaded.
+						.setClientId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) if you are providing relative path
+						.enablePageLoader(true)
+						.downloadFile("downloadBtn")
+						.then((res) => {
+							// (required) this will take elemnt id (optional) which will be blocked while file being downloaded.
+							if (!res.isValid()) {
+								res.showErrorToast()
+							}
+						})
+				}
+			},
+		},
+	}
+</script>
diff --git a/app/src/views/Classroom.vue b/app/src/views/Classroom.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2141eeaabeaa5117b800063beefe7e0512c94d5b
--- /dev/null
+++ b/app/src/views/Classroom.vue
@@ -0,0 +1,227 @@
+<template>
+  <div id="classroom" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Classroom
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-6">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <Accordion :multiple="true">
+              <AccordionTab header="Add Classroom">
+                <div class="field mt-5">
+                  <div class="p-float-label">
+                    <input type="text" class="p-inputtext p-component w-100" :class="classroom.name ? 'p-filled' : ''"
+                      v-model="classroom.name" id="name" required>
+                    <label for="name">Enter classroom name</label>
+                  </div>
+                </div>
+                <div class="field mt-5">
+                  <div class="p-float-label">
+                    <input type="text" class="p-inputtext p-component w-100"
+                      :class="classroom.description ? 'p-filled' : ''" v-model="classroom.description" id="description"
+                      required>
+                    <label for="description">Enter classroom description</label>
+                  </div>
+                </div>
+                <div class="field mt-5">
+                  <div class="p-float-label">
+                    <input type="date" class="p-inputtext p-component w-100"
+                      :class="classroom.startDate ? 'p-filled' : ''" v-model="classroom.startDate" id="startDate"
+                      required>
+                    <label for="startDate">Enter classroom start date</label>
+                  </div>
+                </div>
+                <div class="btn-wrapper">
+                  <button class="btn btn-submit" @click.prevent="saveClassroom">
+                    <i class="isax isax-bold-tick-circle"></i>
+                    Save
+                  </button>
+                </div>
+              </AccordionTab>
+              <AccordionTab header="Fetch classroom within two dates">
+                <div class="field mt-5">
+                  <div class="p-float-label">
+                    <input type="date" class="p-inputtext p-component w-100" :class="fclassroom.sdate ? 'p-filled' : ''"
+                      v-model="fclassroom.sdate" id="sdate" required>
+                    <label for="sdate">Enter start date</label>
+                  </div>
+                </div>
+                <div class="field">
+                  <div class="p-float-label">
+                    <input type="date" class="p-inputtext p-component w-100" :class="fclassroom.edate ? 'p-filled' : ''"
+                      v-model="fclassroom.edate" id="edate" required>
+                    <label for="edate">Enter end date</label>
+                  </div>
+                </div>
+                <div class="btn-wrapper">
+                  <button class="btn btn-submit" @click.prevent="fetchClassroom">
+                    <i class="isax isax-bold-tick-circle"></i>
+                    Fetch
+                  </button>
+                </div>
+                <div class="field mt-5" v-if="classroomResult && classroomResult.length > 0">
+                  <DataTable :value="classroomResult">
+                    <Column field="name" header="name"></Column>
+                    <Column field="description" header="description"></Column>
+                    <Column field="startDate" header="startDate"></Column>
+                  </DataTable>
+                </div>
+              </AccordionTab>
+              <AccordionTab header="Add Classroom with ISO Date">
+              <div class="field mt-4">
+                <div class="p-float-label">
+                  <input type="text" class="p-inputtext p-component w-100" :class="isoclassroom.name ? 'p-filled': ''" v-model="isoclassroom.name" required id="email">
+                  <label for="email">Enter classroom name</label>
+                </div>
+              </div>
+              <div class="field">
+                <div class="p-float-label">
+                  <input type="text" class="p-inputtext p-component w-100" :class="isoclassroom.description ? 'p-filled': ''" v-model="isoclassroom.description" required id="description">
+                  <label for="description">Enter classroom description</label>
+                </div>
+              </div>
+              <div class="field">
+                <div class="p-float-label">
+                  <input type="datetime-local" :class="isoclassroom.startDate ? 'p-inputtext p-component w-100 p-filled': 'p-inputtext p-component w-100'" v-model="isoclassroom.startDate" required id="date">
+                  <label for="date">Enter classroom Start Date</label>
+                </div>
+              </div>
+              <div class="btn-wrapper">
+                <button class="btn btn-submit" @click.prevent="saveClassroomWithISODate">
+                <i class="isax isax-bold-tick-circle"></i>
+                Save
+                </button>
+              </div>
+              </AccordionTab>
+              <AccordionTab header="Fetch classroom within two ISO dates">
+                <div class="field mt-4">
+                  <div class="p-float-label">
+                    <input type="datetime-local" class="p-inputtext p-component w-100" :class="fisoclassroom.sdate ? 'p-filled':''" v-model="fisoclassroom.sdate" id="sdates">
+                    <label for="sdates">Enter start date</label>
+                  </div>
+                </div>
+                <div class="field">
+                  <div class="p-float-label">
+                    <input type="datetime-local" class="p-inputtext p-component w-100" :class="fisoclassroom.edate ? 'p-filled':''" v-model="fisoclassroom.edate" id="edates">
+                    <label for="edates">Enter end date</label>
+                  </div>
+                </div>
+                <div class="btn-wrapper">
+                  <button @click.prevent="fetchClassroomWithISODate"
+                  class="btn btn-submit"
+                  >
+                  <i class="isax isax-bold-tick-circle"></i>
+                  Fetch
+                </button>
+                </div>
+              </AccordionTab>
+            </Accordion>
+            <div class="field mt-5"   v-if="isoClassroomResult && isoClassroomResult.length > 0">
+              <h3 class="mb-3">Result</h3>
+              <DataTable :value="isoClassroomResult">
+                <Column field="name" header="name"></Column>
+                <Column field="description" header="description"></Column>
+                <Column field="startDate" header="startDate"></Column>
+              </DataTable>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data() {
+    return {
+      classroom: {},
+      fclassroom: {},
+      isoclassroom: {},
+      fisoclassroom: {},
+      classroomResult: null,
+      isoClassroomResult: []
+    }
+  },
+  methods: {
+    saveClassroom() {
+      this.classroom.startDate = Math.round(
+        new Date(this.classroom.startDate).getTime() / 1000
+      )
+      new MQL()
+        .setActivity('o.[SaveClassroom]')
+        .setData(this.classroom)
+        .fetch()
+        .then((rs) => {
+          if (rs.isValid('SaveClassroom')) {
+            this.classroom = {}
+            this.$toast.add({severity:'success', summary: 'Classroom', detail:'Classroom added successfully', life: 3000})
+          } else {
+            rs.showErrorToast('SaveClassroom')
+          }
+        })
+    },
+    fetchClassroom() {
+      this.fclassroom.sdate = Math.round(
+        new Date(this.fclassroom.sdate).getTime() / 1000
+      )
+      this.fclassroom.edate = Math.round(
+        new Date(this.fclassroom.edate).getTime() / 1000
+      )
+      new MQL()
+        .setActivity('o.[FetchClassroom]')
+        .setData(this.fclassroom)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('FetchClassroom', true)
+          if (rs.isValid('FetchClassroom')) {
+            this.fclassroom = {}
+            this.classroomResult = res.result
+            for (var i = 0; i < this.classroomResult.length; i++) {
+              this.classroomResult[i].startDate = new Date(
+                this.classroomResult[i].startDate * 1000
+              )
+            }
+          } else {
+            rs.showErrorToast('FetchClassroom')
+          }
+        })
+    },
+    saveClassroomWithISODate() {
+      this.isoclassroom.startDate = new Date(
+        this.isoclassroom.startDate
+      ).toISOString()
+      new MQL()
+        .setActivity('o.[SaveClassroomWithISODate]')
+        .setData(this.isoclassroom)
+        .fetch()
+        .then((rs) => {
+          if (rs.isValid('SaveClassroomWithISODate')) {
+            this.isoclassroom = {}
+            this.$toast.add({severity:'success', summary: 'Classroom', detail:'Classroom added successfully', life: 3000})
+          } else {
+            rs.showErrorToast('SaveClassroomWithISODate')
+          }
+        })
+    },
+    fetchClassroomWithISODate() {
+      new MQL()
+        .setActivity('o.[FetchClassroomWithISODate]')
+        .setData(this.fisoclassroom)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('FetchClassroomWithISODate', true)
+          if (rs.isValid('FetchClassroomWithISODate')) {
+            this.fisoclassroom = {}
+            this.isoClassroomResult = res.result
+          } else {
+            rs.showErrorToast('FetchClassroomWithISODate')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/DownloadManager.vue b/app/src/views/DownloadManager.vue
new file mode 100644
index 0000000000000000000000000000000000000000..73b648559951d225e128cfd7c23c092cd5ec06e5
--- /dev/null
+++ b/app/src/views/DownloadManager.vue
@@ -0,0 +1,94 @@
+<template>
+  <div id="downloadManger" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Download Manager
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-4">
+        <div class="box-login clickable" @click.prevent="downloadFilePush">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-document-download"></i>
+            </div>
+            <div class="bx-login-name">
+              Download File
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-4">
+        <div class="box-login clickable" @click.prevent="downloadProgressPush">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-document-cloud"></i>
+            </div>
+            <div class="bx-login-name">
+              Check Download Progress
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data() {
+    return {
+      download: {},
+      downloadId: '',
+      downloadResult: '',
+      progressResult: ''
+    }
+  },
+  methods: {
+    downloadFilePush() {
+      this.$router.push('/downloadFile')
+    },
+    downloadProgressPush() {
+      this.$router.push('/downloadProgress')
+    },
+    downloadFile() {
+      var a = []
+      a.push(this.download.downloadFileUrl)
+      this.download.downloadFileUrl = a
+      new MQL()
+        .setActivity('o.[DownloadFileUsingDM]')
+        .setData(this.download)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('DownloadFileUsingDM', true)
+          if (rs.isValid('DownloadFileUsingDM')) {
+            this.download = {}
+            this.downloadResult = res.result
+            alert('File downloaded successfully')
+          } else {
+            rs.showErrorToast('DownloadFileUsingDM')
+          }
+        })
+    },
+    checkDownloadProgress() {
+      new MQL()
+        .setActivity('o.[CheckDownloadedFileProgress]')
+        .setData({ downloadFileId: this.downloadId })
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('CheckDownloadedFileProgress', true)
+          if (rs.isValid('CheckDownloadedFileProgress')) {
+            if (res && res.result) {
+              this.progressResult = res.result
+              this.downloadId = ''
+            } else {
+              alert('Progress checking failed')
+            }
+          } else {
+            rs.showErrorToast('CheckDownloadedFileProgress')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/Encryption.vue b/app/src/views/Encryption.vue
new file mode 100644
index 0000000000000000000000000000000000000000..74fc2bccae8b80505332d51c9ff3dd32fff1d1e3
--- /dev/null
+++ b/app/src/views/Encryption.vue
@@ -0,0 +1,128 @@
+<template>
+	<div id="encryption" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Encryption
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-12">
+				<div class="box-login">
+					<div class="p-card p-component">
+						<div class="flex flex-col w-full lg:flex-row">
+							<div class="grid flex-grow h-50 card bg-base-300 rounded-box place-items-center">
+								<h3 class="text-center mb-4">Plain Text Encryption / Decryption</h3>
+								<div class="flex flex-col w-full">
+									<div class="grid h-50 card bg-base-300 rounded-box place-items-center">
+										<FormKit
+											type="text"
+											name="encryptInputText"
+											label="Encrypt Input Text"
+											v-model="encryptInputText"
+											placeho
+											lder="Enter text for encryption"
+											help="Enter text for encryption"
+											validation="required"
+										/>
+										<FormKit type="button" @click="encryptText" label="Encrypt" />
+										{{ encryptOutputText }}
+									</div>
+									<div class="divider"></div>
+									<div class="grid h-50 card bg-base-300 rounded-box place-items-center">
+										<FormKit
+											type="text"
+											name="decryptionInputText"
+											label="Decrypt Input Text"
+											v-model="decryptInputText"
+											placeho
+											lder="Enter text for decryption"
+											help="Enter text for decryption"
+											validation="required"
+										/>
+										<FormKit type="button" @click="decryptText" label="Decrypt Text" />
+										{{ decryptOutputText }}
+									</div>
+								</div>
+							</div>
+							<div class="divider lg:divider-horizontal">OR</div>
+							<div class="grid flex-grow h-50 card bg-base-300 rounded-box place-items-center">
+								<h3 >Object encryption/decryption</h3>
+								<div class="flex flex-col w-full mt-4">
+									<div class="grid h-50 card bg-base-300 rounded-box place-items-center">
+										<FormKit
+											type="text"
+											name="decryptionInputText"
+											label="Encrypt Input Text"
+											v-model="encryptInputObject"
+											placeho
+											lder="Enter object for encryption"
+											help="Enter object for encryption"
+											validation="required"
+										/>
+										<FormKit type="button" @click="encryptObj" label="Encrypt Object" />
+										{{ encryptOutputObject }}
+									</div>
+									<div class="divider"></div>
+									<div class="grid h-50 card bg-base-300 rounded-box place-items-center">
+										<FormKit
+											type="text"
+											name="decryptionInputText"
+											label="Decrypt Input Text"
+											v-model="decryptInputObject"
+											placeho
+											lder="Enter object for decryption"
+											help="Enter object for decryption"
+											validation="required"
+										/>
+										<FormKit type="button" @click="decryptObj" label="Decrypt Object" />
+										{{ decryptOutputObject }}
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import CryptoJS from "crypto-js"
+	export default {
+		data() {
+			return {
+				encryptInputText: "",
+				encryptOutputText: "",
+				decryptInputText: "",
+				decryptOutputText: "",
+				encryptInputObject: "",
+				encryptOutputObject: "",
+				decryptInputObject: "",
+				decryptOutputObject: null,
+				key: "SECRETKEY",
+			}
+		},
+		methods: {
+			encryptText() {
+				var op = CryptoJS.AES.encrypt(this.encryptInputText, this.key)
+				this.encryptOutputText = op.toString()
+			},
+			decryptText() {
+				var bytes = CryptoJS.AES.decrypt(this.encryptOutputText.toString(), this.key)
+				var plaintext = bytes.toString(CryptoJS.enc.Utf8)
+				this.decryptOutputText = plaintext
+			},
+			encryptObj() {
+				var ip = this.encryptInputObject
+				var op = CryptoJS.AES.encrypt(JSON.stringify(ip), this.key)
+				this.encryptOutputObject = op.toString()
+			},
+			decryptObj() {
+				var bytes = CryptoJS.AES.decrypt(this.encryptOutputObject.toString(), this.key)
+				this.decryptOutputObject = JSON.parse(bytes.toString(CryptoJS.enc.Utf8))
+			},
+		},
+	}
+</script>
+
+<style></style>
diff --git a/app/src/views/Excel.vue b/app/src/views/Excel.vue
new file mode 100644
index 0000000000000000000000000000000000000000..087b72caac42ff96141f88a9138d53680a903b7f
--- /dev/null
+++ b/app/src/views/Excel.vue
@@ -0,0 +1,123 @@
+<template>
+<div class="container-fluid" id="excel">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Excel Plugins
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-4">
+            <div class="box-login clickable" @click.prevent="clientDataPush">
+                <div class="p-card p-component">
+                  <div class="icon-holder">
+                    <i class="isax isax-bold-data"></i>
+                  </div>
+                  <div class="bx-login-name">
+                    Client Data
+                  </div>
+                </div>
+            </div>
+        </div>
+        <div class="col-4">
+          <div class="box-login clickable" @click.prevent="updateDataPush">
+                <div class="p-card p-component">
+                  <div class="icon-holder">
+                    <i class="isax isax-bold-global-refresh"></i>
+                  </div>
+                  <div class="bx-login-name">
+                    Update Data
+                  </div>
+                </div>
+            </div>
+        </div>
+        <div class="col-4">
+          <div class="box-login clickable" @click.prevent="saveWActivityPush">
+                <div class="p-card p-component">
+                  <div class="icon-holder">
+                    <i class="isax isax-bold-document-text-1"></i>
+                  </div>
+                  <div class="bx-login-name">
+                    Save with Activity
+                  </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      empList: [
+        { name: 'vikram', age: 27, address: 'pune' },
+        { name: 'kunal', age: 28, address: 'satara' },
+        { name: 'akshay', age: 29, address: 'mumbai' }
+      ],
+      url: '',
+      excel: {}
+    }
+  },
+  components: {
+  },
+  methods: {
+    clientDataPush () {
+      this.$router.push('/clientData')
+    },
+    updateDataPush () {
+      this.$router.push('/updateData')
+    },
+    saveWActivityPush () {
+      this.$router.push('/saveWActivity')
+    },
+
+    saveClientDataUsingExcel () {
+      new MQL()
+        .setActivity('o.[SaveClientDataUsingExcel]')
+        .setData(this.empList)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SaveClientDataUsingExcel', true)
+          if (rs.isValid('SaveClientDataUsingExcel')) {
+            this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Employees Data Saved Successfully', life: 3000})
+          } else {
+            rs.showErrorToast('SaveClientDataUsingExcel')
+          }
+        })
+    },
+    saveExcelDataUsingActivity () {
+      new MQL()
+        .setActivity('o.[SaveActivityDataUsingExcel]')
+        .setData({ excelURL: this.url })
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SaveActivityDataUsingExcel', true)
+          if (rs.isValid('SaveActivityDataUsingExcel')) {
+            this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Excel data saved successfully using activity', life: 3000})
+            this.url = ''
+          } else {
+            rs.showErrorToast('SaveActivityDataUsingExcel')
+          }
+        })
+    },
+    updateData () {
+      this.excel.age = 30
+      this.excel.address = 'pune'
+      new MQL()
+        .setActivity('o.[UpdateDataUsingExcel]')
+        .setData([this.excel])
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('UpdateDataUsingExcel', true)
+          if (rs.isValid('UpdateDataUsingExcel')) {
+            this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Excel data updated successfully', life: 3000})
+            this.excel = {}
+          } else {
+            rs.showErrorToast('UpdateDataUsingExcel')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/ForLoop.vue b/app/src/views/ForLoop.vue
new file mode 100644
index 0000000000000000000000000000000000000000..01c0537542cc1930307d2a8fe91274a55b3a59a8
--- /dev/null
+++ b/app/src/views/ForLoop.vue
@@ -0,0 +1,70 @@
+<template>
+<div class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Save client data
+    </h2>
+    <div class="subtext">
+      This client data is saved in "Employee" collection of "cs playground"
+      database using for loop plugin
+    </div>
+    <div class="row justify-content-center">
+        <div class="col-6">
+            <div class="box-login">
+                <div class="p-card p-component">
+                   <DataTable v-if="empList && empList.length > 0" :value="empList">
+                    <Column field="name" header="name"></Column>
+                    <Column field="age" header="age"></Column>
+                    <Column field="address" header="address"></Column>
+                   </DataTable>
+                   <div class="empty-state" v-else>Records not found</div>
+                    <div class="btn-wrapper">
+                        <button class="btn btn-submit"  @click="saveClientDataUsingForLoop()">
+                            <i class="isax isax-bold-tick-circle"></i>
+                            Save
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      empList: [
+        { name: 'vikram', age: 27, address: 'pune' },
+        { name: 'kunal', age: 28, address: 'satara' },
+        { name: 'akshay', age: 29, address: 'mumbai' }
+      ]
+    }
+  },
+  methods: {
+    saveClientDataUsingForLoop () {
+      new MQL()
+        .setActivity('o.[SaveClientDataUsingForLoop]')
+        .setData(this.empList)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SaveClientDataUsingForLoop', true)
+          if (rs.isValid('SaveClientDataUsingForLoop')) {
+            this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Employees data saved successfully', life: 3000})
+          } else {
+            rs.showErrorToast('SaveClientDataUsingForLoop')
+          }
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.subtext {
+  margin-top: 0.75rem;
+  margin-left: 3rem;
+}
+</style>
\ No newline at end of file
diff --git a/app/src/views/FormKitCustomComposition.vue b/app/src/views/FormKitCustomComposition.vue
new file mode 100644
index 0000000000000000000000000000000000000000..9371d7b3e5a7d342aedb990c5e5ddce86a26802b
--- /dev/null
+++ b/app/src/views/FormKitCustomComposition.vue
@@ -0,0 +1,41 @@
+<script setup>
+	// Formkit with composition API
+
+	import { ref } from "vue"
+	import { createInput } from "@formkit/vue"
+	import Multiselect from "@/components/multiselect.vue"
+	import dateRangePickr from "@/components/date-range-pickr.vue"
+
+	const multiselect = createInput(Multiselect)
+	const dateRangePickrC = createInput(dateRangePickr)
+	const values = ref({})
+</script>
+<template>
+	<div id="masterAxios" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Dashboard
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-6">
+				<div class="box-login">
+					<FormKit type="form" v-model="values">
+						<FormKit
+							:type="multiselect"
+							label="Multiple Data Select"
+							validation="required"
+							validation-visibility="live"
+						></FormKit>
+						<FormKit
+							:type="dateRangePickrC"
+							label="Date Range Select"
+							validation="required"
+							validation-visibility="live"
+						></FormKit>
+						{{ values }}
+					</FormKit>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
diff --git a/app/src/views/FormKitCustomOption.vue b/app/src/views/FormKitCustomOption.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2dbc29eb684b7ecd173adbde16672833b08ca2f0
--- /dev/null
+++ b/app/src/views/FormKitCustomOption.vue
@@ -0,0 +1,45 @@
+<script>
+	// Formkit with Option API
+	import { ref } from "vue"
+	import { createInput } from "@formkit/vue"
+	import Multiselect from "@/components/multiselect.vue"
+	import dateRangePickr from "@/components/date-range-pickr.vue"
+	export default {
+		data() {
+			return {
+				multiselect: createInput(Multiselect),
+				dateRangePickrC: createInput(dateRangePickr),
+				values: "",
+			}
+		},
+	}
+</script>
+<template>
+	<div id="masterAxios" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Dashboard
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-6">
+				<div class="box-login">
+					<FormKit type="form" v-model="values">
+						<FormKit
+							:type="multiselect"
+							label="Multiple Data Select"
+							validation="required"
+							validation-visibility="live"
+						></FormKit>
+						<FormKit
+							:type="dateRangePickrC"
+							label="Date Range Select"
+							validation="required"
+							validation-visibility="live"
+						></FormKit>
+						{{ values }}
+					</FormKit>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
diff --git a/app/src/views/Home.vue b/app/src/views/Home.vue
new file mode 100644
index 0000000000000000000000000000000000000000..5840dd583a6fe072e0bcb34e37ba4a2251bf7381
--- /dev/null
+++ b/app/src/views/Home.vue
@@ -0,0 +1,500 @@
+<template>
+  <div class="box">
+    <h1 class="title">
+      GoLang FullStack
+    </h1>
+    <p class="desc">
+      LIST OF CORE FUNCTIONALITIES
+    </p>
+    <div class="row align-items-center">
+      <div class="col-3">
+        <div class="bx-card">
+          <div class="p-card p-component" @click="$router.push({name: 'login'})">
+            <div class="icon-holder">
+              <i class="isax isax-bold-login"></i>
+            </div>
+            <div class="bx-card-name">
+              Login
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3" @click="$router.push({name: 'registration'})">
+        <div class="bx-card" >
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-edit-2"></i>
+            </div>
+            <div class="bx-card-name">
+              Registration
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'mqlRequestDemo'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-cloud-change"></i>
+            </div>
+            <div class="bx-card-name">
+              Mql Request
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'i18Demo'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-translate"></i>
+            </div>
+            <div class="bx-card-name">
+              i18
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'validator'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-tick-circle"></i>
+            </div>
+            <div class="bx-card-name">
+              Validator
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'encryption'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-lock-1"></i>
+            </div>
+            <div class="bx-card-name">
+              Encryption
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'cdnUpload'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-arrow-up"></i>
+            </div>
+            <div class="bx-card-name">
+             CDN Upload
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'tableDemo'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-stickynote"></i>
+            </div>
+            <div class="bx-card-name">
+              Table
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="vueMeta()">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-menu-board"></i>
+            </div>
+            <div class="bx-card-name">
+              Vue Meta Example
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'MqlAssetFDBDemo'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-3d-cube-scan"></i>
+            </div>
+            <div class="bx-card-name">
+              Mql Asset FDB
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'sessionmgr'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-check"></i>
+            </div>
+            <div class="bx-card-name">
+              Session Manager
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'uploadmanager'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-document-upload"></i>
+            </div>
+            <div class="bx-card-name">
+             Upload Manager
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'downloadmanager'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-document-download"></i>
+            </div>
+            <div class="bx-card-name">
+              Download Manager
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'serversidepagination'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-element-3"></i>
+            </div>
+            <div class="bx-card-name">
+            Server Side Pagination
+            <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'keymapper'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-keyboard-open"></i>
+            </div>
+            <div class="bx-card-name">
+              Key Mapper
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'excel'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-document-1"></i>
+            </div>
+            <div class="bx-card-name">
+              Excel Plugin
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'lastinsertedId'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-note"></i>
+            </div>
+            <div class="bx-card-name">
+              Last Insert ID
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'forloop'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-refresh"></i>
+            </div>
+            <div class="bx-card-name">
+              For Loop
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'sendSms'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-sms-tracking"></i>
+            </div>
+            <div class="bx-card-name">
+             Send SMS
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'sendEmail'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-directbox-send"></i>
+            </div>
+            <div class="bx-card-name">
+              Send Email
+              <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'sendOtp'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-notification-status"></i>
+            </div>
+            <div class="bx-card-name">
+             Send OTP
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'autoBL'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-note-1"></i>
+            </div>
+            <div class="bx-card-name">
+             Auto BL
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'updateUserDataUsingBL'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-refresh"></i>
+            </div>
+            <div class="bx-card-name">
+             Update using BL
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'insertCustomMongoId'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-data"></i>
+            </div>
+            <div class="bx-card-name">
+             Custom Mongo ID
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'classroom'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-profile-2user"></i>
+            </div>
+            <div class="bx-card-name">
+             Classroom
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'clipboard'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-profile-2user"></i>
+            </div>
+            <div class="bx-card-name">
+             Vue Clipboard
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+    <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'FormKitComposition'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-profile-2user"></i>
+            </div>
+            <div class="bx-card-name">
+             FormKit Custom Components (CompositionAPI)
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div><div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'FormKitOption'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-profile-2user"></i>
+            </div>
+            <div class="bx-card-name">
+             FormKit Custom Components (OptionAPI)
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-3">
+        <div class="bx-card" @click="$router.push({name: 'tailwindForm'})">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-profile-2user"></i>
+            </div>
+            <div class="bx-card-name">
+             Tailwind Testing
+             <i class="isax isax-bold-arrow-right"></i>
+            </div>
+            <div class="bx-card-desc">
+              Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum.
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: 'Home',
+  components: {
+  },
+  data(){
+    return{
+
+    }
+  },
+  methods:{
+    vueMeta(){
+      this.$router.push({name: 'vueMetaExample',params:{title:"Live Demo"}})
+    }
+  }
+}
+</script>
+
+<style>
+.home {
+  text-align: center;
+}
+</style>
diff --git a/app/src/views/I18Demo.vue b/app/src/views/I18Demo.vue
new file mode 100644
index 0000000000000000000000000000000000000000..38b145a32b320a0c645fa88af094877136f031d5
--- /dev/null
+++ b/app/src/views/I18Demo.vue
@@ -0,0 +1,73 @@
+<template>
+	<div id="i18" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Internationalization
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-10">
+				<div class="box-login">
+					<div class="p-card p-component">
+						<div class="data">
+							<h3>Change Language (i18)</h3>
+							<FormKit
+								type="select"
+								label=""
+								placeholder="Change Language"
+								name="salutation"
+								:options="langs"
+								@change="changeLanguage(lang)"
+								v-model="lang"
+							/>
+						</div>
+						<div class="data alt">
+							<component1 class="my-3" />
+							<component2 />
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import component1 from "../components/i18Demo/Component1.vue"
+	import component2 from "../components/i18Demo/Component2.vue"
+	import { loadLanguageAsync } from "@/setup/i18n-setup.js"
+	export default {
+		components: { component1, component2 },
+		data() {
+			return {
+				langs: [
+					{
+						label: "Hindi",
+						value: "hi",
+					},
+					{
+						label: "Marathi",
+						value: "mr",
+					},
+					{
+						label: "English",
+						value: "en",
+					},
+				],
+				lang: {},
+			}
+		},
+		methods: {
+			changeLanguage(lang) {
+				console.log("lang", lang)
+				if (Object.keys(lang).length > 0 && lang !== undefined) {
+					this.$i18n.locale = lang
+					this.$i18n.fallbackLocale = lang
+					loadLanguageAsync(lang)
+					console.log(lang)
+				}
+			},
+		},
+	}
+</script>
+
+<style></style>
diff --git a/app/src/views/KeyMapper.vue b/app/src/views/KeyMapper.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2c256335f3d80e22e95600e01af7b3203de8e225
--- /dev/null
+++ b/app/src/views/KeyMapper.vue
@@ -0,0 +1,95 @@
+<template>
+<div class="container-fluid" id="keyMapper">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Key Mappers
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-3">
+            <div class="box-login clickable" @click.prevent="hashDataPush">
+                <div class="p-card p-component">
+                    <div class="icon-holder">
+                      <i class="isax isax-bold-shield-tick"></i>
+                    </div>
+                    <div class="bx-login-name">
+                      Hash Data
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="col-3">
+            <div class="box-login clickable" @click.prevent="hashSaltPush">
+                <div class="p-card p-component">
+                    <div class="icon-holder">
+                      <i class="isax isax-bold-security-card"></i>
+                    </div>
+                    <div class="bx-login-name">
+                      Hash Salt
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="col-3">
+            <div class="box-login clickable" @click.prevent="encryptDataPush">
+                <div class="p-card p-component">
+                    <div class="icon-holder">
+                      <i class="isax isax-bold-security-safe"></i>
+                    </div>
+                    <div class="bx-login-name">
+                      Encrypts Data
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="col-3">
+            <div class="box-login clickable" @click.prevent="decryptDataPush">
+                <div class="p-card p-component">
+                    <div class="icon-holder">
+                      <i class="isax isax-bold-shield-slash"></i>
+                    </div>
+                    <div class="bx-login-name">
+                      Decrypts Data
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+
+export default {
+  data () {
+    return {
+      name: '',
+      sname: '',
+      saltKey: '',
+      ename: '',
+      dname: '',
+      hashResult: '',
+      saltResult: '',
+      encryptResult: '',
+      decryptResult: ''
+    }
+  },
+  methods: {
+    hashDataPush () {
+      this.$router.push('/hashData')
+    },
+    hashSaltPush () {
+      this.$router.push('/hashSalt')
+    },
+    encryptDataPush () {
+      this.$router.push('/encryptData')
+    },
+    decryptDataPush () {
+      this.$router.push('/decryptData')
+    }
+  }
+}
+</script>
+
+<style>
+
+</style>
\ No newline at end of file
diff --git a/app/src/views/LastInsertedId.vue b/app/src/views/LastInsertedId.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a70f59cd3238d5ea4826a72d08eb497f2f1030f4
--- /dev/null
+++ b/app/src/views/LastInsertedId.vue
@@ -0,0 +1,78 @@
+<template>
+<div class="container-fluid" id="lastInsertID">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Last Insert ID
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-auto">
+            <div class="box-login">
+                <div class="p-card p-component">
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="text" class="p-inputtext p-component w-100" :class="emp.name ? 'p-filled' : ''" v-model="emp.name" id="name" required>
+                        <label for="name">Employee Name</label>
+                      </div>
+                    </div>
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="text" class="p-inputtext p-component w-100" :class="emp.age ? 'p-filled' : ''" v-model="emp.age" id="age" required>
+                        <label for="age">Employee Age</label>
+                      </div>
+                    </div>
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="text" class="p-inputtext p-component w-100" :class="emp.address ? 'p-filled' : ''" v-model="emp.address" id="address" required>
+                        <label for="address">Employee Address</label>
+                      </div>
+                    </div>
+                    <div class="btn-wrapper">
+                        <button class="btn btn-submit"  @click.prevent="saveAndGetLastInsertedId">
+                            <i class="isax isax-bold-tick-circle"></i>
+                            Save & Get Last Insert ID
+                        </button>
+                    </div>
+                    <div class="field mt-4">
+                      <h3>Result</h3>
+                      <json-viewer :value="empResult" boxed :expanded="true"></json-viewer>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+import jsonViewer from 'vue-json-viewer'
+export default {
+  data () {
+    return {
+      emp: {},
+      empResult: ''
+    }
+  },
+  components: {
+    jsonViewer
+  },
+  methods: {
+    saveAndGetLastInsertedId () {
+      new MQL()
+        .setActivity('o.[FetchLastInsertedId]')
+        .setData(this.emp)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('FetchLastInsertedId', true)
+          if (rs.isValid('FetchLastInsertedId')) {
+            this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Data Saved Successfully', life: 3000})
+            this.emp = {}
+            this.empResult = res.result
+          } else {
+            rs.showErrorToast('FetchLastInsertedId')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/Login.vue b/app/src/views/Login.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7bbb3a1044d92153718c1ebe2482a99b5bd917ab
--- /dev/null
+++ b/app/src/views/Login.vue
@@ -0,0 +1,80 @@
+<template>
+	<div id="login" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Login Form
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-auto">
+				<div class="box-login">
+					<div class="p-card p-component">
+						<FormKit
+							type="form"
+							id="login-example"
+							:form-class="submitted ? 'hide' : 'show'"
+							submit-label="Register"
+							@submit="authenticate"
+							:actions="false"
+							#default="{ value }"
+						>
+							<FormKit
+								type="text"
+								name="username"
+								label="User Name"
+								v-model="username"
+								placeholder="User Name"
+								help="Enter User Name"
+								validation="required"
+							/>
+							<div class="double">
+								<FormKit
+									type="password"
+									name="password"
+									label="Password"
+									validation="required|length:6|matches:/[^a-zA-Z]/"
+									:validation-messages="{
+										matches: 'Please include at least one symbol',
+									}"
+									v-model="password"
+									placeholder="Your password"
+									help="Choose a password"
+								/>
+							</div>
+
+							<FormKit type="submit" label="Login" />
+							<pre wrap>{{ value }}</pre>
+						</FormKit>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import { login } from "../store/modules/login.js"
+	export default {
+		setup() {
+			const loginStore = login()
+			return { loginStore }
+		},
+		data() {
+			return {
+				username: "",
+				password: "",
+			}
+		},
+		methods: {
+			authenticate() {
+				this.loginStore
+					.AUTH_REQUEST({ loginId: this.username, password: this.password })
+					.then((res) => {
+						this.$toast.success("Login Successfully")
+					})
+					.catch((err) => {
+						this.$toast.error(err)
+					})
+			},
+		},
+	}
+</script>
diff --git a/app/src/views/MQLRequestDemo.vue b/app/src/views/MQLRequestDemo.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c98090627d19464a37e3632ce2b19a17d9bff964
--- /dev/null
+++ b/app/src/views/MQLRequestDemo.vue
@@ -0,0 +1,59 @@
+<template>
+	<div id="masterAxios" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			MQL Request
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-6">
+				<div class="box-login">
+						<div class="data">
+							<h3>MQL Data</h3>
+							<FormKit type="button" prefix-icon="check" @click="GetAllPosts">
+								MQL Request
+							</FormKit>
+						</div>
+						<div class="json-wrapper">
+							<json-viewer :value="result" boxed :expanded="true"></json-viewer>
+						</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import MQL from "@/plugins/mql.js"
+	import jsonViewer from "vue-json-viewer"
+	export default {
+		data() {
+			return {
+				result: [],
+			}
+		},
+		components: {
+			jsonViewer,
+		},
+		methods: {
+			GetAllPosts() {
+				new MQL()
+					.showConfirmDialog(true)
+					.setActivity("o.[query_1QPikbRCETCu32Dj13qzRKNBraC]")
+					.setData({})
+					.setHeader({ "my-header": "It is Ok" })
+					.fetch("mqlData")
+					.then((rs) => {
+						let res = rs.getActivity("query_1QPikbRCETCu32Dj13qzRKNBraC", true)
+						if (rs.isValid("query_1QPikbRCETCu32Dj13qzRKNBraC")) {
+							this.$toast.success("Data Loaded Successfully")
+							this.result = res
+						} else {
+							rs.showErrorToast("query_1QPikbRCETCu32Dj13qzRKNBraC")
+						}
+					})
+			},
+		},
+	}
+</script>
+
+<style></style>
diff --git a/app/src/views/MqlAssetFDBDemo.vue b/app/src/views/MqlAssetFDBDemo.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d1f1a3931e58a8b51c491311aad6f215fbe533e7
--- /dev/null
+++ b/app/src/views/MqlAssetFDBDemo.vue
@@ -0,0 +1,160 @@
+<template>
+	<div id="assetFDB" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			MQL Request For Asset FDB
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-4">
+				<div class="box-login">
+					<div class="p-card p-component">
+						<h3>Upload File</h3>
+						<div class="field mt-5">
+							<!-- <fileupload name="file" :url="url" id="files" :chooseIcon="chooseIcon"
+                                :uploadIcon="uploadIcon" :cancelIcon="cancelIcon" :customUpload="true" 	@uploader="uploadFile">
+                                <template #empty>
+                                    <p>Click on the choose button to upload files</p>
+                                </template>
+                            </fileupload> -->
+							<FormKit
+								type="file"
+								label="Your files"
+								help="This input starts with files already “attached”."
+								multiple="true"
+								:value="file_2"
+								v-model="file"
+							/>
+							<FormKit type="submit" label="Upload File" @click="uploadFile" />
+						</div>
+						<div class="field mt-5">
+							<h3 class="mb-5">Asset File</h3>
+							<div class="p-float-label">
+								<input
+									type="text"
+									class="p-inputtext p-component w-100"
+									:class="assetPath ? 'p-filled' : ''"
+									id="assetPath"
+									name="assetPath"
+								/>
+								<label for="assetPath">Enter Asset File Path</label>
+							</div>
+						</div>
+						<div class="field mt-5">
+							<h3 class="mb-5">Update File</h3>
+							<div class="p-float-label">
+								<input
+									type="text"
+									class="p-inputtext p-component w-100"
+									:class="recordId ? 'p-filled' : ''"
+									name="recordID"
+									id="recordID"
+								/>
+								<label for="recordID">Enter your Record ID</label>
+							</div>
+						</div>
+						<div class="field mt-5">
+							<fileupload
+								name="file"
+								:url="url"
+								id="files"
+								:chooseIcon="chooseIcon"
+								:uploadIcon="uploadIcon"
+								:cancelIcon="cancelIcon"
+								:customUpload="true"
+								@uploader="uploadFile"
+							>
+								<template #empty>
+									<p>Click on the choose button to upload files</p>
+								</template>
+							</fileupload>
+						</div>
+
+						<div class="field mt-5">
+							<h3 class="mb-3">Updated Asset Path</h3>
+							<p v-if="!updatedAssetPath">Asset path not updated</p>
+							<p v-else>
+								{{ updatedAssetPath }}
+							</p>
+						</div>
+
+						<div class="btn-wrapper text-center">
+							<button class="btn btn-submit" @click.stop.prevent="downloadFile">
+								<i class="isax isax-bold-document-download"></i>
+								Download Asset
+							</button>
+							<button class="btn btn-show" @click.stop.prevent="renderFile">
+								<i class="isax isax-bold-document-download"></i>
+								Render Asset
+							</button>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import MQLAssetFDB from "@/plugins/mqlAssetFDB.js"
+
+	export default {
+		data() {
+			return {
+				assetPath: "",
+				file: "",
+				content: "",
+				recordId: "",
+				updatedAssetPath: "",
+				chooseIcon: "isax isax-bold-cloud-plus",
+				uploadIcon: "isax isax-bold-add",
+				cancelIcon: "isax isax-bold-close-circle",
+			}
+		},
+		methods: {
+			uploadFile() {
+				let formData = new FormData()
+				formData.append("file", this.file[0].file)
+				new MQLAssetFDB()
+					.enablePageLoader(true)
+					.setIndex("o.9929b6e44da568f390d20e51032b")
+					.setHostName("TestMixedBucketFDB2")
+					.setFormData(formData)
+					.setAssetData({ TestAssetBucket: "bucket1" })
+					.uploadAssetFile()
+					.then((res) => {
+						if (res.isValid()) {
+							this.assetPath = res.getAssetPath()
+						} else {
+							res.showErrorToast()
+						}
+					})
+			},
+			updateFile(recordId) {
+				let formData = new FormData()
+				formData.append("file", this.files)
+				new MQLAssetFDB()
+					.setIndex("o.9929b6e44da568f390d20e51032b")
+					.setHostName("TestMixedBucketFDB2")
+					.setFormData(formData)
+					.setUpdateWithRecordId(recordId)
+					.setAssetData({ TestAssetBucket: "bucket1" })
+					.uploadAssetFile()
+					.then((res) => {
+						if (res.isValid()) {
+							this.updatedAssetPath = res.getAssetPath()
+						} else {
+							res.showErrorToast()
+						}
+					})
+			},
+			downloadFile() {
+				new MQLAssetFDB().download(this.updatedAssetPath || this.assetPath)
+			},
+			renderFile() {
+				new MQLAssetFDB().render(this.updatedAssetPath || this.assetPath)
+			},
+		},
+	}
+</script>
+
+<style></style>
diff --git a/app/src/views/Registration.vue b/app/src/views/Registration.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2cacd2f2221dcc90f6d203a771123d441f6ef2b5
--- /dev/null
+++ b/app/src/views/Registration.vue
@@ -0,0 +1,280 @@
+<template>
+	<div id="registration" class="container-fluid reg">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Registration Form
+		</h2>
+		<div class="container-fluid">
+			<div class="row justify-content-center">
+				<div class="col-6">
+					<div class="box-login e">
+						<div class="p-card p-component">
+							<FormKit
+								type="form"
+								id="registration-example"
+								:form-class="submitted ? 'hide' : 'show'"
+								submit-label="Register"
+								@submit="saveData(value)"
+								:actions="false"
+								#default="{ value }"
+							>
+								<FormKit
+									type="text"
+									name="loginId"
+									label="loginId"
+									v-model="loginId"
+									placeholder="Login ID"
+									help="Enter Login ID"
+									validation="required"
+								/>
+								<div class="double">
+									<FormKit
+										type="password"
+										name="password"
+										label="Password"
+										validation="required|length:6|matches:/[^a-zA-Z]/"
+										:validation-messages="{
+											matches: 'Please include at least one symbol',
+										}"
+										placeholder="Your password"
+										help="Choose a password"
+									/>
+									<FormKit
+										type="password"
+										name="password_confirm"
+										label="Confirm password"
+										placeholder="Confirm password"
+										validation="required|confirm"
+										help="Confirm your password"
+									/>
+									<FormKit
+										type="file"
+										label="Your files"
+										help="This input starts with files already “attached”."
+										multiple="true"
+										:value="file_2"
+										v-model="file"
+										validation="required"
+									/>
+								</div>
+
+								<FormKit
+									type="checkbox"
+									label="Terms and Conditions"
+									help="Do you agree to our terms of service?"
+									name="terms"
+									:value="true"
+									validation="accepted|required"
+									validation-visibility="dirty"
+								/>
+
+								<FormKit
+									type="color"
+									value="#00FF00"
+									label="Select a color"
+									help="Select your favorite color."
+									validation="required"
+								/>
+
+								<FormKit
+									type="date"
+									value="2011-01-01"
+									label="Birthday"
+									help="Enter your birth day"
+									validation="required|date_before:2010-01-01"
+									validation-visibility="live"
+								/>
+
+								<FormKit
+									type="datetime-local"
+									value="2020-03-13T18:22"
+									label="End of the world"
+									help="When will the end of the world take place?"
+									validation="required|date_after"
+									validation-visibility="live"
+								/>
+
+								<FormKit
+									type="email"
+									label="Student email address"
+									help="Please enter your student email address."
+									validation="required|email|ends_with:.com"
+									validation-visibility="live"
+									placeholder="vikas@school.com"
+								/>
+
+								<FormKit name="user_id" type="hidden" value="user_32135" />
+
+								<FormKit v-model="list" type="list">
+									<p>Please provide a list of emails.</p>
+									<FormKit label="Email address" validation="required|email" />
+									<FormKit label="Email address" validation="required|email" />
+									<FormKit label="Email address" validation="required|email" />
+								</FormKit>
+
+								<FormKit
+									type="month"
+									help="What month were you born?"
+									label="Birth month"
+									name="birth_month"
+									value="1965-09"
+									validation="required"
+								/>
+								<FormKit
+									type="number"
+									help="What temperature should the house be?"
+									label="Thermostat"
+									name="temperature"
+									value="25"
+									step="1"
+									validation="required"
+								/>
+
+								<FormKit
+									v-model="value1"
+									type="radio"
+									label="Preferred transportation"
+									:options="['E-Bike', 'E-Scooter', 'Electric car', 'Walking', 'Space tube']"
+									help="How do you like to get around?"
+									validation="required"
+								/>
+
+								<FormKit
+									v-model="value2"
+									type="range"
+									label="Volume"
+									min="0"
+									max="11"
+									help="Select your volume level."
+									validation="required"
+								/>
+								<pre wrap>{{ value2 }}</pre>
+
+								<FormKit
+									type="search"
+									placeholder="Search..."
+									label="Search"
+									value="Apple Cider"
+									validation="required"
+								/>
+								<FormKit
+									type="select"
+									label="Which country is the smallest?"
+									name="small_country"
+									:options="['Monaco', 'Vatican City', 'Maldives', 'Tuvalu']"
+									validation="required"
+								/>
+
+								<FormKit
+									type="tel"
+									label="Phone number"
+									placeholder="xxx-xxx-xxxx"
+									validation="required|matches:/^[0-9]{3}-[0-9]{3}-[0-9]{4}$/"
+									:validation-messages="{
+										matches: 'Phone number must be in the format xxx-xxx-xxxx',
+									}"
+									validation-visibility="dirty"
+								/>
+
+								<FormKit
+									type="textarea"
+									label="Your Essay"
+									rows="10"
+									placeholder="Remember to write in complete sentences."
+									help="I'll know if you didn't read the book!"
+									validation="required"
+								/>
+								<FormKit
+									type="time"
+									label="Time"
+									value="15:50"
+									help="What time will go home today?"
+									validation="required"
+								/>
+								<FormKit
+									label="Vacation"
+									type="week"
+									help="What week will you travel to Fiji?"
+									value="2025-W02"
+									validation="required"
+								/>
+								<FormKit
+									type="url"
+									label="Favorite website"
+									placeholder="https://www.example.com..."
+									validation="required|url"
+									help="What is your favorite website?"
+								/>
+								<FormKit type="submit" label="Register" />
+
+								<pre wrap>{{ value }}</pre>
+							</FormKit>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import MQLCdn from "@/plugins/mqlCdn.js"
+	export default {
+		data() {
+			return {
+				loginId: "",
+				password: "",
+				file: null,
+				result: "",
+				showPass: false,
+				url: "https://testcdncs.mkcl.org/1TxYD2KhMcczFlxXntsueOYN46J/demoFolder/",
+				uploadedFilePath: "",
+				value: "",
+				value1: "",
+				value2: "",
+				submitted: false,
+				file_2: "",
+				list: "",
+			}
+		},
+		methods: {
+			cdnProfileUpload() {
+				let formData = new FormData()
+				formData.append("file", this.file[0].file) // append your file as 'file' in formdata.
+				new MQLCdn()
+					.enablePageLoader(true)
+					// FIXED: change this to directory path
+					.setDirectoryPath("/demoFolder") // (optional field) if you want to save  file to specific directory path
+					.setFormData(formData) // (required) sets file data
+					.setFileName(this.inputFileName) // (optional field) if you want to set name to file that is being uploaded
+					// FIXED: pass buckeyKey instead of name
+					.setBucketKey("1TxYD2KhMcczFlxXntsueOYN46J") // (required) valid bucket key need to set in which file will be uploaded.
+					.setPurposeId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) valid purposeId need to set in which file will be uploaded.
+					.setClientId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) valid purposeId need to set in which file will be uploaded.
+					.uploadFile("uploadtBtn")
+					.then((res) => {
+						// (required) this will upload file takes element id (optional param) which will be blocked while file upload..
+						if (res.isValid()) {
+							this.uploadedFilePath = res.uploadedFileURL() // returns uploaded file url..
+							console.log("res cdn path", this.uploadedFilePath)
+							this.$toast.add({ severity: "success", summary: "File", detail: "file uploaded.", life: 3000 })
+						} else {
+							res.showErrorToast()
+						}
+					})
+			},
+			saveData(value) {
+				this.cdnProfileUpload()
+				const form = new FormData()
+				form.set("enctype", "multipart/form-data")
+				form.append("fileUrl", this.uploadedFilePath.cdnServer + this.uploadedFilePath.filePath)
+				form.append("loginId", this.loginId)
+				form.append("password", this.password)
+				console.log("formData", this.value)
+				console.log(value)
+			},
+		},
+	}
+</script>
+
+<style></style>
diff --git a/app/src/views/ServerSidePagination.vue b/app/src/views/ServerSidePagination.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d150335f7b5b1c5113d7234cb1f32aeffe2c0cbe
--- /dev/null
+++ b/app/src/views/ServerSidePagination.vue
@@ -0,0 +1,86 @@
+<template>
+<div id="serverSidePagination" class="container-fluid">
+  <h2 class="title alt">
+        <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+          Server Side Pagination
+        </h2>
+        <div class="subtext">This report shows per page 3 documents</div>
+    <div class="row justify-content-center">
+        <div class="col">
+            <div class="box-login">
+                <div class="p-card p-component">
+                  <DataTable :value="items" v-if="items && items.length > 0">
+                  <Column field="addcategory" header="addcategory"></Column>
+                  <Column field="fname" header="fname"></Column>
+                  <Column field="name" header="name"></Column>
+                  <Column field="sname" header="sname"></Column>
+                  </DataTable>
+                  <div class="empty-state" v-else>Records Not Found</div>
+                  <div class="btn-wrapper">
+                    <button class="btn btn-show" v-if="pageNo > 1"  @click="prevClick()">
+                      <i class="isax isax-bold-arrow-left-3"></i>
+                      Prev
+                    </button>
+                    <button  v-if="items && items.length > 0" class="btn btn-submit" :disabled="items == undefined || items.length == 0" @click="nextClick()">
+                      <i class="isax isax-bold-arrow-right-2"></i>
+                      Next
+                    </button>
+                  </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      items: [],
+      pageNo: 1
+    }
+  },
+  mounted () {
+    this.fetchPaginationData()
+  },
+  methods: {
+    prevClick () {
+      if (this.pageNo > 1) {
+        this.pageNo--
+      } else {
+        this.pageNo = 1
+      }
+      this.fetchPaginationData()
+    },
+    nextClick () {
+      this.pageNo++
+      this.fetchPaginationData()
+    },
+    fetchPaginationData () {
+      new MQL()
+        .setActivity('o.[GetPaginationData]')
+        .setData({ pageNo: this.pageNo })
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('GetPaginationData', true)
+          if (rs.isValid('GetPaginationData')) {
+            this.items = res.result
+            this.$toast.add({severity:'success', summary: 'Pagination Data ', detail:'Get Pagination Data', life: 3000})
+          } else {
+            this.items = []
+            rs.showErrorToast('GetPaginationData')
+          }
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.subtext {
+  margin-top: 0.25rem;
+  margin-left: 3rem;
+}
+</style>
\ No newline at end of file
diff --git a/app/src/views/SessionManager.vue b/app/src/views/SessionManager.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7fa6a82ec84999d2aa6c5950b7be27941720ecf1
--- /dev/null
+++ b/app/src/views/SessionManager.vue
@@ -0,0 +1,125 @@
+<template>
+	<div id="sessionManager" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Session Manager
+		</h2>
+		<div class="row justify-content-center">
+			<div class="tabs">
+				<a class="tab tab-bordered" @click.prevent="storeDataPush"> Store Data</a>
+				<a class="tab tab-bordered tab-active" @click.prevent="fetchDataPush">Fetch Data</a>
+				<a class="tab tab-bordered" @click.prevent="deleteDataPush">Delete Data</a>
+			</div>
+			<!-- <div class="col-4">
+				<div class="box-login clickable">
+					<div class="p-card p-component" @click.prevent="storeDataPush">
+						<div class="icon-holder">
+							<i class="isax isax-bold-story"></i>
+						</div>
+						<div class="bx-login-name">Store Data</div>
+					</div>
+				</div>
+			</div>
+			<div class="col-4">
+				<div class="box-login clickable">
+					<div class="p-card p-component" @click.prevent="fetchDataPush">
+						<div class="icon-holder">
+							<i class="isax isax-bold-document-download"></i>
+						</div>
+						<div class="bx-login-name">Fetch Data</div>
+					</div>
+				</div>
+			</div>
+			<div class="col-4">
+				<div class="box-login clickable">
+					<div class="p-card p-component" @click.prevent="deleteDataPush">
+						<div class="icon-holder">
+							<i class="isax isax-bold-trash"></i>
+						</div>
+						<div class="bx-login-name">Delete Data</div>
+					</div>
+				</div>
+			</div> -->
+		</div>
+	</div>
+</template>
+
+<script>
+	import MQL from "@/plugins/mql.js"
+	export default {
+		data() {
+			return {
+				session: {},
+				fetchKey: "",
+				deleteKey: "",
+				sessionResult: "",
+			}
+		},
+		methods: {
+			storeDataPush() {
+				this.$router.push("/storeData")
+			},
+			fetchDataPush() {
+				this.$router.push("/fetchData")
+			},
+			deleteDataPush() {
+				this.$router.push("deleteData")
+			},
+			saveSessionData() {
+				new MQL()
+					.setActivity("o.[StoreDataInSession]")
+					.setData(this.session)
+					.fetch()
+					.then((rs) => {
+						rs.getActivity("StoreDataInSession", true)
+						if (rs.isValid("StoreDataInSession")) {
+							this.session = {}
+							alert("Data saved successfully")
+						} else {
+							rs.showErrorToast("StoreDataInSession")
+						}
+					})
+			},
+			fetchSessionData() {
+				new MQL()
+					.setActivity("o.[FetchDataFromSession]")
+					.setData({ name: this.fetchKey })
+					.fetch()
+					.then((rs) => {
+						let res = rs.getActivity("FetchDataFromSession", true)
+						if (rs.isValid("FetchDataFromSession")) {
+							if (res && res.result) {
+								this.sessionResult = res.result
+								this.fetchKey = ""
+								alert("Data fetched successfully")
+							} else {
+								alert("Data fetched failed")
+							}
+						} else {
+							rs.showErrorToast("FetchDataFromSession")
+						}
+					})
+			},
+			deleteSessionData() {
+				new MQL()
+					.setActivity("o.[DeleteDataFromSession]")
+					.setData({ name: this.deleteKey })
+					.fetch()
+					.then((rs) => {
+						let res = rs.getActivity("DeleteDataFromSession", true)
+						if (rs.isValid("DeleteDataFromSession")) {
+							if (res && res.result) {
+								this.sessionResult = res.result
+								this.deleteKey = ""
+								alert("Data deleted successfully")
+							} else {
+								alert("Data delete failed")
+							}
+						} else {
+							rs.showErrorToast("DeleteDataFromSession")
+						}
+					})
+			},
+		},
+	}
+</script>
diff --git a/app/src/views/StudentDemo.vue b/app/src/views/StudentDemo.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e7e60848b047c1d47f5497900e3da9cb0066057e
--- /dev/null
+++ b/app/src/views/StudentDemo.vue
@@ -0,0 +1,123 @@
+<template>
+  <div>
+    <h3>Save Student</h3>
+    Student Name: <input
+      v-model="student.name"
+      required
+    > <br>
+    Student Age: <input
+      v-model.number="student.age"
+      required
+    > <br>
+    Student address: <input
+      v-model="student.address"
+      required
+    ><br>
+    <button @click="saveStudentData">
+      Save
+    </button>
+    <br><br>
+    <h3>Update Student</h3>
+    Student Name: <input
+      v-model="uname"
+      required
+    > <br>
+    <button @click="updateStudentData">
+      Update
+    </button>
+    <div>{{ updatedRes }}</div>
+    <br><br>
+    <h3>Fetch All Student</h3>
+    <button @click="fetchAllStudent">
+      FetchAllStudent
+    </button>
+    <div>{{ AllStudent }}</div>
+    <br><br>
+    <h3>Delete Student</h3>
+    Student Name: <input
+      v-model="dstudent"
+      required
+    > <br>
+    <button @click="deleteStudentData">
+      Delete
+    </button>
+  </div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      student: {},
+      uname: '',
+      dstudent: '',
+      updatedRes: '',
+      AllStudent: []
+    }
+  },
+  methods: {
+    saveStudentData () {
+      // alert(JSON.stringify(this.student))
+      new MQL()
+        .setActivity('o.[SaveStudentData]')
+        .setData(this.student)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('SaveStudentData', true)
+          if (rs.isValid('SaveStudentData')) {
+            alert(JSON.stringify(res))
+            alert('student saved successfully')
+            this.student = {}
+          } else {
+            rs.showErrorToast('SaveStudentData')
+          }
+        })
+    },
+    updateStudentData () {
+      new MQL()
+        .setActivity('o.[UpdateStudentData]')
+        .setData({ name: this.uname })
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('UpdateStudentData', true)
+          if (rs.isValid('UpdateStudentData')) {
+            this.updatedRes = res.result
+            this.uname = ''
+          } else {
+            rs.showErrorToast('UpdateStudentData')
+          }
+        })
+    },
+    deleteStudentData () {
+      new MQL()
+        .setActivity('o.[DeleteStudentData]')
+        .setData({ name: this.dstudent })
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('DeleteStudentData', true)
+          if (rs.isValid('DeleteStudentData')) {
+            alert('Student deleted successfully')
+            this.dstudent = ''
+          } else {
+            rs.showErrorToast('DeleteStudentData')
+          }
+        })
+    },
+    fetchAllStudent () {
+      new MQL()
+        .setActivity('o.[query_1tvgHmekn2RX1jUoViq5E0vDPh9]')
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('query_1tvgHmekn2RX1jUoViq5E0vDPh9', true)
+          if (rs.isValid('query_1tvgHmekn2RX1jUoViq5E0vDPh9')) {
+            this.AllStudent = res
+          } else {
+            rs.showErrorToast('query_1tvgHmekn2RX1jUoViq5E0vDPh9')
+          }
+        })
+    }
+  }
+}
+</script>
+<style></style>
diff --git a/app/src/views/TableDemo.vue b/app/src/views/TableDemo.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ba44c3e9e3970cfda70e3edf3d1e937108039037
--- /dev/null
+++ b/app/src/views/TableDemo.vue
@@ -0,0 +1,32 @@
+<template>
+  <div id="tableDemo" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Table
+    </h2>
+    <mTable
+      id-table="tblPlaces"
+      restriction="o"
+      activity="query_1el1NAwh6nMeZl1PhbzhP1TyQLf"
+      msg="Table Component"
+    />
+  </div>
+</template>
+
+<script>
+import MTable from '@/components/MTable.vue'
+
+export default {
+  components: {
+    mTable: MTable
+  },
+  data () {
+    return {
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+
+</style>
diff --git a/app/src/views/UploadManager.vue b/app/src/views/UploadManager.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0a50c403ccacf6a28292fafe8d71ec37af0ce395
--- /dev/null
+++ b/app/src/views/UploadManager.vue
@@ -0,0 +1,104 @@
+<template>
+  <div id="uploadManager" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Upload Manager
+    </h2>
+    <div class="row justify-content-center">
+      <!-- <div class="col-4">
+        <div class="box-login clickable" @click.prevent="uploadFilePush">
+          <div class="p-card p-component">
+           <div class="icon-holder">
+            <i class="isax isax-bold-document-upload"></i>
+           </div>
+           <div class="bx-login-name">
+            Upload File
+           </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-4">
+        <div class="box-login clickable" @click.prevent="uploadProgressPush">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-document-cloud"></i>
+            </div>
+            <div class="bx-login-name">
+              Upload Progress Check
+            </div>
+          </div>
+        </div>
+      </div> -->
+      	<div class="tabs">
+				<a class="tab tab-bordered" @click.prevent="uploadFilePush">Upload File</a>
+				<a class="tab tab-bordered tab-active" @click.prevent="uploadProgressPush">Upload Progress Check</a>
+        </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      upload: {},
+      uploadId: '',
+      uploadResult: '',
+      progressResult: ''
+    }
+  },
+  methods: {
+    uploadFilePush () {
+      this.$router.push('/uploadFile')
+    },
+    uploadProgressPush () {
+      this.$router.push('/uploadProgessFile')
+    },
+
+    uploadFile () {
+      // var a = []
+      // a.push(this.upload.uploadFileUrl)
+      // this.upload.uploadFileUrl = a
+      var a = {
+        cdnBaseUrl: [this.upload.cdnBaseUrl],
+        uploadFileUrl: [this.upload.uploadFileUrl],
+        destinationFileUrl: [this.upload.destinationFileUrl]
+      }
+      new MQL()
+        .setActivity('o.[UploadFileUsingUM]')
+        .setData(a)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('UploadFileUsingUM', true)
+          if (rs.isValid('UploadFileUsingUM')) {
+            this.upload = {}
+            this.uploadResult = res.result
+            alert('File uploaded successfully')
+          } else {
+            rs.showErrorToast('UploadFileUsingUM')
+          }
+        })
+    },
+    checkUploadProgress () {
+      new MQL()
+        .setActivity('o.[CheckUploadedFileProgress]')
+        .setData({ uploadFileId: this.uploadId })
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('CheckUploadedFileProgress', true)
+          if (rs.isValid('CheckUploadedFileProgress')) {
+            if (res && res.result) {
+              this.progressResult = res.result
+              this.uploadId = ''
+            } else {
+              alert('Progress checking failed')
+            }
+          } else {
+            rs.showErrorToast('CheckUploadedFileProgress')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/Validator.vue b/app/src/views/Validator.vue
new file mode 100644
index 0000000000000000000000000000000000000000..eaa035bc3acca98df2582c6c692f780bcf0c62d3
--- /dev/null
+++ b/app/src/views/Validator.vue
@@ -0,0 +1,230 @@
+<template>
+	<div id="validator" class="container-fluid">
+		<h2 class="title alt">
+			<i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+			Validator
+		</h2>
+		<div class="row justify-content-center">
+			<div class="col-auto">
+				<div class="box-login">
+					<div class="p-card p-component">
+						<!-- <Form @submit="onSubmit" :validation-schema="schema" v-slot="{ errors }">
+              <div class="field">
+                <label>Title</label>
+                <Field
+                  name="title"
+                  as="select"
+                  class="p-dropdown p-componet p-inputwrapper"
+                  :class="{ 'is-invalid': errors.title }"
+                >
+                  <option class="p-dropdown-item" value="">Select your title</option>
+                  <option class="p-dropdown-item" value="Mr">Mr</option>
+                  <option class="p-dropdown-item" value="Mrs">Mrs</option>
+                  <option class="p-dropdown-item" value="Miss">Miss</option>
+                  <option class="p-dropdown-item" value="Ms">Ms</option>
+                </Field>
+                <div class="invalid-feedback">{{ errors.title }}</div>
+              </div>
+              <div class="field">
+                <label>First Name</label>
+                <Field
+                  name="firstName"
+                  type="text"
+                  class="p-inputtext p-component"
+                  :class="{ 'is-invalid': errors.firstName }"
+                />
+                <div class="invalid-feedback">{{ errors.firstName }}</div>
+              </div>
+              <div class="field">
+                <label>Last Name</label>
+                <Field
+                  name="lastName"
+                  type="text"
+                  class="p-inputtext p-component"
+                  :class="{ 'is-invalid': errors.lastName }"
+                />
+                <div class="invalid-feedback">{{ errors.lastName }}</div>
+              </div>
+              <div class="field">
+                <label>Date of Birth</label>
+                <Field
+                  name="dob"
+                  type="date"
+                  class="p-inputtext p-component"
+                  :class="{ 'is-invalid': errors.dob }"
+                />
+                <div class="invalid-feedback">{{ errors.dob }}</div>
+              </div>
+              <div class="field">
+                <label>Email</label>
+                <Field
+                  name="email"
+                  type="text"
+                  class="p-inputtext p-component"
+                  :class="{ 'is-invalid': errors.email }"
+                />
+                <div class="invalid-feedback">{{ errors.email }}</div>
+              </div>
+              <div class="field">
+                <label>Password</label>
+                <Field
+                  name="password"
+                  type="password"
+                  class="p-inputtext p-component"
+                  :class="{ 'is-invalid': errors.password }"
+                />
+                <div class="invalid-feedback">{{ errors.password }}</div>
+              </div>
+              <div class="field">
+                <label>Confirm Password</label>
+                <Field
+                  name="confirmPassword"
+                  type="password"
+                  class="p-inputtext p-component"
+                  :class="{ 'is-invalid': errors.confirmPassword }"
+                />
+                <div class="invalid-feedback">{{ errors.confirmPassword }}</div>
+              </div>
+              <div class="field">
+                <Field
+                  name="acceptTerms"
+                  type="checkbox"
+                  id="acceptTerms"
+                  value="true"
+                  class="p-checkbox p-component"
+                  :class="{ 'is-invalid': errors.acceptTerms }"
+                />
+                <label for="acceptTerms" class="label-checkbox"
+                  >Accept Terms & Conditions</label
+                >
+                <div class="invalid-feedback">{{ errors.acceptTerms }}</div>
+              </div>
+              <div class="btn-wrapper">
+                <button class="btn btn-submit" type="submit">
+                  <i class="isax isax-bold-tick-circle"></i>
+                  Submit
+                </button>
+              </div>
+            </Form> -->
+						<FormKit
+							type="form"
+							id="validator-example"
+							:form-class="submitted ? 'hide' : 'show'"
+							submit-label="Register"
+							:actions="false"
+							#default="{ value }"
+						>
+							<FormKit
+								type="select"
+								label="Select Salutation"
+                placeholder="Select Salutation"
+								name="salutation"
+								:options="['MR', 'MISS']"
+                validation="required"
+							/>
+							<FormKit
+								type="text"
+								name="firstName"
+								label="firstName"
+								v-model="firstName"
+								placeholder="First Name"
+								help="Enter First Name"
+								validation="required"
+							/>
+							<FormKit
+								type="text"
+								name="lastName"
+								label="lastName"
+								v-model="lastName"
+								placeholder="Last Name"
+								help="Enter Last Name"
+								validation="required"
+							/>
+							<FormKit
+								type="date"
+								value="2011-01-01"
+								label="Birthday"
+								help="Enter your birth day"
+								validation="required|date_before:2010-01-01"
+								validation-visibility="live"
+							/><FormKit
+								type="email"
+								name="email"
+								label="email"
+								v-model="email"
+								placeholder="Email"
+								help="Enter Email"
+								validation="required"
+							/>
+							<div class="double">
+								<FormKit
+									type="password"
+									name="password"
+									label="Password"
+									validation="required|length:6|matches:/[^a-zA-Z]/"
+									:validation-messages="{
+										matches: 'Please include at least one symbol',
+									}"
+									placeholder="Your password"
+									help="Choose a password"
+								/>
+								<FormKit
+									type="password"
+									name="password_confirm"
+									label="Confirm password"
+									placeholder="Confirm password"
+									validation="required|confirm"
+									help="Confirm your password"
+								/>
+								<FormKit
+									type="checkbox"
+									label="Terms and Conditions"
+									help="Do you agree to our terms of service?"
+									name="terms"
+									:value="true"
+									validation="accepted"
+									validation-visibility="dirty"
+								/>
+							</div>
+							<FormKit type="submit" label="Register" />
+							<!-- <pre wrap>{{ value }}</pre> -->
+						</FormKit>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import * as Yup from "yup"
+
+	export default {
+		data() {
+			return {
+				schema: Yup.object().shape({
+					title: Yup.string().required("Title is required"),
+					firstName: Yup.string().required("First Name is required"),
+					lastName: Yup.string().required("Last name is required"),
+					dob: Yup.string()
+						.required("Date of Birth is required")
+						.matches(
+							/^\d{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/,
+							"Date of Birth must be a valid date in the format YYYY-MM-DD"
+						),
+					email: Yup.string().required("Email is required").email("Email is invalid"),
+					password: Yup.string().min(6, "Password must be at least 6 characters").required("Password is required"),
+					confirmPassword: Yup.string()
+						.oneOf([Yup.ref("password"), null], "Passwords must match")
+						.required("Confirm Password is required"),
+					acceptTerms: Yup.string().required("Accept Ts & Cs is required"),
+				}),
+				onSubmit: (values) => {
+					alert("SUCCESS!! :-)\n\n" + JSON.stringify(values, null, 4))
+				},
+			}
+		},
+	}
+</script>
+
+<style></style>
diff --git a/app/src/views/autoBL.vue b/app/src/views/autoBL.vue
new file mode 100644
index 0000000000000000000000000000000000000000..15bcb28800621a19962ca87878341144cedf1962
--- /dev/null
+++ b/app/src/views/autoBL.vue
@@ -0,0 +1,75 @@
+<template>
+  <div class="container-fluid" id="autoBL">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Auto BL
+    </h2>
+    <div class="subtext">To check positive condition write "CoreStudio" string in input box</div>
+    <div class="row justify-content-center">
+      <div class="col-auto">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <div class="field">
+              <div class="p-float-label">
+                <input type="text" v-model="autobl.name" :class="autobl.name ? 'p-filled' : ''" id="bl"
+                  class="p-inputtext p-component">
+                <label for="bl">Enter string</label>
+              </div>
+            </div>
+            <div class="btn-wrapper">
+              <button class="btn btn-submit" @click.prevent="autoblDemo">
+                <i class="isax isax-bold-tick-circle"></i>
+                Test
+              </button>
+            </div>
+            <div class="field mt-4">
+              <h3>Result</h3>
+              <json-viewer :value="autoblResult" boxed :expanded="true"></json-viewer>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+import jsonViewer from 'vue-json-viewer'
+export default {
+  data() {
+    return {
+      autobl: {},
+      autoblResult: ''
+    }
+  },
+  components: {
+    jsonViewer
+  },
+  methods: {
+    autoblDemo() {
+      new MQL()
+        .setActivity('o.[AutoBLDemo]')
+        .setData(this.autobl)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('AutoBLDemo', true)
+          if (rs.isValid('AutoBLDemo')) {
+            this.autobl = {}
+            this.autoblResult = res.result
+          } else {
+            rs.showErrorToast('AutoBLDemo')
+          }
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.subtext {
+  margin-left: 3rem;
+  margin-top: 0.75rem;
+}
+</style>
\ No newline at end of file
diff --git a/app/src/views/email.vue b/app/src/views/email.vue
new file mode 100644
index 0000000000000000000000000000000000000000..acf67b5cd839fab7a2f6e5d20a454d48efea2072
--- /dev/null
+++ b/app/src/views/email.vue
@@ -0,0 +1,70 @@
+<template>
+  <div class="container-fluid">
+      <h2 class="title alt">
+        <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+        Email
+      </h2>
+      <div class="row justify-content-center">
+          <div class="col-6">
+              <div class="box-login clickable"  @click.prevent="sendStatic">
+                  <div class="p-card p-component">
+                    <div class="icon-holder">
+                      <i class="isax isax-bold-sms"></i>
+                    </div>
+                    <div class="bx-login-name">
+                      Send Static Email Example
+                    </div>
+                  </div>
+              </div>
+          </div>
+          <div class="col-6">
+            <div class="box-login clickable" @click.prevent="sendDynamic">
+                  <div class="p-card p-component">
+                    <div class="icon-holder">
+                      <i class="isax isax-bold-sms-tracking"></i>
+                    </div>
+                    <div class="bx-login-name">
+                      Send Dynamic Email Example
+                    </div>
+                  </div>
+              </div>
+          </div>
+      </div>
+  </div>
+  </template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      email: {}
+    }
+  },
+  components: {
+  },
+  methods: {
+    sendDynamic () {
+      this.$router.push('/sendDynamicEmails')
+    },
+    sendStatic () {
+      this.$router.push('/sendStaticEmails')
+    },
+    sendemail () {
+      new MQL()
+        .setActivity('o.[SendEmail]')
+        .setData(this.email)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SendEmail', true)
+          if (rs.isValid('SendEmail')) {
+            this.email = {}
+            this.$toast.add({severity:'success', summary: 'Email Sent ', detail:'Email Sent Successfully', life: 3000})
+          } else {
+            rs.showErrorToast('SendEmail')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/generateOTP.vue b/app/src/views/generateOTP.vue
new file mode 100644
index 0000000000000000000000000000000000000000..19b7a83b0f730deee5beaac2954c1856ad9ad889
--- /dev/null
+++ b/app/src/views/generateOTP.vue
@@ -0,0 +1,72 @@
+<template>
+<div class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Generate OTP
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-auto">
+            <div class="box-login">
+                <div class="p-card p-component">
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="text" class="p-inputtext p-component" :class="otp.number ? 'p-filled' : ''" id="number" v-model="otp.number">
+                        <label for="number">Enter mobile number</label>
+                      </div>
+                    </div>
+                    <div class="btn-wrapper">
+                        <button class="btn btn-submit" @click.prevent="generateOTP">
+                            <i class="isax isax-bold-message"></i>
+                          Generate
+                        </button>
+                    </div>
+                    <div class="field mt-4">
+                      <h3>Result</h3>
+                      <json-viewer :value="result" boxed :expanded="true"></json-viewer>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+import jsonViewer from 'vue-json-viewer'
+export default {
+  data () {
+    return {
+      otp: {},
+      result: ''
+    }
+  },
+  components: {
+    jsonViewer
+  },
+  methods: {
+    onCopy () {
+      this.$toast.add({severity:'info', summary: 'OTP ', detail:'You just copied OTP', life: 3000})
+    },
+    onError () {
+      this.$toast.add({severity:'error', summary: 'OTP ', detail:'Failed to get OTP', life: 3000})
+    },
+    generateOTP () {
+      new MQL()
+        .setActivity('o.[smsOTP]')
+        .setData(this.otp)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('smsOTP', true)
+          if (rs.isValid('smsOTP')) {
+            this.otp = {}
+            this.result = res.result
+            this.$toast.add({severity:'success', summary: 'OTP ', detail:'OTP Sent Successfully', life: 3000})
+          } else {
+            rs.showErrorToast('smsOTP')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/insertCustomMongoId.vue b/app/src/views/insertCustomMongoId.vue
new file mode 100644
index 0000000000000000000000000000000000000000..6df39420ca444832264d0d5f4701ffcb3243ad3c
--- /dev/null
+++ b/app/src/views/insertCustomMongoId.vue
@@ -0,0 +1,84 @@
+<template>
+  <div id="customMongoID" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Insert Any Custom MongoDB ID
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-6">
+        <div class="box-login clickable" @click.prevent="customIDPush">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-data"></i>
+              <div class="bx-login-name">
+                Custom ID Example
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-6">
+        <div class="box-login clickable" @click.prevent="hexIDPush">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-data"></i>
+              <div class="bx-login-name">
+                Hex ID Example
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      obj: {},
+      hobj: {}
+    }
+  },
+  methods: {
+    customIDPush () {
+      this.$router.push('/customID')
+    },
+    hexIDPush () {
+      this.$router.push('/hexID')
+    },
+    saveCustomId () {
+      new MQL()
+        .setActivity('o.[SaveCustomObjectID]')
+        .setData(this.obj)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SaveCustomObjectID', true)
+          if (rs.isValid('SaveCustomObjectID')) {
+            this.obj = {}
+            alert('Custom objectId saved successfully')
+          } else {
+            rs.showErrorToast('SaveCustomObjectID')
+          }
+        })
+    },
+    saveCustomHexId () {
+      new MQL()
+        .setActivity('o.[SaveCustomHexObjectID]')
+        .setData(this.hobj)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SaveCustomHexObjectID', true)
+          if (rs.isValid('SaveCustomHexObjectID')) {
+            this.hobj = {}
+            alert('Custom hex objectId saved successfully')
+          } else {
+            rs.showErrorToast('SaveCustomHexObjectID')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/otp.vue b/app/src/views/otp.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2e89131ce06956f0471a2a8e2db644b837c28f96
--- /dev/null
+++ b/app/src/views/otp.vue
@@ -0,0 +1,72 @@
+<template>
+  <div class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      OTP
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-6">
+            <div class="box-login clickable" @click.prevent="generated">
+                <div class="p-card p-component">
+                    <div class="icon-holder">
+                      <i class="isax isax-bold-message"></i>
+                    </div>
+                    <div class="bx-login-name">
+                      Generate OTP Example
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="col-6">
+            <div class="box-login clickable" @click.prevent="verified">
+                <div class="p-card p-component">
+                    <div class="icon-holder">
+                      <i class="isax isax-bold-message-edit"></i>
+                    </div>
+                    <div class="bx-login-name">
+                      Verify OTP Example
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      otp: {},
+      otpResult: ''
+    }
+  },
+  components: {
+  },
+  methods: {
+    generated () {
+      this.$router.push('/generateOTP')
+    },
+    verified () {
+      this.$router.push('/validateOTP')
+    },
+    generateOTP () {
+      new MQL()
+        .setActivity('o.[SendOTP]')
+        .setData(this.otp)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('SendOTP', true)
+          if (rs.isValid('SendOTP')) {
+            this.otp = {}
+            this.otpResult = res.result
+            this.$toast.add({severity:'success', summary: 'OTP', detail:'OTP generated successfully', life: 3000})
+          } else {
+            rs.showErrorToast('SendOTP')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/sendDynamicEmails.vue b/app/src/views/sendDynamicEmails.vue
new file mode 100644
index 0000000000000000000000000000000000000000..48e8ed45ff333dfa379a4c7e98e320a6098f4422
--- /dev/null
+++ b/app/src/views/sendDynamicEmails.vue
@@ -0,0 +1,64 @@
+<template>
+  <div class="container-fluid" id="dynamicEmail">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Dynamic Emails
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-auto">
+            <div class="box-login">
+                <div class="p-card p-component">
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="email" id="email" v-model="email.to" :class="email.to ? 'p-filled' : ''" class="p-inputtext p-component">
+                        <label for="email">Enter email ID</label>
+                      </div>
+                     </div>
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="email" id="email" v-model="email.text" :class="email.text ? 'p-filled' : ''" class="p-inputtext p-component">
+                        <label for="email">Enter message </label>
+                      </div>
+                     </div>
+                    <div class="btn-wrapper">
+                        <button class="btn btn-submit" @click.prevent="submitDynamic">
+                            <i class="isax isax-bold-sms-tracking"></i>
+                          Send
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      email: {}
+    }
+  },
+  components: {
+  },
+  methods: {
+    submitDynamic () {
+      new MQL()
+        .setActivity('o.[SendDynamicEmails]')
+        .setData(this.email)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SendDynamicEmails', true)
+          if (rs.isValid('SendDynamicEmails')) {
+            this.email = {}
+            this.$toast.add({severity:'success', summary: 'Email Sent ', detail:'Email Sent Successfully', life: 3000})
+          } else {
+            rs.showErrorToast('SendDynamicEmails')
+          }
+        })
+    }
+  }
+}
+</script>
diff --git a/app/src/views/sendDynamicMessages.vue b/app/src/views/sendDynamicMessages.vue
new file mode 100644
index 0000000000000000000000000000000000000000..63ec2c4e2bdc6bfab22a0eb9ff1254f9dcbae04c
--- /dev/null
+++ b/app/src/views/sendDynamicMessages.vue
@@ -0,0 +1,69 @@
+<template>
+<div class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Dynamic Messages
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-auto">
+            <div class="box-login">
+                <div class="p-card p-component">
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="text" class="p-inputtext p-component" v-model="sms.number" id="number" :class="sms.number ? 'p-filled' : ''">
+                        <label for="number">Enter mobile number</label>
+                      </div>
+                    </div>
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="text" class="p-inputtext p-component" v-model="sms.message" id="message" :class="sms.message ? 'p-filled' : ''">
+                        <label for="number">Enter message</label>
+                      </div>
+                    </div>
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="text" class="p-inputtext p-component" v-model="sms.templateId" id="templateId" :class="sms.templateId ? 'p-filled' : ''">
+                        <label for="templateId">Enter template Id</label>
+                      </div>
+                    </div>
+                    <div class="btn-wrapper">
+                        <button class="btn btn-submit" @click.prevent="sendDynamicMessages">
+                            <i class="isax isax-bold-sms"></i>
+                          Send
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      sms: {}
+    }
+  },
+
+  methods: {
+    sendDynamicMessages () {
+      new MQL()
+        .setActivity('o.[SendDynamicMessages]')
+        .setData(this.sms)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SendDynamicMessages', true)
+          if (rs.isValid('SendDynamicMessages')) {
+            this.sms = {}
+            this.$toast.add({severity:'success', summary: 'SMS Sent ', detail:'SMS Sent Successfully', life: 3000})
+          } else {
+            rs.showErrorToast('SendDynamicMessages')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/sendStaticEmails.vue b/app/src/views/sendStaticEmails.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ee7dc3df6fecbfa57da68b3d8d8b08072ff9cf05
--- /dev/null
+++ b/app/src/views/sendStaticEmails.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Static Email
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-auto">
+            <div class="box-login">
+                <div class="p-card p-component">
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="email" v-model="email.to" class="p-inputtext p-component" :class="email.to ? 'p-filled' : ''" id="email" required>
+                        <label for="email">Enter Email ID</label>
+                      </div>
+                    </div>
+                    <div class="btn-wrapper">
+                        <button class="btn btn-submit" @click.prevent="sendemail" >
+                            <i class="isax isax-bold-sms"></i>
+                          Send Email
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      email: {}
+    }
+  },
+
+  methods: {
+    sendemail () {
+      new MQL()
+        .setActivity('o.[SendEmails]')
+        .setData(this.email)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SendEmails', true)
+          if (rs.isValid('SendEmails')) {
+            this.email = {}  
+            this.$toast.add({severity:'success', summary: 'Email Sent ', detail:'Email Sent Successfully', life: 3000})
+          } else {
+            rs.showErrorToast('SendEmails')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/sendStaticMessages.vue b/app/src/views/sendStaticMessages.vue
new file mode 100644
index 0000000000000000000000000000000000000000..244360a9ca378b2bd093fc4baab522e3fa441778
--- /dev/null
+++ b/app/src/views/sendStaticMessages.vue
@@ -0,0 +1,66 @@
+<template>
+<div class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Static Messages
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-auto">
+            <div class="box-login">
+                <div class="p-card p-component">
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="text" v-model="msg.number" class="p-inputtext p-component" :class="msg.number ? 'p-filled' : ''" id="number">
+                        <label for="number">Enter mobile number</label>
+                      </div>
+                      <div class="mt-1">
+                        <small><b>{{ text }}</b></small>
+                      </div>
+                      <div class="mt-1">
+                        <small><b>{{ alert }}</b></small>
+                      </div>
+                    </div>
+                    <div class="btn-wrapper">
+                        <button class="btn btn-submit" @click.prevent="mysms">
+                            <i class="isax isax-bold-sms"></i>
+                            Send
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      number: null,
+      text: null,
+      alert: null,
+      msg: {}
+    }
+  },
+
+  methods: {
+    mysms () {
+      new MQL()
+        .setActivity('o.[MySMSTestActivity]')
+        .setData(this.msg)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('MySMSTestActivity', true)
+          if (rs.isValid('MySMSTestActivity')) {
+            this.sms = {}
+            this.$toast.add({severity:'success', summary: 'SMS Sent ', detail:'SMS Sent Successfully', life: 3000})
+          } else {
+            rs.showErrorToast('MySMSTestActivity')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/sms.vue b/app/src/views/sms.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3c9ff9319568a5a74feec994469bd04121941da4
--- /dev/null
+++ b/app/src/views/sms.vue
@@ -0,0 +1,70 @@
+<template>
+<div class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      SMS
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-6">
+            <div class="box-login clickable"  @click.prevent="staticPage">
+                <div class="p-card p-component">
+                  <div class="icon-holder">
+                    <i class="isax isax-bold-sms"></i>
+                  </div>
+                  <div class="bx-login-name">
+                    Send Static Message Example
+                  </div>
+                </div>
+            </div>
+        </div>
+        <div class="col-6">
+          <div class="box-login clickable" @click.prevent="dynamicPage">
+                <div class="p-card p-component">
+                  <div class="icon-holder">
+                    <i class="isax isax-bold-sms"></i>
+                  </div>
+                  <div class="bx-login-name">
+                    Send Dynamic Message Example
+                  </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      sms: {}
+    }
+  },
+
+  methods: {
+    staticPage () {
+      this.$router.push('/sendStaticMessages')
+    },
+    dynamicPage () {
+      this.$router.push('/sendDynamicMessages')
+    },
+
+    sendsms () {
+      new MQL()
+        .setActivity('o.[SendSMS]')
+        .setData(this.sms)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('SendSMS', true)
+          if (rs.isValid('SendSMS')) {
+            this.sms = {}
+            this.$toast.add({severity:'success', summary: 'SMS Sent ', detail:'SMS sent successfully', life: 3000})
+          } else {
+            rs.showErrorToast('SendSMS')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/tailwindForm.vue b/app/src/views/tailwindForm.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3cf9e96f82c549270c9aa678170109f7198ca8d9
--- /dev/null
+++ b/app/src/views/tailwindForm.vue
@@ -0,0 +1,178 @@
+<template>
+    <div>
+
+    
+
+
+<h1>Table 1</h1>
+
+<div class="relative overflow-x-auto">
+    <table class="w-full text-sm text-left text-gray-500 dark:text-gray-400">
+        <thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
+            <tr>
+                <th scope="col" class="px-6 py-3">
+                    Product name
+                </th>
+                <th scope="col" class="px-6 py-3">
+                    Color
+                </th>
+                <th scope="col" class="px-6 py-3">
+                    Category
+                </th>
+                <th scope="col" class="px-6 py-3">
+                    Price
+                </th>
+            </tr>
+        </thead>
+        <tbody>
+            <tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
+                <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white">
+                    Apple MacBook Pro 17"
+                </th>
+                <td class="px-6 py-4">
+                    Silver
+                </td>
+                <td class="px-6 py-4">
+                    Laptop
+                </td>
+                <td class="px-6 py-4">
+                    $2999
+                </td>
+            </tr>
+            <tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
+                <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white">
+                    Microsoft Surface Pro
+                </th>
+                <td class="px-6 py-4">
+                    White
+                </td>
+                <td class="px-6 py-4">
+                    Laptop PC
+                </td>
+                <td class="px-6 py-4">
+                    $1999
+                </td>
+            </tr>
+            <tr class="bg-white dark:bg-gray-800">
+                <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white">
+                    Magic Mouse 2
+                </th>
+                <td class="px-6 py-4">
+                    Black
+                </td>
+                <td class="px-6 py-4">
+                    Accessories
+                </td>
+                <td class="px-6 py-4">
+                    $99
+                </td>
+            </tr>
+        </tbody>
+    </table>
+</div>
+
+
+
+<H1>Table 2</H1>
+ <div class="relative overflow-x-auto shadow-md sm:rounded-lg">
+    <table class="w-full text-sm text-left text-gray-500 dark:text-gray-400">
+        <thead class="text-xs text-gray-700 uppercase dark:text-gray-400">
+            <tr>
+                <th scope="col" class="px-6 py-3 bg-gray-50 dark:bg-gray-800">
+                    Product name
+                </th>
+                <th scope="col" class="px-6 py-3">
+                    Color
+                </th>
+                <th scope="col" class="px-6 py-3 bg-gray-50 dark:bg-gray-800">
+                    Category
+                </th>
+                <th scope="col" class="px-6 py-3">
+                    Price
+                </th>
+            </tr>
+        </thead>
+        <tbody>
+            <tr class="border-b border-gray-200 dark:border-gray-700">
+                <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800">
+                    Apple MacBook Pro 17"
+                </th>
+                <td class="px-6 py-4">
+                    Silver
+                </td>
+                <td class="px-6 py-4 bg-gray-50 dark:bg-gray-800">
+                    Laptop
+                </td>
+                <td class="px-6 py-4">
+                    $2999
+                </td>
+            </tr>
+            <tr class="border-b border-gray-200 dark:border-gray-700">
+                <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800">
+                    Microsoft Surface Pro
+                </th>
+                <td class="px-6 py-4">
+                    White
+                </td>
+                <td class="px-6 py-4 bg-gray-50 dark:bg-gray-800">
+                    Laptop PC
+                </td>
+                <td class="px-6 py-4">
+                    $1999
+                </td>
+            </tr>
+            <tr class="border-b border-gray-200 dark:border-gray-700">
+                <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800">
+                    Magic Mouse 2
+                </th>
+                <td class="px-6 py-4">
+                    Black
+                </td>
+                <td class="px-6 py-4 bg-gray-50 dark:bg-gray-800">
+                    Accessories
+                </td>
+                <td class="px-6 py-4">
+                    $99
+                </td>
+            </tr>
+            <tr class="border-b border-gray-200 dark:border-gray-700">
+                <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800">
+                    Google Pixel Phone
+                </th>
+                <td class="px-6 py-4">
+                    Gray
+                </td>
+                <td class="px-6 py-4 bg-gray-50 dark:bg-gray-800">
+                    Phone
+                </td>
+                <td class="px-6 py-4">
+                    $799
+                </td>
+            </tr>
+            <tr>
+                <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800">
+                    Apple Watch 5
+                </th>
+                <td class="px-6 py-4">
+                    Red
+                </td>
+                <td class="px-6 py-4 bg-gray-50 dark:bg-gray-800">
+                    Wearables
+                </td>
+                <td class="px-6 py-4">
+                    $999
+                </td>
+            </tr>
+        </tbody>
+    </table>
+</div>
+
+
+
+
+</div>
+
+</template>
+<script>
+
+</script>
\ No newline at end of file
diff --git a/app/src/views/updateUserDataUsingBL.vue b/app/src/views/updateUserDataUsingBL.vue
new file mode 100644
index 0000000000000000000000000000000000000000..afdcebb127fcda9811870f7a6f00534f8321c186
--- /dev/null
+++ b/app/src/views/updateUserDataUsingBL.vue
@@ -0,0 +1,83 @@
+<template>
+  <div id="updateUsingBl" class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Update Data using BL
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-6">
+        <div class="box-login clickable" @click.prevent="updateUserPush">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-refresh"></i>
+            </div>
+            <div class="bx-login-name">
+              Update user data
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="col-6">
+        <div class="box-login clickable" @click.prevent="updateDbSave">
+          <div class="p-card p-component">
+            <div class="icon-holder">
+              <i class="isax isax-bold-document-download"></i>
+            </div>
+            <div class="bx-login-name">
+              Updated and Save to Database
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      obj: {},
+      sobj: {},
+      result: ''
+    }
+  },
+  methods: {
+    updateUserPush () {
+      this.$router.push('/updateUser')
+    },
+    updateDbSave () {
+      this.$router.push('/updateDbSave')
+    },
+    updateObjectUsingBL () {
+      new MQL()
+        .setActivity('o.[UpdateObjectUsingBL]')
+        .setData(this.obj)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('UpdateObjectUsingBL', true)
+          if (rs.isValid('UpdateObjectUsingBL')) {
+            alert('Data update success')
+            this.result = res.result
+          } else {
+            rs.showErrorToast('UpdateObjectUsingBL')
+          }
+        })
+    },
+    updateObjectUsingBLAndSave () {
+      new MQL()
+        .setActivity('o.[UpdateObjectUsingBLAndSave]')
+        .setData(this.sobj)
+        .fetch()
+        .then((rs) => {
+          rs.getActivity('UpdateObjectUsingBLAndSave', true)
+          if (rs.isValid('UpdateObjectUsingBLAndSave')) {
+            alert('Data update & save success')
+          } else {
+            rs.showErrorToast('UpdateObjectUsingBLAndSave')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/validateOTP.vue b/app/src/views/validateOTP.vue
new file mode 100644
index 0000000000000000000000000000000000000000..1cd1a87544ae9dac258a710538fd157a81398217
--- /dev/null
+++ b/app/src/views/validateOTP.vue
@@ -0,0 +1,65 @@
+<template>
+  <div class="container-fluid">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Verify OTP
+    </h2>
+    <div class="row justify-content-center">
+        <div class="col-auto">
+            <div class="box-login">
+                <div class="p-card p-component">
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="text" class="p-inputtext p-component" :class="otp.number ? 'p-filled' : ''" id="number" v-model="otp.number">
+                        <label for="number">Enter mobile number</label>
+                      </div>
+                    </div>
+                    <div class="field">
+                      <div class="p-float-label">
+                        <input type="text" class="p-inputtext p-component" :class="otp.result ? 'p-filled' : ''" id="result" v-model="otp.result">
+                        <label for="result">Enter generated otp</label>
+                      </div>
+                    </div>
+                    <div class="btn-wrapper">
+                        <button class="btn btn-submit" @click.prevent="validateOTP">
+                            <i class="isax isax-bold-message-edit"></i>
+                          Verify
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</template>
+
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  data () {
+    return {
+      otp: {},
+      result: ''
+    }
+  },
+
+  methods: {
+    validateOTP () {
+      new MQL()
+        .setActivity('o.[smsOTP]')
+        .setData(this.otp)
+        .fetch()
+        .then((rs) => {
+          let res = rs.getActivity('smsOTP', true)
+          if (rs.isValid('smsOTP')) {
+            this.otp = {}
+            this.result = res.result
+            this.$toast.add({severity:'success', summary: 'OTP ', detail:'OTP is verified', life: 3000})
+          } else {
+            rs.showErrorToast('smsOTP')
+          }
+        })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/app/src/views/vueClipboard.vue b/app/src/views/vueClipboard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..5a5a752ec9745bfdab177acac04d3d7c9374a915
--- /dev/null
+++ b/app/src/views/vueClipboard.vue
@@ -0,0 +1,50 @@
+<template>
+    <div class="container-fluid">
+      <h2 class="title alt">
+        <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+        Clipboard Demo
+      </h2>
+      <div class="row justify-content-center">
+          <div class="col-auto">
+              <div class="box-login">
+                  <div class="p-card p-component">
+                      <div class="field">
+                        <div >
+                          <textarea  class="p-inputtext p-component" v-model="content" rows="5" cols="90"/>
+                        </div>
+                      </div>
+                      <div class="btn-wrapper">
+                          <button ref="container" class="btn btn-submit" @click="copyContent()" >
+                              <i class="isax isax-bold-copy"></i>
+                            Copy
+                          </button>
+                          
+                      </div>
+                  </div>
+              </div>
+          </div>
+      </div>
+  </div>
+  </template>
+  
+  <script>
+  export default {
+    data () {
+      return {
+        content: 'Computer programming is the process of telling a computer to do certain things by giving it instructions. These instructions are called programs. A person who writes instructions is a computer programmer. The instructions come in different languages; they are called programming languages.'
+      }
+    },
+  
+    methods: {
+      copyContent () {
+        this.$copyText(this.content, undefined, (error, event) => {
+          if (error) {
+            this.$toast.add({ severity: 'error', summary: 'Text Copy', detail: 'Failed to copy text!', life: 3000 })
+          } else {
+            this.$toast.add({ severity: 'success', summary: 'Text Copy', detail: 'Text copied successfully!', life: 3000 })
+          }
+        })
+      }
+    }
+  }
+  </script>
\ No newline at end of file
diff --git a/app/src/views/vueMetaExample.vue b/app/src/views/vueMetaExample.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7de11458b7a55fc5b666f4964fa0c41403c67f5f
--- /dev/null
+++ b/app/src/views/vueMetaExample.vue
@@ -0,0 +1,67 @@
+<template>
+  <div class="container-fluid" id="vueMeta">
+    <h2 class="title alt">
+      <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i>
+      Vue-Meta
+    </h2>
+    <div class="row justify-content-center">
+      <div class="col-4">
+        <div class="box-login">
+          <div class="p-card p-component">
+            <h3>
+              {{ response.name }}
+            </h3>
+            <p>
+              {{ response.description }}
+            </p>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import MQL from '@/plugins/mql.js'
+export default {
+  name: 'Data',
+  metaInfo () {
+    return {
+      title: this.response.title,
+      meta: [
+        {
+          vmid: 'description',
+          name: 'description',
+          content: this.response.description
+        }
+      ]
+    }
+  },
+  data () {
+    return {
+      description: 'I am Data',
+      result: this.$route.params.title,
+      response: ''
+    }
+  },
+  mounted () {
+    // sample activity present in playground project
+    if (this.result) {
+      let data = {
+        name: this.result
+      }
+      new MQL()
+        .setActivity('o.[GetClassRoomName]')
+        .setData(data)
+        .fetch()
+        .then(rs => {
+          let res = rs.getActivity('GetClassRoomName', true)
+          if (rs.isValid('GetClassRoomName')) {
+            this.response = res.result[0]
+          } else {
+            rs.showErrorToast('GetClassRoomName')
+          }
+        })
+    }
+  }
+}
+</script>
diff --git a/app/tailwind.config.js b/app/tailwind.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..c84709af256c637415e8b5b231fc51a254e45676
--- /dev/null
+++ b/app/tailwind.config.js
@@ -0,0 +1,12 @@
+/* @type {import('tailwindcss').Config} */
+export default {
+  content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx,html}"],
+  theme: {
+    extend: {},
+  },
+  plugins: [require("daisyui"),require('tailwind-scrollbar'),
+],
+  daisyui: {
+    themes: ["light", "dark", "cupcake", "bumblebee", "emerald", "corporate", "synthwave", "retro", "cyberpunk", "valentine", "halloween", "garden", "forest", "aqua", "lofi", "pastel", "fantasy", "wireframe", "black", "luxury", "dracula", "cmyk", "autumn", "business", "acid", "lemonade", "night", "coffee", "winter"],
+  },
+};
diff --git a/app/tests/e2e/custom-assertions/elementCount.js b/app/tests/e2e/custom-assertions/elementCount.js
new file mode 100644
index 0000000000000000000000000000000000000000..528830385897b187a62973455fa9580dad3b84eb
--- /dev/null
+++ b/app/tests/e2e/custom-assertions/elementCount.js
@@ -0,0 +1,19 @@
+// A custom Nightwatch assertion.
+// The assertion name is the filename.
+// Example usage:
+//
+//   browser.assert.elementCount(selector, count)
+//
+// For more information on custom assertions see:
+// http://nightwatchjs.org/guide#writing-custom-assertions
+
+exports.assertion = function elementCount (selector, count) {
+  this.message = `Testing if element <${selector}> has count: ${count}`
+  this.expected = count
+  this.pass = val => val === count
+  this.value = res => res.value
+  function evaluator (_selector) {
+    return document.querySelectorAll(_selector).length
+  }
+  this.command = cb => this.api.execute(evaluator, [selector], cb)
+}
diff --git a/app/tests/e2e/specs/login.specs.js b/app/tests/e2e/specs/login.specs.js
new file mode 100644
index 0000000000000000000000000000000000000000..24952eacc7a7208e288b3aeaebc893299f88d822
--- /dev/null
+++ b/app/tests/e2e/specs/login.specs.js
@@ -0,0 +1,18 @@
+
+module.exports = {
+  'Test For Login Success': function (client) {
+    client
+      .url(process.env.VUE_DEV_SERVER_URL)
+      .waitForElementVisible('#app', 5000)
+      .click('[name="loginlink"]')
+      .waitForElementVisible('input[name="email"]', 30000)
+      .waitForElementVisible('input[name="password"]', 30000)
+      .assert.visible('input[name="email"]')
+      .assert.visible('input[name="password"]')
+      .setValue('input[name="email"]', 'test')
+      .setValue('input[name="password"]', 'test')
+      .click('button[name="btnlogin"]')
+      .pause(5000)
+      .end()
+  }
+}
diff --git a/app/tests/e2e/specs/test.js b/app/tests/e2e/specs/test.js
new file mode 100644
index 0000000000000000000000000000000000000000..123740719fea6d14da700f5398ba4f038d1a7ab1
--- /dev/null
+++ b/app/tests/e2e/specs/test.js
@@ -0,0 +1,14 @@
+// For authoring Nightwatch tests, see
+// http://nightwatchjs.org/guide#usage
+
+module.exports = {
+  'default e2e tests': browser => {
+    browser
+      .url(process.env.VUE_DEV_SERVER_URL)
+      .waitForElementVisible('#app', 5000)
+      .assert.elementPresent('.hello')
+      .assert.containsText('h1', 'Welcome to Golang Full Stack Vue App')
+      .assert.elementCount('img', 1)
+      .end()
+  }
+}
diff --git a/app/tests/unit/.eslintrc.js b/app/tests/unit/.eslintrc.js
new file mode 100644
index 0000000000000000000000000000000000000000..4e51c63f4ec969a7230037ce517cba59bc7565b7
--- /dev/null
+++ b/app/tests/unit/.eslintrc.js
@@ -0,0 +1,8 @@
+module.exports = {
+  env: {
+    jest: true
+  },
+  rules: {
+    'import/no-extraneous-dependencies': 'off'
+  }
+}
\ No newline at end of file
diff --git a/app/tests/unit/HelloWorld.spec.js b/app/tests/unit/HelloWorld.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..f84fb39dce9c0ed294ee896a8ab8fd97332b221b
--- /dev/null
+++ b/app/tests/unit/HelloWorld.spec.js
@@ -0,0 +1,12 @@
+import { shallowMount } from '@vue/test-utils'
+import HelloWorld from '@/components/HelloWorld.vue'
+
+describe('HelloWorld.vue', () => {
+  it('renders props.msg when passed', () => {
+    const msg = 'new message'
+    const wrapper = shallowMount(HelloWorld, {
+      propsData: { msg }
+    })
+    expect(wrapper.text()).toMatch(msg)
+  })
+})
diff --git a/app/tests/unit/login.spec.js b/app/tests/unit/login.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..4cc755295d2efc96cdada87dc5df87b51418330a
--- /dev/null
+++ b/app/tests/unit/login.spec.js
@@ -0,0 +1,37 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import { shallowMount } from '@vue/test-utils'
+import Login from '@/views/Login.vue'
+
+Vue.use(Vuex)
+
+describe('Login', () => {
+  let store
+  let actions
+  let state
+
+  beforeEach(() => {
+    state = { data: {} }
+    actions = {
+      AUTH_REQUEST: jest.fn()
+    }
+
+    store = new Vuex.Store({
+      state,
+      actions
+    })
+  })
+
+  it('Test for Login form data entry', () => {
+    const wrapper = shallowMount(Login, {
+      store
+    })
+
+    wrapper.vm.username = 'Test'
+    wrapper.vm.password = 'Test'
+
+    wrapper.find('button').trigger('click')
+
+    expect(actions.AUTH_REQUEST.mock.calls).toHaveLength(1)
+  })
+})
diff --git a/app/vite.config.js b/app/vite.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..429fc521ac4243aada3ab3831511f5161dc5d9fa
--- /dev/null
+++ b/app/vite.config.js
@@ -0,0 +1,66 @@
+import { defineConfig } from "vite";
+import vue from "@vitejs/plugin-vue";
+import vitePluginCompression from "vite-plugin-compression";
+import VueDevTools from 'vite-plugin-vue-devtools'
+import path from "path";
+
+// https://vitejs.dev/config/
+export default defineConfig({
+  publicDir: process.env.NODE_ENV === "production" ? "/app/" : "",
+  base: process.env.NODE_ENV === "production" ? "/app/" : "",
+
+  resolve: {
+    alias: {
+      "@": path.resolve(__dirname, "src"),
+    },
+  },
+  chainWebpack: (config) => {
+    config.plugins.delete("prefetch");
+  },
+  pluginOptions: {
+    webpackBundleAnalyzer: {
+      analyzerMode: "disabled",
+    },
+  },
+  plugins: [vue(), vitePluginCompression(),VueDevTools()],
+  build: {
+    minify: "terser",
+    terserOptions: {
+      ecma: undefined,
+      warnings: false,
+      parse: {},
+      compress: {},
+      mangle: true,
+      module: false,
+      output: {
+        comments: false,
+      },
+      toplevel: false,
+      nameCache: null,
+      ie8: false,
+      keep_classnames: undefined,
+      keep_fnames: false,
+      safari10: false,
+    },
+    sourcemap: true,
+  },
+  server: {
+    port: 8080,
+    proxy: {
+      "/server": {
+        target: "https://cs.mkcl.org/1JFfwe3g8vHuNOtxk2BsH09pBA5",
+        ws: true,
+        secure: false,
+        changeOrigin: true,
+        rewrite: (p) => p.replace(/^\/server/, ""),
+      },
+      "/cdnserver": {
+        target: "https://testcdncs.mkcl.org",
+        ws: true,
+        secure: false,
+        changeOrigin: true,
+        rewrite: (p) => p.replace(/^\/cdnserver/, ""),
+      },
+    },
+  },
+});