From c847a1ba6641cb5541a0316b642b6deb124bf00c Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Sun, 15 Dec 2024 17:04:52 +0100 Subject: [PATCH] feat: vuejs ui to replace old ng frontend (#569) * feat: agate-ui added wip * wip * maven resource plugin and admin.ftl * feat: removed static resources filter, made admin template dynamic * feat: routing to basic pages using stores * feat(ui): simplified main layout * feat(ui): signout and profile redirects * Test and fixed redirect * fix: merge issue * chore: updated agate-ui version --------- Co-authored-by: Ramin Haeri Azad --- .gitignore | 3 - .travis.yml | 2 +- Makefile | 4 + README.md | 4 +- agate-dist/src/main/assembly/agate.xml | 8 + agate-dist/src/test/javascript/karma.conf.js | 68 - .../test/javascript/spec/controllersSpec.js | 92 - .../src/test/javascript/spec/servicesSpec.js | 58 - .../agate/web/rest/security/CorsFilter.java | 25 + agate-ui/.editorconfig | 9 + agate-ui/.eslintignore | 8 + agate-ui/.eslintrc-auto-import.json | 114 + agate-ui/.eslintrc.cjs | 90 + agate-ui/.gitignore | 41 + agate-ui/.npmrc | 5 + agate-ui/.prettierrc | 13 + agate-ui/Makefile | 16 + agate-ui/README.md | 41 + agate-ui/index.html | 24 + agate-ui/package-lock.json | 8405 +++++++++++++++++ agate-ui/package.json | 53 + agate-ui/pom.xml | 85 + agate-ui/postcss.config.cjs | 27 + agate-ui/public/favicon.ico | Bin 0 -> 67646 bytes agate-ui/public/icons/favicon-128x128.png | Bin 0 -> 7332 bytes agate-ui/public/icons/favicon-16x16.png | Bin 0 -> 4704 bytes agate-ui/public/icons/favicon-32x32.png | Bin 0 -> 5381 bytes agate-ui/public/icons/favicon-96x96.png | Bin 0 -> 9323 bytes agate-ui/quasar.config.js | 244 + agate-ui/quasar.extensions.json | 5 + agate-ui/src/App.vue | 5 + agate-ui/src/assets/quasar-logo-vertical.svg | 15 + agate-ui/src/auto-imports.d.ts | 192 + agate-ui/src/boot/.gitkeep | 0 agate-ui/src/boot/ace.ts | 7 + agate-ui/src/boot/api.ts | 67 + agate-ui/src/boot/i18n.ts | 42 + agate-ui/src/components/ConfirmDialog.vue | 59 + agate-ui/src/components/EssentialLink.vue | 31 + agate-ui/src/components/MainDrawer.vue | 112 + agate-ui/src/components/SchemaForm.vue | 88 + agate-ui/src/components/SchemaFormItem.vue | 205 + agate-ui/src/components/models.ts | 114 + agate-ui/src/css/app.scss | 139 + agate-ui/src/css/quasar.variables.scss | 25 + agate-ui/src/env.d.ts | 9 + agate-ui/src/i18n/en/index.js | 25 + agate-ui/src/i18n/fr/index.js | 1 + agate-ui/src/i18n/index.js | 7 + agate-ui/src/layouts/MainLayout.vue | 120 + agate-ui/src/models/Agate.ts | 241 + agate-ui/src/pages/ApplicationsPage.vue | 21 + agate-ui/src/pages/ErrorNotFound.vue | 13 + agate-ui/src/pages/GroupsPage.vue | 21 + agate-ui/src/pages/IndexPage.vue | 64 + agate-ui/src/pages/RealmsPage.vue | 21 + agate-ui/src/pages/SettingsPage.vue | 21 + agate-ui/src/pages/UsersPage.vue | 21 + agate-ui/src/quasar.d.ts | 9 + agate-ui/src/router/index.ts | 33 + agate-ui/src/router/routes.ts | 26 + agate-ui/src/shims-vue.d.ts | 10 + agate-ui/src/stores/application.ts | 21 + agate-ui/src/stores/auth.ts | 76 + agate-ui/src/stores/group.ts | 21 + agate-ui/src/stores/index.ts | 33 + agate-ui/src/stores/realm.ts | 21 + agate-ui/src/stores/store-flag.d.ts | 10 + agate-ui/src/stores/system.ts | 34 + agate-ui/src/stores/user.ts | 21 + agate-ui/src/utils/attributes.ts | 17 + agate-ui/src/utils/authz.ts | 32 + agate-ui/src/utils/colors.ts | 68 + agate-ui/src/utils/dates.ts | 64 + agate-ui/src/utils/files.ts | 24 + agate-ui/src/utils/identifiers.ts | 39 + agate-ui/src/utils/magma.ts | 60 + agate-ui/src/utils/notify.ts | 40 + agate-ui/src/utils/numbers.ts | 6 + agate-ui/src/utils/plugins.ts | 39 + agate-ui/src/utils/r.ts | 9 + agate-ui/src/utils/strings.ts | 39 + agate-ui/src/utils/taxonomies.ts | 16 + agate-ui/src/utils/tokens.ts | 17 + agate-ui/src/utils/validations.ts | 12 + agate-ui/tsconfig.json | 7 + agate-webapp/.bowerrc | 3 - agate-webapp/.jshintrc | 33 - agate-webapp/.yo-rc.json | 16 - agate-webapp/Gruntfile.js | 399 - agate-webapp/bower.json | 70 - agate-webapp/pom.xml | 53 +- .../obiba/agate/config/WebConfiguration.java | 20 - .../agate/web/controller/AdminController.java | 39 +- .../agate/web/controller/SignController.java | 17 +- .../StaticResourcesProductionFilter.java | 52 - .../src/main/resources/_templates/admin.ftl | 282 +- .../main/webapp/app/admin/admin-controller.js | 20 - .../src/main/webapp/app/admin/admin-router.js | 25 - .../src/main/webapp/app/admin/admin.js | 25 - .../webapp/app/admin/views/admin-view.html | 50 - agate-webapp/src/main/webapp/app/app.js | 238 - .../app/application/application-controller.js | 263 - .../app/application/application-router.js | 46 - .../app/application/application-service.js | 35 - .../webapp/app/application/application.js | 22 - .../application/views/application-form.html | 58 - .../application/views/application-list.html | 79 - .../application-realm-group-modal-form.html | 57 - .../views/application-scope-modal-form.html | 45 - .../application/views/application-view.html | 165 - .../commons/localized/localized-directives.js | 104 - .../localized/localized-input-template.html | 22 - .../commons/localized/localized-service.js | 157 - .../commons/localized/localized-template.html | 10 - .../localized-textarea-template.html | 27 - .../webapp/app/commons/localized/localized.js | 17 - .../password-modal-controller.js | 64 - .../password-modal-directive.js | 27 - .../password-modal-template.html | 43 - .../commons/password-modal/password-modal.js | 17 - .../update-password-button-template.html | 3 - .../commons/users-summaries/component.html | 37 - .../app/commons/users-summaries/component.js | 38 - .../webapp/app/config/config-controller.js | 451 - .../main/webapp/app/config/config-router.js | 45 - .../main/webapp/app/config/config-service.js | 68 - .../src/main/webapp/app/config/config.js | 22 - .../config/views/attribute-modal-form.html | 53 - .../webapp/app/config/views/config-form.html | 99 - .../views/config-modal-create-keypair.html | 52 - .../views/config-modal-import-keypair.html | 35 - .../app/config/views/config-style-form.html | 37 - ...onfig-translation-modal-form-template.html | 46 - .../views/config-translations-form.html | 82 - .../webapp/app/config/views/config-view.html | 226 - .../src/main/webapp/app/controllers.js | 240 - .../src/main/webapp/app/directives.js | 141 - .../main/webapp/app/group/group-controller.js | 122 - .../src/main/webapp/app/group/group-router.js | 46 - .../main/webapp/app/group/group-service.js | 31 - .../src/main/webapp/app/group/group.js | 23 - .../webapp/app/group/views/group-form.html | 60 - .../webapp/app/group/views/group-list.html | 76 - .../webapp/app/group/views/group-view.html | 47 - .../main/webapp/app/http-auth-interceptor.js | 163 - .../components/realm-form/component.html | 58 - .../realm/components/realm-form/component.js | 229 - .../components/realm-view/component.html | 202 - .../realm/components/realm-view/component.js | 59 - .../components/realms-list/component.html | 93 - .../realm/components/realms-list/component.js | 97 - .../main/webapp/app/realm/realm-controller.js | 50 - .../src/main/webapp/app/realm/realm-router.js | 38 - .../src/main/webapp/app/realm/realm.js | 22 - .../realm/rest/realm-config-form-resource.js | 22 - .../app/realm/rest/realm-config-resource.js | 40 - .../app/realm/rest/realms-config-resource.js | 35 - .../webapp/app/realm/rest/realms-resource.js | 28 - .../app/realm/services/realm-service.js | 197 - .../app/realm/services/realm-transformer.js | 68 - .../webapp/app/realm/views/realm-form.html | 11 - .../webapp/app/realm/views/realm-view.html | 11 - .../main/webapp/app/realm/views/realms.html | 1 - agate-webapp/src/main/webapp/app/services.js | 261 - .../webapp/app/ticket/ticket-controller.js | 75 - .../main/webapp/app/ticket/ticket-router.js | 32 - .../main/webapp/app/ticket/ticket-service.js | 27 - .../src/main/webapp/app/ticket/ticket.js | 23 - .../webapp/app/ticket/views/ticket-list.html | 110 - .../webapp/app/ticket/views/ticket-view.html | 130 - .../user/attributes/attributes-controller.js | 181 - .../user/attributes/attributes-directive.js | 64 - .../app/user/attributes/attributes-filter.js | 37 - .../app/user/attributes/attributes-service.js | 250 - .../views/attribute-creation-form-modal.html | 40 - .../views/attribute-form-modal.html | 39 - .../views/attributes-form-template.html | 56 - .../views/attributes-view-template.html | 24 - .../main/webapp/app/user/user-controller.js | 417 - .../src/main/webapp/app/user/user-router.js | 52 - .../src/main/webapp/app/user/user-service.js | 83 - agate-webapp/src/main/webapp/app/user/user.js | 24 - .../app/user/views/user-access-info-form.html | 70 - .../main/webapp/app/user/views/user-form.html | 49 - .../views/user-identification-info-form.html | 35 - .../app/user/views/user-list-header.html | 24 - .../main/webapp/app/user/views/user-list.html | 112 - .../app/user/views/user-request-list.html | 88 - .../main/webapp/app/user/views/user-view.html | 142 - .../src/main/webapp/app/views/error.html | 24 - .../src/main/webapp/app/views/login.html | 12 - .../src/main/webapp/app/views/main.html | 39 - .../webapp/app/views/oauth-authorize.html | 102 - .../webapp/app/views/pagination-template.html | 35 - .../app/views/profile/profile-view.html | 13 - agate-webapp/src/main/webapp/favicon.ico | Bin 1150 -> 67646 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 298 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../src/main/webapp/images/chosen-sprite.png | Bin 646 -> 0 bytes .../main/webapp/images/development_ribbon.png | Bin 11495 -> 0 bytes .../main/webapp/images/famfamfam-flags.png | Bin 76543 -> 0 bytes .../images/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../webapp/images/glyphicons-halflings.png | Bin 12727 -> 0 bytes .../src/main/webapp/images/loading.gif | Bin 723 -> 0 bytes agate-webapp/src/main/webapp/less/agate.less | 350 - .../bootstrap-chosen-variables.less | 23 - .../bootstrap-chosen/bootstrap-chosen.less | 439 - agate-webapp/src/main/webapp/less/navs.less | 475 - .../src/main/webapp/less/variables.less | 829 -- agate-webapp/src/main/webapp/styles/agate.css | 1 - .../src/main/webapp/styles/documentation.css | 14 - .../main/webapp/styles/famfamfam-flags.css | 1566 --- pom.xml | 2 + 217 files changed, 11801 insertions(+), 12904 deletions(-) delete mode 100644 agate-dist/src/test/javascript/karma.conf.js delete mode 100644 agate-dist/src/test/javascript/spec/controllersSpec.js delete mode 100644 agate-dist/src/test/javascript/spec/servicesSpec.js create mode 100644 agate-rest/src/main/java/org/obiba/agate/web/rest/security/CorsFilter.java create mode 100644 agate-ui/.editorconfig create mode 100644 agate-ui/.eslintignore create mode 100644 agate-ui/.eslintrc-auto-import.json create mode 100644 agate-ui/.eslintrc.cjs create mode 100644 agate-ui/.gitignore create mode 100644 agate-ui/.npmrc create mode 100644 agate-ui/.prettierrc create mode 100644 agate-ui/Makefile create mode 100644 agate-ui/README.md create mode 100644 agate-ui/index.html create mode 100644 agate-ui/package-lock.json create mode 100644 agate-ui/package.json create mode 100644 agate-ui/pom.xml create mode 100644 agate-ui/postcss.config.cjs create mode 100644 agate-ui/public/favicon.ico create mode 100644 agate-ui/public/icons/favicon-128x128.png create mode 100644 agate-ui/public/icons/favicon-16x16.png create mode 100644 agate-ui/public/icons/favicon-32x32.png create mode 100644 agate-ui/public/icons/favicon-96x96.png create mode 100644 agate-ui/quasar.config.js create mode 100644 agate-ui/quasar.extensions.json create mode 100644 agate-ui/src/App.vue create mode 100644 agate-ui/src/assets/quasar-logo-vertical.svg create mode 100644 agate-ui/src/auto-imports.d.ts create mode 100644 agate-ui/src/boot/.gitkeep create mode 100644 agate-ui/src/boot/ace.ts create mode 100644 agate-ui/src/boot/api.ts create mode 100644 agate-ui/src/boot/i18n.ts create mode 100644 agate-ui/src/components/ConfirmDialog.vue create mode 100644 agate-ui/src/components/EssentialLink.vue create mode 100644 agate-ui/src/components/MainDrawer.vue create mode 100644 agate-ui/src/components/SchemaForm.vue create mode 100644 agate-ui/src/components/SchemaFormItem.vue create mode 100644 agate-ui/src/components/models.ts create mode 100644 agate-ui/src/css/app.scss create mode 100644 agate-ui/src/css/quasar.variables.scss create mode 100644 agate-ui/src/env.d.ts create mode 100644 agate-ui/src/i18n/en/index.js create mode 100644 agate-ui/src/i18n/fr/index.js create mode 100644 agate-ui/src/i18n/index.js create mode 100644 agate-ui/src/layouts/MainLayout.vue create mode 100644 agate-ui/src/models/Agate.ts create mode 100644 agate-ui/src/pages/ApplicationsPage.vue create mode 100644 agate-ui/src/pages/ErrorNotFound.vue create mode 100644 agate-ui/src/pages/GroupsPage.vue create mode 100644 agate-ui/src/pages/IndexPage.vue create mode 100644 agate-ui/src/pages/RealmsPage.vue create mode 100644 agate-ui/src/pages/SettingsPage.vue create mode 100644 agate-ui/src/pages/UsersPage.vue create mode 100644 agate-ui/src/quasar.d.ts create mode 100644 agate-ui/src/router/index.ts create mode 100644 agate-ui/src/router/routes.ts create mode 100644 agate-ui/src/shims-vue.d.ts create mode 100644 agate-ui/src/stores/application.ts create mode 100644 agate-ui/src/stores/auth.ts create mode 100644 agate-ui/src/stores/group.ts create mode 100644 agate-ui/src/stores/index.ts create mode 100644 agate-ui/src/stores/realm.ts create mode 100644 agate-ui/src/stores/store-flag.d.ts create mode 100644 agate-ui/src/stores/system.ts create mode 100644 agate-ui/src/stores/user.ts create mode 100644 agate-ui/src/utils/attributes.ts create mode 100644 agate-ui/src/utils/authz.ts create mode 100644 agate-ui/src/utils/colors.ts create mode 100644 agate-ui/src/utils/dates.ts create mode 100644 agate-ui/src/utils/files.ts create mode 100644 agate-ui/src/utils/identifiers.ts create mode 100644 agate-ui/src/utils/magma.ts create mode 100644 agate-ui/src/utils/notify.ts create mode 100644 agate-ui/src/utils/numbers.ts create mode 100644 agate-ui/src/utils/plugins.ts create mode 100644 agate-ui/src/utils/r.ts create mode 100644 agate-ui/src/utils/strings.ts create mode 100644 agate-ui/src/utils/taxonomies.ts create mode 100644 agate-ui/src/utils/tokens.ts create mode 100644 agate-ui/src/utils/validations.ts create mode 100644 agate-ui/tsconfig.json delete mode 100644 agate-webapp/.bowerrc delete mode 100644 agate-webapp/.jshintrc delete mode 100644 agate-webapp/.yo-rc.json delete mode 100644 agate-webapp/bower.json delete mode 100644 agate-webapp/src/main/java/org/obiba/agate/web/filter/StaticResourcesProductionFilter.java delete mode 100644 agate-webapp/src/main/webapp/app/admin/admin-controller.js delete mode 100644 agate-webapp/src/main/webapp/app/admin/admin-router.js delete mode 100644 agate-webapp/src/main/webapp/app/admin/admin.js delete mode 100644 agate-webapp/src/main/webapp/app/admin/views/admin-view.html delete mode 100644 agate-webapp/src/main/webapp/app/app.js delete mode 100644 agate-webapp/src/main/webapp/app/application/application-controller.js delete mode 100644 agate-webapp/src/main/webapp/app/application/application-router.js delete mode 100644 agate-webapp/src/main/webapp/app/application/application-service.js delete mode 100644 agate-webapp/src/main/webapp/app/application/application.js delete mode 100644 agate-webapp/src/main/webapp/app/application/views/application-form.html delete mode 100644 agate-webapp/src/main/webapp/app/application/views/application-list.html delete mode 100644 agate-webapp/src/main/webapp/app/application/views/application-realm-group-modal-form.html delete mode 100644 agate-webapp/src/main/webapp/app/application/views/application-scope-modal-form.html delete mode 100644 agate-webapp/src/main/webapp/app/application/views/application-view.html delete mode 100644 agate-webapp/src/main/webapp/app/commons/localized/localized-directives.js delete mode 100644 agate-webapp/src/main/webapp/app/commons/localized/localized-input-template.html delete mode 100644 agate-webapp/src/main/webapp/app/commons/localized/localized-service.js delete mode 100644 agate-webapp/src/main/webapp/app/commons/localized/localized-template.html delete mode 100644 agate-webapp/src/main/webapp/app/commons/localized/localized-textarea-template.html delete mode 100644 agate-webapp/src/main/webapp/app/commons/localized/localized.js delete mode 100644 agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-controller.js delete mode 100644 agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-directive.js delete mode 100644 agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-template.html delete mode 100644 agate-webapp/src/main/webapp/app/commons/password-modal/password-modal.js delete mode 100644 agate-webapp/src/main/webapp/app/commons/password-modal/update-password-button-template.html delete mode 100644 agate-webapp/src/main/webapp/app/commons/users-summaries/component.html delete mode 100644 agate-webapp/src/main/webapp/app/commons/users-summaries/component.js delete mode 100644 agate-webapp/src/main/webapp/app/config/config-controller.js delete mode 100644 agate-webapp/src/main/webapp/app/config/config-router.js delete mode 100644 agate-webapp/src/main/webapp/app/config/config-service.js delete mode 100644 agate-webapp/src/main/webapp/app/config/config.js delete mode 100644 agate-webapp/src/main/webapp/app/config/views/attribute-modal-form.html delete mode 100644 agate-webapp/src/main/webapp/app/config/views/config-form.html delete mode 100644 agate-webapp/src/main/webapp/app/config/views/config-modal-create-keypair.html delete mode 100644 agate-webapp/src/main/webapp/app/config/views/config-modal-import-keypair.html delete mode 100644 agate-webapp/src/main/webapp/app/config/views/config-style-form.html delete mode 100644 agate-webapp/src/main/webapp/app/config/views/config-translation-modal-form-template.html delete mode 100644 agate-webapp/src/main/webapp/app/config/views/config-translations-form.html delete mode 100644 agate-webapp/src/main/webapp/app/config/views/config-view.html delete mode 100644 agate-webapp/src/main/webapp/app/controllers.js delete mode 100644 agate-webapp/src/main/webapp/app/directives.js delete mode 100644 agate-webapp/src/main/webapp/app/group/group-controller.js delete mode 100644 agate-webapp/src/main/webapp/app/group/group-router.js delete mode 100644 agate-webapp/src/main/webapp/app/group/group-service.js delete mode 100644 agate-webapp/src/main/webapp/app/group/group.js delete mode 100644 agate-webapp/src/main/webapp/app/group/views/group-form.html delete mode 100644 agate-webapp/src/main/webapp/app/group/views/group-list.html delete mode 100644 agate-webapp/src/main/webapp/app/group/views/group-view.html delete mode 100644 agate-webapp/src/main/webapp/app/http-auth-interceptor.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/components/realm-form/component.html delete mode 100644 agate-webapp/src/main/webapp/app/realm/components/realm-form/component.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/components/realm-view/component.html delete mode 100644 agate-webapp/src/main/webapp/app/realm/components/realm-view/component.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/components/realms-list/component.html delete mode 100644 agate-webapp/src/main/webapp/app/realm/components/realms-list/component.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/realm-controller.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/realm-router.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/realm.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/rest/realm-config-form-resource.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/rest/realm-config-resource.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/rest/realms-config-resource.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/rest/realms-resource.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/services/realm-service.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/services/realm-transformer.js delete mode 100644 agate-webapp/src/main/webapp/app/realm/views/realm-form.html delete mode 100644 agate-webapp/src/main/webapp/app/realm/views/realm-view.html delete mode 100644 agate-webapp/src/main/webapp/app/realm/views/realms.html delete mode 100644 agate-webapp/src/main/webapp/app/services.js delete mode 100644 agate-webapp/src/main/webapp/app/ticket/ticket-controller.js delete mode 100644 agate-webapp/src/main/webapp/app/ticket/ticket-router.js delete mode 100644 agate-webapp/src/main/webapp/app/ticket/ticket-service.js delete mode 100644 agate-webapp/src/main/webapp/app/ticket/ticket.js delete mode 100644 agate-webapp/src/main/webapp/app/ticket/views/ticket-list.html delete mode 100644 agate-webapp/src/main/webapp/app/ticket/views/ticket-view.html delete mode 100644 agate-webapp/src/main/webapp/app/user/attributes/attributes-controller.js delete mode 100644 agate-webapp/src/main/webapp/app/user/attributes/attributes-directive.js delete mode 100644 agate-webapp/src/main/webapp/app/user/attributes/attributes-filter.js delete mode 100644 agate-webapp/src/main/webapp/app/user/attributes/attributes-service.js delete mode 100644 agate-webapp/src/main/webapp/app/user/attributes/views/attribute-creation-form-modal.html delete mode 100644 agate-webapp/src/main/webapp/app/user/attributes/views/attribute-form-modal.html delete mode 100644 agate-webapp/src/main/webapp/app/user/attributes/views/attributes-form-template.html delete mode 100644 agate-webapp/src/main/webapp/app/user/attributes/views/attributes-view-template.html delete mode 100644 agate-webapp/src/main/webapp/app/user/user-controller.js delete mode 100644 agate-webapp/src/main/webapp/app/user/user-router.js delete mode 100644 agate-webapp/src/main/webapp/app/user/user-service.js delete mode 100644 agate-webapp/src/main/webapp/app/user/user.js delete mode 100644 agate-webapp/src/main/webapp/app/user/views/user-access-info-form.html delete mode 100644 agate-webapp/src/main/webapp/app/user/views/user-form.html delete mode 100644 agate-webapp/src/main/webapp/app/user/views/user-identification-info-form.html delete mode 100644 agate-webapp/src/main/webapp/app/user/views/user-list-header.html delete mode 100644 agate-webapp/src/main/webapp/app/user/views/user-list.html delete mode 100644 agate-webapp/src/main/webapp/app/user/views/user-request-list.html delete mode 100644 agate-webapp/src/main/webapp/app/user/views/user-view.html delete mode 100644 agate-webapp/src/main/webapp/app/views/error.html delete mode 100644 agate-webapp/src/main/webapp/app/views/login.html delete mode 100644 agate-webapp/src/main/webapp/app/views/main.html delete mode 100644 agate-webapp/src/main/webapp/app/views/oauth-authorize.html delete mode 100644 agate-webapp/src/main/webapp/app/views/pagination-template.html delete mode 100644 agate-webapp/src/main/webapp/app/views/profile/profile-view.html delete mode 100644 agate-webapp/src/main/webapp/fonts/glyphicons-halflings-regular.eot delete mode 100644 agate-webapp/src/main/webapp/fonts/glyphicons-halflings-regular.svg delete mode 100644 agate-webapp/src/main/webapp/fonts/glyphicons-halflings-regular.ttf delete mode 100644 agate-webapp/src/main/webapp/fonts/glyphicons-halflings-regular.woff delete mode 100644 agate-webapp/src/main/webapp/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 agate-webapp/src/main/webapp/images/chosen-sprite.png delete mode 100644 agate-webapp/src/main/webapp/images/development_ribbon.png delete mode 100644 agate-webapp/src/main/webapp/images/famfamfam-flags.png delete mode 100755 agate-webapp/src/main/webapp/images/glyphicons-halflings-white.png delete mode 100755 agate-webapp/src/main/webapp/images/glyphicons-halflings.png delete mode 100644 agate-webapp/src/main/webapp/images/loading.gif delete mode 100644 agate-webapp/src/main/webapp/less/agate.less delete mode 100644 agate-webapp/src/main/webapp/less/bootstrap-chosen/bootstrap-chosen-variables.less delete mode 100644 agate-webapp/src/main/webapp/less/bootstrap-chosen/bootstrap-chosen.less delete mode 100644 agate-webapp/src/main/webapp/less/navs.less delete mode 100644 agate-webapp/src/main/webapp/less/variables.less delete mode 100644 agate-webapp/src/main/webapp/styles/agate.css delete mode 100644 agate-webapp/src/main/webapp/styles/documentation.css delete mode 100644 agate-webapp/src/main/webapp/styles/famfamfam-flags.css diff --git a/.gitignore b/.gitignore index 301bda4c9..9e02f3fba 100644 --- a/.gitignore +++ b/.gitignore @@ -10,9 +10,6 @@ node_modules .merge_file* .sass-cache .DS_Store -agate-webapp/src/main/webapp/dist -agate-webapp/src/main/webapp/bower_components -agate-webapp/src/main/webapp/styles/agate.css.map spring_loaded *.log .vagrant diff --git a/.travis.yml b/.travis.yml index e93386ac0..6e1e860e0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ before_install: - sudo apt-get install -y nodejs devscripts - nvm install lts/gallium - node --version - - npm install -g grunt-cli bower + - npm install -g grunt-cli addons: apt: packages: diff --git a/Makefile b/Makefile index adb433790..f1bd73c70 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,10 @@ core: rest: cd agate-rest && ${mvn_exec} clean install +ui: + cd agate-ui && ${mvn_exec} clean install + cd agate-webapp && ${mvn_exec} clean + model: proto proto: diff --git a/README.md b/README.md index 6b09cde76..1631ae0b6 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,12 @@ Central authentication server for OBiBa applications. ## For developers -Install NodeJS, Grunt and Bower +Install NodeJS, Grunt ``` sudo add-apt-repository -y ppa:chris-lea/node.js sudo apt-get install -y nodejs -sudo npm install -g grunt-cli bower +sudo npm install -g grunt-cli ``` If you run agate for the first time, run `make npm-install`. diff --git a/agate-dist/src/main/assembly/agate.xml b/agate-dist/src/main/assembly/agate.xml index a1290adb9..cdb781376 100644 --- a/agate-dist/src/main/assembly/agate.xml +++ b/agate-dist/src/main/assembly/agate.xml @@ -74,6 +74,14 @@ + + diff --git a/agate-dist/src/test/javascript/karma.conf.js b/agate-dist/src/test/javascript/karma.conf.js deleted file mode 100644 index e10c526e1..000000000 --- a/agate-dist/src/test/javascript/karma.conf.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -// Karma configuration -// http://karma-runner.github.io/0.10/config/configuration-file.html - -module.exports = function (config) { - config.set({ - // base path, that will be used to resolve files and exclude - basePath: '../../..', - - // testing framework to use (jasmine/mocha/qunit/...) - frameworks: ['jasmine'], - - // list of files / patterns to load in the browser - files: [ - 'src/main/webapp/bower_components/modernizr/modernizr.js', - 'src/main/webapp/bower_components/jquery/jquery.js', - 'src/main/webapp/bower_components/angular/angular.js', - 'src/main/webapp/bower_components/angular-mocks/angular-mocks.js', - 'src/main/webapp/bower_components/angular-route/angular-route.js', - 'src/main/webapp/bower_components/angular-resource/angular-resource.js', - 'src/main/webapp/bower_components/angular-cookies/angular-cookies.js', - 'src/main/webapp/bower_components/angular-sanitize/angular-sanitize.js', - 'src/main/webapp/bower_components/angular-translate/angular-translate.js', - 'src/main/webapp/bower_components/angular-translate-storage-cookie/angular-translate-storage-cookie.js', - 'src/main/webapp/bower_components/angular-translate-loader-static-files/angular-translate-loader-static-files.js', - 'src/main/webapp/bower_components/angular-dynamic-locale/src/tmhDinamicLocale.js', - 'src/main/webapp/scripts/*.js', - 'src/main/webapp/scripts/**/*.js', - 'src/test/javascript/**/!(karma.conf).js' - ], - - // list of files / patterns to exclude - exclude: [], - - // web server port - port: 9876, - - // level of logging - // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG - logLevel: config.LOG_INFO, - - // enable / disable watching file and executing tests whenever any file changes - autoWatch: false, - - // Start these browsers, currently available: - // - Chrome - // - ChromeCanary - // - Firefox - // - Opera - // - Safari (only Mac) - // - PhantomJS - // - IE (only Windows) - browsers: ['PhantomJS'], - - // Continuous Integration mode - // if true, it capture browsers, run tests and exit - singleRun: false - }); -}; diff --git a/agate-dist/src/test/javascript/spec/controllersSpec.js b/agate-dist/src/test/javascript/spec/controllersSpec.js deleted file mode 100644 index b519c3f89..000000000 --- a/agate-dist/src/test/javascript/spec/controllersSpec.js +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -describe('Controllers Tests ', function () { - - beforeEach(module('agate')); - - describe('LoginController', function () { - var $scope; - - - beforeEach(inject(function ($rootScope, $controller) { - $scope = $rootScope.$new(); - $controller('LoginController', {$scope: $scope}); - })); - - it('should set remember Me', function () { - expect($scope.rememberMe).toBeTruthy(); - }); - }); - - describe('SettingsController', function () { - var $scope, AccountService; - - beforeEach(inject(function ($rootScope, $controller, Account) { - $scope = $rootScope.$new(); - - AccountService = Account; - $controller('SettingsController', {$scope: $scope, resolvedAccount: AccountService, Account: AccountService}); - })); - - it('should save account', function () { - //GIVEN - $scope.settingsAccount = {firstName: "John", lastName: "Doe"}; - - //SET SPY - spyOn(AccountService, 'save'); - - //WHEN - $scope.save(); - - //THEN - expect(AccountService.save).toHaveBeenCalled(); - expect(AccountService.save).toHaveBeenCalledWith({firstName: "John", lastName: "Doe"}, jasmine.any(Function), jasmine.any(Function)); - - //SIMULATE SUCCESS CALLBACK CALL FROM SERVICE - AccountService.save.calls.mostRecent().args[1](); - expect($scope.error).toBeNull(); - expect($scope.success).toBe('OK'); - }); - }); - - describe('SessionsController', function () { - var $scope, SessionsService; - - beforeEach(inject(function ($rootScope, $controller, Sessions) { - $scope = $rootScope.$new(); - - SessionsService = Sessions; - $controller('SessionsController', {$scope: $scope, resolvedSessions: SessionsService, Sessions: SessionsService}); - })); - - it('should invalidate session', function () { - //GIVEN - $scope.series = "123456789"; - - //SET SPY - spyOn(SessionsService, 'delete'); - - //WHEN - $scope.invalidate($scope.series); - - //THEN - expect(SessionsService.delete).toHaveBeenCalled(); - expect(SessionsService.delete).toHaveBeenCalledWith({series: "123456789"}, jasmine.any(Function), jasmine.any(Function)); - - //SIMULATE SUCCESS CALLBACK CALL FROM SERVICE - SessionsService.delete.calls.mostRecent().args[1](); - expect($scope.error).toBeNull(); - expect($scope.success).toBe('OK'); - }); - }); -}); diff --git a/agate-dist/src/test/javascript/spec/servicesSpec.js b/agate-dist/src/test/javascript/spec/servicesSpec.js deleted file mode 100644 index f160b8902..000000000 --- a/agate-dist/src/test/javascript/spec/servicesSpec.js +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -describe('Services Tests ', function () { - - beforeEach(module('agate')); - - describe('AuthenticationSharedService', function () { - var serviceTested, - httpBackend, - authServiceSpied; - - beforeEach(inject(function ($httpBackend, AuthenticationSharedService, authService) { - serviceTested = AuthenticationSharedService; - httpBackend = $httpBackend; - authServiceSpied = authService; - //Request on app init - httpBackend.expectGET('i18n/en.json').respond(200, ''); - })); - //make sure no expectations were missed in your tests. - //(e.g. expectGET or expectPOST) - afterEach(function () { - httpBackend.verifyNoOutstandingExpectation(); - httpBackend.verifyNoOutstandingRequest(); - }); - - it('should call backend on logout then call authService.loginCancelled', function () { - //GIVEN - //set up some data for the http call to return and test later. - var returnData = { result: 'ok' }; - //expectGET to make sure this is called once. - httpBackend.expectGET('ws/logout').respond(returnData); - - //Set spy - spyOn(authServiceSpied, 'loginCancelled'); - - //WHEN - serviceTested.logout(); - //flush the backend to "execute" the request to do the expectedGET assertion. - httpBackend.flush(); - - //THEN - expect(authServiceSpied.loginCancelled).toHaveBeenCalled(); - }); - - }); -}); - - diff --git a/agate-rest/src/main/java/org/obiba/agate/web/rest/security/CorsFilter.java b/agate-rest/src/main/java/org/obiba/agate/web/rest/security/CorsFilter.java new file mode 100644 index 000000000..964f98c0f --- /dev/null +++ b/agate-rest/src/main/java/org/obiba/agate/web/rest/security/CorsFilter.java @@ -0,0 +1,25 @@ +package org.obiba.agate.web.rest.security; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerResponseContext; +import jakarta.ws.rs.container.ContainerResponseFilter; +import jakarta.ws.rs.ext.Provider; +import java.io.IOException; + +@Provider +public class CorsFilter implements ContainerResponseFilter { + + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { + // Allow specific origin or use "*" for all origins + responseContext.getHeaders().add("Access-Control-Allow-Origin", "http://localhost:9000"); + + // Allow specific HTTP methods + responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); + + // Allow specific headers + responseContext.getHeaders().add("Access-Control-Allow-Headers", "Authorization, Content-Type"); + + // Allow credentials (if needed) + responseContext.getHeaders().add("Access-Control-Allow-Credentials", "true"); + } +} diff --git a/agate-ui/.editorconfig b/agate-ui/.editorconfig new file mode 100644 index 000000000..9d08a1a82 --- /dev/null +++ b/agate-ui/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/agate-ui/.eslintignore b/agate-ui/.eslintignore new file mode 100644 index 000000000..6c7024251 --- /dev/null +++ b/agate-ui/.eslintignore @@ -0,0 +1,8 @@ +/dist +/src-capacitor +/src-cordova +/.quasar +/node_modules +.eslintrc.js +/src-ssr +/quasar.config.*.temporary.compiled* diff --git a/agate-ui/.eslintrc-auto-import.json b/agate-ui/.eslintrc-auto-import.json new file mode 100644 index 000000000..e6edf7b6e --- /dev/null +++ b/agate-ui/.eslintrc-auto-import.json @@ -0,0 +1,114 @@ +{ + "globals": { + "$": true, + "$$": true, + "$computed": true, + "$customRef": true, + "$ref": true, + "$shallowRef": true, + "$toRef": true, + "Component": true, + "ComponentPublicInstance": true, + "ComputedRef": true, + "EffectScope": true, + "ExtractDefaultPropTypes": true, + "ExtractPropTypes": true, + "ExtractPublicPropTypes": true, + "InjectionKey": true, + "PropType": true, + "Ref": true, + "VNode": true, + "WritableComputedRef": true, + "computed": true, + "createApp": true, + "customRef": true, + "defineAsyncComponent": true, + "defineComponent": true, + "effectScope": true, + "getCurrentInstance": true, + "getCurrentScope": true, + "h": true, + "inject": true, + "isProxy": true, + "isReactive": true, + "isReadonly": true, + "isRef": true, + "markRaw": true, + "nextTick": true, + "onActivated": true, + "onBeforeMount": true, + "onBeforeRouteLeave": true, + "onBeforeRouteUpdate": true, + "onBeforeUnmount": true, + "onBeforeUpdate": true, + "onDeactivated": true, + "onErrorCaptured": true, + "onMounted": true, + "onRenderTracked": true, + "onRenderTriggered": true, + "onScopeDispose": true, + "onServerPrefetch": true, + "onUnmounted": true, + "onUpdated": true, + "provide": true, + "reactive": true, + "readonly": true, + "ref": true, + "resolveComponent": true, + "shallowReactive": true, + "shallowReadonly": true, + "shallowRef": true, + "toRaw": true, + "toRef": true, + "toRefs": true, + "toValue": true, + "triggerRef": true, + "unref": true, + "useAttrs": true, + "useCssModule": true, + "useCssVars": true, + "useI18n": true, + "useLink": true, + "useRoute": true, + "useRouter": true, + "useSlots": true, + "watch": true, + "watchEffect": true, + "watchPostEffect": true, + "watchSyncEffect": true, + "stores": true, + "useCounterStore": true, + "useAuthStore": true, + "useProjectsStore": true, + "useDatasourceStore": true, + "useFilesStore": true, + "usePluginsStore": true, + "useTransientDatasourceStore": true, + "useCommandsStore": true, + "useUsersStore": true, + "useUsersGroupsStore": true, + "useGroupsStore": true, + "useSystemStore": true, + "useRStore": true, + "useDatashieldStore": true, + "useAuthzStore": true, + "useProfilesStore": true, + "useProfileAclsStore": true, + "useTokensStore": true, + "useIdentityProvidersStore": true, + "TOKEN_TYPES": true, + "useTaxonomiesStore": true, + "useResourcesStore": true, + "useIdentifiersStore": true, + "useAppsStore": true, + "useSqlStore": true, + "useSearchStore": true, + "useCartStore": true, + "AnalysisPluginPackages": true, + "useProfileActivityStore": true, + "useUserStore": true, + "useGroupStore": true, + "useApplicationStore": true, + "useRealmStore": true + } +} diff --git a/agate-ui/.eslintrc.cjs b/agate-ui/.eslintrc.cjs new file mode 100644 index 000000000..796b2e869 --- /dev/null +++ b/agate-ui/.eslintrc.cjs @@ -0,0 +1,90 @@ +module.exports = { + // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy + // This option interrupts the configuration hierarchy at this file + // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) + root: true, + + // https://eslint.vuejs.org/user-guide/#how-to-use-a-custom-parser + // Must use parserOptions instead of "parser" to allow vue-eslint-parser to keep working + // `parser: 'vue-eslint-parser'` is already included with any 'plugin:vue/**' config and should be omitted + parserOptions: { + parser: require.resolve('@typescript-eslint/parser'), + extraFileExtensions: [ '.vue' ] + }, + + env: { + browser: true, + es2021: true, + node: true, + 'vue/setup-compiler-macros': true + }, + + // Rules order is important, please avoid shuffling them + extends: [ + // Base ESLint recommended rules + // 'eslint:recommended', + + // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage + // ESLint typescript rules + 'plugin:@typescript-eslint/recommended', + + // Uncomment any of the lines below to choose desired strictness, + // but leave only one uncommented! + // See https://eslint.vuejs.org/rules/#available-rules + 'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention) + // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability) + // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead) + + // https://github.com/prettier/eslint-config-prettier#installation + // usage with Prettier, provided by 'eslint-config-prettier'. + 'prettier' + ], + + plugins: [ + // required to apply rules which need type information + '@typescript-eslint', + + // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files + // required to lint *.vue files + 'vue' + + // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674 + // Prettier has not been included as plugin to avoid performance impact + // add it as an extension for your IDE + + ], + + globals: { + ga: 'readonly', // Google Analytics + cordova: 'readonly', + __statics: 'readonly', + __QUASAR_SSR__: 'readonly', + __QUASAR_SSR_SERVER__: 'readonly', + __QUASAR_SSR_CLIENT__: 'readonly', + __QUASAR_SSR_PWA__: 'readonly', + process: 'readonly', + Capacitor: 'readonly', + chrome: 'readonly' + }, + + // add your custom rules here + rules: { + + 'prefer-promise-reject-errors': 'off', + + quotes: ['warn', 'single', { avoidEscape: true }], + + // this rule, if on, would require explicit return type on the `render` function + '@typescript-eslint/explicit-function-return-type': 'off', + + // in plain CommonJS modules, you can't use `import foo = require('foo')` to pass this rule, so it has to be disabled + '@typescript-eslint/no-var-requires': 'off', + + // The core 'no-unused-vars' rules (in the eslint:recommended ruleset) + // does not work with type definitions + 'no-unused-vars': 'off', + + // allow debugger during development only + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' + } +} diff --git a/agate-ui/.gitignore b/agate-ui/.gitignore new file mode 100644 index 000000000..1c9a530a3 --- /dev/null +++ b/agate-ui/.gitignore @@ -0,0 +1,41 @@ +.DS_Store +.thumbs.db +node_modules + +# Quasar core related directories +.quasar +/dist +/quasar.config.*.temporary.compiled* + +# Cordova related directories and files +/src-cordova/node_modules +/src-cordova/platforms +/src-cordova/plugins +/src-cordova/www + +# Capacitor related directories and files +/src-capacitor/www +/src-capacitor/node_modules + +# BEX related directories and files +/src-bex/www +/src-bex/js/core + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +*.suo +*.ntvs* +*.njsproj +*.sln + +# local .env files +.env.local* + +.vscode +.history +node diff --git a/agate-ui/.npmrc b/agate-ui/.npmrc new file mode 100644 index 000000000..eb1908282 --- /dev/null +++ b/agate-ui/.npmrc @@ -0,0 +1,5 @@ +# pnpm-related options +shamefully-hoist=true +strict-peer-dependencies=false +# to get the latest compatible packages when creating the project https://github.com/pnpm/pnpm/issues/6463 +resolution-mode=highest diff --git a/agate-ui/.prettierrc b/agate-ui/.prettierrc new file mode 100644 index 000000000..35a7d55a9 --- /dev/null +++ b/agate-ui/.prettierrc @@ -0,0 +1,13 @@ +{ + "singleQuote": true, + "semi": true, + "printWidth": 120, + "overrides": [ + { + "files": "src/i18n/**/index.js", + "options": { + "printWidth": 10000 + } + } + ] +} \ No newline at end of file diff --git a/agate-ui/Makefile b/agate-ui/Makefile new file mode 100644 index 000000000..4654aa158 --- /dev/null +++ b/agate-ui/Makefile @@ -0,0 +1,16 @@ +PROTO_DIR := ../agate-web-model/src/main/protobuf + +SOURCES := $(wildcard ${PROTO_DIR}/*.proto) + +DESTINATION := ./src/models + +.PHONY: proto + +proto: + mkdir -p ${DESTINATION} + @for file in $(SOURCES); do \ + base_name=$$(basename $$file); \ + echo "Processing $$base_name"; \ + rm -f ${DESTINATION}/$${base_name%.*}.ts; \ + protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_opt=onlyTypes=true --ts_proto_opt=outputJsonMethods=false --ts_proto_opt=outputEncodeMethods=false --ts_proto_opt=stringEnums=true --ts_proto_opt=outputExtensions=true --ts_proto_out=${DESTINATION} --proto_path=${PROTO_DIR} $$base_name; \ + done diff --git a/agate-ui/README.md b/agate-ui/README.md new file mode 100644 index 000000000..ea6f85652 --- /dev/null +++ b/agate-ui/README.md @@ -0,0 +1,41 @@ +# Agate administration webapp (agate-ui) + +An interface to manage Agate content + +## Install the dependencies + +```bash +npm install +``` + +### Start the app in development mode (hot-code reloading, error reporting, etc.) + +```bash +npm run dev +``` + +### Lint the files + +```bash +npm run lint +``` + +### Format the files + +```bash +npm run format +``` + +### Build the app for production + +```bash +npm run build +``` + +### Customize the configuration + +See [Configuring quasar.config.js](https://v2.quasar.dev/quasar-cli-vite/quasar-config-js). + +### CORS Setting during development + +Add `cors.allowed=http://localhost:9000` in `Agate_HOME/config/Agate-config.properties` to make sure REST calls do not fail. diff --git a/agate-ui/index.html b/agate-ui/index.html new file mode 100644 index 000000000..e0528de36 --- /dev/null +++ b/agate-ui/index.html @@ -0,0 +1,24 @@ + + + + <%= productName %> + + + + + + + + + + + + + + + + + diff --git a/agate-ui/package-lock.json b/agate-ui/package-lock.json new file mode 100644 index 000000000..ed7f3ebb1 --- /dev/null +++ b/agate-ui/package-lock.json @@ -0,0 +1,8405 @@ +{ + "name": "agate-ui", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "agate-ui", + "version": "0.0.1", + "dependencies": { + "@quasar/extras": "^1.16.9", + "axios": "^1.7.7", + "date-fns": "^3.6.0", + "diff2html": "^3.4.48", + "papaparse": "^5.4.1", + "pinia": "^2.1.7", + "pinia-plugin-persistedstate": "^4.0.0", + "plotly.js-dist": "^2.32.0", + "quasar": "^2.17.4", + "ts-proto": "^1.174.0", + "vue": "^3.4.19", + "vue-i18n": "^9.14.0", + "vue-router": "^4.4.5", + "vue3-ace-editor": "^2.2.4", + "vue3-cookies": "^1.0.6" + }, + "devDependencies": { + "@intlify/unplugin-vue-i18n": "^2.0.0", + "@quasar/app-vite": "^1.11.0", + "@quasar/quasar-app-extension-qmarkdown": "^2.0.0-beta.10", + "@types/node": "^12.20.21", + "@typescript-eslint/eslint-plugin": "^5.10.0", + "@typescript-eslint/parser": "^5.10.0", + "autoprefixer": "^10.4.2", + "eslint": "^8.11.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-vue": "^9.0.0", + "prettier": "^2.5.1", + "typescript": "^4.5.4", + "unplugin-auto-import": "^0.17.5" + }, + "engines": { + "node": "^20 || ^18 || ^16", + "npm": ">= 6.13.4", + "yarn": ">= 1.21.1" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.7.tgz", + "integrity": "sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "dependencies": { + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/standalone": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.25.6.tgz", + "integrity": "sha512-Kf2ZcZVqsKbtYhlA7sP0z5A3q5hmCVYMKMWRWNK/5OVwHIve3JY1djVRmIVAx8FMueLIfZGKQDIILK2w8zO4mg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@intlify/bundle-utils": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-7.5.0.tgz", + "integrity": "sha512-6DymqusddBQ8kVtVBsVFFF7arNfIhuLacOmmsqayT2vl427j9m0VX12mMC+cgoVIodSpRfzYPaPTdPuJq7mK0Q==", + "dev": true, + "dependencies": { + "@intlify/message-compiler": "^9.4.0", + "@intlify/shared": "^9.4.0", + "acorn": "^8.8.2", + "escodegen": "^2.0.0", + "estree-walker": "^2.0.2", + "jsonc-eslint-parser": "^2.3.0", + "magic-string": "^0.30.0", + "mlly": "^1.2.0", + "source-map-js": "^1.0.1", + "yaml-eslint-parser": "^1.2.2" + }, + "engines": { + "node": ">= 14.16" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + } + } + }, + "node_modules/@intlify/core-base": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.0.tgz", + "integrity": "sha512-zJn0imh9HIsZZUtt9v8T16PeVstPv6bP2YzlrYJwoF8F30gs4brZBwW2KK6EI5WYKFi3NeqX6+UU4gniz5TkGg==", + "dependencies": { + "@intlify/message-compiler": "9.14.0", + "@intlify/shared": "9.14.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.0.tgz", + "integrity": "sha512-sXNsoMI0YsipSXW8SR75drmVK56tnJHoYbPXUv2Cf9lz6FzvwsosFm6JtC1oQZI/kU+n7qx0qRrEWkeYFTgETA==", + "dependencies": { + "@intlify/shared": "9.14.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.0.tgz", + "integrity": "sha512-r+N8KRQL7LgN1TMTs1A2svfuAU0J94Wu9wWdJVJqYsoMMLIeJxrPjazihfHpmJqfgZq0ah3Y9Q4pgWV2O90Fyg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/unplugin-vue-i18n": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-2.0.0.tgz", + "integrity": "sha512-1oKvm92L9l2od2H9wKx2ZvR4tzn7gUtd7bPLI7AWUmm7U9H1iEypndt5d985ypxGsEs0gToDaKTrytbBIJwwSg==", + "dev": true, + "dependencies": { + "@intlify/bundle-utils": "^7.4.0", + "@intlify/shared": "^9.4.0", + "@rollup/pluginutils": "^5.0.2", + "@vue/compiler-sfc": "^3.2.47", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "pathe": "^1.0.0", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2", + "unplugin": "^1.1.0" + }, + "engines": { + "node": ">= 14.16" + }, + "peerDependencies": { + "petite-vue-i18n": "*", + "vue-i18n": "*", + "vue-i18n-bridge": "*" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "vue-i18n-bridge": { + "optional": true + } + } + }, + "node_modules/@intlify/unplugin-vue-i18n/node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxt/kit": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.13.1.tgz", + "integrity": "sha512-FkUL349lp/3nVfTIyws4UDJ3d2jyv5Pk1DC1HQUCOkSloYYMdbRcQAUcb4fe2TCLNWvHM+FhU8jnzGTzjALZYA==", + "dependencies": { + "@nuxt/schema": "3.13.1", + "c12": "^1.11.2", + "consola": "^3.2.3", + "defu": "^6.1.4", + "destr": "^2.0.3", + "globby": "^14.0.2", + "hash-sum": "^2.0.0", + "ignore": "^5.3.2", + "jiti": "^1.21.6", + "klona": "^2.0.6", + "knitwork": "^1.1.0", + "mlly": "^1.7.1", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "scule": "^1.3.0", + "semver": "^7.6.3", + "ufo": "^1.5.4", + "unctx": "^2.3.1", + "unimport": "^3.11.1", + "untyped": "^1.4.2" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/@nuxt/kit/node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@nuxt/kit/node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nuxt/kit/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nuxt/kit/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nuxt/schema": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.13.1.tgz", + "integrity": "sha512-ishbhzVGspjshG9AG0hYnKYY6LWXzCtua7OXV7C/DQ2yA7rRcy1xHpzKZUDbIRyxCHHCAcBd8jfHEUmEuhEPrA==", + "dependencies": { + "compatx": "^0.1.8", + "consola": "^3.2.3", + "defu": "^6.1.4", + "hookable": "^5.5.3", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "scule": "^1.3.0", + "std-env": "^3.7.0", + "ufo": "^1.5.4", + "uncrypto": "^0.1.3", + "unimport": "^3.11.1", + "untyped": "^1.4.2" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@quasar/app-vite": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@quasar/app-vite/-/app-vite-1.11.0.tgz", + "integrity": "sha512-PUeqtYs2liA/O17LJ25jzKckB0MG1ZW/iuDC7NvCMZpYT6Ab66AypiYfPf4WGWeAqricorHVNRyMfMpTscR/hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quasar/render-ssr-error": "^1.0.3", + "@quasar/vite-plugin": "^1.7.0", + "@rollup/pluginutils": "^4.1.2", + "@types/chrome": "^0.0.208", + "@types/compression": "^1.7.2", + "@types/cordova": "0.0.34", + "@types/express": "^4.17.13", + "@vitejs/plugin-vue": "^2.2.0", + "archiver": "^5.3.0", + "chokidar": "^3.5.3", + "ci-info": "^3.7.1", + "compression": "^1.7.4", + "cross-spawn": "^7.0.3", + "dot-prop": "6.0.1", + "elementtree": "0.1.7", + "esbuild": "0.14.51", + "express": "^4.17.3", + "fast-glob": "3.2.12", + "fs-extra": "^11.1.0", + "html-minifier-terser": "^7.2.0", + "inquirer": "^8.2.1", + "isbinaryfile": "^5.0.0", + "kolorist": "^1.5.1", + "lodash": "^4.17.21", + "minimist": "^1.2.6", + "open": "^8.4.0", + "register-service-worker": "^1.7.2", + "rollup-plugin-visualizer": "^5.5.4", + "sass": "^1.80.2", + "semver": "^7.3.5", + "serialize-javascript": "^6.0.0", + "table": "^6.8.0", + "vite": "^2.9.13", + "webpack-merge": "^5.8.0" + }, + "bin": { + "quasar": "bin/quasar" + }, + "engines": { + "node": "^24 || ^22 || ^20 || ^18 || ^16 || ^14.19", + "npm": ">= 6.14.12", + "yarn": ">= 1.17.3" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + }, + "peerDependencies": { + "@electron/packager": ">= 18", + "electron-builder": ">= 22", + "electron-packager": ">= 15", + "eslint": "^8.11.0", + "pinia": "^2.0.0", + "quasar": "^2.16.0", + "vue": "^3.2.29", + "vue-router": "^4.0.12", + "vuex": "^4.0.0", + "workbox-build": "^6 || 7.0.x" + }, + "peerDependenciesMeta": { + "@electron/packager": { + "optional": true + }, + "electron-builder": { + "optional": true + }, + "electron-packager": { + "optional": true + }, + "eslint": { + "optional": true + }, + "pinia": { + "optional": true + }, + "vuex": { + "optional": true + }, + "workbox-build": { + "optional": true + } + } + }, + "node_modules/@quasar/extras": { + "version": "1.16.9", + "resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.16.9.tgz", + "integrity": "sha512-SlOhwzXyPQHWgQIS2ncyDdYdksCJvUYNtgsDQqzAKEG3r3d/ejOxvThle79HTK3Q6HB+gQWFG21Ux00Osr5XSw==", + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + } + }, + "node_modules/@quasar/quasar-app-extension-qmarkdown": { + "version": "2.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@quasar/quasar-app-extension-qmarkdown/-/quasar-app-extension-qmarkdown-2.0.0-beta.10.tgz", + "integrity": "sha512-D/2/oxMiNM19D7p1xAkWG5ptW3IzXmLwGtmtqbDJ0gmtzYvkqQxzimdst9uUyZs6G3jmMQSdCN6mJ/iZcyw38g==", + "dev": true, + "dependencies": { + "@quasar/quasar-ui-qmarkdown": "^2.0.0-beta.10", + "front-matter": "^4.0.2", + "markdown-it-abbr": "^1.0.4", + "markdown-it-deflist": "^2.1.0", + "markdown-it-emoji": "^2.0.0", + "markdown-it-footnote": "^3.0.3", + "markdown-it-ins": "^3.0.1", + "markdown-it-mark": "^3.0.1", + "markdown-it-sub": "^1.0.0", + "markdown-it-sup": "^1.0.0", + "markdown-it-task-lists": "^2.1.1", + "raw-loader": "^4.0.2", + "webpack-merge": "^5.8.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/hawkeye64" + } + }, + "node_modules/@quasar/quasar-ui-qmarkdown": { + "version": "2.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@quasar/quasar-ui-qmarkdown/-/quasar-ui-qmarkdown-2.0.0-beta.10.tgz", + "integrity": "sha512-dglYq169H7SQ14eR0mm/Rp+k5gftkSmZyd/3vIH4M94Z/3z2eys4Ch620VhM4oFuxnUUumXYxvs66IQDx3272g==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^12.2.3", + "markdown-it": "^12.3.2", + "markdown-it-container": "^3.0.0", + "markdown-it-imsize": "^2.0.1", + "markdown-it-toc-and-anchor": "^4.2.0", + "prismjs": "^1.28.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/hawkeye64" + } + }, + "node_modules/@quasar/render-ssr-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@quasar/render-ssr-error/-/render-ssr-error-1.0.3.tgz", + "integrity": "sha512-A8RF99q6/sOSe1Ighnh5syEIbliD3qUYEJd2HyfFyBPSMF+WYGXon5dmzg4nUoK662NgOggInevkDyBDJcZugg==", + "dev": true, + "dependencies": { + "stack-trace": "^1.0.0-pre2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + } + }, + "node_modules/@quasar/vite-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@quasar/vite-plugin/-/vite-plugin-1.7.0.tgz", + "integrity": "sha512-ia4w1n4DuPYm92MQLPNpMqLJID1WGGRyVGxkVeg8V+V25Vh3p9QBo++iuXR4sW/bCmzzx66Ko6VStsr1zp90GQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + }, + "peerDependencies": { + "@vitejs/plugin-vue": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "quasar": "^2.16.0", + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/chrome": { + "version": "0.0.208", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.208.tgz", + "integrity": "sha512-VDU/JnXkF5qaI7WBz14Azpa2VseZTgML0ia/g/B1sr9OfdOnHiH/zZ7P7qCDqxSlkqJh76/bPc8jLFcx8rHJmw==", + "dev": true, + "dependencies": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, + "node_modules/@types/compression": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha512-rkiiTuf/z2wTd4RxFOb+clE7PF4AEJU0hsczbUdkHHBtkUmpWQpEddynNfJYKYtZFJKbq4F+brfekt1kx85IZA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/filesystem": { + "version": "0.0.35", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.35.tgz", + "integrity": "sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==", + "dev": true, + "dependencies": { + "@types/filewriter": "*" + } + }, + "node_modules/@types/filewriter": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.32.tgz", + "integrity": "sha512-Kpi2GXQyYJdjL8mFclL1eDgihn1SIzorMZjD94kdPZh9E4VxGOeyjPxi5LpsM4Zku7P0reqegZTt2GxhmA9VBg==", + "dev": true + }, + "node_modules/@types/har-format": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.15.tgz", + "integrity": "sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "dev": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz", + "integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "vite": "^2.5.10", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.19.tgz", + "integrity": "sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.19", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.19.tgz", + "integrity": "sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==", + "dependencies": { + "@vue/compiler-core": "3.4.19", + "@vue/shared": "3.4.19" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.19.tgz", + "integrity": "sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.19", + "@vue/compiler-dom": "3.4.19", + "@vue/compiler-ssr": "3.4.19", + "@vue/shared": "3.4.19", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.6", + "postcss": "^8.4.33", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.19.tgz", + "integrity": "sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==", + "dependencies": { + "@vue/compiler-dom": "3.4.19", + "@vue/shared": "3.4.19" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" + }, + "node_modules/@vue/reactivity": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.19.tgz", + "integrity": "sha512-+VcwrQvLZgEclGZRHx4O2XhyEEcKaBi50WbxdVItEezUf4fqRh838Ix6amWTdX0CNb/b6t3Gkz3eOebfcSt+UA==", + "dependencies": { + "@vue/shared": "3.4.19" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.19.tgz", + "integrity": "sha512-/Z3tFwOrerJB/oyutmJGoYbuoadphDcJAd5jOuJE86THNZji9pYjZroQ2NFsZkTxOq0GJbb+s2kxTYToDiyZzw==", + "dependencies": { + "@vue/reactivity": "3.4.19", + "@vue/shared": "3.4.19" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.19.tgz", + "integrity": "sha512-IyZzIDqfNCF0OyZOauL+F4yzjMPN2rPd8nhqPP2N1lBn3kYqJpPHHru+83Rkvo2lHz5mW+rEeIMEF9qY3PB94g==", + "dependencies": { + "@vue/runtime-core": "3.4.19", + "@vue/shared": "3.4.19", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.19.tgz", + "integrity": "sha512-eAj2p0c429RZyyhtMRnttjcSToch+kTWxFPHlzGMkR28ZbF1PDlTcmGmlDxccBuqNd9iOQ7xPRPAGgPVj+YpQw==", + "dependencies": { + "@vue/compiler-ssr": "3.4.19", + "@vue/shared": "3.4.19" + }, + "peerDependencies": { + "vue": "3.4.19" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.19.tgz", + "integrity": "sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ace-builds": { + "version": "1.33.1", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.33.1.tgz", + "integrity": "sha512-pj5mcXV1n3s86UI4SWUt8X0ltN8cTaYcvF76cSmvy5i2ZDtXX9KkjVcYTGkCV7ox6VUrzqHByeqH0xRsMjXi4g==", + "peer": true + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autoprefixer": { + "version": "10.4.17", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", + "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.22.2", + "caniuse-lite": "^1.0.30001578", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c12": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/c12/-/c12-1.11.2.tgz", + "integrity": "sha512-oBs8a4uvSDO9dm8b7OCFW7+dgtVrwmwnrVXYzLm43ta7ep2jCn/0MhoUFygIWtxhyy6+/MG7/agvpY0U1Iemew==", + "dependencies": { + "chokidar": "^3.6.0", + "confbox": "^0.1.7", + "defu": "^6.1.4", + "dotenv": "^16.4.5", + "giget": "^1.2.3", + "jiti": "^1.21.6", + "mlly": "^1.7.1", + "ohash": "^1.1.3", + "pathe": "^1.1.2", + "perfect-debounce": "^1.0.0", + "pkg-types": "^1.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.4" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001658", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz", + "integrity": "sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/case-anything": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", + "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/compatx": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.1.8.tgz", + "integrity": "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==" + }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==" + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deep-pick-omit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/deep-pick-omit/-/deep-pick-omit-1.2.0.tgz", + "integrity": "sha512-2CGvfTM2c+IP/MhdRZMpaHhTc6zIlgz3tQXJ/VGAkc7mjMrjqSU28qiI63yEcy+fcYfd/K+NNJcGRzap4M4bqw==" + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==" + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff2html": { + "version": "3.4.48", + "resolved": "https://registry.npmjs.org/diff2html/-/diff2html-3.4.48.tgz", + "integrity": "sha512-1lzNSg0G0VPKZPTyi4knzV2nAWTXBy/QaWCKzDto6iEIlcuOJEG0li4bElJfpHNz+pBqPu4AcC1i9ZCo9KMUOg==", + "dependencies": { + "diff": "5.1.0", + "hogan.js": "3.0.2" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "highlight.js": "11.9.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dprint-node": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz", + "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==", + "dependencies": { + "detect-libc": "^1.0.3" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.18", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.18.tgz", + "integrity": "sha512-1OfuVACu+zKlmjsNdcJuVQuVE61sZOLbNM4JAQ1Rvh6EOj0/EUKhMJjRH73InPlXSh8HIJk1cVZ8pyOV/FMdUQ==" + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "peer": true + }, + "node_modules/esbuild": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.51.tgz", + "integrity": "sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.51", + "esbuild-android-arm64": "0.14.51", + "esbuild-darwin-64": "0.14.51", + "esbuild-darwin-arm64": "0.14.51", + "esbuild-freebsd-64": "0.14.51", + "esbuild-freebsd-arm64": "0.14.51", + "esbuild-linux-32": "0.14.51", + "esbuild-linux-64": "0.14.51", + "esbuild-linux-arm": "0.14.51", + "esbuild-linux-arm64": "0.14.51", + "esbuild-linux-mips64le": "0.14.51", + "esbuild-linux-ppc64le": "0.14.51", + "esbuild-linux-riscv64": "0.14.51", + "esbuild-linux-s390x": "0.14.51", + "esbuild-netbsd-64": "0.14.51", + "esbuild-openbsd-64": "0.14.51", + "esbuild-sunos-64": "0.14.51", + "esbuild-windows-32": "0.14.51", + "esbuild-windows-64": "0.14.51", + "esbuild-windows-arm64": "0.14.51" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.51.tgz", + "integrity": "sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.51.tgz", + "integrity": "sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.51.tgz", + "integrity": "sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.51.tgz", + "integrity": "sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.51.tgz", + "integrity": "sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.51.tgz", + "integrity": "sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.51.tgz", + "integrity": "sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.51.tgz", + "integrity": "sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.51.tgz", + "integrity": "sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.51.tgz", + "integrity": "sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.51.tgz", + "integrity": "sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.51.tgz", + "integrity": "sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.51.tgz", + "integrity": "sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.51.tgz", + "integrity": "sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.51.tgz", + "integrity": "sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.51.tgz", + "integrity": "sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.51.tgz", + "integrity": "sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.51.tgz", + "integrity": "sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.51.tgz", + "integrity": "sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.51.tgz", + "integrity": "sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.20.1.tgz", + "integrity": "sha512-GyCs8K3lkEvoyC1VV97GJhP1SvqsKCiWGHnbn0gVUYiUhaH2+nB+Dv1uekv1THFMPbBfYxukrzQdltw950k+LQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.4.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/front-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/front-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz", + "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.3", + "nypm": "^0.3.8", + "ohash": "^1.1.3", + "pathe": "^1.1.2", + "tar": "^6.2.0" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", + "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", + "optional": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", + "dependencies": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "bin": { + "hulk": "bin/hulk" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", + "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", + "dev": true, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", + "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", + "dev": true, + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/knitwork": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.1.0.tgz", + "integrity": "sha512-oHnmiBUVHz1V+URE77PNot2lv3QiYU2zQf1JjOVkMt3YDKGbu8NAFr+c4mcNOhdsGrB/VpVbRwPwhiXrPhxQbw==" + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-abbr": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz", + "integrity": "sha512-ZeA4Z4SaBbYysZap5iZcxKmlPL6bYA8grqhzJIHB1ikn7njnzaP8uwbtuXc4YXD5LicI4/2Xmc0VwmSiFV04gg==", + "dev": true + }, + "node_modules/markdown-it-container": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz", + "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==", + "dev": true + }, + "node_modules/markdown-it-deflist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz", + "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==", + "dev": true + }, + "node_modules/markdown-it-emoji": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==", + "dev": true + }, + "node_modules/markdown-it-footnote": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", + "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==", + "dev": true + }, + "node_modules/markdown-it-imsize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-imsize/-/markdown-it-imsize-2.0.1.tgz", + "integrity": "sha512-5SH90ademqcR8ifQCBXRCfIR4HGfZZOh5pO0j2TglulfSQH+SBXM4Iw/QlTUbSoUwVZArCYgECoMvktDS2kP3w==", + "dev": true + }, + "node_modules/markdown-it-ins": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-ins/-/markdown-it-ins-3.0.1.tgz", + "integrity": "sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw==", + "dev": true + }, + "node_modules/markdown-it-mark": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-3.0.1.tgz", + "integrity": "sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A==", + "dev": true + }, + "node_modules/markdown-it-sub": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz", + "integrity": "sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q==", + "dev": true + }, + "node_modules/markdown-it-sup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz", + "integrity": "sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ==", + "dev": true + }, + "node_modules/markdown-it-task-lists": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz", + "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==", + "dev": true + }, + "node_modules/markdown-it-toc-and-anchor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.2.0.tgz", + "integrity": "sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==", + "dev": true, + "dependencies": { + "clone": "^2.1.0", + "uslug": "^1.0.4" + } + }, + "node_modules/markdown-it-toc-and-anchor/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "engines": { + "node": "*" + } + }, + "node_modules/mlly": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch-native": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", + "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nypm": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.11.tgz", + "integrity": "sha512-E5GqaAYSnbb6n1qZyik2wjPDZON43FqOJO59+3OkWrnmQtjggrMOVnsyzfjxp/tS6nlYJBA4zRA5jSM2YaadMg==", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "execa": "^8.0.1", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "ufo": "^1.5.4" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ohash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", + "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/papaparse": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", + "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==" + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", + "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia-plugin-persistedstate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.0.0.tgz", + "integrity": "sha512-yTly/5XMwgd4hQmZOTAdeK3Kfz89h9TMS2/d0VzVJEL9v2LanZdjhckpwnE+jelL+vsT7DnRLmSOtkzSJjO6Ng==", + "dependencies": { + "@nuxt/kit": "^3.13.0", + "deep-pick-omit": "^1.2.0", + "defu": "^6.1.4", + "destr": "^2.0.3" + }, + "peerDependencies": { + "@pinia/nuxt": ">=0.5.0", + "pinia": ">=2.0.0" + }, + "peerDependenciesMeta": { + "@pinia/nuxt": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", + "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.1", + "pathe": "^1.1.2" + } + }, + "node_modules/plotly.js-dist": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/plotly.js-dist/-/plotly.js-dist-2.32.0.tgz", + "integrity": "sha512-+RnvqNTJADe3ctmCMT2YOhXu4ZwYuBi7eD4FF0oyaJ8jWj65Ru6lZVnetr7T3ZvnU5BgQWbbId+tYgf0PBFkeQ==" + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/@types/node": { + "version": "20.12.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", + "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quasar": { + "version": "2.17.4", + "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.17.4.tgz", + "integrity": "sha512-EqfV7taxfHIGN9gTwpwRayF6VMxk2I7ztapTwr+A1h22Jop4gNpl40HDuNtjpKbXaw/ZsIBK9cbch0aXDCGhNg==", + "license": "MIT", + "engines": { + "node": ">= 10.18.1", + "npm": ">= 6.13.4", + "yarn": ">= 1.21.1" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/register-service-worker": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/register-service-worker/-/register-service-worker-1.7.2.tgz", + "integrity": "sha512-CiD3ZSanZqcMPRhtfct5K9f7i3OLCcBBWsJjLh1gW9RO/nS94sVzY59iS+fgYBOBqaBpf4EzfqUF3j9IG+xo8A==", + "dev": true + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.77.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz", + "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", + "devOptional": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz", + "integrity": "sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==", + "dev": true, + "dependencies": { + "open": "^8.4.0", + "picomatch": "^2.3.1", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.81.0.tgz", + "integrity": "sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-trace": { + "version": "1.0.0-pre2", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", + "dependencies": { + "js-tokens": "^9.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser": { + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.4.tgz", + "integrity": "sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-poet": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.9.0.tgz", + "integrity": "sha512-roe6W6MeZmCjRmppyfOURklO5tQFQ6Sg7swURKkwYJvV7dbGCrK28um5+51iW3twdPRKtwarqFAVMU6G1mvnuQ==", + "dependencies": { + "dprint-node": "^1.0.8" + } + }, + "node_modules/ts-proto": { + "version": "1.174.0", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.174.0.tgz", + "integrity": "sha512-hptQp5Nu5Vj3Mrj70fx5ccw3rTwPPpKXpa5RJ/WlmWiliVMqNPGYzUuBvd9N/EKsxiSQHiw62aGlZezzF19fKA==", + "dependencies": { + "case-anything": "^2.1.13", + "protobufjs": "^7.2.4", + "ts-poet": "^6.7.0", + "ts-proto-descriptors": "1.15.0" + }, + "bin": { + "protoc-gen-ts_proto": "protoc-gen-ts_proto" + } + }, + "node_modules/ts-proto-descriptors": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.15.0.tgz", + "integrity": "sha512-TYyJ7+H+7Jsqawdv+mfsEpZPTIj9siDHS6EMCzG/z3b/PZiphsX+mWtqFfFVe5/N0Th6V3elK9lQqjnrgTOfrg==", + "dependencies": { + "long": "^5.2.3", + "protobufjs": "^7.2.4" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + }, + "node_modules/unctx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.3.1.tgz", + "integrity": "sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==", + "dependencies": { + "acorn": "^8.8.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.0", + "unplugin": "^1.3.1" + } + }, + "node_modules/unctx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.11.1.tgz", + "integrity": "sha512-DuB1Uoq01LrrXTScxnwOoMSlTXxyKcULguFxbLrMDFcE/CO0ZWHpEiyhovN0mycPt7K6luAHe8laqvwvuoeUPg==", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "acorn": "^8.12.1", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.11", + "mlly": "^1.7.1", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "scule": "^1.3.0", + "strip-literal": "^2.1.0", + "unplugin": "^1.12.2" + } + }, + "node_modules/unimport/node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/unimport/node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unimport/node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.13.1.tgz", + "integrity": "sha512-6Kq1iSSwg7KyjcThRUks9LuqDAKvtnioxbL9iEtB9ctTyBA5OmrB8gZd/d225VJu1w3UpUsKV7eGrvf59J7+VA==", + "dependencies": { + "acorn": "^8.12.1", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "webpack-sources": "^3" + }, + "peerDependenciesMeta": { + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.17.5.tgz", + "integrity": "sha512-fHNDkDSxv3PGagX1wmKBYBkgaM4AKAgZmdJw/bxjhNljx9KSXSgHpGfX0MwUrq9qw6q1bhHIZVWyOwoY2koo4w==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.7", + "@rollup/pluginutils": "^5.1.0", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "minimatch": "^9.0.3", + "unimport": "^3.7.1", + "unplugin": "^1.6.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import/node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/unplugin-auto-import/node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/unplugin-auto-import/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/untyped": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.4.2.tgz", + "integrity": "sha512-nC5q0DnPEPVURPhfPQLahhSTnemVtPzdx7ofiRxXpOB2SYnb3MfdU3DVGyJdS8Lx+tBWeAePO8BfU/3EgksM7Q==", + "dependencies": { + "@babel/core": "^7.23.7", + "@babel/standalone": "^7.23.8", + "@babel/types": "^7.23.6", + "defu": "^6.1.4", + "jiti": "^1.21.0", + "mri": "^1.2.0", + "scule": "^1.2.0" + }, + "bin": { + "untyped": "dist/cli.mjs" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uslug": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz", + "integrity": "sha512-Jrbpp/NS3TvIGNjfJT1sn3/BCeykoxR8GbNYW5lF6fUscLkbXFwj1b7m4DvIkHm8k3Qr6Co68lbTmoZTMGk/ow==", + "dev": true, + "dependencies": { + "unorm": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.18.tgz", + "integrity": "sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.14.27", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": ">=2.59.0 <2.78.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": ">=12.2.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.19.tgz", + "integrity": "sha512-W/7Fc9KUkajFU8dBeDluM4sRGc/aa4YJnOYck8dkjgZoXtVsn3OeTGni66FV1l3+nvPA7VBFYtPioaGKUmEADw==", + "dependencies": { + "@vue/compiler-dom": "3.4.19", + "@vue/compiler-sfc": "3.4.19", + "@vue/runtime-dom": "3.4.19", + "@vue/server-renderer": "3.4.19", + "@vue/shared": "3.4.19" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", + "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-i18n": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.0.tgz", + "integrity": "sha512-LxmpRuCt2rI8gqU+kxeflRZMQn4D5+4M3oP3PWZdowW/ePJraHqhF7p4CuaME52mUxdw3Mmy2yAUKgfZYgCRjA==", + "dependencies": { + "@intlify/core-base": "9.14.0", + "@intlify/shared": "9.14.0", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz", + "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue3-ace-editor": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/vue3-ace-editor/-/vue3-ace-editor-2.2.4.tgz", + "integrity": "sha512-FZkEyfpbH068BwjhMyNROxfEI8135Sc+x8ouxkMdCNkuj/Tuw83VP/gStFQqZHqljyX9/VfMTCdTqtOnJZGN8g==", + "dependencies": { + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "ace-builds": "*", + "vue": "^3" + } + }, + "node_modules/vue3-cookies": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vue3-cookies/-/vue3-cookies-1.0.6.tgz", + "integrity": "sha512-a1UvVD0qIgxyOqjlSOwnLnqAnz8ASltugEv8yX+96i/WGZAN9fEDci7xO4HIWZE1uToUnRq9JnFhvfDCSo45OA==", + "dependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz", + "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "lodash": "^4.17.21", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + } +} diff --git a/agate-ui/package.json b/agate-ui/package.json new file mode 100644 index 000000000..447422bf8 --- /dev/null +++ b/agate-ui/package.json @@ -0,0 +1,53 @@ +{ + "name": "agate-ui", + "version": "0.0.1", + "description": "OBiBa identity provider", + "productName": "Agate", + "author": "Yannick Marcon ", + "private": true, + "scripts": { + "lint": "eslint --ext .js,.ts,.vue ./", + "format": "prettier --write \"**/*.{js,ts,vue,scss,html,md,json}\" --ignore-path .gitignore", + "test": "echo \"No test specified\" && exit 0", + "dev": "quasar dev", + "build": "quasar build", + "clean": "quasar clean" + }, + "dependencies": { + "@quasar/extras": "^1.16.9", + "axios": "^1.7.7", + "date-fns": "^3.6.0", + "diff2html": "^3.4.48", + "papaparse": "^5.4.1", + "pinia": "^2.1.7", + "pinia-plugin-persistedstate": "^4.0.0", + "plotly.js-dist": "^2.32.0", + "quasar": "^2.17.4", + "ts-proto": "^1.174.0", + "vue": "^3.4.19", + "vue-i18n": "^9.14.0", + "vue-router": "^4.4.5", + "vue3-ace-editor": "^2.2.4", + "vue3-cookies": "^1.0.6" + }, + "devDependencies": { + "@intlify/unplugin-vue-i18n": "^2.0.0", + "@quasar/app-vite": "^1.11.0", + "@quasar/quasar-app-extension-qmarkdown": "^2.0.0-beta.10", + "@types/node": "^12.20.21", + "@typescript-eslint/eslint-plugin": "^5.10.0", + "@typescript-eslint/parser": "^5.10.0", + "autoprefixer": "^10.4.2", + "eslint": "^8.11.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-vue": "^9.0.0", + "prettier": "^2.5.1", + "typescript": "^4.5.4", + "unplugin-auto-import": "^0.17.5" + }, + "engines": { + "node": "^20 || ^18 || ^16", + "npm": ">= 6.13.4", + "yarn": ">= 1.21.1" + } +} diff --git a/agate-ui/pom.xml b/agate-ui/pom.xml new file mode 100644 index 000000000..f6e74028b --- /dev/null +++ b/agate-ui/pom.xml @@ -0,0 +1,85 @@ + + + + + + 4.0.0 + + agate + org.obiba.agate + 3.3-SNAPSHOT + + agate-ui + agate-ui + pom + + + + + com.github.eirslett + frontend-maven-plugin + ${frontend-maven-plugin.version} + + + + + install node and npm + + install-node-and-npm + + + v20.9.0 + + + + + npm install + + npm + + + install + + + + npm run build + + npm + + + run build + + + + + + org.apache.maven.plugins + maven-antrun-plugin + ${maven-antrun-plugin.version} + + + custom-clean + clean + + run + + + + + + + + + + + + + diff --git a/agate-ui/postcss.config.cjs b/agate-ui/postcss.config.cjs new file mode 100644 index 000000000..94b7b1c85 --- /dev/null +++ b/agate-ui/postcss.config.cjs @@ -0,0 +1,27 @@ +/* eslint-disable */ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + plugins: [ + // https://github.com/postcss/autoprefixer + require('autoprefixer')({ + overrideBrowserslist: [ + 'last 4 Chrome versions', + 'last 4 Firefox versions', + 'last 4 Edge versions', + 'last 4 Safari versions', + 'last 4 Android versions', + 'last 4 ChromeAndroid versions', + 'last 4 FirefoxAndroid versions', + 'last 4 iOS versions' + ] + }) + + // https://github.com/elchininet/postcss-rtlcss + // If you want to support RTL css, then + // 1. yarn/npm install postcss-rtlcss + // 2. optionally set quasar.config.js > framework > lang to an RTL language + // 3. uncomment the following line: + // require('postcss-rtlcss') + ] +} diff --git a/agate-ui/public/favicon.ico b/agate-ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..046948fb52db1ead968e7d8edc90e82348d4765e GIT binary patch literal 67646 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 T?=iaE+j}g^Ap!nh6b}49INcH7 literal 0 HcmV?d00001 diff --git a/agate-ui/public/icons/favicon-128x128.png b/agate-ui/public/icons/favicon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..02baefc1e040883ef871a05196997434c110118a GIT binary patch literal 7332 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 F_CHmg-{}AV literal 0 HcmV?d00001 diff --git a/agate-ui/public/icons/favicon-16x16.png b/agate-ui/public/icons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..5ef1b41f59c82577722af64e919fc0757c54faa3 GIT binary patch literal 4704 zcmeHKc~leE8V{fn5RtYht%?l61;LPH5=b%-0ZD*}LBxRKRwpwPn39cTVgicL7K>}$ zu^_MYq2f~IQAHFzYE)EQL3vu27I#o7waT+7qV1i4i0Ad3cRc6yKaw*ucfRF!zwh^b z_nx_n6XIhAxDIh;Fc<^mvC>5F^q?MZ3nDiO6n2BTh0Y6ytRG!PJB zCDjau^}04;hWl~I?PZf^==j-NZi^`5lCJ!2?OH0}1`Ay+f=6vX^z90&*;jMA;Iip- zp-1x0SlJyx$?zK7IXW^Gepa9FQQ^7o>r19{-({D|7YFXX&$`zJRTlaWZht+}b0BFM z5&OGGfbV9Q>Hax#SXT8s>(#LT;>D|6-{euo@F2Bg%qyCKO8hQmTKDk?!974;?`kVSF!DoO0|1kZ(& zrpQ(;i49#O!nfU-6RE78{Cz^6>pzpzE+4(OC8ut)uRJ5eb7p_{*JG2tXBL~yhCzLf z`go)|kCu6jd2)Dj9qVNO6>S*}lKi$`o$|5@$>dX_jSnjeCsd!9I5+8+EE&_`KYq(5 z7p9yn9x?Lvj8EJC9cT8soANq4C;4ARdp`E?Se#mjUauZnUB997Xy$jKV@q~Vm>(ae zzSMWIPgR+<<7CyX-8R0T8VQ~>%y)2q?am5bV9}5#o*Bx^)EO^$`1i&8MCtbf(i_$s z;jXQpT2K|A&U6{8a`{l|zpW$>)>NncDF0z)N$dU}BbhaQGG@g|N4K__N5yAA@AQacDh#;%h06LGs2n)9wP%NFG zAQh2H>Ljek2am8I5|^;11}nGy(p7 znDk~NM#$z8I?Asn1det48_Y(HJslk55E?=YOif@`-aAvq$Q23Q9yA51q}E{f0%X5q zNs;QeWW5s`t+A)mGZ5h3jr)%Eo80Zjz)GP&qPP_ zDmKa&;%ot*OR&WvoXb|hFouVSLqvQcqz9B-XQEIYM$k|IJctB1DwvN2)81-W#A6FY zFrO_}@d-An3dT{PS|}8T@OnT@GLoPxQBBXNXeb;&@k00_wSeHUd1^j@!bJi$8ce|K z5LiWEB3Qr=5x{mR97Ce@MlA};Novtlf@9F7+7&e6NMwRs!h(aiZzTyDlu`o+32P#$ zGh5#(l%$rJLZLL9JRzUY74n7P7AzJ83*H(f6Gjv0L>iOF4dRRJ8oDe9NCps#(tQd5 z>~fF`5@jS%N^ex^^%@C_4hfBR$ub(TDqG=cdu?V`>VHHFCNeCvGGkoKhnLH0#~pjc-LCUh==+v5aS zohmF1)uj?(_vmWZH*)eXT7jn$qaipb7@>kyY=KH7Vxw4y5cCy_VPZna$JL!Ab)%c~ zYRZBdiO5vIBj5_Or=2Uv-(ILO@5W+DBj_ps!q_~R-Ax#e+eH|sD`5`3XS~TcjPqZd zgxL*xY%;*FQwBCKuorT=H^VN@K)iqFud5b+=M)gsJIQ$0j!|Q`Fc^+ZxinHKI=gF4ZJaX0!xnz?TH8 z?LU5Gx!93%<7Q>YkdF=Cr~5U>e3f$T>4!V^z6^@*H>-GNdCSkI;zA?aH#Hjv74K!t zzgfGeX3U6}`6=K-7 zD#L%yE=H2#yk_vO>AqzvPiM+nJMy)6&z`7!a=+gCdh_~LSM8G}`B!E*+&5m6-U}|; zIea#opK$epwWVra!N76T$9>a!ea~H|ssRtD%a+A%SFSEiH!sg`&w2Wh`=YBc UV_)85f;M5uW%1Io@pHcT6P;AuHvj+t literal 0 HcmV?d00001 diff --git a/agate-ui/public/icons/favicon-32x32.png b/agate-ui/public/icons/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..bf72ae04a19ca01eb550e3d24a4d6b942f36c363 GIT binary patch literal 5381 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 boot files are part of 'main.js' + // https://v2.quasar.dev/quasar-cli-vite/boot-files + boot: ['i18n', 'api', 'ace'], + + // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css + css: ['app.scss'], + + // https://github.com/quasarframework/quasar/tree/dev/extras + extras: [ + // 'ionicons-v4', + // 'mdi-v5', + 'fontawesome-v6', + // 'eva-icons', + // 'themify', + // 'line-awesome', + // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both! + + 'roboto-font', // optional, you are not bound to it + 'material-icons', // optional, you are not bound to it + ], + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#build + build: { + target: { + browser: ['es2019', 'edge88', 'firefox78', 'chrome87', 'safari13.1'], + node: 'node20', + }, + + vueRouterMode: 'hash', // available values: 'hash', 'history' + // vueRouterBase, + // vueDevtools, + // vueOptionsAPI: false, + + // rebuildCache: true, // rebuilds Vite/linter/etc cache on startup + + publicPath: '/admin', + env: { + API: ctx.dev ? 'http://localhost:8081/ws' : (process.env.AGATE_URL ? process.env.AGATE_URL : '') + '/ws', + }, + // rawDefine: {} + // ignorePublicFolder: true, + // minify: false, + // polyfillModulePreload: true, + // distDir + + // extendViteConf (viteConf) {}, + // Needed to have relative assets in the index.html + // https://github.com/quasarframework/quasar/issues/8513#issuecomment-1127654470 + extendViteConf(viteConf, { isServer, isClient }) { + viteConf.base = ''; + viteConf.css = mergeConfig(viteConf.css, { + preprocessorOptions: { + // silence deprecation warnings from quasar-ui-qmarkdown + sass: { + silenceDeprecations: ['color-functions'] + }, + scss: { + silenceDeprecations: ['color-functions'] + } + } + }); + }, + // viteVuePluginOptions: {}, + + vitePlugins: [ + [ + 'unplugin-auto-import/vite', + { + imports: ['vue', 'vue-router', 'vue-i18n', 'vue/macros'], + dts: 'src/auto-imports.d.ts', + dirs: ['src/stores'], + vueTemplate: true, + eslintrc: { + enabled: true, // Default `false` + filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json` + globalsPropValue: true, // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable') + }, + }, + ], + // [ + // '@intlify/unplugin-vue-i18n', + // { + // // if you want to use Vue I18n Legacy API, you need to set `compositionOnly: false` + // // compositionOnly: false, + // // if you want to use named tokens in your Vue I18n messages, such as 'Hello {name}', + // // you need to set `runtimeOnly: false` + // runtimeOnly: false, + // // you need to set i18n resource including paths ! + // include: [path.resolve(__dirname, './src/i18n/**')], + // }, + // ], + ], + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#devServer + devServer: { + // https: true + open: false, // opens browser window automatically + }, + + // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#framework + framework: { + config: {}, + + // iconSet: 'material-icons', // Quasar icon set + // lang: 'en-US', // Quasar language pack + + // For special cases outside of where the auto-import strategy can have an impact + // (like functional components as one of the examples), + // you can manually specify Quasar components/directives to be available everywhere: + // + // components: [], + // directives: [], + + // Quasar plugins + plugins: ['AppFullscreen', 'Notify', 'LocalStorage', 'LoadingBar'], + }, + + // animations: 'all', // --- includes all animations + // https://v2.quasar.dev/options/animations + animations: [], + + // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#sourcefiles + // sourceFiles: { + // rootComponent: 'src/App.vue', + // router: 'src/router/index', + // store: 'src/store/index', + // registerServiceWorker: 'src-pwa/register-service-worker', + // serviceWorker: 'src-pwa/custom-service-worker', + // pwaManifestFile: 'src-pwa/manifest.json', + // electronMain: 'src-electron/electron-main', + // electronPreload: 'src-electron/electron-preload' + // }, + + // https://v2.quasar.dev/quasar-cli-vite/developing-ssr/configuring-ssr + ssr: { + // ssrPwaHtmlFilename: 'offline.html', // do NOT use index.html as name! + // will mess up SSR + + // extendSSRWebserverConf (esbuildConf) {}, + // extendPackageJson (json) {}, + + pwa: false, + + // manualStoreHydration: true, + // manualPostHydrationTrigger: true, + + prodPort: 3000, // The default port that the production server should use + // (gets superseded if process.env.PORT is specified at runtime) + + middlewares: [ + 'render', // keep this as last one + ], + }, + + // https://v2.quasar.dev/quasar-cli-vite/developing-pwa/configuring-pwa + pwa: { + workboxMode: 'generateSW', // or 'injectManifest' + injectPwaMetaTags: true, + swFilename: 'sw.js', + manifestFilename: 'manifest.json', + useCredentialsForManifestTag: false, + // useFilenameHashes: true, + // extendGenerateSWOptions (cfg) {} + // extendInjectManifestOptions (cfg) {}, + // extendManifestJson (json) {} + // extendPWACustomSWConf (esbuildConf) {} + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-cordova-apps/configuring-cordova + cordova: { + // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-capacitor-apps/configuring-capacitor + capacitor: { + hideSplashscreen: true, + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-electron-apps/configuring-electron + electron: { + // extendElectronMainConf (esbuildConf) + // extendElectronPreloadConf (esbuildConf) + + inspectPort: 5858, + + bundler: 'packager', // 'packager' or 'builder' + + packager: { + // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options + // OS X / Mac App Store + // appBundleId: '', + // appCategoryType: '', + // osxSign: '', + // protocol: 'myapp://path', + // Windows only + // win32metadata: { ... } + }, + + builder: { + // https://www.electron.build/configuration/configuration + + appId: 'agate-ui', + }, + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-browser-extensions/configuring-bex + bex: { + contentScripts: ['my-content-script'], + + // extendBexScriptsConf (esbuildConf) {} + // extendBexManifestJson (json) {} + }, + }; +}); diff --git a/agate-ui/quasar.extensions.json b/agate-ui/quasar.extensions.json new file mode 100644 index 000000000..c51ad8adf --- /dev/null +++ b/agate-ui/quasar.extensions.json @@ -0,0 +1,5 @@ +{ + "@quasar/qmarkdown": { + "import_md": true + } +} diff --git a/agate-ui/src/App.vue b/agate-ui/src/App.vue new file mode 100644 index 000000000..6dd241ce4 --- /dev/null +++ b/agate-ui/src/App.vue @@ -0,0 +1,5 @@ + + + diff --git a/agate-ui/src/assets/quasar-logo-vertical.svg b/agate-ui/src/assets/quasar-logo-vertical.svg new file mode 100644 index 000000000..821083104 --- /dev/null +++ b/agate-ui/src/assets/quasar-logo-vertical.svg @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/agate-ui/src/auto-imports.d.ts b/agate-ui/src/auto-imports.d.ts new file mode 100644 index 000000000..43c1d5e2c --- /dev/null +++ b/agate-ui/src/auto-imports.d.ts @@ -0,0 +1,192 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +export {} +declare global { + const $: typeof import('vue/macros')['$'] + const $$: typeof import('vue/macros')['$$'] + const $computed: typeof import('vue/macros')['$computed'] + const $customRef: typeof import('vue/macros')['$customRef'] + const $ref: typeof import('vue/macros')['$ref'] + const $shallowRef: typeof import('vue/macros')['$shallowRef'] + const $toRef: typeof import('vue/macros')['$toRef'] + const AnalysisPluginPackages: typeof import('./stores/plugins')['AnalysisPluginPackages'] + const EffectScope: typeof import('vue')['EffectScope'] + const TOKEN_TYPES: typeof import('./stores/tokens')['TOKEN_TYPES'] + const computed: typeof import('vue')['computed'] + const createApp: typeof import('vue')['createApp'] + const customRef: typeof import('vue')['customRef'] + const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] + const defineComponent: typeof import('vue')['defineComponent'] + const effectScope: typeof import('vue')['effectScope'] + const getCurrentInstance: typeof import('vue')['getCurrentInstance'] + const getCurrentScope: typeof import('vue')['getCurrentScope'] + const h: typeof import('vue')['h'] + const inject: typeof import('vue')['inject'] + const isProxy: typeof import('vue')['isProxy'] + const isReactive: typeof import('vue')['isReactive'] + const isReadonly: typeof import('vue')['isReadonly'] + const isRef: typeof import('vue')['isRef'] + const markRaw: typeof import('vue')['markRaw'] + const nextTick: typeof import('vue')['nextTick'] + const onActivated: typeof import('vue')['onActivated'] + const onBeforeMount: typeof import('vue')['onBeforeMount'] + const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] + const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] + const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] + const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] + const onDeactivated: typeof import('vue')['onDeactivated'] + const onErrorCaptured: typeof import('vue')['onErrorCaptured'] + const onMounted: typeof import('vue')['onMounted'] + const onRenderTracked: typeof import('vue')['onRenderTracked'] + const onRenderTriggered: typeof import('vue')['onRenderTriggered'] + const onScopeDispose: typeof import('vue')['onScopeDispose'] + const onServerPrefetch: typeof import('vue')['onServerPrefetch'] + const onUnmounted: typeof import('vue')['onUnmounted'] + const onUpdated: typeof import('vue')['onUpdated'] + const provide: typeof import('vue')['provide'] + const reactive: typeof import('vue')['reactive'] + const readonly: typeof import('vue')['readonly'] + const ref: typeof import('vue')['ref'] + const resolveComponent: typeof import('vue')['resolveComponent'] + const shallowReactive: typeof import('vue')['shallowReactive'] + const shallowReadonly: typeof import('vue')['shallowReadonly'] + const shallowRef: typeof import('vue')['shallowRef'] + const stores: typeof import('./stores/index')['default'] + const toRaw: typeof import('vue')['toRaw'] + const toRef: typeof import('vue')['toRef'] + const toRefs: typeof import('vue')['toRefs'] + const toValue: typeof import('vue')['toValue'] + const triggerRef: typeof import('vue')['triggerRef'] + const unref: typeof import('vue')['unref'] + const useApplicationStore: typeof import('./stores/application')['useApplicationStore'] + const useAppsStore: typeof import('./stores/apps')['useAppsStore'] + const useAttrs: typeof import('vue')['useAttrs'] + const useAuthStore: typeof import('./stores/auth')['useAuthStore'] + const useAuthzStore: typeof import('./stores/authz')['useAuthzStore'] + const useCartStore: typeof import('./stores/cart')['useCartStore'] + const useCommandsStore: typeof import('./stores/commands')['useCommandsStore'] + const useCounterStore: typeof import('./stores/auth')['useCounterStore'] + const useCssModule: typeof import('vue')['useCssModule'] + const useCssVars: typeof import('vue')['useCssVars'] + const useDatashieldStore: typeof import('./stores/datashield')['useDatashieldStore'] + const useDatasourceStore: typeof import('./stores/datasource')['useDatasourceStore'] + const useFilesStore: typeof import('./stores/files')['useFilesStore'] + const useGroupStore: typeof import('./stores/group')['useGroupStore'] + const useGroupsStore: typeof import('./stores/groups')['useGroupsStore'] + const useI18n: typeof import('vue-i18n')['useI18n'] + const useIdentifiersStore: typeof import('./stores/identifiers')['useIdentifiersStore'] + const useIdentityProvidersStore: typeof import('./stores/identity-providers')['useIdentityProvidersStore'] + const useLink: typeof import('vue-router')['useLink'] + const usePluginsStore: typeof import('./stores/plugins')['usePluginsStore'] + const useProfileAclsStore: typeof import('./stores/profile-acls')['useProfileAclsStore'] + const useProfileActivityStore: typeof import('./stores/profile-activity')['useProfileActivityStore'] + const useProfilesStore: typeof import('./stores/profiles')['useProfilesStore'] + const useProjectsStore: typeof import('./stores/projects')['useProjectsStore'] + const useRStore: typeof import('./stores/r')['useRStore'] + const useRealmStore: typeof import('./stores/realm')['useRealmStore'] + const useResourcesStore: typeof import('./stores/resources')['useResourcesStore'] + const useRoute: typeof import('vue-router')['useRoute'] + const useRouter: typeof import('vue-router')['useRouter'] + const useSearchStore: typeof import('./stores/search')['useSearchStore'] + const useSlots: typeof import('vue')['useSlots'] + const useSqlStore: typeof import('./stores/sql')['useSqlStore'] + const useSystemStore: typeof import('./stores/system')['useSystemStore'] + const useTaxonomiesStore: typeof import('./stores/taxonomies')['useTaxonomiesStore'] + const useTokensStore: typeof import('./stores/tokens')['useTokensStore'] + const useTransientDatasourceStore: typeof import('./stores/transient-datasource')['useTransientDatasourceStore'] + const useUserStore: typeof import('./stores/user')['useUserStore'] + const useUsersGroupsStore: typeof import('./stores/users-groups')['useUsersGroupsStore'] + const useUsersStore: typeof import('./stores/users')['useUsersStore'] + const watch: typeof import('vue')['watch'] + const watchEffect: typeof import('vue')['watchEffect'] + const watchPostEffect: typeof import('vue')['watchPostEffect'] + const watchSyncEffect: typeof import('vue')['watchSyncEffect'] +} +// for type re-export +declare global { + // @ts-ignore + export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue' + import('vue') +} +// for vue template auto import +import { UnwrapRef } from 'vue' +declare module 'vue' { + interface GlobalComponents {} + interface ComponentCustomProperties { + readonly $$: UnwrapRef + readonly $: UnwrapRef + readonly $computed: UnwrapRef + readonly $customRef: UnwrapRef + readonly $ref: UnwrapRef + readonly $shallowRef: UnwrapRef + readonly $toRef: UnwrapRef + readonly EffectScope: UnwrapRef + readonly computed: UnwrapRef + readonly createApp: UnwrapRef + readonly customRef: UnwrapRef + readonly defineAsyncComponent: UnwrapRef + readonly defineComponent: UnwrapRef + readonly effectScope: UnwrapRef + readonly getCurrentInstance: UnwrapRef + readonly getCurrentScope: UnwrapRef + readonly h: UnwrapRef + readonly inject: UnwrapRef + readonly isProxy: UnwrapRef + readonly isReactive: UnwrapRef + readonly isReadonly: UnwrapRef + readonly isRef: UnwrapRef + readonly markRaw: UnwrapRef + readonly nextTick: UnwrapRef + readonly onActivated: UnwrapRef + readonly onBeforeMount: UnwrapRef + readonly onBeforeRouteLeave: UnwrapRef + readonly onBeforeRouteUpdate: UnwrapRef + readonly onBeforeUnmount: UnwrapRef + readonly onBeforeUpdate: UnwrapRef + readonly onDeactivated: UnwrapRef + readonly onErrorCaptured: UnwrapRef + readonly onMounted: UnwrapRef + readonly onRenderTracked: UnwrapRef + readonly onRenderTriggered: UnwrapRef + readonly onScopeDispose: UnwrapRef + readonly onServerPrefetch: UnwrapRef + readonly onUnmounted: UnwrapRef + readonly onUpdated: UnwrapRef + readonly provide: UnwrapRef + readonly reactive: UnwrapRef + readonly readonly: UnwrapRef + readonly ref: UnwrapRef + readonly resolveComponent: UnwrapRef + readonly shallowReactive: UnwrapRef + readonly shallowReadonly: UnwrapRef + readonly shallowRef: UnwrapRef + readonly stores: UnwrapRef + readonly toRaw: UnwrapRef + readonly toRef: UnwrapRef + readonly toRefs: UnwrapRef + readonly toValue: UnwrapRef + readonly triggerRef: UnwrapRef + readonly unref: UnwrapRef + readonly useApplicationStore: UnwrapRef + readonly useAttrs: UnwrapRef + readonly useAuthStore: UnwrapRef + readonly useCssModule: UnwrapRef + readonly useCssVars: UnwrapRef + readonly useGroupStore: UnwrapRef + readonly useI18n: UnwrapRef + readonly useLink: UnwrapRef + readonly useRealmStore: UnwrapRef + readonly useRoute: UnwrapRef + readonly useRouter: UnwrapRef + readonly useSlots: UnwrapRef + readonly useSystemStore: UnwrapRef + readonly useUserStore: UnwrapRef + readonly watch: UnwrapRef + readonly watchEffect: UnwrapRef + readonly watchPostEffect: UnwrapRef + readonly watchSyncEffect: UnwrapRef + } +} diff --git a/agate-ui/src/boot/.gitkeep b/agate-ui/src/boot/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/agate-ui/src/boot/ace.ts b/agate-ui/src/boot/ace.ts new file mode 100644 index 000000000..a419f7181 --- /dev/null +++ b/agate-ui/src/boot/ace.ts @@ -0,0 +1,7 @@ +import ace from 'ace-builds'; + +import modeJavascriptUrl from 'ace-builds/src-noconflict/mode-javascript?url'; +ace.config.setModuleUrl('ace/mode/javascript', modeJavascriptUrl); + +import themeMonokaiUrl from 'ace-builds/src-noconflict/theme-monokai?url'; +ace.config.setModuleUrl('ace/theme/monokai', themeMonokaiUrl); diff --git a/agate-ui/src/boot/api.ts b/agate-ui/src/boot/api.ts new file mode 100644 index 000000000..59b2188e9 --- /dev/null +++ b/agate-ui/src/boot/api.ts @@ -0,0 +1,67 @@ +import { boot } from 'quasar/wrappers'; +import axios, { AxiosInstance, AxiosResponse } from 'axios'; + +declare module '@vue/runtime-core' { + interface ComponentCustomProperties { + $axios: AxiosInstance; + $api: AxiosInstance; + } +} + +// context path detection +const locationContextPath = window.location.pathname.substring(0, window.location.pathname.indexOf('/', 2)); + +const baseUrl = process.env.API.startsWith('/') ? locationContextPath + process.env.API : process.env.API; +const contextPath = locationContextPath || '/'; +const PROFILE_PATH = '/auth/session/_current'; +const SAFE_PATHS = [PROFILE_PATH, '/auth/session', '/system/conf/general', '/resource-providers']; + +const api = axios.create({ + baseURL: baseUrl, + withCredentials: true, +}); + +function requiresCode(response: AxiosResponse): boolean { + if (response && response.status === 401) return response.headers['www-authenticate'] === 'X-Agate-TOTP'; + return false; +} + +api.interceptors.response.use( + function (response) { + // Any status code that lie within the range of 2xx cause this function to trigger + // Do something with response data + return response; + }, + function (error) { + // Any status codes that falls outside the range of 2xx cause this function to trigger + // Do something with response error + if ( + error.response && + !requiresCode(error.response) && + [401, 403, 404].includes(error.response.status) && + !SAFE_PATHS.includes(error.config.url) + ) { + // verify that user is still logged in + console.debug('error', error); + api.get(PROFILE_PATH).catch(() => { + // reload to redirect to sign in page (and reset app state) + window.location.replace(contextPath); + }); + } + return Promise.reject(error); + } +); + +export default boot(({ app }) => { + // for use inside Vue files (Options API) through this.$axios and this.$api + + app.config.globalProperties.$axios = axios; + // ^ ^ ^ this will allow you to use this.$axios (for Vue Options API form) + // so you won't necessarily have to import axios in each vue file + + app.config.globalProperties.$api = api; + // ^ ^ ^ this will allow you to use this.$api (for Vue Options API form) + // so you can easily perform requests against your app's API +}); + +export { api, baseUrl, contextPath }; diff --git a/agate-ui/src/boot/i18n.ts b/agate-ui/src/boot/i18n.ts new file mode 100644 index 000000000..ea4734f6c --- /dev/null +++ b/agate-ui/src/boot/i18n.ts @@ -0,0 +1,42 @@ +import { boot } from 'quasar/wrappers'; +import { createI18n } from 'vue-i18n'; +import messages from 'src/i18n'; +import { Quasar } from 'quasar'; +import { useCookies } from 'vue3-cookies'; + +const { cookies } = useCookies(); + +const defaultLocales = ['en', 'fr']; + +const locales = defaultLocales; + +function getCurrentLocale() { + let detectedLocale = cookies.get('locale') + ? cookies.get('locale') // previously selected + : Quasar.lang.getLocale(); // browser + if (!detectedLocale) { + detectedLocale = locales[0]; + } else if (!locales.includes(detectedLocale)) { + detectedLocale = detectedLocale.split('-')[0]; + if (!locales.includes(detectedLocale)) { + detectedLocale = locales[0]; + } + } + return detectedLocale; +} + +const i18n = createI18n({ + locale: getCurrentLocale(), + fallbackLocale: locales[0], + globalInjection: true, + legacy: false, + messages, +}); +const t = i18n.global.t; + +export default boot(({ app }) => { + // Set i18n instance on app + app.use(i18n); +}); + +export { i18n, t, locales, getCurrentLocale }; diff --git a/agate-ui/src/components/ConfirmDialog.vue b/agate-ui/src/components/ConfirmDialog.vue new file mode 100644 index 000000000..e0f31836a --- /dev/null +++ b/agate-ui/src/components/ConfirmDialog.vue @@ -0,0 +1,59 @@ + + + + diff --git a/agate-ui/src/components/EssentialLink.vue b/agate-ui/src/components/EssentialLink.vue new file mode 100644 index 000000000..5f546326b --- /dev/null +++ b/agate-ui/src/components/EssentialLink.vue @@ -0,0 +1,31 @@ + + + + diff --git a/agate-ui/src/components/MainDrawer.vue b/agate-ui/src/components/MainDrawer.vue new file mode 100644 index 000000000..7c7752dc3 --- /dev/null +++ b/agate-ui/src/components/MainDrawer.vue @@ -0,0 +1,112 @@ + + + + diff --git a/agate-ui/src/components/SchemaForm.vue b/agate-ui/src/components/SchemaForm.vue new file mode 100644 index 000000000..2dc2615de --- /dev/null +++ b/agate-ui/src/components/SchemaForm.vue @@ -0,0 +1,88 @@ + + + + + + diff --git a/agate-ui/src/components/SchemaFormItem.vue b/agate-ui/src/components/SchemaFormItem.vue new file mode 100644 index 000000000..b04f24cc3 --- /dev/null +++ b/agate-ui/src/components/SchemaFormItem.vue @@ -0,0 +1,205 @@ + + + + diff --git a/agate-ui/src/components/models.ts b/agate-ui/src/components/models.ts new file mode 100644 index 000000000..ea2386dfd --- /dev/null +++ b/agate-ui/src/components/models.ts @@ -0,0 +1,114 @@ +import { PluginPackageDto, DatasourcePluginPackageDto } from 'src/models/Plugins'; +import { + ViewDto, + VariableListViewDto, + DatasourceFactoryDto, + StaticDatasourceFactoryDto, + ExcelDatasourceFactoryDto, + CsvDatasourceFactoryDto, + FsDatasourceFactoryDto, + RHavenDatasourceFactoryDto, + PluginDatasourceFactoryDto, + RestDatasourceFactoryDto, + AttributeDto, + JdbcDatasourceFactoryDto, +} from 'src/models/Magma'; +import { TaxonomyDto, VocabularyDto, TermDto } from 'src/models/Agate'; + +export interface StringMap { + [key: string]: string | string[] | undefined; +} + +export interface Message { + msg: string; + timestamp: number; +} + +export interface FileObject extends Blob { + readonly size: number; + readonly name: string; + readonly path: string; + readonly type: string; +} + +// +// Plugins +// + +export interface PluginPackage extends PluginPackageDto { + 'Plugins.DatasourcePluginPackageDto.datasource': DatasourcePluginPackageDto | undefined; +} + +// +// Datasource +// + +export interface View extends ViewDto { + 'Magma.VariableListViewDto.view': VariableListViewDto | undefined; +} + +export interface DatasourceFactory extends DatasourceFactoryDto { + 'Magma.CsvDatasourceFactoryDto.params'?: CsvDatasourceFactoryDto; + 'Magma.FsDatasourceFactoryDto.params'?: FsDatasourceFactoryDto; + 'Magma.RHavenDatasourceFactoryDto.params'?: RHavenDatasourceFactoryDto; + 'Magma.PluginDatasourceFactoryDto.params'?: PluginDatasourceFactoryDto; + 'Magma.RestDatasourceFactoryDto.params'?: RestDatasourceFactoryDto; + 'Magma.StaticDatasourceFactoryDto.params'?: StaticDatasourceFactoryDto; + 'Magma.ExcelDatasourceFactoryDto.params'?: ExcelDatasourceFactoryDto; + 'Magma.JdbcDatasourceFactoryDto.params'?: JdbcDatasourceFactoryDto; +} + +export interface EnumOption { + key: string; + title: string; +} + +export interface SchemaFormField { + key: string; + type: string; + format?: string; + title?: string; + description?: string; + default?: string; + minimum?: number; + maximum?: number; + fileFormats?: string[]; + enum?: EnumOption[]; + items: SchemaFormField[]; +} + +export interface SchemaFormObject { + $schema: string; + type: string; + title?: string; + description?: string; + items: SchemaFormField[]; + required: string[]; +} + +export interface FormObject { + [key: string]: boolean | number | string | FileObject | FormObject | Array | undefined; +} + +export interface AttributesBundle { + id: string; + attributes: AttributeDto[]; +} + +export interface Annotation extends AttributesBundle { + taxonomy: TaxonomyDto; + vocabulary: VocabularyDto; + term: TermDto; +} + +export interface SqlCommand { + query: string; + datasource: string; + timestamp: number; + delay: number; +} + +export interface SqlResults { + columns: string[]; + rows: string[][]; +} diff --git a/agate-ui/src/css/app.scss b/agate-ui/src/css/app.scss new file mode 100644 index 000000000..20f114f04 --- /dev/null +++ b/agate-ui/src/css/app.scss @@ -0,0 +1,139 @@ +// app global css in SCSS form +a { + color: $primary; + text-decoration: none; + background-color: transparent; +} + +a.q-btn { + line-height: 2em; +} + +p:last-of-type { + margin: 0; +} + +.q-tab-panel { + padding: 1em 0 1em 0; +} + +.q-table { + th { + background-color: $blue-grey-1; + } + tr:nth-child(even) { + background-color: $grey-2; + } + tr:nth-child(odd) { + background-color: white; + } +} + +.fields-list { + .q-item:nth-child(even) { + background-color: $grey-2; + } + .q-item:nth-child(odd) { + background-color: white; + } +} + +code { + color: crimson; + background-color: #f7f7f9; + font-size: smaller; + padding: 2px 4px; + border-radius: 5px; + border: 1px solid #e1e1e8; + white-space: nowrap; +} + +.q-card.o-card-sm { + width: 200px; +} +.q-card.o-card-md { + width: 250px; +} + +.box-info { + background-color: $info; + color: white; + padding: 0.5em; +} + +.box-warning { + background-color: $warning; + color: $grey-10; + padding: 0.5em; +} + +.box-negative { + background-color: $negative; + color: white; + padding: 0.5em; +} + +.box-positive { + background-color: $positive; + color: white; + padding: 0.5em; +} + +.text-help { + color: $grey-7; +} + +.text-hint { + color: $grey-7; + font-size: 0.8em; +} + +.table-values { + /* specifying max-width so the example can + highlight the sticky column on any browser window */ + //max-width: 600px; + + thead tr:first-child th:first-child { + /* bg color is important for th; just specify one */ + background-color: $grey-1; + } + + td:first-child { + background-color: $grey-3; + } + + th:first-child, + td:first-child { + position: sticky; + left: 0; + z-index: 1; + } +} + +.ace_editor { + font-size: 16px; +} + +.ace_gutter { + padding-top: 10px; + padding-bottom: 10px; +} + +.ace_scroller { + padding: 10px; +} + +.dialog-sm { + width: 500px !important; + max-width: 80vw !important; +} + +.dialog-md { + width: 700px !important; + max-width: 80vw !important; +} + +.dialog-lg { + width: 900px !important; + max-width: 80vw !important; +} diff --git a/agate-ui/src/css/quasar.variables.scss b/agate-ui/src/css/quasar.variables.scss new file mode 100644 index 000000000..d26182bcf --- /dev/null +++ b/agate-ui/src/css/quasar.variables.scss @@ -0,0 +1,25 @@ +// Quasar SCSS (& Sass) Variables +// -------------------------------------------------- +// To customize the look and feel of this app, you can override +// the Sass/SCSS variables found in Quasar's source Sass/SCSS files. + +// Check documentation for full list of Quasar variables + +// Your own variables (that are declared here) and Quasar's own +// ones will be available out of the box in your .vue/.scss/.sass files + +// It's highly recommended to change the default colors +// to match your app's branding. +// Tip: Use the "Theme Builder" on Quasar's documentation website. + +$primary: #007bff; +$secondary: #6c757d; +$accent: #dd4b39; + +$dark: #161d31; +$dark-page: #121212; + +$positive: #28a745; +$negative: #dc3545; +$info: #17a2b8; +$warning: #ffc107; diff --git a/agate-ui/src/env.d.ts b/agate-ui/src/env.d.ts new file mode 100644 index 000000000..dd757b1c0 --- /dev/null +++ b/agate-ui/src/env.d.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ + +declare namespace NodeJS { + interface ProcessEnv { + NODE_ENV: string; + VUE_ROUTER_MODE: 'hash' | 'history' | 'abstract' | undefined; + VUE_ROUTER_BASE: string | undefined; + } +} diff --git a/agate-ui/src/i18n/en/index.js b/agate-ui/src/i18n/en/index.js new file mode 100644 index 000000000..2e7696b93 --- /dev/null +++ b/agate-ui/src/i18n/en/index.js @@ -0,0 +1,25 @@ +export default { + auth: { + signout: 'Sign Out', + }, + main: { + powered_by: 'Powered by', + }, + administration: 'Administration', + content_management: 'Content Management', + docs: 'Docs', + documentation_cookbook: 'Documentation and cookbook', + source_code: 'Source Code', + users: 'Users', + users_caption: 'Manage users, assign role and groups to grant applications access', + groups: 'Groups', + groups_caption: 'Manage groups, grant applications access to group members', + applications: 'Applications', + applications_caption: 'Manage applications, identifications and identity providers', + realms: 'Realms', + realms_caption: 'Manage realms, federate external identity providers', + settings: 'Settings', + my_profile: 'My Profile', + help: 'Help', + other_links: 'Other links', +} \ No newline at end of file diff --git a/agate-ui/src/i18n/fr/index.js b/agate-ui/src/i18n/fr/index.js new file mode 100644 index 000000000..56004c9f9 --- /dev/null +++ b/agate-ui/src/i18n/fr/index.js @@ -0,0 +1 @@ +export default {} \ No newline at end of file diff --git a/agate-ui/src/i18n/index.js b/agate-ui/src/i18n/index.js new file mode 100644 index 000000000..5ee5cb2af --- /dev/null +++ b/agate-ui/src/i18n/index.js @@ -0,0 +1,7 @@ +import en from './en'; +import fr from './fr'; + +export default { + en: en, + fr: fr, +}; diff --git a/agate-ui/src/layouts/MainLayout.vue b/agate-ui/src/layouts/MainLayout.vue new file mode 100644 index 000000000..ce084ee2d --- /dev/null +++ b/agate-ui/src/layouts/MainLayout.vue @@ -0,0 +1,120 @@ + + + diff --git a/agate-ui/src/models/Agate.ts b/agate-ui/src/models/Agate.ts new file mode 100644 index 000000000..5b6454518 --- /dev/null +++ b/agate-ui/src/models/Agate.ts @@ -0,0 +1,241 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v1.174.0 +// protoc v3.21.12 +// source: Agate.proto + +/* eslint-disable */ + +export const protobufPackage = "obiba.agate"; + +export enum KeyType { + KEY_PAIR = "KEY_PAIR", + CERTIFICATE = "CERTIFICATE", + UNRECOGNIZED = "UNRECOGNIZED", +} + +export enum RealmStatus { + INACTIVE = "INACTIVE", + ACTIVE = "ACTIVE", + UNRECOGNIZED = "UNRECOGNIZED", +} + +export interface SessionDto { + username: string; + role: string; + realm: string; +} + +export interface AuthorizationDto { + id: string; + username: string; + application: string; + code: string; + redirectURI?: string | undefined; + scopes: string[]; + timestamps?: TimestampsDto | undefined; + applicationName?: string | undefined; +} + +export interface TicketDto { + id: string; + timestamps?: TimestampsDto | undefined; + username: string; + remembered: boolean; + events: TicketDto_Event[]; + expires?: string | undefined; + authorization?: AuthorizationDto | undefined; +} + +export interface TicketDto_Event { + application?: string | undefined; + action: string; + time: string; +} + +export interface TimestampsDto { + created?: string | undefined; + lastUpdate?: string | undefined; +} + +export interface AttributeConfigurationDto { + name: string; + required: boolean; + type: string; + values: string[]; + description?: string | undefined; +} + +export interface LocalizedStringDto { + lang: string; + value?: string | undefined; +} + +export interface ConfigurationDto { + name: string; + domain?: + | string + | undefined; + /** hours */ + shortTimeout: number; + /** hours */ + longTimeout: number; + userAttributes: AttributeConfigurationDto[]; + /** hours */ + inactiveTimeout: number; + publicUrl?: string | undefined; + joinWithUsername: boolean; + version?: string | undefined; + style?: string | undefined; + languages: string[]; + translations: LocalizedStringDto[]; + portalUrl?: string | undefined; + joinPageEnabled: boolean; + joinWhitelist?: string | undefined; + joinBlacklist?: string | undefined; + enforced2FAStrategy: string; +} + +export interface PublicConfigurationDto { + name: string; + languages: string[]; + joinWithUsername: boolean; + userAttributes: AttributeConfigurationDto[]; + publicUrl?: string | undefined; +} + +export interface AttributeDto { + name: string; + value?: string | undefined; +} + +export interface UserCreateFormDto { + user: UserDto | undefined; + password?: string | undefined; +} + +export interface UserDto { + id?: string | undefined; + name: string; + realm: string; + firstName?: string | undefined; + lastName?: string | undefined; + email: string; + attributes: AttributeDto[]; + role: string; + status: string; + groups: string[]; + applications: string[]; + timestamps?: TimestampsDto | undefined; + groupApplications: GroupApplicationDto[]; + lastLogin?: string | undefined; + preferredLanguage?: string | undefined; + accountUrl?: string | undefined; + otpEnabled?: boolean | undefined; +} + +export interface UserSummaryDto { + id?: string | undefined; + name: string; + firstName?: string | undefined; + lastName?: string | undefined; + email: string; +} + +export interface GroupApplicationDto { + group: string; + application: string; +} + +export interface GroupDto { + id?: string | undefined; + name: string; + description?: string | undefined; + timestamps?: TimestampsDto | undefined; + applications: string[]; + users: UserSummaryDto[]; +} + +export interface ApplicationDto { + id?: string | undefined; + name: string; + key?: string | undefined; + description?: string | undefined; + timestamps?: TimestampsDto | undefined; + redirectURI?: string | undefined; + scopes: ApplicationDto_ScopeDto[]; + autoApproval?: boolean | undefined; +} + +export interface ApplicationDto_ScopeDto { + name: string; + description?: string | undefined; +} + +export interface ConfirmForm { + username: string; + key: string; + password: string; +} + +export interface KeyDto { + alias: string; + certificate: string; + keyType: KeyType; +} + +export interface KeyForm { + alias?: string | undefined; + privateForm?: PrivateKeyForm | undefined; + privateImport?: string | undefined; + publicForm?: PublicKeyForm | undefined; + publicImport?: string | undefined; + certificateFile?: string | undefined; + keyType: KeyType; +} + +export interface PrivateKeyForm { + algo: string; + size: number; +} + +export interface PublicKeyForm { + name: string; + organizationalUnit: string; + organization: string; + locality: string; + state: string; + country: string; +} + +export interface RealmConfigDto { + id?: string | undefined; + name: string; + title: LocalizedStringDto[]; + description: LocalizedStringDto[]; + groups: string[]; + type: string; + forSignup?: boolean | undefined; + status?: RealmStatus | undefined; + content: string; + users: UserSummaryDto[]; + userCount?: number | undefined; + userInfoMappings: RealmConfigDto_UserInfoMappingDto[]; + publicUrl?: string | undefined; + domain?: string | undefined; +} + +export interface RealmConfigDto_UserInfoMappingDto { + key: string; + value: string; +} + +export interface RealmConfigSummaryDto { + id?: string | undefined; + name: string; + type: string; + title: LocalizedStringDto[]; + description: LocalizedStringDto[]; + status?: RealmStatus | undefined; + userCount?: number | undefined; +} diff --git a/agate-ui/src/pages/ApplicationsPage.vue b/agate-ui/src/pages/ApplicationsPage.vue new file mode 100644 index 000000000..d2b7ebe55 --- /dev/null +++ b/agate-ui/src/pages/ApplicationsPage.vue @@ -0,0 +1,21 @@ + + + diff --git a/agate-ui/src/pages/ErrorNotFound.vue b/agate-ui/src/pages/ErrorNotFound.vue new file mode 100644 index 000000000..de477b53b --- /dev/null +++ b/agate-ui/src/pages/ErrorNotFound.vue @@ -0,0 +1,13 @@ + + + diff --git a/agate-ui/src/pages/GroupsPage.vue b/agate-ui/src/pages/GroupsPage.vue new file mode 100644 index 000000000..ed04610b6 --- /dev/null +++ b/agate-ui/src/pages/GroupsPage.vue @@ -0,0 +1,21 @@ + + + diff --git a/agate-ui/src/pages/IndexPage.vue b/agate-ui/src/pages/IndexPage.vue new file mode 100644 index 000000000..170bf91e8 --- /dev/null +++ b/agate-ui/src/pages/IndexPage.vue @@ -0,0 +1,64 @@ + + + diff --git a/agate-ui/src/pages/RealmsPage.vue b/agate-ui/src/pages/RealmsPage.vue new file mode 100644 index 000000000..b3341755c --- /dev/null +++ b/agate-ui/src/pages/RealmsPage.vue @@ -0,0 +1,21 @@ + + + diff --git a/agate-ui/src/pages/SettingsPage.vue b/agate-ui/src/pages/SettingsPage.vue new file mode 100644 index 000000000..de9fe4fdb --- /dev/null +++ b/agate-ui/src/pages/SettingsPage.vue @@ -0,0 +1,21 @@ + + + diff --git a/agate-ui/src/pages/UsersPage.vue b/agate-ui/src/pages/UsersPage.vue new file mode 100644 index 000000000..ffdc64f3d --- /dev/null +++ b/agate-ui/src/pages/UsersPage.vue @@ -0,0 +1,21 @@ + + + diff --git a/agate-ui/src/quasar.d.ts b/agate-ui/src/quasar.d.ts new file mode 100644 index 000000000..5937f7a5d --- /dev/null +++ b/agate-ui/src/quasar.d.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ + +// Forces TS to apply `@quasar/app-vite` augmentations of `quasar` package +// Removing this would break `quasar/wrappers` imports as those typings are declared +// into `@quasar/app-vite` +// As a side effect, since `@quasar/app-vite` reference `quasar` to augment it, +// this declaration also apply `quasar` own +// augmentations (eg. adds `$q` into Vue component context) +/// diff --git a/agate-ui/src/router/index.ts b/agate-ui/src/router/index.ts new file mode 100644 index 000000000..404e98344 --- /dev/null +++ b/agate-ui/src/router/index.ts @@ -0,0 +1,33 @@ +import { route } from 'quasar/wrappers'; +import { createMemoryHistory, createRouter, createWebHashHistory, createWebHistory } from 'vue-router'; + +import routes from './routes'; + +/* + * If not building with SSR mode, you can + * directly export the Router instantiation; + * + * The function below can be async too; either use + * async/await or return a Promise which resolves + * with the Router instance. + */ + +export default route(function (/* { store, ssrContext } */) { + const createHistory = process.env.SERVER + ? createMemoryHistory + : process.env.VUE_ROUTER_MODE === 'history' + ? createWebHistory + : createWebHashHistory; + + const Router = createRouter({ + scrollBehavior: () => ({ left: 0, top: 0 }), + routes, + + // Leave this as is and make changes in quasar.conf.js instead! + // quasar.conf.js -> build -> vueRouterMode + // quasar.conf.js -> build -> publicPath + history: createHistory(process.env.VUE_ROUTER_BASE), + }); + + return Router; +}); diff --git a/agate-ui/src/router/routes.ts b/agate-ui/src/router/routes.ts new file mode 100644 index 000000000..96c2b1d83 --- /dev/null +++ b/agate-ui/src/router/routes.ts @@ -0,0 +1,26 @@ +import { RouteRecordRaw } from 'vue-router'; + +const routes: RouteRecordRaw[] = [ + { path: '/index.html', redirect: '/' }, + { + path: '/', + component: () => import('layouts/MainLayout.vue'), + children: [ + { path: '', component: () => import('pages/IndexPage.vue') }, + { path: 'users', component: () => import('pages/UsersPage.vue') }, + { path: 'groups', component: () => import('pages/GroupsPage.vue') }, + { path: 'applications', component: () => import('pages/ApplicationsPage.vue') }, + { path: 'realms', component: () => import('pages/RealmsPage.vue') }, + { path: 'settings', component: () => import('pages/SettingsPage.vue') }, + ], + }, + + // Always leave this as last one, + // but you can also remove it + { + path: '/:catchAll(.*)*', + component: () => import('pages/ErrorNotFound.vue'), + }, +]; + +export default routes; diff --git a/agate-ui/src/shims-vue.d.ts b/agate-ui/src/shims-vue.d.ts new file mode 100644 index 000000000..4e6894b2c --- /dev/null +++ b/agate-ui/src/shims-vue.d.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ + +/// + +// Mocks all files ending in `.vue` showing them as plain Vue instances +declare module '*.vue' { + import type { DefineComponent } from 'vue'; + const component: DefineComponent<{}, {}, any>; + export default component; +} diff --git a/agate-ui/src/stores/application.ts b/agate-ui/src/stores/application.ts new file mode 100644 index 000000000..554e12c2b --- /dev/null +++ b/agate-ui/src/stores/application.ts @@ -0,0 +1,21 @@ +import { defineStore } from 'pinia'; +import { api } from 'src/boot/api'; +import { ApplicationDto } from 'src/models/Agate'; + +export const useApplicationStore = defineStore('application', () => { + const applications = ref([]); + + async function init() { + return api.get('/applications').then((response) => { + if (response.status === 200) { + applications.value = response.data; + } + return response; + }); + } + + return { + applications, + init, + }; +}); \ No newline at end of file diff --git a/agate-ui/src/stores/auth.ts b/agate-ui/src/stores/auth.ts new file mode 100644 index 000000000..791b2c187 --- /dev/null +++ b/agate-ui/src/stores/auth.ts @@ -0,0 +1,76 @@ +import { defineStore } from 'pinia'; +import { api } from 'src/boot/api'; +import { SessionDto } from 'src/models/Agate'; + +export const useAuthStore = defineStore('auth', () => { + const sid = ref(''); + const version = ref(''); + const session = ref(null); + + const isAdministrator = computed(() => session.value?.role === 'agate-administrator'); + + const isAuthenticated = computed(() => { + return session.value !== null; + }); + + function reset() { + sid.value = ''; + version.value = ''; + session.value = null; + } + + async function signin(username: string, password: string, authMethod: string, token: string) { + const params = new URLSearchParams(); + params.append('username', username); + params.append('password', password); + sid.value = ''; + version.value = ''; + const headers = {}; + if (authMethod && token) { + //headers[authMethod] = token; + } + return api.post('/auth/sessions', params, { headers }).then((response) => { + if (response.status === 201) { + const sessionUrl = response.headers['location']; + sid.value = sessionUrl.split('/').pop(); + version.value = response.headers['x-agate-version']; + } + return response; + }); + } + + async function signout() { + return api.delete('/auth/session/_current').then((response) => { + reset(); + return response; + }); + } + + async function userProfile() { + return api.get('/auth/session/_current').then((response) => { + if (response.status === 200) { + version.value = response.headers['x-agate-version']; + session.value = response.data; + } + return response; + }); + } + + // async function getProviders(): Promise { + // return api.get('/auth/providers').then((response) => { + // return response.data; + // }); + // } + + return { + sid, + version, + session, + isAuthenticated, + isAdministrator, + signin, + signout, + userProfile, + reset, + }; +}); diff --git a/agate-ui/src/stores/group.ts b/agate-ui/src/stores/group.ts new file mode 100644 index 000000000..9d9a35f9a --- /dev/null +++ b/agate-ui/src/stores/group.ts @@ -0,0 +1,21 @@ +import { defineStore } from 'pinia'; +import { api } from 'src/boot/api'; +import { GroupDto } from 'src/models/Agate'; + +export const useGroupStore = defineStore('group', () => { + const groups = ref([]); + + async function init() { + return api.get('/groups').then((response) => { + if (response.status === 200) { + groups.value = response.data; + } + return response; + }); + } + + return { + groups, + init, + }; +}); \ No newline at end of file diff --git a/agate-ui/src/stores/index.ts b/agate-ui/src/stores/index.ts new file mode 100644 index 000000000..a1aa558e8 --- /dev/null +++ b/agate-ui/src/stores/index.ts @@ -0,0 +1,33 @@ +import { store } from 'quasar/wrappers'; +import { createPinia } from 'pinia'; +import { Router } from 'vue-router'; +import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'; + +/* + * When adding new properties to stores, you should also + * extend the `PiniaCustomProperties` interface. + * @see https://pinia.vuejs.org/core-concepts/plugins.html#typing-new-store-properties + */ +declare module 'pinia' { + export interface PiniaCustomProperties { + readonly router: Router; + } +} + +/* + * If not building with SSR mode, you can + * directly export the Store instantiation; + * + * The function below can be async too; either use + * async/await or return a Promise which resolves + * with the Store instance. + */ + +export default store((/* { ssrContext } */) => { + const pinia = createPinia(); + + // You can add Pinia plugins here + pinia.use(piniaPluginPersistedstate); + + return pinia; +}); diff --git a/agate-ui/src/stores/realm.ts b/agate-ui/src/stores/realm.ts new file mode 100644 index 000000000..d20095c81 --- /dev/null +++ b/agate-ui/src/stores/realm.ts @@ -0,0 +1,21 @@ +import { defineStore } from 'pinia'; +import { api } from 'src/boot/api'; +import { RealmConfigDto } from 'src/models/Agate'; + +export const useRealmStore = defineStore('realm', () => { + const realms = ref([]); + + async function init() { + return api.get('/config/realms/summaries').then((response) => { + if (response.status === 200) { + realms.value = response.data; + } + return response; + }); + } + + return { + realms, + init, + }; +}); \ No newline at end of file diff --git a/agate-ui/src/stores/store-flag.d.ts b/agate-ui/src/stores/store-flag.d.ts new file mode 100644 index 000000000..b6ca7c83f --- /dev/null +++ b/agate-ui/src/stores/store-flag.d.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ +// THIS FEATURE-FLAG FILE IS AUTOGENERATED, +// REMOVAL OR CHANGES WILL CAUSE RELATED TYPES TO STOP WORKING +import 'quasar/dist/types/feature-flag'; + +declare module 'quasar/dist/types/feature-flag' { + interface QuasarFeatureFlags { + store: true; + } +} diff --git a/agate-ui/src/stores/system.ts b/agate-ui/src/stores/system.ts new file mode 100644 index 000000000..3e1145c33 --- /dev/null +++ b/agate-ui/src/stores/system.ts @@ -0,0 +1,34 @@ +import { defineStore } from 'pinia'; +import { api } from 'src/boot/api'; +import { PublicConfigurationDto, ConfigurationDto } from 'src/models/Agate'; + +export const useSystemStore = defineStore('system', () => { + const configurationPublic = ref(null); + const configuration = ref(null); + + + async function initPub() { + return api.get('/config/_public').then((response) => { + if (response.status === 200) { + configurationPublic.value = response.data; + } + return response; + }); + } + + async function init() { + return api.get('/config').then((response) => { + if (response.status === 200) { + configuration.value = response.data; + } + return response; + }); + } + + return { + configuration, + configurationPublic, + init, + initPub, + }; +}); \ No newline at end of file diff --git a/agate-ui/src/stores/user.ts b/agate-ui/src/stores/user.ts new file mode 100644 index 000000000..dc96d9f73 --- /dev/null +++ b/agate-ui/src/stores/user.ts @@ -0,0 +1,21 @@ +import { defineStore } from 'pinia'; +import { api } from 'src/boot/api'; +import { UserDto } from 'src/models/Agate'; + +export const useUserStore = defineStore('user', () => { + const users = ref([]); + + async function init() { + return api.get('/users').then((response) => { + if (response.status === 200) { + users.value = response.data; + } + return response; + }); + } + + return { + users, + init, + }; +}); \ No newline at end of file diff --git a/agate-ui/src/utils/attributes.ts b/agate-ui/src/utils/attributes.ts new file mode 100644 index 000000000..3fdf7cf94 --- /dev/null +++ b/agate-ui/src/utils/attributes.ts @@ -0,0 +1,17 @@ +import { AttributeDto } from 'src/models/Magma'; + +export function getLabels(attributes: AttributeDto[] | undefined) { + return attributes ? attributes.filter((a) => a.name === 'label' && a.namespace === undefined) : []; +} + +export function getLabelsString(attributes: AttributeDto[] | undefined) { + const labels = getLabels(attributes); + if (labels.length > 0) { + return labels.map(attr => attr.locale ? `(${attr.locale}) ${attr.value}` : attr.value).join(' | '); + } + return ''; +} + +export function getDescriptions(attributes: AttributeDto[]) { + return attributes ? attributes.filter((a) => a.name === 'description' && a.namespace === undefined) : []; +} diff --git a/agate-ui/src/utils/authz.ts b/agate-ui/src/utils/authz.ts new file mode 100644 index 000000000..ee71dcffe --- /dev/null +++ b/agate-ui/src/utils/authz.ts @@ -0,0 +1,32 @@ +import { AxiosResponse } from 'axios'; + +export class Perms { + methods: string[]; + + constructor(response: AxiosResponse) { + this.methods = + response && response.headers && response.headers.allow + ? response.headers.allow.split(',').map((m: string) => m.trim()) + : []; + } + + canCreate() { + return this.methods.includes('POST'); + } + + canRead() { + return this.methods.includes('GET'); + } + + canUpdate() { + return this.methods.includes('PUT'); + } + + canDelete() { + return this.methods.includes('DELETE'); + } + + none() { + return this.methods.length === 1 && this.methods.includes('OPTIONS'); + } +} diff --git a/agate-ui/src/utils/colors.ts b/agate-ui/src/utils/colors.ts new file mode 100644 index 000000000..6f837a936 --- /dev/null +++ b/agate-ui/src/utils/colors.ts @@ -0,0 +1,68 @@ +import { CommandStateDto_Status } from 'src/models/Commands'; +import { TableStatusDto } from 'src/models/Magma'; +import { ProjectDatasourceStatusDto, AnalysisStatusDto } from 'src/models/Projects'; + +export function projectStatusColor(status: string | ProjectDatasourceStatusDto) { + const statusEnum = typeof status === 'string' ? ProjectDatasourceStatusDto[status] : status; + switch (statusEnum) { + case ProjectDatasourceStatusDto.READY: + return 'positive'; + case ProjectDatasourceStatusDto.ERRORS: + return 'negative'; + case ProjectDatasourceStatusDto.LOADING: + return 'secondary'; + case ProjectDatasourceStatusDto.BUSY: + return 'warning'; + case ProjectDatasourceStatusDto.NONE: + return 'black'; + default: + return 'white'; + } +} + +export function tableStatusColor(status: string | TableStatusDto) { + const statusEnum = typeof status === 'string' ? TableStatusDto[status] : status; + switch (statusEnum) { + case TableStatusDto.READY: + return 'positive'; + case TableStatusDto.ERROR: + return 'negative'; + case TableStatusDto.LOADING: + return 'secondary'; + case TableStatusDto.CLOSED: + return 'black'; + default: + return 'white'; + } +} + +export function commandStatusColor(status: string | CommandStateDto_Status) { + const statusEnum = typeof status === 'string' ? CommandStateDto_Status[status] : status; + switch (statusEnum) { + case CommandStateDto_Status.NOT_STARTED: + return 'black'; + case CommandStateDto_Status.IN_PROGRESS: + return 'primary'; + case CommandStateDto_Status.SUCCEEDED: + return 'positive'; + case CommandStateDto_Status.FAILED: + return 'negative'; + case CommandStateDto_Status.CANCEL_PENDING: + return 'secondary'; + case CommandStateDto_Status.CANCELED: + return 'warning'; + default: + return 'white'; + } +} + +export function analysisColor(status: string | AnalysisStatusDto) { + const statusEnum = typeof status === 'string' ? AnalysisStatusDto[status] : status; + switch (statusEnum) { + case AnalysisStatusDto.PASSED: + return 'positive'; + default: + return 'negative'; + + } +} \ No newline at end of file diff --git a/agate-ui/src/utils/dates.ts b/agate-ui/src/utils/dates.ts new file mode 100644 index 000000000..8e2a7269b --- /dev/null +++ b/agate-ui/src/utils/dates.ts @@ -0,0 +1,64 @@ +import { getCurrentLocale } from 'src/boot/i18n'; +import { parseISO, formatDistanceStrict, formatDuration, millisecondsToHours, millisecondsToMinutes, millisecondsToSeconds } from 'date-fns'; + +import { enUS as en } from 'date-fns/locale/en-US'; +import { fr } from 'date-fns/locale/fr'; + +export function getDate(date: string | number | undefined) { + if (typeof date === 'string') { + return parseISO(date); + } else if (date === undefined || isNaN(date)) { + return null; + } + return new Date(date); +} + +export function getDateLabel(date: string | number | undefined) { + const locale = getCurrentLocale(); + const localeDate = getDate(date); + return localeDate ? localeDate.toLocaleString(locale) : '-'; +} + +export function getDateDistanceLabel(date: string | number | undefined) { + const now = new Date(); + return getDatesDistanceLabel(date, now.getTime()); +} + +export function getDatesDistanceLabel(date1: string | number | undefined, date2: string | number | undefined, addSuffix = true) { + const locale = getCurrentLocale(); + const localeDate1 = getDate(date1); + const localeDate2 = getDate(date2) || new Date(); + return localeDate1 + ? formatDistanceStrict(localeDate1, localeDate2, { + addSuffix, + locale: locale === 'fr' ? fr : en, + }) + : '-'; +} + +export function getMillisLabel(millis: number, compact = true) { + let value = millis; + const hours = millisecondsToHours(value); + value = value - hours * 3600000; + const minutes = millisecondsToMinutes(value); + value = value - minutes * 60000; + const seconds = millisecondsToSeconds(value); + const milliseconds = value - seconds * 1000; + + if (compact) { + const labels = []; + if (hours > 0) labels.push(`${hours} h`); + if (minutes>0) labels.push(`${minutes} min`); + if (seconds>0) labels.push(`${seconds} s`); + if (milliseconds>0) labels.push(`${milliseconds} ms`); + return labels.join(', '); + } + + const locale = getCurrentLocale(); + const label = formatDuration({ + hours, + minutes, + seconds + }, {locale: locale === 'fr' ? fr : en,}); + return `${label}${milliseconds>0 ? ' ' + milliseconds + ' ms' : ''}`; +} \ No newline at end of file diff --git a/agate-ui/src/utils/files.ts b/agate-ui/src/utils/files.ts new file mode 100644 index 000000000..4a989919c --- /dev/null +++ b/agate-ui/src/utils/files.ts @@ -0,0 +1,24 @@ +import { FileDto, FileDto_FileType } from 'src/models/Agate'; + +export function getSizeLabel(size: number | undefined) { + if (size === undefined || isNaN(size)) { + return '-'; + } + if (size < 1024) { + return `${size} B`; + } + if (size < 1024 * 1024) { + return `${(size / 1024).toFixed(2)} KB`; + } + if (size < 1024 * 1024 * 1024) { + return `${(size / 1024 / 1024).toFixed(2)} MB`; + } + return `${(size / 1024 / 1024 / 1024).toFixed(2)} GB`; +} + +export function getIconName(file: FileDto) { + if (file.type === FileDto_FileType.FOLDER) { + return file.readable ? 'folder' : 'folder_off'; + } + return file.readable ? 'description' : 'insert_drive_file'; +} diff --git a/agate-ui/src/utils/identifiers.ts b/agate-ui/src/utils/identifiers.ts new file mode 100644 index 000000000..3e175edaa --- /dev/null +++ b/agate-ui/src/utils/identifiers.ts @@ -0,0 +1,39 @@ +export function generateIdentifier(count: number, allowZeros: boolean, withChecksum: boolean, prefix: string) { + let sample: string = '9'.repeat(count); + + if (allowZeros) { + sample = '0' + '9'.repeat(count - 1); + } else if (withChecksum) { + sample = '' + '9'.repeat(count - 1) + generateLuhnCheckDigit(parseInt(sample)); + } + + if (!!prefix) { + sample = `${prefix}${sample}`; + } + + return sample; +} + +export function generateLuhnCheckDigit(input: number): number { + const str = `${input}`; + const ints = []; + for (let i = 0; i < str.length; i++) { + ints.push(parseInt(str.substring(i, i + 1))); + } + + for (let i = ints.length - 2; i >= 0; i = i - 2) { + let j: number = ints[i]; + j = j * 2; + if (j > 9) { + j = (j % 10) + 1; + } + ints[i] = j; + } + let sum = 0; + for (let i = 0; i < ints.length; i++) { + sum += ints[i]; + } + if (sum % 10 == 0) { + return 0; + } else return 10 - (sum % 10); +} diff --git a/agate-ui/src/utils/magma.ts b/agate-ui/src/utils/magma.ts new file mode 100644 index 000000000..92127572b --- /dev/null +++ b/agate-ui/src/utils/magma.ts @@ -0,0 +1,60 @@ +import { VariableDto } from 'src/models/Magma'; + +export const ValueTypes = [ + 'text', + 'integer', + 'decimal', + 'date', + 'datetime', + 'point', + 'linestring', + 'polygon', + 'binary', + 'boolean', + 'locale', +]; + +export const ValueTypesMap = { + textual: ['text', 'locale'], + numerical: ['integer', 'decimal'], + temporal: ['date', 'datetime'], + geospatial: ['point', 'linestring', 'polygon'], + other: ['binary', 'boolean'], +}; + +export const VariableNatures = { + CATEGORICAL: 'CATEGORICAL', + CONTINUOUS: 'CONTINUOUS', + TEMPORAL: 'TEMPORAL', + GEO: 'GEO', + BINARY: 'BINARY', + UNDETERMINED: 'UNDETERMINED', +}; + +export const getVariableNature = (variable: VariableDto) => { + if (variable.categories && variable.categories.length > 0 && variable.categories.find((c) => !c.isMissing)) { + return VariableNatures.CATEGORICAL; + } + + if (variable.valueType === 'boolean') { + return VariableNatures.CATEGORICAL; + } + + if (variable.valueType === 'integer' || variable.valueType === 'decimal') { + return VariableNatures.CONTINUOUS; + } + + if (variable.valueType === 'date' || variable.valueType === 'datetime') { + return VariableNatures.TEMPORAL; + } + + if (variable.valueType === 'point' || variable.valueType === 'linestring' || variable.valueType === 'polygon') { + return VariableNatures.GEO; + } + + if (variable.valueType === 'binary') { + return VariableNatures.BINARY; + } + + return VariableNatures.UNDETERMINED; +} \ No newline at end of file diff --git a/agate-ui/src/utils/notify.ts b/agate-ui/src/utils/notify.ts new file mode 100644 index 000000000..3c2afa236 --- /dev/null +++ b/agate-ui/src/utils/notify.ts @@ -0,0 +1,40 @@ +import { Notify } from 'quasar'; +import { t } from 'src/boot/i18n'; + +export function notifySuccess(message: string) { + Notify.create({ + type: 'positive', + message: t(message), + }); +} + +export function notifyInfo(message: string) { + Notify.create({ + type: 'info', + message: t(message), + }); +} + +export function notifyWarning(message: string) { + Notify.create({ + type: 'warning', + message: t(message), + }); +} + +export function notifyError(error) { + let message = t('unknown_error'); + if (typeof error === 'string') { + message = t(error); + } else { + console.error(error); + message = error.message; + if (error.response?.data && error.response.data?.status) { + message = t(`error.${error.response?.data.status}`, error.response?.data.arguments); + } + } + Notify.create({ + type: 'negative', + message, + }); +} diff --git a/agate-ui/src/utils/numbers.ts b/agate-ui/src/utils/numbers.ts new file mode 100644 index 000000000..d1d831298 --- /dev/null +++ b/agate-ui/src/utils/numbers.ts @@ -0,0 +1,6 @@ +export function toMaxDecimals(x: number | null, n: number): number | null { + if (x === null) { + return null; + } + return +x.toFixed(n); +} diff --git a/agate-ui/src/utils/plugins.ts b/agate-ui/src/utils/plugins.ts new file mode 100644 index 000000000..4f6df5378 --- /dev/null +++ b/agate-ui/src/utils/plugins.ts @@ -0,0 +1,39 @@ +import { i18n } from 'src/boot/i18n'; +import { PluginPackagesDto, PluginPackageDto } from 'src/models/Plugins'; + +type Translation = { + [key: string]: string; +}; + +type Translations = { + [key: string]: Translation; +}; + +type PluginTranslations = { + plugins: { + [key: string]: Translations; + }; +}; + +export function mergeAnalysesTranslations(packages: PluginPackagesDto) { + if (!!packages) { + const normalizeFn = (plugin: PluginPackageDto, translations: Translations) => { + const normalized: PluginTranslations = { plugins: {} } as PluginTranslations; + normalized.plugins[plugin.name] = translations; + return normalized; + }; + + ((packages || {}).packages || []).forEach((plugin) => { + const pluginTranslations: Translations = {}; + pluginTranslations[plugin.name] = { title: plugin.title, description: plugin.description }; + i18n.global.mergeLocaleMessage('en', { plugins: pluginTranslations }); + + const templates = (plugin['Plugins.AnalysisPluginPackageDto.analysis'] || {}).analysisTemplates || []; + const tplTranslations: Translations = {}; + templates.forEach((template: PluginPackageDto) => { + tplTranslations[template.name] = { title: template.title, description: template.description }; + i18n.global.mergeLocaleMessage('en', normalizeFn(plugin, tplTranslations)); + }); + }); + } +} diff --git a/agate-ui/src/utils/r.ts b/agate-ui/src/utils/r.ts new file mode 100644 index 000000000..6f17cecf7 --- /dev/null +++ b/agate-ui/src/utils/r.ts @@ -0,0 +1,9 @@ +import { RPackageDto } from 'src/models/AgateR'; + +export function getPackageKey(pkg: RPackageDto) { + return `${pkg.name}-${getDescriptionValue(pkg, 'LibPath')}`; +} + +export function getDescriptionValue(pkg: RPackageDto, key: string) { + return pkg.description.find((entry) => entry.key === key)?.value; +} diff --git a/agate-ui/src/utils/strings.ts b/agate-ui/src/utils/strings.ts new file mode 100644 index 000000000..d921e5352 --- /dev/null +++ b/agate-ui/src/utils/strings.ts @@ -0,0 +1,39 @@ +export function generateName(prefix: string, names: string[]): string { + let i = 1; + let name = prefix + '-' + i; + while (names.includes(name)) { + i++; + name = prefix + '-' + i; + } + return name; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function flattenObjectToString(object: any, icase = true): string { + let result = ''; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + function recurse(value: string | any) { + if (Array.isArray(value)) { + value.forEach((item) => recurse(item)); + } else if (value && typeof value === 'object') { + for (const key in value) { + if (value.hasOwnProperty(key)) { + recurse(value[key]); + } + } + } else { + result += ` ${value}`; + } + } + + recurse(object); + + result = result.trim(); + return icase ? result.toLowerCase() : result; +} + +export const includesToken = (source: string, token: string, ignoreCase = true) => { + if (!source || !token) return true + return ignoreCase ? source.toLowerCase().includes(token.toLowerCase()) : source.includes(token); +}; diff --git a/agate-ui/src/utils/taxonomies.ts b/agate-ui/src/utils/taxonomies.ts new file mode 100644 index 000000000..7eff1d096 --- /dev/null +++ b/agate-ui/src/utils/taxonomies.ts @@ -0,0 +1,16 @@ +import { TaxonomyDto } from 'src/models/Agate'; + +export function getCreativeCommonsLicenseUrl() { + return 'http://creativecommons.org/choose/'; +} + +export function getCreativeCommonsLicenseAnchor(taxonomy: TaxonomyDto, locale = 'en') { + const theLicense = taxonomy.license || ''; + const licenseParts = theLicense.split(/\s+/); + if (licenseParts.length === 3) { + return ` + ${theLicense}`; + } else { + return theLicense; + } +} diff --git a/agate-ui/src/utils/tokens.ts b/agate-ui/src/utils/tokens.ts new file mode 100644 index 000000000..03b41b888 --- /dev/null +++ b/agate-ui/src/utils/tokens.ts @@ -0,0 +1,17 @@ +export function generateToken() { + function generate(): string { + const PASSWORD_CHARACTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const PASSWORD_CHARACTERS_LENGTH: number = PASSWORD_CHARACTERS.length; + const PASSWORD_MX_LENGTH = 32; + + let generated = ''; + + for (let i = 0; i < PASSWORD_MX_LENGTH; i++) { + generated += PASSWORD_CHARACTERS.charAt(Math.floor(Math.random() * PASSWORD_CHARACTERS_LENGTH)); + } + + return generated; + } + + return generate(); +} diff --git a/agate-ui/src/utils/validations.ts b/agate-ui/src/utils/validations.ts new file mode 100644 index 000000000..6ddcebdb0 --- /dev/null +++ b/agate-ui/src/utils/validations.ts @@ -0,0 +1,12 @@ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function isEmpty(value: any): boolean { + if (Array.isArray(value)) { + return value.length === 0; + } else if (typeof value === 'object') { + return Object.keys(value).length === 0; + } else if (typeof value === 'string') { + return value === undefined || value === null || value === ''; + } + + return value === undefined || value === null; +} \ No newline at end of file diff --git a/agate-ui/tsconfig.json b/agate-ui/tsconfig.json new file mode 100644 index 000000000..94588a63b --- /dev/null +++ b/agate-ui/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@quasar/app-vite/tsconfig-preset", + "compilerOptions": { + "baseUrl": ".", + "target": "ES2015" + } +} diff --git a/agate-webapp/.bowerrc b/agate-webapp/.bowerrc deleted file mode 100644 index dca141d8f..000000000 --- a/agate-webapp/.bowerrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "directory": "src/main/webapp/bower_components" -} diff --git a/agate-webapp/.jshintrc b/agate-webapp/.jshintrc deleted file mode 100644 index bc64bf506..000000000 --- a/agate-webapp/.jshintrc +++ /dev/null @@ -1,33 +0,0 @@ -{ - "node": true, - "esnext": true, - "bitwise": true, - "camelcase": true, - "curly": true, - "eqeqeq": true, - "immed": true, - "indent": 2, - "latedef": true, - "newcap": true, - "noarg": true, - "quotmark": "single", - "regexp": true, - "undef": true, - "unused": true, - "strict": true, - "trailing": true, - "smarttabs": true, - "white": true, - "globals": { - "ace": true, - "angular": true, - "agate": true, - "jQuery": true, - "$": true, - "axios": true, - "window": true, - "URLSearchParams": true, - "Cookies": true, - "contextPath": true - } -} diff --git a/agate-webapp/.yo-rc.json b/agate-webapp/.yo-rc.json deleted file mode 100644 index ea0c8f203..000000000 --- a/agate-webapp/.yo-rc.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "generator-jhipster": { - "baseName": "agate", - "packageName": "org.obiba.agate", - "packageFolder": "org/obiba/agate", - "hibernateCache": "ehcache", - "clusteredHttpSession": "no", - "websocket": "no", - "devDatabaseType": "mongodb", - "prodDatabaseType": "mongodb", - "useCompass": false, - "databaseType": "nosql", - "frontendBuilder": "grunt", - "javaVersion": "8" - } -} \ No newline at end of file diff --git a/agate-webapp/Gruntfile.js b/agate-webapp/Gruntfile.js index 6b7a97baf..2c857056f 100644 --- a/agate-webapp/Gruntfile.js +++ b/agate-webapp/Gruntfile.js @@ -11,343 +11,17 @@ // Generated on 2014-03-27 using generator-jhipster 0.12.0 'use strict'; -// # Globbing -// for performance reasons we're only matching one level down: -// 'test/spec/{,*/}*.js' -// use this if you want to recursively match all subfolders: -// 'test/spec/**/*.js' - -var proxySnippet = require('grunt-connect-proxy2/lib/utils').proxyRequest; - module.exports = function (grunt) { require('load-grunt-tasks')(grunt); require('time-grunt')(grunt); grunt.initConfig({ - yeoman: { - // configurable paths - app: require('./bower.json').appPath || 'app', - dist: 'src/main/webapp/dist' - }, - less: { - development: { - options: { - compress: true, - yuicompress: true, - optimization: 2, - sourceMap: true - }, - files: { - // target.css file: source.less file - 'src/main/webapp/styles/agate.css': 'src/main/webapp/less/agate.less' - } - } - }, - watch: { - styles: { - files: ['src/main/webapp/less/{,*/}*.less'], - tasks: ['less'], - options: { - nospawn: true - } - }, - livereload: { - options: { - livereload: 35729 - }, - files: [ - 'src/main/webapp/{,*/}*.html', - '.tmp/styles/{,*/}*.css', - '{.tmp/,}src/main/webapp/app/{,*/}*.js', - 'src/main/webapp/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}' - ] - } - }, - autoprefixer: { - dist: { - files: [ - { - expand: true, - cwd: '.tmp/styles/', - src: '{,*/}*.css', - dest: '.tmp/styles/' - } - ] - } - }, - connect: { - proxies: [ - { - context: '/ws', - host: 'localhost', - port: 8081, - https: false, - changeOrigin: false - }, - { - context: '/jvm', - host: 'localhost', - port: 8081, - https: false, - changeOrigin: false - }, - { - context: '/dump', - host: 'localhost', - port: 8081, - https: false, - changeOrigin: false - } - ], - options: { - port: 9001, - // Change this to 'localhost' to deny access to the server from outside. - hostname: '0.0.0.0', - livereload: 35729 - }, - livereload: { - options: { - open: true, - base: [ - '.tmp', - 'src/main/webapp' - ], - middleware: function (connect) { - return [ - proxySnippet, - connect.static(require('path').resolve('src/main/webapp')) - ]; - } - } - }, - test: { - options: { - port: 9001, - base: [ - '.tmp', - 'test', - 'src/main/webapp' - ] - } - }, - dist: { - options: { - base: '<%= yeoman.dist %>' - } - } - }, clean: { - dist: { - files: [ - { - dot: true, - src: [ - '.tmp', - '<%= yeoman.dist %>/*', - '!<%= yeoman.dist %>/.git*' - ] - } - ] - }, assets: ['src/main/webapp/assets/libs/node_modules'], - server: '.tmp' }, - jshint: { - options: { - jshintrc: '.jshintrc' - }, - all: [ - 'Gruntfile.js', - // TODO - //'src/main/webapp/app/**/*.js', - //'src/main/webapp/assets/js/agate.js' - ] - }, - - coffee: { - options: { - sourceMap: true, - sourceRoot: '' - }, - dist: { - files: [ - { - expand: true, - cwd: 'src/main/webapp/app', - src: '{,*/}*.coffee', - dest: '.tmp/scripts', - ext: '.js' - } - ] - }, - test: { - files: [ - { - expand: true, - cwd: 'test/spec', - src: '{,*/}*.coffee', - dest: '.tmp/spec', - ext: '.js' - } - ] - } - }, - // generated dynamically by useminPrepare - //concat: { - // dist: {} - //}, - rev: { - dist: { - files: { - src: [ - '<%= yeoman.dist %>/app/{,*/}*.js', - '<%= yeoman.dist %>/styles/{,*/}*.css', - '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}', - '<%= yeoman.dist %>/fonts/*' - ] - } - } - }, - useminPrepare: { - html: 'src/main/webapp/{,*/}*.html', - options: { - dest: '<%= yeoman.dist %>', - flow: { - html: { - steps: { - css: ['concat', 'cssmin'], - js: ['concat', 'uglifyjs'] - }, - post: {} - } - } - } - }, - usemin: { - html: ['<%= yeoman.dist %>/{,*/}*.html'], - css: ['<%= yeoman.dist %>/styles/{,*/}*.css'], - options: { - dirs: ['<%= yeoman.dist %>'] - } - }, - imagemin: { - dist: { - files: [ - { - expand: true, - cwd: 'src/main/webapp/images', - src: '{,*/}*.{jpg,jpeg}', // we don't optimize PNG files as it doesn't work on Linux. If you are not on Linux, feel free to use '{,*/}*.{png,jpg,jpeg}' - dest: '<%= yeoman.dist %>/images' - } - ] - } - }, - svgmin: { - dist: { - files: [ - { - expand: true, - cwd: 'src/main/webapp/images', - src: '{,*/}*.svg', - dest: '<%= yeoman.dist %>/images' - } - ] - } - }, - // generated dynamically by useminPrepare - //cssmin: { - // // By default, your `admin.html` will take care of - // // minification. This option is pre-configured if you do not wish to use - // // Usemin blocks. - // dist: { - // files: { - // '<%= yeoman.dist %>/styles/main.css': [ - // '.tmp/styles/{,*/}*.css', - // 'styles/{,*/}*.css' - // ] - // } - // } - //}, - htmlmin: { - dist: { - options: { - /*removeCommentsFromCDATA: true, - // https://github.com/yeoman/grunt-usemin/issues/44 - //collapseWhitespace: true, - collapseBooleanAttributes: true, - removeAttributeQuotes: true, - removeRedundantAttributes: true, - useShortDoctype: true, - removeEmptyAttributes: true, - removeOptionalTags: true*/ - }, - files: [ - { - expand: true, - cwd: 'src/main/webapp', - src: ['*.html', 'app/**/*.html'], - dest: '<%= yeoman.dist %>' - } - ] - } - }, // Put files not handled in other tasks here copy: { - dist: { - files: [ - { - expand: true, - dot: true, - cwd: 'src/main/webapp', - dest: '<%= yeoman.dist %>', - src: [ - '*.{ico,png,txt}', - '.htaccess', - 'images/{,*/}*.{png,gif,webp}', - 'fonts/*', - 'styles/*' - ] - }, - { - expand: true, - dot: true, - cwd: 'src/main/webapp/bower_components/font-awesome', - dest: '<%= yeoman.dist %>', - src: [ - 'fonts/fontawesome*' - ] - }, - { - expand: true, - cwd: '.tmp/images', - dest: '<%= yeoman.dist %>/images', - src: [ - 'generated/*' - ] - }, - { - expand: true, - dot: true, - cwd: 'src/main/webapp/bower_components/ace-builds/src-min-noconflict', - dest: '<%= yeoman.dist %>/scripts', - src: [ - 'mode-json.js', - 'worker-json.js', - 'mode-css.js', - 'worker-css.js', - 'theme-monokai.js', - 'ext-searchbox.js' - ] - } - ] - }, - styles: { - expand: true, - cwd: 'src/main/webapp/styles', - dest: '.tmp/styles/', - src: '{,*/}*.css' - }, assets: { files: [ {expand: true, src: ['node_modules/admin-lte/dist/**'], dest: 'src/main/webapp/assets/libs/'}, @@ -359,95 +33,22 @@ module.exports = function (grunt) { {expand: true, src: ['node_modules/admin-lte/plugins/jquery/**'], dest: 'src/main/webapp/assets/libs/'}, {expand: true, src: ['node_modules/admin-lte/plugins/moment/**'], dest: 'src/main/webapp/assets/libs/'}, {expand: true, src: ['node_modules/admin-lte/plugins/toastr/**'], dest: 'src/main/webapp/assets/libs/'}, - {expand: true, src: ['node_modules/simplemde/dist/**'], dest: 'src/main/webapp/assets/libs/'}, - {expand: true, src: ['node_modules/vue/dist/**'], dest: 'src/main/webapp/assets/libs/'}, - {expand: true, src: ['node_modules/rql/dist/**'], dest: 'src/main/webapp/assets/libs/'}, - {expand: true, src: ['node_modules/vue-obiba-search-result/dist/**'], dest: 'src/main/webapp/assets/libs/'}, {expand: true, src: ['node_modules/axios/dist/**'], dest: 'src/main/webapp/assets/libs/'}, - {expand: true, src: ['node_modules/marked/lib/**'], dest: 'src/main/webapp/assets/libs/'}, {expand: true, src: ['node_modules/jquery.redirect/**'], dest: 'src/main/webapp/assets/libs/'}, {expand: true, src: ['node_modules/js-cookie/**'], dest: 'src/main/webapp/assets/libs/'}, {expand: true, src: ['node_modules/bootstrap-datepicker/dist/**'], dest: 'src/main/webapp/assets/libs/'}, ] } }, - concurrent: { - server: [ - 'copy:styles' - ], - test: [ - 'copy:styles' - ], - dist: [ - 'copy:styles', - 'imagemin', - 'svgmin', - 'htmlmin' - ] - }, - karma: { - unit: { - configFile: 'src/test/javascript/karma.conf.js', - singleRun: true - } - }, - cdnify: { - dist: { - html: ['<%= yeoman.dist %>/*.html'] - } - }, - wiredep: { - task: { - src: 'src/main/resources/templates/admin.ftl' - } - } }); - grunt.registerTask('server', function (target) { - if (target === 'dist') { - return grunt.task.run(['build', 'connect:dist:keepalive']); - } - - grunt.task.run([ - 'clean:server', - 'jshint', - 'concurrent:server', - 'autoprefixer', - 'configureProxies', - 'connect:livereload', - 'watch' - ]); - }); - - grunt.registerTask('test', [ -// 'clean:server', -// 'concurrent:test', -// 'autoprefixer', -// 'connect:test', -// 'karma' - ]); - grunt.registerTask('build', [ - 'clean:dist', 'clean:assets', - 'less', - 'jshint', - //'useminPrepare', - 'concurrent:dist', - //'autoprefixer', - //'concat', - 'copy:dist', - //'cssmin', - //'uglify', - //'rev', - //'usemin', 'copy:assets' ]); grunt.registerTask('default', [ - 'test', 'build' ]); - grunt.loadNpmTasks('grunt-wiredep'); }; diff --git a/agate-webapp/bower.json b/agate-webapp/bower.json deleted file mode 100644 index 814d33111..000000000 --- a/agate-webapp/bower.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "agate", - "version": "0.0.1", - "dependencies": { - "angular": "1.6.9", - "angular-animate": "1.6.9", - "angular-bootstrap": "2.5.0", - "angular-chosen-localytics": "1.8.0", - "angular-cookies": "1.6.9", - "angular-dynamic-locale": "0.1.32", - "angular-i18n": "1.6.9", - "angular-loading-bar": "0.9.0", - "angular-resource": "1.6.9", - "angular-route": "1.6.9", - "angular-sanitize": "1.6.9", - "angular-translate": "2.17.0", - "angular-translate-loader-static-files": "2.17.0", - "angular-translate-storage-cookie": "2.17.0", - "angular-ui-select": "0.19.8", - "angular-ui": "0.4.0", - "bootstrap": "3.3.7", - "bootswatch": "3.3.7", - "font-awesome": "4.7.0", - "grunt-contrib-less": "1.3.0", - "jquery": "2.2.4", - "jquery-ui": "1.12.1", - "json3": "3.3.2", - "modernizr": "2.8.3", - "angular-moment": "1.2.0", - "ng-obiba": "https://github.com/obiba/ng-obiba.git#2.0.2", - "angular-utils-pagination": "0.11.1", - "angular-schema-form": "0.8.13", - "angular-schema-form-bootstrap": "https://github.com/obiba/angular-schema-form-bootstrap.git#1.1.4", - "angular-ui-ace": "0.2.3", - "angular-recaptcha": "3.0.3", - "angular-media-queries": "0.6.1", - "obiba-shims": "https://github.com/obiba/obiba-shims.git#1.0.0", - "sf-obiba-ui-select": "https://github.com/obiba/sf-obiba-ui-select.git#1.0.0", - "sf-localized-string": "https://github.com/obiba/sf-localized-string.git#1.3.3" - }, - "devDependencies": { - "angular-mocks": "1.6.9", - "angular-scenario": "1.6.9" - }, - "overrides": { - "angular-ui": { - "main": "./build/angular-ui.min.js" - }, - "bootstrap": { - "main": "./dist/js/bootstrap.min.js" - }, - "ace-builds": { - "main": "./src-noconflict/ace.js" - }, - "chosen": { - "main": "./chosen.jquery.js" - }, - "moment": { - "main": [ - "./moment.js", - "./min/locales.min.js" - ] - } - }, - "resolutions": { - "angular": "1.6.9", - "jquery": "2.2.4", - "angular-bootstrap": "2.5.0" - } -} diff --git a/agate-webapp/pom.xml b/agate-webapp/pom.xml index 663ccf0e7..96fbb1604 100644 --- a/agate-webapp/pom.xml +++ b/agate-webapp/pom.xml @@ -147,9 +147,6 @@ node_modules - - src/main/webapp/bower_components - @@ -171,27 +168,35 @@ - exec-bower-install + exec-grunt generate-sources - bower - - install - + grunt exec + + + + maven-resources-plugin + - exec-grunt - generate-sources - - grunt - + copy ui content + generate-resources - exec + copy-resources + + target/classes/static/admin + true + + + ../agate-ui/dist/spa + + + @@ -202,12 +207,7 @@ - generate-node-bower-modules - - - src/main/webapp/bower_components - - + generate-node-modules @@ -227,19 +227,6 @@ exec - - exec-bower-install - generate-sources - - bower - - install - - - - exec - - exec-grunt generate-resources diff --git a/agate-webapp/src/main/java/org/obiba/agate/config/WebConfiguration.java b/agate-webapp/src/main/java/org/obiba/agate/config/WebConfiguration.java index 6d40e9d63..32855035e 100644 --- a/agate-webapp/src/main/java/org/obiba/agate/config/WebConfiguration.java +++ b/agate-webapp/src/main/java/org/obiba/agate/config/WebConfiguration.java @@ -190,26 +190,6 @@ public FilterRegistrationBean clickjackingHttpHea return bean; } - @Bean - @Profile(Constants.SPRING_PROFILE_PRODUCTION) - public FilterRegistrationBean staticResourcesProductionFilterRegistration() { - log.debug("Registering Static Resources Production Filter"); - FilterRegistrationBean bean = new FilterRegistrationBean<>(); - - bean.setFilter(new StaticResourcesProductionFilter()); - bean.addUrlPatterns("/favicon.ico"); - bean.addUrlPatterns("/robots.txt"); - bean.addUrlPatterns("/index.html"); - bean.addUrlPatterns("/images/*"); - bean.addUrlPatterns("/fonts/*"); - bean.addUrlPatterns("/scripts/*"); - bean.addUrlPatterns("/styles/*"); - bean.addUrlPatterns("/views/*"); - bean.setAsyncSupported(true); - - return bean; - } - @Bean @Profile(Constants.SPRING_PROFILE_PRODUCTION) public FilterRegistrationBean cachingHttpHeadersFilterRegistration() { diff --git a/agate-webapp/src/main/java/org/obiba/agate/web/controller/AdminController.java b/agate-webapp/src/main/java/org/obiba/agate/web/controller/AdminController.java index 3e33ed2d5..933b4f6b5 100644 --- a/agate-webapp/src/main/java/org/obiba/agate/web/controller/AdminController.java +++ b/agate-webapp/src/main/java/org/obiba/agate/web/controller/AdminController.java @@ -3,15 +3,22 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; import org.obiba.agate.service.ConfigurationService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.ModelAndView; import jakarta.inject.Inject; +import java.io.IOException; @Controller public class AdminController { + private static final Logger log = LoggerFactory.getLogger(AdminController.class); + @Inject private ConfigurationService configurationService; @@ -22,10 +29,36 @@ public ModelAndView admin() { if (!subject.isAuthenticated()) return new ModelAndView("redirect:signin?redirect=" + contextPath + "/admin"); - if (subject.hasRole("agate-administrator")) - return new ModelAndView("admin"); - else + if (subject.hasRole("agate-administrator")) { + ModelAndView mv = new ModelAndView("admin"); + try { + includeEntryPoints(mv); + } catch (IOException e) { + log.error("Error while reading SPA entry points", e); + } + return mv; + } else return new ModelAndView("redirect:profile"); } + private void includeEntryPoints(ModelAndView mv) throws IOException { + var resolver = new PathMatchingResourcePatternResolver(); + String folderPath = "classpath:/static/admin/assets/*"; + + // Resolve all resources under the folder + Resource[] resources = resolver.getResources(folderPath); + + for (Resource resource : resources) { + String fileName = resource.getFilename(); + if (fileName != null && fileName.startsWith("index.")) { + log.info("Quasar entrypoint: {}", fileName); + if (fileName.endsWith(".js")) { + mv.getModel().put("entryPointJS", fileName); + } else if (fileName.endsWith(".css")) { + mv.getModel().put("entryPointCSS", fileName); + } + } + } + } + } diff --git a/agate-webapp/src/main/java/org/obiba/agate/web/controller/SignController.java b/agate-webapp/src/main/java/org/obiba/agate/web/controller/SignController.java index 71a9c8ffc..599690845 100644 --- a/agate-webapp/src/main/java/org/obiba/agate/web/controller/SignController.java +++ b/agate-webapp/src/main/java/org/obiba/agate/web/controller/SignController.java @@ -78,7 +78,7 @@ public class SignController { */ @GetMapping("/check") public ModelAndView check(@RequestParam(value = "redirect", required = false) String redirect) { - String verifiedRedirect = verifyRedirect(redirect); + String verifiedRedirect = normalizeRedirect(verifyRedirect(redirect)); return new ModelAndView("redirect:" + (Strings.isNullOrEmpty(verifiedRedirect) ? configurationService.getContextPath() + "/" : verifiedRedirect)); } @@ -88,7 +88,7 @@ public ModelAndView signin(HttpServletRequest request, @RequestParam(value = "language", required = false) String language, @RequestParam(value = "redirect", required = false) String redirect) { Subject subject = SecurityUtils.getSubject(); - String verifiedRedirect = verifyRedirect(redirect); + String verifiedRedirect = normalizeRedirect(verifyRedirect(redirect)); if (subject.isAuthenticated()) return new ModelAndView("redirect:" + (Strings.isNullOrEmpty(verifiedRedirect) ? configurationService.getContextPath() + "/" : verifiedRedirect)); @@ -236,11 +236,20 @@ private Collection getOidcProviders(RealmUsage usage, String local private String ensurePostLogoutRedirectUri(String postLogoutRedirectUri) { if (!Strings.isNullOrEmpty(postLogoutRedirectUri)) { - return verifyRedirect(postLogoutRedirectUri); + return normalizeRedirect(verifyRedirect(postLogoutRedirectUri)); } String url = configurationService.getConfiguration().getPortalUrl(); if (!Strings.isNullOrEmpty(url)) return url; - return configurationService.getConfiguration().hasPublicUrl() ? configurationService.getPublicUrl() : "/"; + + url = configurationService.getConfiguration().hasPublicUrl() ? configurationService.getPublicUrl() : "/"; + String contextPath = configurationService.getContextPath(); + return contextPath.equals("/") ? url : url + contextPath; + } + + private String normalizeRedirect(String redirect) { + if (Strings.isNullOrEmpty(redirect)) return redirect; + String contextPath = configurationService.getContextPath(); + return !redirect.equals("/") && redirect.startsWith(contextPath) ? redirect.replace(contextPath, "") : redirect; } private String verifyRedirect(String redirect) { diff --git a/agate-webapp/src/main/java/org/obiba/agate/web/filter/StaticResourcesProductionFilter.java b/agate-webapp/src/main/java/org/obiba/agate/web/filter/StaticResourcesProductionFilter.java deleted file mode 100644 index 1b2253259..000000000 --- a/agate-webapp/src/main/java/org/obiba/agate/web/filter/StaticResourcesProductionFilter.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.obiba.agate.web.filter; - -import org.apache.commons.lang.StringUtils; - -import jakarta.servlet.*; -import jakarta.servlet.http.HttpServletRequest; -import java.io.IOException; - -/** - * This filter is used in production, to serve static resources generated by "grunt build". - *

- * It is configured to serve resources from the "dist" directory, which is the Grunt - * destination directory. - *

- */ -public class StaticResourcesProductionFilter implements Filter { - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - // Nothing to initialize - } - - @Override - public void destroy() { - // Nothing to destroy - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - HttpServletRequest httpRequest = (HttpServletRequest) request; - String contextPath = httpRequest.getContextPath(); - String requestURI = httpRequest.getRequestURI(); - requestURI = StringUtils.substringAfter(requestURI, contextPath); - if(StringUtils.equals("/", requestURI)) { - requestURI = "/index.html"; - } - String newURI = "/dist" + requestURI; - request.getRequestDispatcher(newURI).forward(request, response); - } - -} diff --git a/agate-webapp/src/main/resources/_templates/admin.ftl b/agate-webapp/src/main/resources/_templates/admin.ftl index 53f100055..10623dc27 100644 --- a/agate-webapp/src/main/resources/_templates/admin.ftl +++ b/agate-webapp/src/main/resources/_templates/admin.ftl @@ -1,265 +1,23 @@ - - - - - - - - - + + - - <#assign contextPath = "${config.contextPath}"/> - - - - - - - - - - - - - - - - - - + + <#assign contextPath = "${config.contextPath}"/> + ${config.name!"Agate"} + + + + + + + + + + + + - - - - - -
- - - - -
- -
- -
- -
- - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
- + \ No newline at end of file diff --git a/agate-webapp/src/main/webapp/app/admin/admin-controller.js b/agate-webapp/src/main/webapp/app/admin/admin-controller.js deleted file mode 100644 index e851e7ea1..000000000 --- a/agate-webapp/src/main/webapp/app/admin/admin-controller.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.admin - - .controller('AdminViewController', [ - '$rootScope', - '$scope', - '$translate', - function () { - }]); diff --git a/agate-webapp/src/main/webapp/app/admin/admin-router.js b/agate-webapp/src/main/webapp/app/admin/admin-router.js deleted file mode 100644 index 8a9b548f0..000000000 --- a/agate-webapp/src/main/webapp/app/admin/admin-router.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.admin - - .config(['$routeProvider', - function ($routeProvider) { - $routeProvider - .when('/admin', { - templateUrl: 'app/admin/views/admin-view.html', - controller: 'AdminViewController', - access: { - authorizedRoles: ['agate-administrator'] - } - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/admin/admin.js b/agate-webapp/src/main/webapp/app/admin/admin.js deleted file mode 100644 index 08203056b..000000000 --- a/agate-webapp/src/main/webapp/app/admin/admin.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.admin = angular.module('agate.admin', [ - 'ui.bootstrap', - 'pascalprecht.translate' -]) -.filter('threadDumpFilterX', function () { - return function (obj) { - console.log(obj); - return true; - }; -}); - - - diff --git a/agate-webapp/src/main/webapp/app/admin/views/admin-view.html b/agate-webapp/src/main/webapp/app/admin/views/admin-view.html deleted file mode 100644 index d49e36089..000000000 --- a/agate-webapp/src/main/webapp/app/admin/views/admin-view.html +++ /dev/null @@ -1,50 +0,0 @@ - - -
- -

- global.menu.admin -

- -
-
- -
-
-
diff --git a/agate-webapp/src/main/webapp/app/app.js b/agate-webapp/src/main/webapp/app/app.js deleted file mode 100644 index d4583613a..000000000 --- a/agate-webapp/src/main/webapp/app/app.js +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -/* App Module */ - -var agate = angular.module('agate', [ - 'obibaShims', - 'angular-loading-bar', - 'http-auth-interceptor', - 'localytics.directives', - 'agate.config', - 'ngObiba', - 'agate.localized', - 'agate.admin', - 'agate.application', - 'agate.realm', - 'agate.ticket', - 'agate.user', - 'agate.group', - 'agate.passwordModal', - 'ngAnimate', - 'ngCookies', - 'ngResource', - 'ngRoute', - 'pascalprecht.translate', - 'tmh.dynamicLocale', - 'ui.bootstrap', - 'angularUtils.directives.dirPagination', - 'schemaForm', - 'sfObibaUiSelect', - 'sfLocalizedString', - 'obiba.utils', - 'vcRecaptcha', - 'matchMedia' -]); - -agate - .config(['$routeProvider', - '$httpProvider', - '$translateProvider', - '$locationProvider', - 'tmhDynamicLocaleProvider', - 'USER_ROLES', - 'paginationTemplateProvider', - 'AlertBuilderProvider', - function ($routeProvider, - $httpProvider, - $translateProvider, - $locationProvider, - tmhDynamicLocaleProvider, - USER_ROLES, - paginationTemplateProvider, - AlertBuilderProvider) { - - $locationProvider.hashPrefix(''); - - AlertBuilderProvider.setMsgKey('global.server-error'); - AlertBuilderProvider.setAlertId('Application'); - AlertBuilderProvider.setGrowlId('MainControllerGrowl'); - AlertBuilderProvider.setModeAlert(); - - $routeProvider - .when('/login', { - templateUrl: 'app/views/login.html', - controller: 'LoginController', - access: { - authorizedRoles: [USER_ROLES.all] - } - }) - .when('/error', { - templateUrl: 'app/views/error.html', - controller: 'ErrorController', - access: { - authorizedRoles: [USER_ROLES.all] - } - }) - .when('/authorize', { - templateUrl: 'app/views/oauth-authorize.html', - controller: 'OAuthController', - access: { - authorizedRoles: [USER_ROLES.all] - } - }) - .when('/profile', { - templateUrl: 'app/views/profile/profile-view.html', - controller: 'ProfileController', - access: { - authorizedRoles: [USER_ROLES.all] - } - }) - .when('/logout', { - templateUrl: 'app/views/main.html', - controller: 'LogoutController', - access: { - authorizedRoles: [USER_ROLES.all] - } - }) - .otherwise({ - templateUrl: 'app/views/main.html', - controller: 'MainController', - access: { - authorizedRoles: [USER_ROLES.all] - } - }); - - // Initialize angular-translate - $translateProvider - .useStaticFilesLoader({ - prefix: contextPath + '/ws/config/i18n/', - suffix: '.json' - }) - .registerAvailableLanguageKeys(['en', 'fr'], { - 'en_*': 'en', - 'fr_*': 'fr', - '*': 'en' - }) - .determinePreferredLanguage() - .fallbackLanguage('en') - .useCookieStorage() - .useSanitizeValueStrategy('escaped'); - - paginationTemplateProvider.setPath('app/views/pagination-template.html'); - tmhDynamicLocaleProvider.localeLocationPattern('bower_components/angular-i18n/angular-locale_{{locale}}.js'); - tmhDynamicLocaleProvider.useCookieStorage('NG_TRANSLATE_LANG_KEY'); - }]) - - .run(['$rootScope', - '$location', - '$http', - '$route', - 'AuthenticationSharedService', - 'Session', - 'USER_ROLES', - 'ServerErrorUtils', - 'amMoment', - '$cookies', - function ($rootScope, - $location, - $http, - $route, - AuthenticationSharedService, - Session, - USER_ROLES, - ServerErrorUtils, - amMoment, - $cookies) { - - var langKey = $cookies.get('NG_TRANSLATE_LANG_KEY'); - amMoment.changeLocale(langKey ? langKey.replace(/"/g, '') : 'en'); - - var isSessionInitialized = false; - - $rootScope.$on('$routeChangeStart', function (event, next) { - if(!isSessionInitialized) { - event.preventDefault(); - AuthenticationSharedService.isSessionInitialized().then(function() { - $route.reload(); - }); - } else { - $rootScope.authenticated = AuthenticationSharedService.isAuthenticated(); - $rootScope.hasRole = AuthenticationSharedService.isAuthorized; - $rootScope.hasProfile = AuthenticationSharedService.hasProfile(); - $rootScope.canChangePassword = AuthenticationSharedService.canChangePassword(); - $rootScope.userRoles = USER_ROLES; - $rootScope.subject = Session; - - if (!$rootScope.authenticated) { - Session.destroy(); - var path = $location.path(); - var invalidRedirectPaths = ['', '/error', '/logout', '/login', '/confirm', '/forgotten', '/join', '/reset_password']; - if (invalidRedirectPaths.indexOf(path) === -1) { - // save path to navigate to after login - var search = $location.search(); - search.redirect = path; - $location.search(search); - } - if (['/confirm', '/forgotten', '/join', '/reset_password', '/error'].indexOf(path) === -1) { - $rootScope.$broadcast('event:auth-loginRequired'); - } - } else if (!AuthenticationSharedService.isAuthorized(next.access ? next.access.authorizedRoles : '*')) { - $rootScope.$broadcast('event:auth-notAuthorized'); - } - } - }); - - // Call when the the client is confirmed - $rootScope.$on('event:auth-loginConfirmed', function () { - if ($location.path() === '/login') { - var path = '/'; - var search = $location.search(); - if (search.hasOwnProperty('redirect')) { - path = search.redirect; - delete search.redirect; - } - $location.path(path).search(search).replace(); - } - }); - - // Call when the 401 response is returned by the server - $rootScope.$on('event:auth-loginRequired', function () { - Session.destroy(); - $window.location.href = '../signin' - }); - - // Call when the 403 response is returned by the server - $rootScope.$on('event:auth-notAuthorized', function () { - if (!$rootScope.authenticated) { - $window.location.href = '../signin' - } else { - $rootScope.errorMessage = 'errors.403'; - $location.path('/error').replace(); - } - }); - - $rootScope.$on('event:unhandled-server-error', function (event, response) { - $rootScope.errorMessage = ServerErrorUtils.buildMessage(response); - $location.path('/error').replace(); - }); - - // Call when the user logs out - $rootScope.$on('event:auth-loginCancelled', function () { - $rootScope.authenticated = undefined; - $window.location.href = '../signin' - }); - - AuthenticationSharedService.initSession().finally(function() { - isSessionInitialized = true; - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/application/application-controller.js b/agate-webapp/src/main/webapp/app/application/application-controller.js deleted file mode 100644 index 24f331be9..000000000 --- a/agate-webapp/src/main/webapp/app/application/application-controller.js +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.application - - .controller('ApplicationListController', - ['$rootScope', - '$scope', - 'ApplicationsResource', - 'ApplicationResource', - 'NOTIFICATION_EVENTS', - 'AlertBuilder', - - function ($rootScope, - $scope, - ApplicationsResource, - ApplicationResource, - NOTIFICATION_EVENTS, - AlertBuilder) { - var onSuccess = function(response) { - $scope.applications = response; - $scope.loading = false; - }; - - var onError = function(response) { - $scope.loading = false; - AlertBuilder.newBuilder().response(response).delay(0).build(); - }; - - $scope.loading = true; - ApplicationsResource.query({}, onSuccess, onError); - - $scope.deleteApplication = function (application) { - $scope.applicationToDelete = application.id; - - $rootScope.$broadcast(NOTIFICATION_EVENTS.showConfirmDialog, - { - titleKey: 'application.delete-dialog.title', - messageKey:'application.delete-dialog.message', - messageArgs: [application.name] - }, application.id - ); - }; - - $scope.$on(NOTIFICATION_EVENTS.confirmDialogAccepted, function (event, id) { - if ($scope.applicationToDelete === id) { - - ApplicationResource.delete({id: id}).$promise - .then(function () { - $scope.loading = true; - ApplicationsResource.query({}, onSuccess, onError); - }) - .catch(onError); - } - }); - - }]) - - .controller('ApplicationViewController', ['$scope', '$location', '$routeParams', 'ApplicationResource', '$uibModal','$log', - - function ($scope, $location, $routeParams, ApplicationResource, $uibModal, $log) { - $scope.application = $routeParams.id ? ApplicationResource.get({id: $routeParams.id}) : {}; - - $scope.editRealmGroup = function (rg) { - $uibModal.open({ - templateUrl: 'app/application/views/application-realm-group-modal-form.html', - controller: 'ApplicationRealmGroupModalController', - resolve: { - 'realmGroup': function () { - return rg ? angular.copy(rg) : {}; - } - } - }).result.then(function (realmGroup) { - var onSuccess = function () { - $scope.status = $scope.statusCodes.SUCCESS; - $location.path('/application' + ($scope.application.id ? '/' + $scope.application.id : '')).replace(); - }; - - var onError = function() { - $log.debug('DEBUG', $scope, $scope.$parent); - $scope.status = $scope.statusCodes.ERROR; - }; - - if(!$scope.application.realmGroups) { - $scope.application.realmGroups = []; - } - - var idx = $scope.application.realmGroups.findIndex((val) => val.realm === realmGroup.realm); - if(idx > -1) { - $scope.application.realmGroups[idx] = realmGroup; - } else { - $scope.application.realmGroups.push(realmGroup); - } - ApplicationResource.update({id: $scope.application.id}, $scope.application, onSuccess, onError); - }); - }; - - $scope.deleteRealmGroup = function(rg) { - var idx = $scope.application.realmGroups.indexOf(rg); - if(idx > -1) { - $scope.application.realmGroups.splice(idx, 1); - ApplicationResource.update({id: $scope.application.id}, $scope.application); - } - }; - - $scope.editScope = function (scp) { - $uibModal.open({ - templateUrl: 'app/application/views/application-scope-modal-form.html', - controller: 'ApplicationScopeModalController', - resolve: { - 'scope': function () { - return angular.copy(scp); - } - } - }).result.then(function (scope) { - var onSuccess = function () { - $scope.status = $scope.statusCodes.SUCCESS; - $location.path('/application' + ($scope.application.id ? '/' + $scope.application.id : '')).replace(); - }; - - var onError = function() { - $log.debug('DEBUG', $scope, $scope.$parent); - $scope.status = $scope.statusCodes.ERROR; - }; - - if(!$scope.application.scopes) { - $scope.application.scopes = []; - } - - var idx = $scope.application.scopes.indexOf(scp); - if(idx > -1) { - $scope.application.scopes[idx] = scope; - } else { - $scope.application.scopes.push(scope); - } - - ApplicationResource.update({id: $scope.application.id}, $scope.application, onSuccess, onError); - }); - }; - - $scope.deleteScope = function(scope) { - var idx = $scope.application.scopes.indexOf(scope); - if(idx > -1) { - $scope.application.scopes.splice(idx, 1); - ApplicationResource.update({id: $scope.application.id}, $scope.application); - } - }; - }]) - - .controller('ApplicationEditController', ['$scope', '$location', '$routeParams', 'ApplicationsResource', 'ApplicationResource', '$log', - - function ($scope, $location, $routeParams, ApplicationsResource, ApplicationResource, $log) { - $scope.statusCodes = { - ERROR: -2, - SUCCESS: 1 - }; - $scope.status = null; - $scope.application = $routeParams.id ? ApplicationResource.get({id: $routeParams.id}) : {}; - - $scope.save = function(form) { - if (!form.$valid) { - $scope.status = $scope.statusCodes.ERROR; - form.saveAttempted = true; - return; - } - - var onSuccess = function () { - $scope.status = $scope.statusCodes.SUCCESS; - $location.path('/applications'); - }; - - var onError = function () { - $log.debug('DEBUG', $scope, $scope.$parent); - $scope.status = $scope.statusCodes.ERROR; - }; - - if ($scope.key) { - $scope.application.key = $scope.key; - } else { - delete $scope.application.key; - } - - if ($scope.application.id) { - ApplicationResource.update({id: $scope.application.id}, $scope.application, onSuccess, onError); - } else { - ApplicationsResource.save($scope.application, onSuccess, onError); - } - }; - - $scope.generateKey = function() { - var text = ''; - var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - - for( var i=0; i < 30; i++ ) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - - $scope.key = text; - }; - - $scope.cancel = function () { - if ($scope.application.id) { - $location.path('/application' + ($scope.application.id ? '/' + $scope.application.id : '')).replace(); - } else { - $location.path('/applications'); - } - }; - }]) - - .controller('ApplicationScopeModalController', ['$scope', '$filter', '$uibModalInstance', 'scope', - function($scope, $filter, $uibModalInstance, scope) { - $scope.editMode = scope && scope.name; - $scope.scope = scope; - - $scope.save = function (form) { - if (!form.$valid) { - form.saveAttempted = true; - return; - } - - $uibModalInstance.close($scope.scope); - }; - - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; - }]) - - .controller('ApplicationRealmGroupModalController', ['$scope', '$filter', '$uibModalInstance', 'GroupsResource', 'realmGroup', - function($scope, $filter, $uibModalInstance, GroupsResource, realmGroup) { - $scope.editMode = realmGroup && realmGroup.realm; - $scope.realmGroup = realmGroup; - if (!$scope.realmGroup.groups) { - $scope.realmGroup.groups = []; - } - - $scope.groupList = []; - GroupsResource.query().$promise.then((groups) => { - $scope.groupList = groups.map((grp) => grp.name); - }); - - $scope.save = function (form) { - if (!form.$valid) { - form.saveAttempted = true; - return; - } - - $uibModalInstance.close($scope.realmGroup); - }; - - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; - }]); diff --git a/agate-webapp/src/main/webapp/app/application/application-router.js b/agate-webapp/src/main/webapp/app/application/application-router.js deleted file mode 100644 index c353955f7..000000000 --- a/agate-webapp/src/main/webapp/app/application/application-router.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.application - - .config(['$routeProvider', - function ($routeProvider) { - $routeProvider - .when('/applications', { - templateUrl: 'app/application/views/application-list.html', - controller: 'ApplicationListController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/application/new', { - templateUrl: 'app/application/views/application-form.html', - controller: 'ApplicationEditController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/application/:id', { - templateUrl: 'app/application/views/application-view.html', - controller: 'ApplicationViewController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/application/:id/edit', { - templateUrl: 'app/application/views/application-form.html', - controller: 'ApplicationEditController', - access: { - authorizedRoles: ['agate-administrator'] - } - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/application/application-service.js b/agate-webapp/src/main/webapp/app/application/application-service.js deleted file mode 100644 index 1c9ac89ce..000000000 --- a/agate-webapp/src/main/webapp/app/application/application-service.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.application - - .factory('ApplicationsResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/applications', {}, { - 'get': {method: 'GET', errorHandler: true} - }); - }]) - - .factory('ApplicationResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/application/:id', {}, { - 'get': {method: 'GET', params: {id: '@id'}, errorHandler: true}, - 'update': { method:'PUT', params: {id: '@id'}, errorHandler: true}, - 'delete': {method: 'DELETE', errorHandler: true} - }); - }]) - .factory('ApplicationSummaryResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/application/:id/summary', {}, { - 'get': {method: 'GET', params: {id: '@id'}, errorHandler: true} - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/application/application.js b/agate-webapp/src/main/webapp/app/application/application.js deleted file mode 100644 index 6713efcc7..000000000 --- a/agate-webapp/src/main/webapp/app/application/application.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.application = angular.module('agate.application', [ - 'agate.config', - 'obiba.form', - 'obiba.notification', - 'ngResource', - 'ngRoute', - 'ui.bootstrap', - 'ui', - 'pascalprecht.translate' -]); diff --git a/agate-webapp/src/main/webapp/app/application/views/application-form.html b/agate-webapp/src/main/webapp/app/application/views/application-form.html deleted file mode 100644 index b34ad078a..000000000 --- a/agate-webapp/src/main/webapp/app/application/views/application-form.html +++ /dev/null @@ -1,58 +0,0 @@ - - -
-

-
    -
  1. applications
  2. -
  3. {{application.name}}application.new
  4. -
-

-
-
-

properties

- -
-

fix-error

-
- The key and its confirmation do not match! -
- -
- -
- - application.key-generate -
- -
- -
- - - - -
-
-
-
- - diff --git a/agate-webapp/src/main/webapp/app/application/views/application-list.html b/agate-webapp/src/main/webapp/app/application/views/application-list.html deleted file mode 100644 index 1c65efdb6..000000000 --- a/agate-webapp/src/main/webapp/app/application/views/application-list.html +++ /dev/null @@ -1,79 +0,0 @@ - - -
- -

applications

- -

applications-description

- - - application.add - - -

- application.none -

- -

-

- -
-
-
- - - - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - -
application.nameIDapplication.descriptionapplication.actions
- {{application.name}} - - {{application.id}} - - {{application.description}} - -
    -
  • - -
  • -
  • - -
  • -
-
-
-
-
diff --git a/agate-webapp/src/main/webapp/app/application/views/application-realm-group-modal-form.html b/agate-webapp/src/main/webapp/app/application/views/application-realm-group-modal-form.html deleted file mode 100644 index ecd5cf9b5..000000000 --- a/agate-webapp/src/main/webapp/app/application/views/application-realm-group-modal-form.html +++ /dev/null @@ -1,57 +0,0 @@ - - - diff --git a/agate-webapp/src/main/webapp/app/application/views/application-scope-modal-form.html b/agate-webapp/src/main/webapp/app/application/views/application-scope-modal-form.html deleted file mode 100644 index 81e7aa1e3..000000000 --- a/agate-webapp/src/main/webapp/app/application/views/application-scope-modal-form.html +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/agate-webapp/src/main/webapp/app/application/views/application-view.html b/agate-webapp/src/main/webapp/app/application/views/application-view.html deleted file mode 100644 index afdcb82c1..000000000 --- a/agate-webapp/src/main/webapp/app/application/views/application-view.html +++ /dev/null @@ -1,165 +0,0 @@ - - -
-

-
    -
  1. applications
  2. -
  3. {{application.name}}
  4. -
-

- -
-
-

properties

- - - - - - - - - - - - - - - - - - - - - - - -
application.name{{application.name}}
ID - {{application.id}} -
application.description{{application.description}}
application.redirectURI{{application.redirectURI}}
- application.autoApproval - - - -
- - -
- -
-

application.scope-permissions

-

- application.scope-permission.help -

- - application.scope-permission.add - -

- application.scope-permission.none -

-
-
-
- - - - -
-
- -
-
- -
- - - - - - - - - - - - - - - -
application.nameapplication.descriptionapplication.actions
- {{scope.name}} - - {{scope.description}} - -
    -
  • - -
  • -
  • - -
  • -
-
-
-
- -

application.realmGroups

-

- application.realmGroups-help -

- - application.realm-group.add - - -
- - - - - - - - - - - - - - - -
application.realm-group.realmapplication.realm-group.groupapplication.actions
- {{realmGroup.realm}} - - {{realmGroup.groups.join(', ')}} - -
    -
  • - -
  • -
  • - -
  • -
-
-
-
-
-
diff --git a/agate-webapp/src/main/webapp/app/commons/localized/localized-directives.js b/agate-webapp/src/main/webapp/app/commons/localized/localized-directives.js deleted file mode 100644 index ce17b1a98..000000000 --- a/agate-webapp/src/main/webapp/app/commons/localized/localized-directives.js +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.localized - - .directive('localized', ['LocalizedValues', function (LocalizedValues) { - return { - restrict: 'AE', - scope: { - value: '=', - lang: '=', - ellipsisSize: '=', - markdownIt: '=', - keyLang: '@', - keyValue: '@' - }, - templateUrl: 'app/commons/localized/localized-template.html', - link: function(scope) { - scope.keyLang = scope.keyLang || 'lang'; - scope.keyValue = scope.keyValue || 'value'; - scope.LocalizedValues = LocalizedValues; - } - }; - }]) - - .directive('localizedInput', [function () { - return { - restrict: 'AE', - require: '^form', - scope: { - name: '@', - model: '=', - label: '@', - required: '@', - lang: '=', - help: '@' - }, - templateUrl: 'app/commons/localized/localized-input-template.html', - link: function ($scope, elem, attr, ctrl) { - if (angular.isUndefined($scope.model) || $scope.model === null) { - $scope.model = [ - {lang: $scope.lang, value: ''} - ]; - } - $scope.fieldName = $scope.name + '-' + $scope.lang; - $scope.form = ctrl; -// console.log('localizedInput', $scope); - } - }; - }]) - - .directive('localizedTextarea', [function () { - return { - restrict: 'AE', - require: '^form', - scope: { - name: '@', - model: '=', - label: '@', - required: '@', - disabled: '=', - lang: '=', - help: '@', - rows: '@', - customValidator: '=' - }, - templateUrl: 'app/commons/localized/localized-textarea-template.html', - link: function ($scope, elem, attr, ctrl) { - if (angular.isUndefined($scope.model) || $scope.model === null) { - $scope.model = [ - {lang: $scope.lang, value: ''} - ]; - } - - $scope.$watch('model', function(newModel) { - if (angular.isUndefined(newModel) || newModel === null) { - $scope.model = [{lang: $scope.lang, value: ''}]; - } - - var currentLang = $scope.model.filter(function(e) { - if (e.lang === $scope.lang) { - return e; - } - }); - - if (currentLang.length === 0) { - $scope.model.push({lang:$scope.lang, value: ''}); - } - }, true); - - $scope.fieldName = $scope.name + '-' + $scope.lang; - $scope.form = ctrl; - } - }; - }]); diff --git a/agate-webapp/src/main/webapp/app/commons/localized/localized-input-template.html b/agate-webapp/src/main/webapp/app/commons/localized/localized-input-template.html deleted file mode 100644 index 996011bd7..000000000 --- a/agate-webapp/src/main/webapp/app/commons/localized/localized-input-template.html +++ /dev/null @@ -1,22 +0,0 @@ -
- - - - - -
    -
  • required
  • -
  • {{error}}
  • -
diff --git a/agate-webapp/src/main/webapp/app/commons/localized/localized-service.js b/agate-webapp/src/main/webapp/app/commons/localized/localized-service.js deleted file mode 100644 index a0de474b0..000000000 --- a/agate-webapp/src/main/webapp/app/commons/localized/localized-service.js +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.localized - - .service('LocalizedValues',['$translate' ,function ($translate) { - var self = this; - this.for = function (values, lang, keyLang, keyValue) { - if (angular.isArray(values)) { - var result = values.filter(function (item) { - return item[keyLang] === lang; - }); - - if (result && result.length > 0) { - return result[0][keyValue]; - } else { - - var langs = values.map(function(value) { - return value[keyLang]; - }); - - if (langs.length > 0) { - return self.for(values, langs.length === 1 ? langs[0] : 'en', keyLang, keyValue); - } - } - - } else if (angular.isObject(values)) { - return self.for(Object.keys(values).map(function(k) { - return {lang: k, value: values[k]}; - }), lang, keyLang, keyValue); - } - - return values && values.length > 0 ? values : ''; - }; - - this.forLocale = function (values, lang) { - var rval = this.for(values, lang, 'locale', 'text'); - if (!rval || rval === '') { - rval = this.for(values, 'und', 'locale', 'text'); - } - if (!rval || rval === '') { - rval = this.for(values, 'en', 'locale', 'text'); - } - return rval; - }; - - this.forLang = function (values, lang) { - var rval = this.for(values, lang, 'lang', 'value'); - if (!rval || rval === '') { - rval = this.for(values, 'und', 'lang', 'value'); - } - if (!rval || rval === '') { - rval = this.for(values, 'en', 'lang', 'value'); - } - return rval; - }; - - this.formatNumber = function (val) { - return (typeof val === 'undefined' || val === null || typeof val !== 'number') ? val : val.toLocaleString($translate.use()); - }; - - this.arrayToObject = function (values) { - var rval = {}; - if (values) { - values.forEach(function(entry) { - rval[entry.lang] = entry.value; - }); - } - return rval; - }; - - this.objectToArray = function (values, languages) { - var rval = []; - if (values) { - var locales = languages ? languages : Object.keys(values); - if (locales) { - locales.forEach(function (lang) { - rval.push({ - lang: lang, - value: values[lang] - }); - }); - } - } - return rval.length === 0 ? undefined : rval; - }; - }] - ) - - .service('LocalizedSchemaFormService', ['$filter', function ($filter) { - - this.translate = function(value) { - if (!value) { - return value; - } - if (typeof value === 'string') { - return this.translateString(value); - } else if (typeof value === 'object') { - if (Array.isArray(value)) { - return this.translateArray(value); - } else { - return this.translateObject(value); - } - } - return value; - }; - - this.translateObject = function(object) { - if (!object) { - return object; - } - for (var prop in object) { - if (object.hasOwnProperty(prop)) { - if (typeof object[prop] === 'string') { - object[prop] = this.translateString(object[prop]); - } else if (typeof object[prop] === 'object') { - if (Array.isArray(object[prop])) { - object[prop] = this.translateArray(object[prop]); - } else { - object[prop] = this.translateObject(object[prop]); - } - } // else ignore - } - } - return object; - }; - - this.translateArray = function(array) { - if (!array) { - return array; - } - var that = this; - array.map(function (item) { - return that.translate(item); - }); - return array; - }; - - this.translateString = function(string) { - if (!string) { - return string; - } - return string.replace(/t\(([^\)]+)\)/g, function (match, p1) { - return $filter('translate')(p1); - }); - }; - - }]); diff --git a/agate-webapp/src/main/webapp/app/commons/localized/localized-template.html b/agate-webapp/src/main/webapp/app/commons/localized/localized-template.html deleted file mode 100644 index 449f3c2e8..000000000 --- a/agate-webapp/src/main/webapp/app/commons/localized/localized-template.html +++ /dev/null @@ -1,10 +0,0 @@ - - diff --git a/agate-webapp/src/main/webapp/app/commons/localized/localized-textarea-template.html b/agate-webapp/src/main/webapp/app/commons/localized/localized-textarea-template.html deleted file mode 100644 index e53e7edf7..000000000 --- a/agate-webapp/src/main/webapp/app/commons/localized/localized-textarea-template.html +++ /dev/null @@ -1,27 +0,0 @@ - - -
- - - - - -
    -
  • required
  • -
  • {{error}}
  • -
- -

{{help | translate}}

- -
diff --git a/agate-webapp/src/main/webapp/app/commons/localized/localized.js b/agate-webapp/src/main/webapp/app/commons/localized/localized.js deleted file mode 100644 index 3a34df8d2..000000000 --- a/agate-webapp/src/main/webapp/app/commons/localized/localized.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.localized = angular.module('agate.localized', [ - 'agate.config', - 'obiba.notification', - 'pascalprecht.translate' -]); diff --git a/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-controller.js b/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-controller.js deleted file mode 100644 index 646402140..000000000 --- a/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-controller.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.passwordModal - - .controller('PasswordModalController', ['$scope', '$uibModalInstance', '$uibModal', 'Password', 'FormServerValidation', 'userId', 'AlertService', - function ($scope, $uibModalInstance, $uibModal, Password, FormServerValidation, userId, AlertService) { - $scope.userId = userId; - $scope.profile = { - password: null, - confirmPassword: null - }; - - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; - - $scope.save = function () { - if ($scope.profile.password !== $scope.profile.confirmPassword) { - AlertService.alert({ id: 'PasswordModalController', type: 'danger', msgKey: 'password.error.dontmatch' }); - } else { - Password.put($scope.userId, { password: $scope.profile.password }) - .then(function () { - $uibModalInstance.close(); - }, function (response) { - AlertService.alert({ id: 'PasswordModalController', type: 'danger', msgKey: 'password.error.global' }); - FormServerValidation.error(response, $scope.form); - }); - } - }; - - }]) - - .controller('UpdatePasswordButtonController', ['$scope', '$uibModal', - function ($scope, $uibModal) { - $scope.updatePassword = function () { - $uibModal - .open({ - templateUrl: 'app/commons/password-modal/password-modal-template.html', - controller: 'PasswordModalController', - resolve: { - userId: function () { - return $scope.userId; - } - } - }) - .result.then(function () { - if ($scope.updated) {$scope.updated();} - }, function () { - if ($scope.closed) {$scope.closed();} - }); - }; - - - }]); diff --git a/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-directive.js b/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-directive.js deleted file mode 100644 index 62755bada..000000000 --- a/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-directive.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -'use strict'; - -agate.passwordModal - - .directive('updatePasswordButton', [function() { - return { - restrict: 'E', - replace: true, - controller: 'UpdatePasswordButtonController', - scope: { - profile: '=', - userId: '@', - updated: '&', - closed: '&' - }, - templateUrl: 'app/commons/password-modal/update-password-button-template.html' - }; - }]); diff --git a/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-template.html b/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-template.html deleted file mode 100644 index 281afd03c..000000000 --- a/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal-template.html +++ /dev/null @@ -1,43 +0,0 @@ - - - diff --git a/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal.js b/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal.js deleted file mode 100644 index 2eb062473..000000000 --- a/agate-webapp/src/main/webapp/app/commons/password-modal/password-modal.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.passwordModal = angular.module('agate.passwordModal', [ - 'agate.config', - 'obiba.notification', - 'pascalprecht.translate' -]); diff --git a/agate-webapp/src/main/webapp/app/commons/password-modal/update-password-button-template.html b/agate-webapp/src/main/webapp/app/commons/password-modal/update-password-button-template.html deleted file mode 100644 index 5624579f2..000000000 --- a/agate-webapp/src/main/webapp/app/commons/password-modal/update-password-button-template.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/agate-webapp/src/main/webapp/app/commons/users-summaries/component.html b/agate-webapp/src/main/webapp/app/commons/users-summaries/component.html deleted file mode 100644 index 060bc1d71..000000000 --- a/agate-webapp/src/main/webapp/app/commons/users-summaries/component.html +++ /dev/null @@ -1,37 +0,0 @@ -

global.users

-

user.none

-
-
-
- - - - -
-
- -
-
- -
- - - - - - - - - - - - - - -
global.nameuser.email
- {{user.fullName}} - - {{user.email}} -
-
-
diff --git a/agate-webapp/src/main/webapp/app/commons/users-summaries/component.js b/agate-webapp/src/main/webapp/app/commons/users-summaries/component.js deleted file mode 100644 index ccefa56f3..000000000 --- a/agate-webapp/src/main/webapp/app/commons/users-summaries/component.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function () { - - function Controller() { - var ctrl = this; - - function onChanges(changes) { - if (changes.users) { - (ctrl.users || []).forEach(function(user) { - user.fullName = user.firstName && user.lastName ? user.firstName + ' ' + user.lastName : user.name; - }); - } - } - - ctrl.$onChanges = onChanges.bind(this); - } - - angular.module('agate') - .component('usersSummaries', { - transclude: true, - bindings: { - users: '<' - }, - templateUrl: 'app/commons/users-summaries/component.html', - controller: Controller - }); -})(); diff --git a/agate-webapp/src/main/webapp/app/config/config-controller.js b/agate-webapp/src/main/webapp/app/config/config-controller.js deleted file mode 100644 index 8b8267a0b..000000000 --- a/agate-webapp/src/main/webapp/app/config/config-controller.js +++ /dev/null @@ -1,451 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.config - .controller('ConfigurationController', ['$rootScope', '$scope', '$resource', '$route', '$log', '$window', 'ConfigurationResource', - 'NOTIFICATION_EVENTS', '$uibModal', 'KeyStoreResource', - - function ($rootScope, $scope, $resource, $route, $log, $window, ConfigurationResource, NOTIFICATION_EVENTS, $uibModal, KeyStoreResource) { - $scope.agateConfig = {userAttributes: []}; - $scope.availableLanguages = $resource(contextPath + '/ws/config/languages').get(); - - ConfigurationResource.get(function(config) { - $scope.agateConfig = config; - $scope.agateConfig.userAttributes = $scope.agateConfig.userAttributes || []; - }); - - $scope.createKeyPair = function () { - $uibModal.open({ - templateUrl: 'app/config/views/config-modal-create-keypair.html', - controller: 'CreateKeyPairModalController' - }).result.then(function (data) { - KeyStoreResource.save(data, function () { - $route.reload(); - }); - }); - }; - - $scope.importKeyPair = function () { - $uibModal.open({ - templateUrl: 'app/config/views/config-modal-import-keypair.html', - controller: 'ImportKeyPairModalController' - }).result.then(function(data) { - KeyStoreResource.save(data, function () { - $route.reload(); - }); - }); - }; - - $scope.downloadCertificate = function () { - $window.open(contextPath + '/ws/config/keystore/system/https', '_blank', ''); - }; - - $scope.editAttribute = function (att) { - $uibModal.open({ - templateUrl: 'app/config/views/attribute-modal-form.html', - controller: 'AttributeModalController', - resolve: { - 'attribute': function () { - return angular.copy(att); - } - } - }).result.then(function (attribute) { - var idx = $scope.agateConfig.userAttributes.indexOf(att); - var newConfig = angular.copy($scope.agateConfig); - - if (idx > -1) { - newConfig.userAttributes.splice(idx, 1); - newConfig.userAttributes.splice(idx, 0, attribute); - } else { - newConfig.userAttributes.push(attribute); - } - - ConfigurationResource.save(newConfig, function () { - $route.reload(); - }); - }); - }; - - $scope.deleteAttribute = function(attribute) { - $scope.attributeToDelete = $scope.agateConfig.userAttributes.indexOf(attribute); - - $rootScope.$broadcast(NOTIFICATION_EVENTS.showConfirmDialog, - { - titleKey: 'attribute.delete-dialog.title', - messageKey:'attribute.delete-dialog.message', - messageArgs: [attribute.name] - }, $scope.attributeToDelete - ); - - $scope.$on(NOTIFICATION_EVENTS.confirmDialogAccepted, function (event, id) { - if ($scope.attributeToDelete === id) { - $scope.agateConfig.userAttributes.splice(id, 1); - ConfigurationResource.save($scope.agateConfig, function () { - $route.reload(); - }); - } - }); - }; - }]) - - .controller('AttributeModalController', ['$scope', '$filter', '$uibModalInstance', 'attribute', - function($scope, $filter, $uibModalInstance, attribute) { - $scope.TYPES = [ - {name: 'STRING', label: $filter('translate')('config.attributes.types.STRING')}, - {name: 'INTEGER', label: $filter('translate')('config.attributes.types.INTEGER')}, - {name: 'NUMBER', label: $filter('translate')('config.attributes.types.NUMBER')}, - {name: 'BOOLEAN', label: $filter('translate')('config.attributes.types.BOOLEAN')} - ]; - - var index = -1; - if (attribute) { - index = $scope.TYPES.findIndex(function(type){ - return type.name === attribute.type; - }); - } - - $scope.selectedType = index === -1 ? $scope.TYPES[0] : $scope.TYPES[index]; - $scope.editMode = attribute && attribute.name; - $scope.attribute = attribute || {type: 'STRING'}; - $scope.attribute.values = attribute && attribute.values ? attribute.values.join(', ') : ''; - $scope.attribute.required = attribute && attribute.required === true ? attribute.required : false; - - $scope.save = function (form) { - if (!form.$valid) { - form.saveAttempted = true; - return; - } - $scope.attribute.type = $scope.selectedType.name; - $scope.attribute.values = $scope.attribute.type !== 'BOOLEAN' && $scope.attribute.values.length > 0 ? $scope.attribute.values.split(',').map(function(s) { - return s.trim(); - }) : null; - - $uibModalInstance.close($scope.attribute); - }; - - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; - }]) - - .controller('ImportKeyPairModalController', ['$scope', '$location', '$uibModalInstance', - function($scope, $location, $uibModalInstance) { - $scope.keyForm = { - privateImport: '', - publicImport: '', - keyType: 0 - }; - - $scope.save = function () { - $uibModalInstance.close($scope.keyForm); - }; - - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; - }]) - - .controller('CreateKeyPairModalController', ['$scope', '$location', '$uibModalInstance', - function($scope, $location, $uibModalInstance) { - $scope.showAdvanced = false; - - $scope.keyForm = { - privateForm: { - algo: 'RSA', - size: 2048 - }, - publicForm: {}, - keyType: 0 - }; - - $scope.save = function () { - $uibModalInstance.close($scope.keyForm); - }; - - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; - }]) - - .controller('ConfigurationEditController', ['$scope', '$resource', '$window', '$location', '$log', '$filter', 'ConfigurationResource', 'FormServerValidation', - - function ($scope, $resource, $window, $location, $log, $filter, ConfigurationResource, FormServerValidation) { - $scope.agateConfig = ConfigurationResource.get(function() { - $scope.inactiveTimeoutDays = $scope.agateConfig.inactiveTimeout / 24; - }); - - var reload = false; - $scope.agateConfig.$promise.then(function() { - $scope.$watchGroup(['agateConfig.name', 'agateConfig.languages'], function(value, oldValue) { - if(!angular.equals(value,oldValue)) { - reload = true; - } - }); - }); - - $scope.availableLanguages = $resource(contextPath + '/ws/config/languages').get(); - $scope.enforced2FAStrategies = [ - { - label: $filter('translate')('config.enforced2FA-strategies.NONE'), - value: 'NONE' - }, - { - label: $filter('translate')('config.enforced2FA-strategies.APP'), - value: 'APP' - }, - { - label: $filter('translate')('config.enforced2FA-strategies.ANY'), - value: 'ANY' - } - ]; - - $scope.save = function () { - - if (!$scope.form.$valid) { - $scope.form.saveAttempted = true; - return; - } - - $scope.agateConfig.inactiveTimeout = $scope.inactiveTimeoutDays * 24; - $scope.agateConfig.$save( - function () { - $location.path('/admin/general'); - if(reload) { - $window.location.reload(); - } - }, - function (response) { - FormServerValidation.error(response, $scope.form); - }); - }; - - }]) - - .controller('ConfigurationStyleEditController', ['$scope', '$resource', '$window', '$location', '$log', 'ConfigurationResource', - 'FormServerValidation', 'StyleEditorService', - function ($scope, $resource, $window, $location, $log, ConfigurationResource, FormServerValidation, StyleEditorService) { - var reload = false; - $scope.agateConfig = ConfigurationResource.get(); - - $scope.agateConfig.$promise.then(function() { - $scope.$watch('agateConfig.style', function(value, oldValue) { - if(!angular.equals(value,oldValue)) { - reload = true; - } - }); - }); - - StyleEditorService.configureAcePaths(); - $scope.ace = StyleEditorService.getEditorOptions(); - - $scope.save = function () { - $scope.agateConfig.$save( - function () { - $location.path('/admin'); - if(reload) { - $window.location.reload(); - } - }, - function (response) { - FormServerValidation.error(response, $scope.form); - }); - }; - - }]) - - .controller('ConfigurationTranslationsEditController', ['$scope', '$q', '$resource', '$window', '$location', '$log', '$uibModal', - 'ConfigurationResource', 'FormServerValidation', 'TranslationsResource', - function ($scope, $q, $resource, $window, $location, $log, $uibModal, ConfigurationResource, FormServerValidation, TranslationsResource) { - var updates = {}, oldTranslations = {}; - $scope.agateConfig = ConfigurationResource.get(); - $scope.agateConfig.$promise.then(function() { - var defaults = {}; - $scope.translations = {}; - $scope.tabs = $scope.agateConfig.languages.map(function (lang) { - updates[lang] = jsonToPaths( - JSON.parse((($scope.agateConfig.translations || []).filter(function(t) { return t.lang === lang; })[0] || {value: '{}'}).value) - ); - defaults[lang] = TranslationsResource.get({id: lang, default: true}).$promise; - return {lang: lang}; - }); - - $q.all(defaults).then(function(res) { - Object.keys(res).forEach(function(lang) { - var defaultPaths = jsonToPaths(extractObjFromResouce(res[lang])); - oldTranslations[lang] = angular.copy(defaultPaths); - var newPaths = updates[lang].map(function(e) { - if(!defaultPaths.some(function(u) { - return e.path === u.path ? (u.value = e.value , u.overwritten = true) : false; - })) { - e.overwritten = true; - return e; - } - - return null; - }).filter(notNull); - $scope.translations[lang] = defaultPaths.concat(newPaths); - }); - }); - }); - - function notNull (x) { - return x; - } - - function jsonToPaths (obj) { - function inner(o, name, acc) { - for(var k in o) { - var tmp = [name, k].filter(function(x) {return x;}).join('.'); - if (angular.isObject(o[k])) { - inner(o[k], tmp, acc); - } else { - acc.push({path: tmp, value: o[k]}); - } - } - - return acc; - } - - return inner(obj, null, []); - } - - function pathsToJson(paths) { - function inner(target, path, value) { - if(path.length === 1) { - target[path[0]] = value; - return; - } - - if(!target[path[0]]) { target[path[0]] = {}; } - - inner(target[path[0]], path.splice(1), value); - } - - return paths.reduce(function(res, e) { - inner(res, e.path.split('.'), e.value); - return res; - }, {}); - } - - function extractObjFromResouce(res) { - return angular.fromJson(angular.toJson(res)); - } - - $scope.checkPresence = function (entry) { - if (!isInDefault(entry)) { - entry.isCustom = true; - } - }; - - function isInDefault(entry) { - var presence = []; - $scope.agateConfig.languages.forEach(function (lang) { - var found = oldTranslations[lang].filter(function (translation) { - return translation.path === entry.path; - }).pop(); - presence.push(found); - }); - return presence.reduce(function (prev, curr) { - return prev && curr; - }); - } - - $scope.trash = function (entry) { - var indices = []; - $scope.agateConfig.languages.forEach(function (lang) { - $scope.translations[lang].filter(function (translation, index) { - var found = translation.path === entry.path; - if (found) { - indices.push({lang: lang, index: index}); - } - return found; - }); - }); - - indices.forEach(function (i) { - $scope.translations[i.lang].splice(i.index, 1); - }); - }; - - $scope.add = function () { - var modal = $uibModal.open({ - templateUrl: 'app/config/views/config-translation-modal-form-template.html', - controller: 'NewEntryModalController' - }); - - modal.result.then(function (entry) { - $scope.agateConfig.languages.forEach(function (lang) { - $scope.translations[lang].push({path: entry.path, value: entry.value}); - }); - }); - }; - - $scope.setDirty = function(entry) { - if(!entry.overwritten) { entry.overwritten = true; } - }; - - $scope.resetEntry = function(entry, lang) { - entry.overwritten = false; - - var original = oldTranslations[lang].filter(function(e) { - return e.path === entry.path; - })[0]; - - entry.value = original ? original.value : ''; - }; - - $scope.save = function () { - $scope.agateConfig.translations = $scope.agateConfig.languages.map(function(lang){ - var changes = $scope.translations[lang].filter(function (e) { - var result = null; - - if (!oldTranslations[lang].some(function(o) { - if (o.path === e.path) { - if (o.value !== e.value) { - result = e; - } - - return true; - } - })) { - result = e; - } - - return result; - }).filter(notNull); - - return {lang: lang, value: JSON.stringify(pathsToJson(changes))}; - }); - - $scope.agateConfig.$save( - function () { - $location.path('/admin'); - $window.location.reload(); - }, - function (response) { - FormServerValidation.error(response, $scope.form); - }); - }; - }]) - - .controller('NewEntryModalController', ['$scope', '$uibModalInstance', - function ($scope, $uibModalInstance) { - $scope.entry = {}; - - $scope.accept = function () { - $uibModalInstance.close($scope.entry); - }; - - $scope.cancel = function () { - $uibModalInstance.dismiss(); - }; - }]);; diff --git a/agate-webapp/src/main/webapp/app/config/config-router.js b/agate-webapp/src/main/webapp/app/config/config-router.js deleted file mode 100644 index f2fad9327..000000000 --- a/agate-webapp/src/main/webapp/app/config/config-router.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.config - .config(['$routeProvider', - function ($routeProvider) { - $routeProvider - .when('/admin/general', { - templateUrl: 'app/config/views/config-view.html', - controller: 'ConfigurationController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/admin/general/edit', { - templateUrl: 'app/config/views/config-form.html', - controller: 'ConfigurationEditController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/admin/style/edit', { - templateUrl: 'app/config/views/config-style-form.html', - controller: 'ConfigurationStyleEditController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/admin/translations/edit', { - templateUrl: 'app/config/views/config-translations-form.html', - controller: 'ConfigurationTranslationsEditController', - access: { - authorizedRoles: ['agate-administrator'] - } - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/config/config-service.js b/agate-webapp/src/main/webapp/app/config/config-service.js deleted file mode 100644 index 61798c35e..000000000 --- a/agate-webapp/src/main/webapp/app/config/config-service.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.config - .factory('ConfigurationResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/config', {}, { - // override $resource.save method because it uses POST by default - 'save': {method: 'PUT'}, - 'get': {method: 'GET'} - }); - }]) - .factory('PublicConfigurationResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/config/_public', {}, { - // override $resource.save method because it uses POST by default - 'get': {method: 'GET'} - }); - }]) - .factory('KeyStoreResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/config/keystore/system/https', {}, { - 'save': {method: 'PUT'} - }); - }]) - .factory('StyleEditorService', [ - function () { - return { - /** - * HACK until angular-ui-ce can config path settings - */ - configureAcePaths: function () { - var defaultPath = ace.config.get('basePath'); - - if (defaultPath.indexOf('bower_components') === -1) { - // production path must be changed - ace.config.set('basePath', '/scripts'); - ace.config.set('modePath', '/scripts'); - ace.config.set('themePath', '/scripts'); - ace.config.set('workerPath', '/scripts'); - } - }, - - getEditorOptions: function () { - return { - options: { - theme: 'monokai', - mode: 'css', - displayIndentGuides: true, - useElasticTabstops: true - } - }; - } - }; - }]) - .factory('TranslationsResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/config/i18n/:id.json'); - }]); diff --git a/agate-webapp/src/main/webapp/app/config/config.js b/agate-webapp/src/main/webapp/app/config/config.js deleted file mode 100644 index 3f75350bb..000000000 --- a/agate-webapp/src/main/webapp/app/config/config.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.config = angular.module('agate.config', [ - 'obiba.form', - 'obiba.notification', - 'ngObiba', - 'ngResource', - 'ngRoute', - 'pascalprecht.translate', - 'ui.ace', - 'ui.bootstrap' -]); diff --git a/agate-webapp/src/main/webapp/app/config/views/attribute-modal-form.html b/agate-webapp/src/main/webapp/app/config/views/attribute-modal-form.html deleted file mode 100644 index 8ec01a631..000000000 --- a/agate-webapp/src/main/webapp/app/config/views/attribute-modal-form.html +++ /dev/null @@ -1,53 +0,0 @@ - - - diff --git a/agate-webapp/src/main/webapp/app/config/views/config-form.html b/agate-webapp/src/main/webapp/app/config/views/config-form.html deleted file mode 100644 index a58456616..000000000 --- a/agate-webapp/src/main/webapp/app/config/views/config-form.html +++ /dev/null @@ -1,99 +0,0 @@ - - -
-

-
    -
  1. global.menu.admin
  2. -
  3. config.general.title
  4. -
-

- -
-
-
- -
- -
- -
- -
- -
- -
-
-
- -
- - -

- required -

-

config.languages-help

-
- -
- -
- -
- -
- -
- -
-
-
- -
- - cancel - - - -
-
- -
- - diff --git a/agate-webapp/src/main/webapp/app/config/views/config-modal-create-keypair.html b/agate-webapp/src/main/webapp/app/config/views/config-modal-create-keypair.html deleted file mode 100644 index 1e3eb2516..000000000 --- a/agate-webapp/src/main/webapp/app/config/views/config-modal-create-keypair.html +++ /dev/null @@ -1,52 +0,0 @@ - - - diff --git a/agate-webapp/src/main/webapp/app/config/views/config-modal-import-keypair.html b/agate-webapp/src/main/webapp/app/config/views/config-modal-import-keypair.html deleted file mode 100644 index 9816d6170..000000000 --- a/agate-webapp/src/main/webapp/app/config/views/config-modal-import-keypair.html +++ /dev/null @@ -1,35 +0,0 @@ - - - diff --git a/agate-webapp/src/main/webapp/app/config/views/config-style-form.html b/agate-webapp/src/main/webapp/app/config/views/config-style-form.html deleted file mode 100644 index f9bf8c42f..000000000 --- a/agate-webapp/src/main/webapp/app/config/views/config-style-form.html +++ /dev/null @@ -1,37 +0,0 @@ - - -
-

-
    -
  1. global.menu.admin
  2. -
  3. config.style.title
  4. -
-

- -

config.style.info

- -
- -
- -
- - cancel - - - -
-
-
- - diff --git a/agate-webapp/src/main/webapp/app/config/views/config-translation-modal-form-template.html b/agate-webapp/src/main/webapp/app/config/views/config-translation-modal-form-template.html deleted file mode 100644 index 4b3e3c655..000000000 --- a/agate-webapp/src/main/webapp/app/config/views/config-translation-modal-form-template.html +++ /dev/null @@ -1,46 +0,0 @@ - - - diff --git a/agate-webapp/src/main/webapp/app/config/views/config-translations-form.html b/agate-webapp/src/main/webapp/app/config/views/config-translations-form.html deleted file mode 100644 index 3c41614e9..000000000 --- a/agate-webapp/src/main/webapp/app/config/views/config-translations-form.html +++ /dev/null @@ -1,82 +0,0 @@ - - -
-

-
    -
  1. global.menu.admin
  2. -
  3. config.translations.title
  4. -
-

-

config.translations.info

- - - -

 

- - - - -
-
- - - - -
-
- -
- - - - - - - - - -
config.translations.pathconfig.translations.value
- {{entry.path}} - {{entry.path}} - -
- - - - - - - - -
-
-
- -
-
- -
-
- - cancel - - -
-
-
diff --git a/agate-webapp/src/main/webapp/app/config/views/config-view.html b/agate-webapp/src/main/webapp/app/config/views/config-view.html deleted file mode 100644 index 07e78f465..000000000 --- a/agate-webapp/src/main/webapp/app/config/views/config-view.html +++ /dev/null @@ -1,226 +0,0 @@ - - -
-

-
    -
  1. global.menu.admin
  2. -
  3. config.general.title
  4. -
-

- -
-
-

config.title

-
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- config.name - config.name-help - {{agateConfig.name}}
- config.publicUrl - config.publicUrl-help - {{agateConfig.publicUrl}}
- config.portalUrl - config.portalUrl-help - {{agateConfig.portalUrl}}
- config.domain - config.domain-help - {{agateConfig.domain}}
- config.shortTimeout - config.shortTimeout-help - {{agateConfig.shortTimeout}}
- config.longTimeout - config.longTimeout-help - {{agateConfig.longTimeout}}
- config.inactiveTimeout - config.inactiveTimeout-help - {{agateConfig.inactiveTimeout / 24}}
- - - edit - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- config.languages - config.languages-help - -
    -
  • - {{lang}} {{availableLanguages[lang]}} -
  • -
-
- config.joinPageEnabled - config.joinPageEnabled-help - - - -
- config.joinWithUsername - config.joinWithUsername-help - - - -
- config.joinWhitelist - config.joinWhitelist-help - {{agateConfig.joinWhitelist}}
- config.joinBlacklist - config.joinBlacklist-help - {{agateConfig.joinBlacklist}}
- config.enforced2FA - config.enforced2FA-help - - {{'config.enforced2FA-strategies.' + agateConfig.enforced2FAStrategy}} -
-
-
- -
-
-

config.encryption-keys

-

- config.encryption-keys-help -

- - - - - config.downloadCertificate - -
-
- -

config.user-attributes

-

- config.user-attributes-help -

- - - -
-
- - - - - - - - - - - - - - - - - - - -
config.attributes.nameconfig.attributes.typeconfig.attributes.valuesconfig.attributes.requiredconfig.attributes.actions
- {{attribute.name}} - - {{'config.attributes.types.' + attribute.type | translate}} - - {{attribute.values.join(', ') }} - - - -
    -
  • - -
  • -
  • - -
  • -
-
-
-
- -
-
- -
diff --git a/agate-webapp/src/main/webapp/app/controllers.js b/agate-webapp/src/main/webapp/app/controllers.js deleted file mode 100644 index aa7be5d10..000000000 --- a/agate-webapp/src/main/webapp/app/controllers.js +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -/* Controllers */ - -agate.controller('MainController', ['$rootScope', '$scope', '$window', '$log', '$sce', 'ConfigurationResource', 'PublicConfigurationResource', 'screenSize', 'AuthenticationSharedService', 'Account', '$translate', - function ($rootScope, $scope, $window, $log, $sce, ConfigurationResource, PublicConfigurationResource, screenSize, AuthenticationSharedService, Account, $translate) { - $rootScope.screen = $scope.screen = { size: null, device: null }; - var applyTitle = function (config) { - $window.document.title = config.name; - }; - if (AuthenticationSharedService.isAuthenticated()) { - $scope.agateConfig = ConfigurationResource.get(applyTitle); - } else { - $scope.agateConfig = PublicConfigurationResource.get(applyTitle); - } - $rootScope.$on('event:auth-loginConfirmed', function () { - if (AuthenticationSharedService.hasProfile()) { - Account.get(function (user) { $translate.use(user.preferredLanguage); }); - } - $scope.agateConfig = ConfigurationResource.get(); - }); - - $rootScope.$on('$translateChangeSuccess', function () { - - $scope.currentLanguage = 'https://www.google.com/recaptcha/api.js?onload=vcRecaptchaApiLoaded&render=explicit&hl=' + $translate.use(); - loadScript($scope.currentLanguage); - }); - - function loadScript(src) { - - var script = document.createElement('script'); - script.type = 'text/javascript'; - script.src = src; - document.getElementById('recaptcha').appendChild(script); - } - - function getScreenSize() { - var size = ['lg', 'md', 'sm', 'xs'].filter(function (size) { - return screenSize.is(size); - }); - - $scope.screen.size = size ? size[0] : 'lg'; - $scope.screen.device = screenSize.is('md, lg') ? 'desktop' : 'mobile'; - $scope.screen.is = screenSize.is; - - $log.debug('Screen', $scope.screen); - } - - getScreenSize(); - - screenSize.on('lg, md, sm, xs', function () { - getScreenSize(); - }); - }]); - -agate.controller('AdminController', [function () { }]); - -agate.controller('LanguageController', ['$scope', '$translate', 'amMoment', 'PublicConfigurationResource', - function ($scope, $translate, amMoment, PublicConfigurationResource) { - $scope.changeLanguage = function (languageKey) { - $translate.use(languageKey); - amMoment.changeLocale(languageKey); - }; - $scope.getCurrentLanguage = $translate.use; - - $scope.publicMicaConfig = PublicConfigurationResource.get(function (config) { - $scope.languages = config.languages; - }); - }]); - -agate.controller('MenuController', [function () { }]); - -agate.controller('LoginController', ['$window', - function ($window) { - $window.location.href = '../signin' - }]); - -agate.controller('ErrorController', ['$scope', '$location', function ($scope, $location) { - var search = $location.search(); - $scope.errorMessage = search.message; - $scope.error = search.error; -}]); - -agate.controller('CredentialsTestModalController', ['$scope', '$uibModalInstance', '$resource', 'provider', 'username', - function ($scope, $uibModalInstance, $resource, provider, username) { - $scope.provider = provider; - $scope.username = username; - - $scope.cameWithUsername = username && username.length; - - $scope.cancel = function () { - $uibModalInstance.dismiss({}); - }; - - $scope.test = function () { - $resource(contextPath + '/ws/users/_test', {}, {'test': {method: 'POST', errorHandler: true}}) - .test({provider: provider, username: $scope.username, password: $scope.password}) - .$promise.then(function (value) { - $uibModalInstance.close({provider: provider, username: $scope.username}); - }, function (reason) { - $uibModalInstance.dismiss({error: reason, provider: provider, username: $scope.username}); - }); - } - }]); - -agate.controller('LogoutController', ['$window', - function ($window) { - $window.location.href = '../signout' - }]); - -agate.controller('OAuthController', ['$log', '$scope', '$q', '$location', 'Account', 'AccountAuthorizations', 'ApplicationSummaryResource', 'OAuthAuthorize', - function ($log, $scope, $q, $location, Account, AccountAuthorizations, ApplicationSummaryResource, OAuthAuthorize) { - var OPENID_SCOPES = ['openid', 'profile', 'email', 'address', 'phone', 'offline_access']; - // hide the form while we are not sure whether the scopes were already granted - $scope.loading = true; - $scope.authRequired = false; - $scope.applicationAccess = false; - $scope.auth = $location.search(); - $scope.client = ApplicationSummaryResource.get({ id: $scope.auth.client_id }, function () { - }, function () { - $scope.error = 'unknown-client-application'; - $scope.errorArgs = $scope.auth.client_id; - }); - Account.get(function(user) { - // check user has access to the app - var apps = []; - if (user.applications) { - apps = user.applications; - } - if (user.groupApplications) { - user.groupApplications.forEach(function(gapp) { - apps.push(gapp.application); - }); - } - $scope.applicationAccess = apps.includes($scope.auth.client_id); - if ($scope.applicationAccess) { - // check if the authz was already granted - AccountAuthorizations.query().$promise.then(function(authorizations){ - if (authorizations.length>0) { - authorizations.forEach(function(authorization){ - if (authorization.application === $scope.auth.client_id) { - var allScopesCovered = true; - $scope.auth.scope.split(' ').forEach(function(sc) { - if (!authorization.scopes.includes(sc)) { - allScopesCovered = false; - $scope.authRequired = true; - } - }); - if (allScopesCovered) { - document.getElementById('oauthForm').submit(); - } - } - }); - } else { - $scope.authRequired = true; - } - $scope.loading = false; - }); - } else { - $scope.loading = false; - } - }); - - $scope.scopes = $scope.auth.scope.split(' ').map(function (s) { - var scopeParts = s.split(':'); - var appId = scopeParts[0]; - if (OPENID_SCOPES.indexOf(appId) < 0) { - return { application: appId, name: scopeParts[1] }; - } else { - return { application: 'openid', name: appId }; - } - }); - - var applications = $scope.scopes.reduce(function (applications, scope) { - var application = scope.application; - - if (applications.indexOf(application) < 0) { - applications.push(application); - } - - return applications; - }, []); - - $q.all(applications.map(function (application) { - if (OPENID_SCOPES.indexOf(application) < 0) { - return ApplicationSummaryResource.get({ id: application }).$promise; - } else { - var deferred = $q.defer(); - deferred.resolve({ id: application, scopes: OPENID_SCOPES.map(function (s) { return { name: s }; }) }); - return deferred.promise; - } - })).then(function (applications) { - var res = $scope.scopes.map(function (scope) { - var application, found; - application = applications.filter(function (application) { return application.id === scope.application; })[0]; - found = application && application.scopes ? application.scopes.filter(function (s) { return s.name === scope.name; })[0] : {}; - - if (!found && scope.name) { - scope.isMissing = true; - } else { - scope.description = found ? found.description : null; - } - - return scope; - }); - - var missingScopes = res.filter(function (scope) { return scope.isMissing; }); - - if (missingScopes.length > 0) { - $scope.error = 'unknown-resource-scope'; - $scope.errorArgs = missingScopes.map(function (s) { return s.application + ':' + s.name; }).join(', '); - } - - $scope.applicationScopes = applications.map(function (application) { - var scopes = res.filter(function (scope) { return scope.application === application.id; }); - - return { application: application, scopes: scopes }; - }); - }).catch(function (e) { - $log.error(e); - $scope.error = 'unknown-resource-application'; - $scope.errorArgs = applications.join(', '); - }); - }]); - -agate.controller('ProfileController', - ['$window', - function ($window) { - $window.location.href = '../profile'; - }]); diff --git a/agate-webapp/src/main/webapp/app/directives.js b/agate-webapp/src/main/webapp/app/directives.js deleted file mode 100644 index b3ce6eed5..000000000 --- a/agate-webapp/src/main/webapp/app/directives.js +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -angular.module('agate') - - .directive('activeMenu', ['$translate', '$locale', 'tmhDynamicLocale', function ($translate, $locale, tmhDynamicLocale) { - return { - restrict: 'A', - link: function (scope, element, attrs) { - var language = attrs.activeMenu; - - scope.$watch(function () { - return $translate.use(); - }, function (selectedLanguage) { - if (language === selectedLanguage) { - tmhDynamicLocale.set(language); - element.addClass('active'); - } else { - element.removeClass('active'); - } - }); - } - }; - }]) - - .directive('activeLink', ['$location', function (location) { - return { - restrict: 'A', - link: function (scope, element, attrs) { - var clazz = attrs.activeLink; - var path = attrs.href; - path = path.substring(1); //hack because path does bot return including hashbang - scope.location = location; - scope.$watch('location.path()', function (newPath) { - if (path === newPath) { - element.addClass(clazz); - } else { - element.removeClass(clazz); - } - }); - } - }; - }]) - - .directive('passwordStrengthBar', function () { - return { - replace: true, - restrict: 'E', - template: '
' + - 'Password strength:' + - '
    ' + - '
  • ' + - '
' + - '
', - link: function (scope, iElement, attr) { - var strength = { - colors: ['#F00', '#F90', '#FF0', '#9F0', '#0F0'], - mesureStrength: function (p) { - - var _force = 0; - var _regex = /[$-/:-?{-~!"^_`\[\]]/g; // " - - var _lowerLetters = /[a-z]+/.test(p); - var _upperLetters = /[A-Z]+/.test(p); - var _numbers = /[0-9]+/.test(p); - var _symbols = _regex.test(p); - - var _flags = [_lowerLetters, _upperLetters, _numbers, _symbols]; - var _passedMatches = $.grep(_flags, function (el) { - return el === true; - }).length; - - _force += 2 * p.length + ((p.length >= 10) ? 1 : 0); - _force += _passedMatches * 10; - - // penality (short password) - _force = (p.length <= 6) ? Math.min(_force, 10) : _force; - - // penality (poor variety of characters) - _force = (_passedMatches === 1) ? Math.min(_force, 10) : _force; - _force = (_passedMatches === 2) ? Math.min(_force, 20) : _force; - _force = (_passedMatches === 3) ? Math.min(_force, 40) : _force; - - return _force; - - }, - getColor: function (s) { - - var idx = 0; - if (s <= 10) { - idx = 0; - } - else if (s <= 20) { - idx = 1; - } - else if (s <= 30) { - idx = 2; - } - else if (s <= 40) { - idx = 3; - } - else { - idx = 4; - } - - return { idx: idx + 1, col: this.colors[idx] }; - } - }; - scope.$watch(attr.passwordToCheck, function (password) { - if (password) { - var c = strength.getColor(strength.mesureStrength(password)); - iElement.removeClass('ng-hide'); - iElement.find('ul').children('li') - .css({ 'background': '#DDD' }) - .slice(0, c.idx) - .css({ 'background': c.col }); - } - }); - } - }; - }) - - .directive('nullIfEmpty', [function () { - return { - require: 'ngModel', - link: function (scope, elm, attr, ctrl) { - ctrl.$parsers.unshift(function (value) { - return value === '' ? null : value; - }); - } - }; - }]); diff --git a/agate-webapp/src/main/webapp/app/group/group-controller.js b/agate-webapp/src/main/webapp/app/group/group-controller.js deleted file mode 100644 index e32f70193..000000000 --- a/agate-webapp/src/main/webapp/app/group/group-controller.js +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.group - - .controller('GroupListController', - ['$rootScope', - '$scope', - '$route', - 'GroupsResource', - 'GroupResource', - 'NOTIFICATION_EVENTS', - 'AlertBuilder', - - function ($rootScope, $scope, $route, GroupsResource, GroupResource, NOTIFICATION_EVENTS, AlertBuilder) { - function onSuccess(response) { - $scope.groups = response; - $scope.loading = false; - } - - function onError(response) { - $scope.loading = false; - AlertBuilder.newBuilder().response(response).delay(0).build(); - } - - $scope.loading = true; - $scope.groups = GroupsResource.query({}, onSuccess, onError); - - $scope.deleteGroup = function (group) { - $scope.groupToDelete = group.id; - - $rootScope.$broadcast(NOTIFICATION_EVENTS.showConfirmDialog, - { - titleKey: 'group.delete-dialog.onerrortitle', - messageKey:'group.delete-dialog.message', - messageArgs: [group.name] - }, group.id - ); - }; - - $scope.$on(NOTIFICATION_EVENTS.confirmDialogAccepted, function (event, id) { - if ($scope.groupToDelete === id) { - - GroupResource.delete({id: id}).$promise - .then(function () { - $route.reload(); - }) - .catch(onError); - } - }); - - }]) - - .controller('GroupEditController', - ['$scope', - '$routeParams', - '$location', - 'GroupsResource', - 'GroupResource', - 'ApplicationsResource', - 'AlertBuilder', - - function ($scope, $routeParams, $location, GroupsResource, GroupResource, ApplicationsResource, AlertBuilder) { - $scope.group = $routeParams.id ? GroupResource.get({id: $routeParams.id}) : {}; - $scope.applicationList = []; - - function onError(response) { - AlertBuilder.newBuilder().response(response).delay(0).build(); - } - - ApplicationsResource.query().$promise - .then(function(applications){ - applications.forEach(function(application){ - $scope.applicationList.push(application.id); - }); - }) - .catch(onError); - - $scope.save = function(form) { - if (!form.$valid) { - form.saveAttempted = true; - return; - } - - if (!$scope.group.id) { - GroupsResource.save($scope.group).$promise - .then(function () { - $location.path('/groups'); - }) - .catch(onError); - } else { - GroupResource.update({id: $scope.group.id}, $scope.group).$promise - .then(function () { - $location.path('/groups'); - }) - .catch(onError); - } - }; - - $scope.cancel = function () { - if ($scope.group.id) { - $location.path('/group' + ($scope.group.id ? '/' + $scope.group.id : '')).replace(); - } else { - $location.path('/groups'); - } - }; - }]) - - .controller('GroupViewController', ['$scope', '$routeParams', 'GroupResource', - - function ($scope, $routeParams, GroupResource) { - $scope.group = GroupResource.get({id: $routeParams.id, includeUsers: true}); - }]); diff --git a/agate-webapp/src/main/webapp/app/group/group-router.js b/agate-webapp/src/main/webapp/app/group/group-router.js deleted file mode 100644 index 2537593e6..000000000 --- a/agate-webapp/src/main/webapp/app/group/group-router.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.group - - .config(['$routeProvider', - function ($routeProvider) { - $routeProvider - .when('/groups', { - templateUrl: 'app/group/views/group-list.html', - controller: 'GroupListController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/group/new', { - templateUrl: 'app/group/views/group-form.html', - controller: 'GroupEditController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/group/:id', { - templateUrl: 'app/group/views/group-view.html', - controller: 'GroupViewController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/group/:id/edit', { - templateUrl: 'app/group/views/group-form.html', - controller: 'GroupEditController', - access: { - authorizedRoles: ['agate-administrator'] - } - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/group/group-service.js b/agate-webapp/src/main/webapp/app/group/group-service.js deleted file mode 100644 index a8d069144..000000000 --- a/agate-webapp/src/main/webapp/app/group/group-service.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.group - - .factory('GroupsResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/groups', {}, { - 'get': {method: 'GET', errorHandler: true}, - 'save': {method: 'POST', errorHandler: true} - }); - }]) - - .factory('GroupResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/group/:id', {}, { - 'get': {method: 'GET', params: {id: '@id'}, errorHandler: true}, - 'update': {method: 'PUT', params: {id: '@id'}, errorHandler: true}, - 'delete': {method: 'DELETE', params: {id: '@id'}, errorHandler: true}, - 'users': {url: contextPath + '/ws/group/:id/users', method: 'PUT', params: {id: '@id'}, errorHandler: true} - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/group/group.js b/agate-webapp/src/main/webapp/app/group/group.js deleted file mode 100644 index 61eb5e4d5..000000000 --- a/agate-webapp/src/main/webapp/app/group/group.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.group = angular.module('agate.group', [ - 'agate.config', - 'obiba.form', - 'obiba.notification', - 'ngObiba', - 'ngResource', - 'ngRoute', - 'ui.bootstrap', - 'ui', - 'pascalprecht.translate' -]); diff --git a/agate-webapp/src/main/webapp/app/group/views/group-form.html b/agate-webapp/src/main/webapp/app/group/views/group-form.html deleted file mode 100644 index 45ed72808..000000000 --- a/agate-webapp/src/main/webapp/app/group/views/group-form.html +++ /dev/null @@ -1,60 +0,0 @@ - - -
-

-
    -
  1. groups
  2. -
  3. {{group.name}}group.new
  4. -
-

- -
-
-

properties

- -
-

fix-error

- -
- -
- -
- - - - - {{application}} - - -

- user.groups-help -

-
- - - - - -
-
-
-
- - diff --git a/agate-webapp/src/main/webapp/app/group/views/group-list.html b/agate-webapp/src/main/webapp/app/group/views/group-list.html deleted file mode 100644 index 219103663..000000000 --- a/agate-webapp/src/main/webapp/app/group/views/group-list.html +++ /dev/null @@ -1,76 +0,0 @@ - - -
-

groups

- -

groups-description

- - - group.add - - -

- group.none -

- -

-

- -
-
-
- - - - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - -
group.namegroup.descriptiongroup.applicationsgroup.actions
- {{group.name}} - - {{group.description}} - - {{app}} - -
    -
  • - -
  • -
  • - -
  • -
-
-
-
-
diff --git a/agate-webapp/src/main/webapp/app/group/views/group-view.html b/agate-webapp/src/main/webapp/app/group/views/group-view.html deleted file mode 100644 index 505d9526f..000000000 --- a/agate-webapp/src/main/webapp/app/group/views/group-view.html +++ /dev/null @@ -1,47 +0,0 @@ - - -
-

-
    -
  1. groups
  2. -
  3. {{group.name}}
  4. -
-

- -
-
-

properties

- - - - - - - - - - - - - - - -
group.name{{group.name}}
group.description{{group.description}}
group.applications{{group.applications.join(', ')}}
-
-
- -
-
- - - edit - -
diff --git a/agate-webapp/src/main/webapp/app/http-auth-interceptor.js b/agate-webapp/src/main/webapp/app/http-auth-interceptor.js deleted file mode 100644 index da0f0802b..000000000 --- a/agate-webapp/src/main/webapp/app/http-auth-interceptor.js +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * @license HTTP Auth Interceptor Module for AngularJS - * (c) 2012 Witold Szczerba - * License: MIT - */ -(function () { - 'use strict'; - - angular.module('http-auth-interceptor', ['http-auth-interceptor-buffer']) - - .factory('authService', ['$rootScope', 'httpBuffer', function ($rootScope, httpBuffer) { - return { - /** - * Call this function to indicate that authentication was successfull and trigger a - * retry of all deferred requests. - * @param data an optional argument to pass on to $broadcast which may be useful for - * example if you need to pass through details of the user that was logged in - */ - loginConfirmed: function (data, configUpdater) { - var updater = configUpdater || function (config) { - return config; - }; - $rootScope.$broadcast('event:auth-loginConfirmed', data); - httpBuffer.retryAll(updater); - }, - - /** - * Call this function to indicate that authentication should not proceed. - * All deferred requests will be abandoned or rejected (if reason is provided). - * @param data an optional argument to pass on to $broadcast. - * @param reason if provided, the requests are rejected; abandoned otherwise. - */ - loginCancelled: function (data, reason) { - httpBuffer.rejectAll(reason); - $rootScope.$broadcast('event:auth-loginCancelled', data); - } - }; - }]) - - .factory('AgateHttpInterceptor', ['$rootScope', '$q', 'httpBuffer', function($rootScope, $q, httpBuffer) { - return { - // optional method - 'request': function(config) { - // do something on success - return config; - }, - - // optional method - 'requestError': function(rejection) { - // do something on error - return $q.reject(rejection); - }, - - // optional method - 'response': function(response) { - // do something on success - return response; - }, - - // optional method - 'responseError': function(response) { - if (response.status === 401 && !response.config.ignoreAuthModule) { - var deferred = $q.defer(); - httpBuffer.append(response.config, deferred); - $rootScope.$broadcast('event:auth-loginRequired', response); - return deferred.promise; - } else { - if (angular.isObject(response.data) && !response.data.messageTemplate) { - response.data.messageTemplate = 'server.error.' + response.status; - } - - if (response.status === 403 && !response.config.ignoreAuthModule) { - $rootScope.$broadcast('event:auth-notAuthorized', response); - } else if (!response.config.errorHandler) { - $rootScope.$broadcast('event:unhandled-server-error', response); - } - } - - // otherwise, default behaviour - return $q.reject(response); - } - }; - }]) - - /** - * $http interceptor. - * On 401 response (without 'ignoreAuthModule' option) stores the request - * and broadcasts 'event:angular-auth-loginRequired'. - */ - .config(['$httpProvider', function ($httpProvider) { - $httpProvider.interceptors.push('AgateHttpInterceptor'); - }]); - - /** - * Private module, a utility, required internally by 'http-auth-interceptor'. - */ - angular.module('http-auth-interceptor-buffer', []) - - .factory('httpBuffer', ['$injector', function ($injector) { - /** Holds all the requests, so they can be re-requested in future. */ - var buffer = []; - - /** Service initialized later because of circular dependency problem. */ - var $http; - - function retryHttpRequest(config, deferred) { - function successCallback(response) { - deferred.resolve(response); - } - - function errorCallback(response) { - deferred.reject(response); - } - - $http = $http || $injector.get('$http'); - $http(config).then(successCallback, errorCallback); - } - - return { - /** - * Appends HTTP request configuration object with deferred response attached to buffer. - */ - append: function (config, deferred) { - buffer.push({ - config: config, - deferred: deferred - }); - }, - - /** - * Abandon or reject (if reason provided) all the buffered requests. - */ - rejectAll: function (reason) { - if (reason) { - for (var i = 0; i < buffer.length; ++i) { - buffer[i].deferred.reject(reason); - } - } - buffer = []; - }, - - /** - * Retries all the buffered requests clears the buffer. - */ - retryAll: function (updater) { - for (var i = 0; i < buffer.length; ++i) { - retryHttpRequest(updater(buffer[i].config), buffer[i].deferred); - } - buffer = []; - } - }; - }]); -})(); diff --git a/agate-webapp/src/main/webapp/app/realm/components/realm-form/component.html b/agate-webapp/src/main/webapp/app/realm/components/realm-form/component.html deleted file mode 100644 index a746166aa..000000000 --- a/agate-webapp/src/main/webapp/app/realm/components/realm-form/component.html +++ /dev/null @@ -1,58 +0,0 @@ - - -

-
    -
  1. global.menu.admin
  2. -
  3. global.realms
  4. -
  5. - {{$ctrl.model.safeTitle}} - realm.new-realm -
  6. -
-

- -
-
-
-

realm.general-information

-
-
-
-
- -
-

realm.user-info-mapping

-

realm.user-info-mapping-help

-
-
-
-
-
- -
-

realm.specific-information

-
-
-
-
-
- - - - cancel - - - - - - diff --git a/agate-webapp/src/main/webapp/app/realm/components/realm-form/component.js b/agate-webapp/src/main/webapp/app/realm/components/realm-form/component.js deleted file mode 100644 index bfd28c219..000000000 --- a/agate-webapp/src/main/webapp/app/realm/components/realm-form/component.js +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function () { - - function Controller( - $q, - $scope, - $filter, - $location, - $timeout, - ConfigurationResource, - RealmConfigFormResource, - RealmsConfigResource, - RealmConfigResource, - RealmsService, - GroupsResource, - JsonUtils, - AlertBuilder) { - - var ctrl = this; - - function extractRealmForm(type, config) { - return JsonUtils.parseJsonSafely(config[type], {}); - } - - function onTypeChanged(/*type*/) { - ctrl.realm.form = extractRealmForm(ctrl.model.type, ctrl.config); - - if (ctrl.config.userInfoMappingDefaults && ctrl.config.userInfoMappingDefaults[ctrl.model.type]) { - ctrl.model.userInfoMapping = ctrl.config.userInfoMappingDefaults[ctrl.model.type]; - } else { - delete ctrl.model.userInfoMapping; - } - - ctrl.noMapping = ctrl.model.type !== 'agate-oidc-realm'; - - } - - function onStatusChanged(status) { - if ('INACTIVE' === status) { - ctrl.model.forSignup = false; - } - } - - /** - * This is primarily to prevent using $watch()! - * - * @param model - * @param typeChangeCallBack - */ - function addTypeGetterSetter(model, typeChangeCallBack) { - var type = model.type; - delete model.type; - var _type = type; - - Object.defineProperty(model, 'type', { - get: function() { return _type; }, - set: function(value) { - _type = value; - typeChangeCallBack.call(ctrl, _type); - }, - enumerable: true - }); - } - - /** - * This is primarily to prevent using $watch()! - * - * @param model - * @param typeChangeCallBack - */ - function addStatusGetterSetter(model, statusChangeCallBack) { - var status = model.status; - delete model.status; - var _status = status; - - Object.defineProperty(model, 'status', { - get: function() { return _status; }, - set: function(value) { - if (value === 'INACTIVE' && ctrl.model.userCount > 0) { - AlertBuilder.newBuilder() - .trMsg('realm.deativate-warning', ctrl.model.safeTitle) - .type('warning') - .build(); - } - _status = value; - statusChangeCallBack.call(ctrl, _status); - }, - enumerable: true - }); - } - - function cloneRealm(realm) { - var clone = angular.copy(realm); - delete clone.id; - delete clone.name; - delete clone.title; - clone.status = 'INACTIVE'; - clone.forSignup = false; - return clone; - } - - function invokeRealmConfigResource() { - - if (ctrl.name) { - return RealmConfigResource.get({name: ctrl.name}).$promise; - } - - var deferred = $q.defer(); - var search = $location.search(); - - if (search && search.from) { - RealmConfigResource.get({name: search.from}).$promise - .then(function(realm) { - deferred.resolve(cloneRealm(realm)); - }); - } else { - deferred.resolve({}); - } - - return deferred.promise; - } - - function onError(response) { - AlertBuilder.newBuilder().response(response).delay(0).build(); - } - - function init() { - var forEditing = ctrl.name && ctrl.name.length > 0; - - $q.all( - [ - ConfigurationResource.get().$promise, - RealmConfigFormResource.get({locale: ctrl.locale.language, forEditing: forEditing}).$promise, - invokeRealmConfigResource(), - GroupsResource.query().$promise - ]) - .then(function(responses) { - ctrl.sfLanguages = responses[0].languages.reduce(function(acc, language) { - acc[language] = $filter('translate')('language.' + language); - return acc; - }, {}); - ctrl.config = responses[1]; - ctrl.model = responses[2]; - ctrl.sfOptions = {formDefaults: {languages: ctrl.sfLanguages}}; - ctrl.sfOptions.formDefaults.items = responses[3].map(function(group) { - return {value: group.id, label: group.name}; - }); - - addTypeGetterSetter(ctrl.model, onTypeChanged); - addStatusGetterSetter(ctrl.model, onStatusChanged); - ctrl.model.safeTitle = ctrl.model.id ? RealmsService.ensureRealmTitle(ctrl.model) : null; - - ctrl.main = JsonUtils.parseJsonSafely(ctrl.config.form, {}); - ctrl.realm = { - form: extractRealmForm(ctrl.model.type, ctrl.config), - model: JsonUtils.parseJsonSafely(ctrl.model.content, {}) - }; - - ctrl.mapping = { - form: JsonUtils.parseJsonSafely(ctrl.config.userInfoMapping, {}), - }; - - ctrl.noMapping = ctrl.model.type !== 'agate-oidc-realm'; - }).catch(onError); - } - - function onChanges(changed) { - if (changed.locale.currentValue && changed.locale.currentValue.language) { - init(); - } - } - - function save() { - $scope.$broadcast('schemaFormValidate'); - if (ctrl.form.main.$valid && ctrl.form.realm.$valid) { - ctrl.model.content = JSON.stringify(ctrl.realm.model); - - var copy = angular.copy(ctrl.model); - (copy.id ? RealmConfigResource.save(copy).$promise : RealmsConfigResource.create(copy).$promise) - .then(function() { - ctrl.onSave({}); - }) - .catch(onError); - } - } - - ctrl.$onChanges = onChanges.bind(this); - ctrl.save = save; - } - - var injections = [ - '$q', - '$scope', - '$filter', - '$location', - '$timeout', - 'ConfigurationResource', - 'RealmConfigFormResource', - 'RealmsConfigResource', - 'RealmConfigResource', - 'RealmsService', - 'GroupsResource', - 'JsonUtils', - 'AlertBuilder' - ]; - - angular.module('agate.realm') - .component('realmForm', { - transclude: true, - bindings: { - name: '<', - locale: '<', - onSave: '&' - }, - templateUrl: 'app/realm/components/realm-form/component.html', - controller: [].concat(injections, Controller) - }); -})(); diff --git a/agate-webapp/src/main/webapp/app/realm/components/realm-view/component.html b/agate-webapp/src/main/webapp/app/realm/components/realm-view/component.html deleted file mode 100644 index 9cf570ea0..000000000 --- a/agate-webapp/src/main/webapp/app/realm/components/realm-view/component.html +++ /dev/null @@ -1,202 +0,0 @@ - - -
-

-
    -
  1. global.menu.admin
  2. -
  3. global.realms
  4. -
  5. - {{$ctrl.realm.safeTitle}} -
  6. -
-

- -
-
-

properties

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
global.name{{$ctrl.realm.name}}
global.title
global.description
global.status{{'realm.' + $ctrl.realm.status | translate}}
realm.for-signup
global.groups{{group}}
- config.publicUrl - config.publicUrl-help - {{$ctrl.realm.publicUrl}}
- config.domain - config.domain-help - {{$ctrl.realm.domain}}
- -
-

{{'realm.user-info-mapping'}}

- - - - - - - -
{{'user-info.' + key | translate}}{{value}}
-
- -

{{'realm.' + $ctrl.realm.type | translate}}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
realm.ldap.url{{$ctrl.realm.content.url}}
realm.ldap.system-username{{$ctrl.realm.content.systemUsername}}
realm.ldap.user-dn-template{{$ctrl.realm.content.userDnTemplate}}
realm.jdbc.url{{$ctrl.realm.content.url}}
realm.jdbc.username{{$ctrl.realm.content.username}}
realm.jdbc.authentication-query{{$ctrl.realm.content.authenticationQuery}}
realm.jdbc.salt-style{{$ctrl.realm.content.saltStyle}}
realm.jdbc.external-salt{{$ctrl.realm.content.externalSalt}}
realm.jdbc.algorithm-name{{$ctrl.realm.content.algorithmName}}
realm.ad.url{{$ctrl.realm.content.url}}
realm.ad.system-username{{$ctrl.realm.content.systemUsername}}
realm.ad.search-filter{{$ctrl.realm.content.searchFilter}}
realm.ad.search-base{{$ctrl.realm.content.searchBase}}
realm.ad.principal-suffix{{$ctrl.realm.content.principalSuffix}}
realm.oidc.client-id{{$ctrl.realm.content.clientId}}
realm.oidc.discovery-uri - {{'realm.oidc.configuration' | translate}} -
realm.oidc.provider-url - {{'realm.oidc.user-account' | translate}} -
realm.oidc.scope{{$ctrl.realm.content.scope}}
realm.oidc.groups-claim{{$ctrl.realm.content.groupsClaim}}
realm.oidc.groups-js{{$ctrl.realm.content.groupsJS}}
realm.oidc.use-nonce
realm.oidc.connect-timeout{{$ctrl.realm.content.connectTimeout}}
realm.oidc.read-timeout{{$ctrl.realm.content.readTimeout}}
- - -
- - -
- -
-
-
diff --git a/agate-webapp/src/main/webapp/app/realm/components/realm-view/component.js b/agate-webapp/src/main/webapp/app/realm/components/realm-view/component.js deleted file mode 100644 index c3f16c344..000000000 --- a/agate-webapp/src/main/webapp/app/realm/components/realm-view/component.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function () { - - function Controller(RealmConfigResource, RealmsService, JsonUtils, AlertBuilder) { - - var ctrl = this; - - function onError(response) { - AlertBuilder.newBuilder().response(response).delay(0).build(); - } - - function init() { - RealmConfigResource.get({name: ctrl.name, includeUsers: true}).$promise - .then(function(realm) { - ctrl.realm = realm; - ctrl.realm.safeTitle = RealmsService.ensureRealmTitle(ctrl.realm); - ctrl.realm.content = JsonUtils.parseJsonSafely(realm.content); - }).catch(onError); - } - - function onChanges(changed) { - if (changed.locale.currentValue && changed.locale.currentValue.language) { - init(); - } - } - - ctrl.$onChanges = onChanges.bind(this); - } - - var injections = [ - 'RealmConfigResource', - 'RealmsService', - 'JsonUtils', - 'AlertBuilder' - ]; - - angular.module('agate.realm') - .component('realmView', { - transclude: true, - bindings: { - name: '<', - locale: '<', - onSave: '&' - }, - templateUrl: 'app/realm/components/realm-view/component.html', - controller: [].concat(injections, Controller) - }); -})(); diff --git a/agate-webapp/src/main/webapp/app/realm/components/realms-list/component.html b/agate-webapp/src/main/webapp/app/realm/components/realms-list/component.html deleted file mode 100644 index 626bd4a38..000000000 --- a/agate-webapp/src/main/webapp/app/realm/components/realms-list/component.html +++ /dev/null @@ -1,93 +0,0 @@ - - -

-
    -
  1. global.menu.admin
  2. -
  3. global.realms
  4. -
-

- -

realms.description

- - - realms.add-realm - - -

- realms.none -

- -

- -
-
-
- - - - -
-
- -
-
-
- - - - - - - - - - - - - - - - - - - - - -
global.nameglobal.descriptionglobal.typeglobal.usersglobal.statusglobal.actions
- - - - - - {{'realm.' + realm.type | translate}}{{realm.userCount}}{{'realm.' + realm.status | translate}} -
    -
  • - - -
  • -
  • - -
  • -
  • - -
  • -
  • - -
  • -
-
-
-
diff --git a/agate-webapp/src/main/webapp/app/realm/components/realms-list/component.js b/agate-webapp/src/main/webapp/app/realm/components/realms-list/component.js deleted file mode 100644 index 7ba1adc4b..000000000 --- a/agate-webapp/src/main/webapp/app/realm/components/realms-list/component.js +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function () { - - function Controller( - $rootScope, - $scope, - $translate, - RealmsConfigResource, - RealmConfigResource, - RealmsService, - NOTIFICATION_EVENTS, - AlertBuilder) { - - var ctrl = this; - - function onError(response) { - AlertBuilder.newBuilder().response(response).delay(0).build(); - } - - function onInit() { - ctrl.loading = true; - RealmsConfigResource.summaries().$promise - .then(function(realms) { - ctrl.loading = false; - ctrl.realms = realms; - }) - .catch(onError); - } - - function toggleActivateRealm(realm) { - if (realm.status === 'ACTIVE') { - if (realm.userCount > 0) { - RealmsService.deactivateRealm(realm, $scope, onInit, onError); - } else { - RealmConfigResource.deactivate({name: realm.name}).$promise.then(onInit).catch(onError); - } - } else { - RealmConfigResource.activate({name: realm.name}).$promise.then(onInit).catch(onError); - } - } - - function deleteRealm(realm) { - ctrl.unbindDelete = $scope.$on(NOTIFICATION_EVENTS.confirmDialogAccepted, onDelete.bind(ctrl)); - $rootScope.$broadcast(NOTIFICATION_EVENTS.showConfirmDialog, - { - titleKey: 'realm.delete-dialog.title', - messageKey: 'realm.delete-dialog.message', - messageArgs: [realm.name] - }, realm - ); - } - - function onDelete(event, realm) { - RealmConfigResource.delete({name: realm.name}).$promise - .then(function() { - ctrl.unbindDelete(); - onInit(); - }) - .catch(onError); - } - - ctrl.toggleActivateRealm = toggleActivateRealm; - ctrl.deleteRealm = deleteRealm; - ctrl.$onInit = onInit.bind(this); - } - - angular.module('agate.realm') - .component('realmsList', { - transclude: true, - bindings: { - locale: '<' - }, - templateUrl: 'app/realm/components/realms-list/component.html', - controller: [ - '$rootScope', - '$scope', - '$translate', - 'RealmsConfigResource', - 'RealmConfigResource', - 'RealmsService', - 'NOTIFICATION_EVENTS', - 'AlertBuilder', - Controller - ] - }); -})(); diff --git a/agate-webapp/src/main/webapp/app/realm/realm-controller.js b/agate-webapp/src/main/webapp/app/realm/realm-controller.js deleted file mode 100644 index 9555517b9..000000000 --- a/agate-webapp/src/main/webapp/app/realm/realm-controller.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function() { - - angular.module('agate.realm') - .controller('RealmListController', ['$rootScope', '$scope', - function($rootScope, $scope) { - $rootScope.$on('$translateChangeSuccess', function (event, locale) { - $scope.locale = locale; - }); - } - ]) - - .controller('RealmViewController', - ['$rootScope', '$scope', '$routeParams', '$translate', - function($rootScope, $scope, $routeParams, $translate) { - $scope.name = $routeParams.name; - $scope.locale = {language: $translate.use()}; - $rootScope.$on('$translateChangeSuccess', function (event, locale) { - $scope.locale = locale; - }); - } - ]) - - .controller('RealmFormController', - ['$rootScope', '$scope', '$routeParams', '$translate', '$location', - function($rootScope, $scope, $routeParams, $translate, $location) { - function onSave() { - $location.path($routeParams.name ? '/admin/realm/'+ $routeParams.name : '/admin/realms').replace(); - } - $scope.name = $routeParams.name; - $scope.locale = {language: $translate.use()}; - $scope.onSave = onSave; - $rootScope.$on('$translateChangeSuccess', function (event, locale) { - $scope.locale = locale; - }); - } - ]); - -})(); diff --git a/agate-webapp/src/main/webapp/app/realm/realm-router.js b/agate-webapp/src/main/webapp/app/realm/realm-router.js deleted file mode 100644 index 937429c04..000000000 --- a/agate-webapp/src/main/webapp/app/realm/realm-router.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function() { - angular.module('agate.realm') - .config(['$routeProvider', - function($routeProvider) { - $routeProvider.when('/admin/realms', { - templateUrl: 'app/realm/views/realms.html', - controller: 'RealmListController' - }); - - $routeProvider.when('/admin/realm/new', { - templateUrl: 'app/realm/views/realm-form.html', - controller: 'RealmFormController' - }); - - $routeProvider.when('/admin/realm/:name', { - templateUrl: 'app/realm/views/realm-view.html', - controller: 'RealmViewController' - }); - - $routeProvider.when('/admin/realm/:name/edit', { - templateUrl: 'app/realm/views/realm-form.html', - controller: 'RealmFormController' - }); - }]); - -})(); diff --git a/agate-webapp/src/main/webapp/app/realm/realm.js b/agate-webapp/src/main/webapp/app/realm/realm.js deleted file mode 100644 index dca168e44..000000000 --- a/agate-webapp/src/main/webapp/app/realm/realm.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.realm = angular.module('agate.realm', [ - 'agate.config', - 'obiba.form', - 'obiba.notification', - 'ngResource', - 'ngRoute', - 'ui.bootstrap', - 'ui', - 'pascalprecht.translate' -]); diff --git a/agate-webapp/src/main/webapp/app/realm/rest/realm-config-form-resource.js b/agate-webapp/src/main/webapp/app/realm/rest/realm-config-form-resource.js deleted file mode 100644 index 502578e5a..000000000 --- a/agate-webapp/src/main/webapp/app/realm/rest/realm-config-form-resource.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function() { - angular.module('agate.realm') - .factory('RealmConfigFormResource', ['$resource', - function($resource) { - return $resource(contextPath + '/ws/config/realm-form', {}, { - get: {method: 'GET', errorHandler: true} - }); - } - ]); -})(); diff --git a/agate-webapp/src/main/webapp/app/realm/rest/realm-config-resource.js b/agate-webapp/src/main/webapp/app/realm/rest/realm-config-resource.js deleted file mode 100644 index b2e241e74..000000000 --- a/agate-webapp/src/main/webapp/app/realm/rest/realm-config-resource.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function() { - angular.module('agate.realm') - .factory('RealmConfigResource', ['$resource', 'RealmTransformer', - function($resource, RealmTransformer) { - - - return $resource(contextPath + '/ws/config/realm/:name', {}, - { - 'get': { - method: 'GET', - params: {name: '@name'}, - errorHandler: true, - transformResponse: RealmTransformer.transformForResponse - }, - 'save': { - method: 'PUT', - params: {name: '@name'}, - errorHandler: true, - transformRequest: RealmTransformer.transformForRequest - }, - 'delete': {method: 'DELETE', params: {name: '@name'}, errorHandler: true}, - 'users': {url: contextPath + '/ws/config/realm/:name/users', method: 'GET', params: {name: '@name'}, errorHandler: true}, - 'activate': {url: contextPath + '/ws/config/realm/:name/active', method: 'PUT', params: {name: '@name'}, errorHandler: true}, - 'deactivate': {url: contextPath + '/ws/config/realm/:name/active', method: 'DELETE', params: {name: '@name'}, errorHandler: true} - }); - }]); -})(); - diff --git a/agate-webapp/src/main/webapp/app/realm/rest/realms-config-resource.js b/agate-webapp/src/main/webapp/app/realm/rest/realms-config-resource.js deleted file mode 100644 index 0faf1ad95..000000000 --- a/agate-webapp/src/main/webapp/app/realm/rest/realms-config-resource.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function() { - angular.module('agate.realm') - .factory('RealmsConfigResource', ['$resource', 'RealmTransformer', - function($resource, RealmTransformer) { - - return $resource(contextPath + '/ws/config/realms', {}, - { - 'create': { - url: contextPath + '/ws/config/realms', - method: 'POST', - errorHandler: true, - transformRequest: RealmTransformer.transformForRequest - }, - 'summaries': { - url: contextPath + '/ws/config/realms/summaries', - method: 'GET', - isArray: true, - errorHandler: true - } - }); - }]); -})(); - diff --git a/agate-webapp/src/main/webapp/app/realm/rest/realms-resource.js b/agate-webapp/src/main/webapp/app/realm/rest/realms-resource.js deleted file mode 100644 index 9639b3e4c..000000000 --- a/agate-webapp/src/main/webapp/app/realm/rest/realms-resource.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function() { - angular.module('agate.realm') - .factory('RealmsResource', ['$resource', - function($resource) { - - return $resource(contextPath + '/ws/realms', {}, - { - 'get': { - url: contextPath + '/ws/realms', - method: 'GET', - errorHandler: true - } - }); - }]); -})(); - diff --git a/agate-webapp/src/main/webapp/app/realm/services/realm-service.js b/agate-webapp/src/main/webapp/app/realm/services/realm-service.js deleted file mode 100644 index bcbb0e82f..000000000 --- a/agate-webapp/src/main/webapp/app/realm/services/realm-service.js +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function() { - -angular.module('agate.realm') - .service('RealmsService', - ['$rootScope', - '$q', - '$translate', - 'Session', - 'RealmsConfigResource', - 'RealmConfigResource', - 'RealmsResource', - 'LocalizedValues', - 'NOTIFICATION_EVENTS', - - function($rootScope, - $q, - $translate, - Session, - RealmsConfigResource, - RealmConfigResource, - RealmsResource, - LocalizedValues, - NOTIFICATION_EVENTS) { - var DEFAULT_AGATE_REALM = null; - var REALMS = null; - var service = this; - - function createDefaultRealm() { - var deferred = $q.defer(); - - if (DEFAULT_AGATE_REALM) { - deferred.resolve(DEFAULT_AGATE_REALM); - } else { - DEFAULT_AGATE_REALM = { - name: 'agate-user-realm', - title: [], - description: [] - }; - - var languages = $translate.getAvailableLanguageKeys(); - var promises = (languages || ['en']).map(function (language) { - return $translate(['realm.agate-user-realm', 'realm.default-help'], null, null, null, language); - }); - - $q.all(promises).then(function(translations) { - translations.forEach(function(translation, index) { - var lang = languages[index]; - DEFAULT_AGATE_REALM.title = - DEFAULT_AGATE_REALM.title.concat({value: translation['realm.agate-user-realm'], lang: lang}); - DEFAULT_AGATE_REALM.description = - DEFAULT_AGATE_REALM.description.concat({value: translation['realm.default-help'], lang: lang}); - - deferred.resolve(DEFAULT_AGATE_REALM); - }); - }); - } - - return deferred.promise; - } - - function getRealms() { - var realmResource = 'agate-administrator' === Session.role ? RealmsConfigResource.summaries() : RealmsResource.query(); - var deferred = $q.defer(); - - if (REALMS !== null) { - deferred.resolve(REALMS); - } else { - $q.all([createDefaultRealm(), realmResource.$promise]) - .then(function (realms) { - REALMS = [].concat(realms[0], realms[1]); - deferred.resolve(REALMS); - }); - } - - return deferred.promise; - } - - function getRealmsForLanguage(language) { - var deferred = $q.defer(); - - getRealms().then(function(realms) { - deferred.resolve( - realms.map(function(realm) { - return { - name: realm.name, - title: LocalizedValues.forLang(realm.title, language), - description: LocalizedValues.forLang(realm.description, language) - }; - }) - ); - }); - - return deferred.promise; - } - - function getRealmsNameTitleMap(language, config) { - var deferred = $q.defer(); - - getRealmsForLanguage(language, config).then(function (realms) { - deferred.resolve( - realms.reduce(function (acc, realm) { - acc[realm.name] = realm. title; - return acc; - }, {}) - ); - }); - - return deferred.promise; - } - - function findRealm(target) { - return REALMS.filter(function(realm) { - return realm.name === target; - }).pop() || DEFAULT_AGATE_REALM; - } - - function findRealmForLanguage(target, language) { - var realm = REALMS.filter(function(realm) { - return realm.name === target; - }).pop() || DEFAULT_AGATE_REALM; - - realm.title = LocalizedValues.forLang(realm.title, language); - realm.description = LocalizedValues.forLang(realm.description, language); - - return realm; - } - - function getAgateDefaultRealm() { - return DEFAULT_AGATE_REALM; - } - - function onDeactivateRealm(event, args) { - RealmConfigResource.deactivate({name: args.realm.name}).$promise - .then(function() { - service.unbindActivate(); - args.successCallback(); - }) - .catch(args.failCallback); - } - - function ensureRealmTitle(realm) { - return realm.title && Object.keys(realm.title).length > 0 ? LocalizedValues.forLang(realm.title, $translate.use()) : realm.name; - } - - function deactivateRealm(realm, $scope, successCallback, failCallback) { - if (realm.userCount > 0) { - service.unbindActivate = $scope.$on(NOTIFICATION_EVENTS.confirmDialogAccepted, onDeactivateRealm.bind(service)); - $rootScope.$broadcast(NOTIFICATION_EVENTS.showConfirmDialog, - { - titleKey: 'realm.deactivate-dialog.title', - messageKey: 'realm.deactivate-dialog.message', - messageArgs: [ensureRealmTitle(realm)] - }, {realm: realm, successCallback: successCallback, failCallback: failCallback} - ); - } - } - - function deserialize(realmData) { - var realm = angular.fromJson(realmData); - if (realm.userInfoMappings && realm.userInfoMappings.length > 0) { - realm.userInfoMapping = {}; - realm.userInfoMappings.forEach(function(userInfoMapping) { - if (realm.userInfoMapping.key) { - realm.userInfoMapping[realm.userInfoMapping.key] = userInfoMapping.value; - } - }); - } - - return realm; - } - - this.ensureRealmTitle = ensureRealmTitle; - this.getRealms = getRealms; - this.getRealmsForLanguage = getRealmsForLanguage; - this.getRealmsNameTitleMap = getRealmsNameTitleMap; - this.findRealm = findRealm; - this.findRealmForLanguage = findRealmForLanguage; - this.getAgateDefaultRealm = getAgateDefaultRealm; - this.deactivateRealm = deactivateRealm; - this.deserialize = deserialize; - - return this; - }]); - -})(); diff --git a/agate-webapp/src/main/webapp/app/realm/services/realm-transformer.js b/agate-webapp/src/main/webapp/app/realm/services/realm-transformer.js deleted file mode 100644 index a1bd4b38c..000000000 --- a/agate-webapp/src/main/webapp/app/realm/services/realm-transformer.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -(function() { - angular.module('agate.realm') - .factory('RealmTransformer', ['LocalizedValues', function(LocalizedValues) { - - function transformUserInfoMappingForRequest(realm) { - if (realm.userInfoMapping) { - realm.userInfoMappings = []; - Object.keys(realm.userInfoMapping).forEach(function(key) { - if (realm.userInfoMapping[key]) { - realm.userInfoMappings.push({key: key, value: realm.userInfoMapping[key]}); - } - }); - - // client side only a DTOs do not have maps - delete realm.userInfoMapping; - } - } - - function transformUserInfoMappingForResponse(realm) { - if (realm.userInfoMappings) { - realm.userInfoMapping = {}; - realm.userInfoMappings.forEach(function(entry) { - if (entry.key && entry.value) { - realm.userInfoMapping[entry.key] = entry.value; - } - }); - } - } - - function transformRealmFromResponse(response, getResponseHeaderCallBack, status) { - if (status < 400) { - var realm = JSON.parse(response); - realm.title = LocalizedValues.arrayToObject(realm.title); - realm.description = LocalizedValues.arrayToObject(realm.description); - transformUserInfoMappingForResponse(realm); - return realm; - } - - return response; - } - - function transformRealmForRequest(realm) { - delete realm.safeTitle; - realm.title = LocalizedValues.objectToArray(realm.title); - realm.description = LocalizedValues.objectToArray(realm.description); - transformUserInfoMappingForRequest(realm); - - return JSON.stringify(realm); - } - - return { - transformForResponse: transformRealmFromResponse, - transformForRequest: transformRealmForRequest - }; - }]); -})(); diff --git a/agate-webapp/src/main/webapp/app/realm/views/realm-form.html b/agate-webapp/src/main/webapp/app/realm/views/realm-form.html deleted file mode 100644 index 3c0c95005..000000000 --- a/agate-webapp/src/main/webapp/app/realm/views/realm-form.html +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/agate-webapp/src/main/webapp/app/realm/views/realm-view.html b/agate-webapp/src/main/webapp/app/realm/views/realm-view.html deleted file mode 100644 index 7b77ef0ac..000000000 --- a/agate-webapp/src/main/webapp/app/realm/views/realm-view.html +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/agate-webapp/src/main/webapp/app/realm/views/realms.html b/agate-webapp/src/main/webapp/app/realm/views/realms.html deleted file mode 100644 index 50445958a..000000000 --- a/agate-webapp/src/main/webapp/app/realm/views/realms.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/agate-webapp/src/main/webapp/app/services.js b/agate-webapp/src/main/webapp/app/services.js deleted file mode 100644 index 23fe91c31..000000000 --- a/agate-webapp/src/main/webapp/app/services.js +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.constant('USER_ROLES', { - all: '*', - admin: 'agate-administrator', - user: 'agate-user' -}); - -/* Services */ - -agate.factory('CurrentSession', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/auth/session/_current'); - }]); - -agate.factory('Account', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/user/_current', {}, { - 'save': { method: 'PUT', params: { id: '@id' }, errorHandler: true } - }); - }]); - -agate.factory('AccountAuthorizations', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/user/_current/authorizations', {}, { - 'get': { method: 'GET' } - }); - }]); - -agate.factory('OidcProvidersResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/auth/providers', {locale: '@locale'}, { - 'get': { method: 'GET', errorHandler: true, isArray: true } - }); - }]); - -agate.factory('AccountAuthorization', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/user/_current/authorization/:authz', {}, { - 'get': { method: 'GET', params: { authz: '@authz' } }, - 'delete': { method: 'DELETE', params: { authz: '@authz' }, errorHandler: true } - }); - }]); - -agate.factory('OAuthAuthorize', ['$http', - function ($http) { - return { - post: function (data) { - return $http.post(contextPath + '/ws/oauth2/authz', $.param(data), { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' } - }); - } - }; - }]); - -agate.factory('Password', ['$resource', '$http', - function ($resource, $http) { - return { - put: function (userId, data) { - return $http.put(contextPath + '/ws/user/' + userId + '/password', $.param(data), { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - errorHandler: true - }); - } - }; - }]); - -agate.factory('ConfirmResource', ['$http', - function ($http) { - return { - post: function (data) { - return $http.post(contextPath + '/ws/users/_confirm', $.param(data), { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' } - }); - } - }; - }]); - -agate.factory('PasswordResetResource', ['$http', - function ($http) { - return { - post: function (data) { - return $http.post(contextPath + '/ws/users/_reset_password', $.param(data), { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' } - }); - } - }; - }]); - -agate.factory('JoinResource', ['$http', - function ($http) { - return { - post: function (data) { - return $http.post(contextPath + '/ws/users/_join', $.param(data), { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' } - }); - } - }; - }]); - -agate.factory('ForgotUsernameResource', ['$http', - function ($http) { - return { - post: function (data) { - return $http.post(contextPath + '/ws/users/_forgot_username', $.param(data), { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' } - }); - } - }; - }]); - -agate.factory('ForgotPasswordResource', ['$http', - function ($http) { - return { - post: function (data) { - return $http.post(contextPath + '/ws/users/_forgot_password', $.param(data), { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - errorHandler: true - }); - } - }; - }]); - -agate.factory('JoinConfigResource', ['$resource', '$translate', - function ($resource, $translate) { - return $resource(contextPath + '/ws/config/join', { locale: $translate.use }); - }]); - -agate.factory('ClientConfig', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/config/client').get(); - }]); - -agate.factory('Session', ['$cookieStore', - function ($cookieStore) { - this.create = function (login, role, realm) { - this.login = login; - this.role = role; - this.realm = realm; - }; - this.destroy = function () { - this.login = null; - this.role = null; - this.realm = null; - $cookieStore.remove('agate_subject'); - $cookieStore.remove('agatesid'); - $cookieStore.remove('obibaid'); - }; - return this; - }]); - -agate.service('AuthenticationSharedService', ['$rootScope', '$q', '$http', '$log', '$cookies', 'authService', 'Session', 'CurrentSession', - function ($rootScope, $q, $http, $log, $cookies, authService, Session, CurrentSession) { - let isInitializingSession = false, isInitializedDeferred = $q.defer(), self = this; - - this.isSessionInitialized = function() { - return isInitializedDeferred.promise; - }; - - this.initSession = function() { - let deferred = $q.defer(); - - if(!isInitializingSession) { - isInitializingSession = true; - CurrentSession.get().$promise.then(function (data) { - Session.create(data.username, data.role, data.realm); - deferred.resolve(Session); - authService.loginConfirmed(data); - return data; - }).catch(function() { - deferred.reject(); - return $q.reject(); - }).finally(function() { - isInitializingSession = false; - isInitializedDeferred.resolve(true); - }); - } - - return deferred.promise; - }; - - this.login = function (param) { - $rootScope.authenticationError = false; - $rootScope.userBannedError = false; - var data = 'username=' + param.username + '&password=' + param.password; - $http.post(contextPath + '/ws/auth/sessions', data, { - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - errorHandler: true, - ignoreAuthModule: 'ignoreAuthModule' - }).then(function () { - self.initSession(); - }, function (response) { - var resp = response.data; - if (resp.messageTemplate && resp.messageTemplate === 'error.userBanned') { - $rootScope.userBannedError = true; - } - $rootScope.authenticationError = true; - Session.destroy(); - }); - }; - - this.isAuthenticated = function () { - return Session.login !== null && Session.login !== undefined; - }; - - this.isAuthorized = function (authorizedRoles) { - if (!angular.isArray(authorizedRoles)) { - if (authorizedRoles === '*') { - return true; - } - - authorizedRoles = [authorizedRoles]; - } - - var isAuthorized = false; - - angular.forEach(authorizedRoles, function (authorizedRole) { - var authorized = (!!Session.login && - Session.role === authorizedRole); - - if (authorized || authorizedRole === '*') { - isAuthorized = true; - } - }); - - return isAuthorized; - }; - - this.hasProfile = function () { - return Session.realm !== 'agate-ini-realm'; - }; - - this.canChangePassword = function () { - return Session.realm !== 'agate-user-realm'; - }; - - this.logout = function () { - $rootScope.authenticationError = false; - $rootScope.userBannedError = false; - $http({ method: 'DELETE', url: contextPath + '/ws/auth/session/_current', errorHandler: true }) - .then(function () { - Session.destroy(); - authService.loginCancelled(null, 'logout'); - }, function () { - Session.destroy(); - authService.loginCancelled(null, 'logout failure'); - }); - }; - }]); diff --git a/agate-webapp/src/main/webapp/app/ticket/ticket-controller.js b/agate-webapp/src/main/webapp/app/ticket/ticket-controller.js deleted file mode 100644 index 5fa5a0853..000000000 --- a/agate-webapp/src/main/webapp/app/ticket/ticket-controller.js +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.ticket - - .controller('TicketListController', ['$rootScope', '$scope', 'TicketsResource', - 'TicketResource', 'NOTIFICATION_EVENTS', - - function ($rootScope, $scope, TicketsResource, TicketResource, NOTIFICATION_EVENTS) { - var onSuccess = function(response) { - $scope.tickets = response; - $scope.loading = false; - }; - - var onError = function() { - $scope.loading = false; - }; - - $scope.loading = true; - TicketsResource.query({}, onSuccess, onError); - - $scope.deleteTicket = function (id) { - $scope.groupToDelete = id; - $rootScope.$broadcast(NOTIFICATION_EVENTS.showConfirmDialog, - {title: 'Delete Ticket', message: 'Are you sure to delete the ticket?'}, id); - }; - - $scope.$on(NOTIFICATION_EVENTS.confirmDialogAccepted, function (event, id) { - if ($scope.groupToDelete === id) { - - TicketResource.delete({id: id}, - function () { - $scope.loading = true; - TicketsResource.query({}, onSuccess, onError); - }); - } - }); - - // Extract header and claims from Base64 encoded token string - $scope.decodeToken = function() { - if (!$scope.token) { - $scope.jwt = null; - } else { - try { - var jwt = $scope.token.split('.'); - var header = JSON.stringify(JSON.parse(window.atob(jwt[0])), null, 4); - var claims = JSON.stringify(JSON.parse(window.atob(jwt[1])), null, 4); - $scope.jwt = { header: header, claims: claims }; - } catch(err) { - $scope.jwt = null; - } - } - }; - - $scope.token = null; - $scope.jwt = null; - }]) - .controller('TicketViewController', ['$scope', '$routeParams', 'TicketResource', - - function ($scope, $routeParams, TicketResource) { - - - TicketResource.get({id: $routeParams.id}, function(ticket) { - $scope.ticket = ticket; - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/ticket/ticket-router.js b/agate-webapp/src/main/webapp/app/ticket/ticket-router.js deleted file mode 100644 index d51240d0d..000000000 --- a/agate-webapp/src/main/webapp/app/ticket/ticket-router.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.ticket - - .config(['$routeProvider', - function ($routeProvider) { - $routeProvider - .when('/tickets', { - templateUrl: 'app/ticket/views/ticket-list.html', - controller: 'TicketListController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/ticket/:id', { - templateUrl: 'app/ticket/views/ticket-view.html', - controller: 'TicketViewController', - access: { - authorizedRoles: ['agate-administrator'] - } - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/ticket/ticket-service.js b/agate-webapp/src/main/webapp/app/ticket/ticket-service.js deleted file mode 100644 index 687cabd47..000000000 --- a/agate-webapp/src/main/webapp/app/ticket/ticket-service.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.ticket - - .factory('TicketsResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/tickets', {}, { - 'get': {method: 'GET', errorHandler: true} - }); - }]) - - .factory('TicketResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/ticket/:id', {}, { - 'get': {method: 'GET'} - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/ticket/ticket.js b/agate-webapp/src/main/webapp/app/ticket/ticket.js deleted file mode 100644 index 57516e084..000000000 --- a/agate-webapp/src/main/webapp/app/ticket/ticket.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.ticket = angular.module('agate.ticket', [ - 'agate.config', - 'obiba.form', - 'obiba.notification', - 'angularMoment', - 'ngResource', - 'ngRoute', - 'ui.bootstrap', - 'ui', - 'pascalprecht.translate' -]); diff --git a/agate-webapp/src/main/webapp/app/ticket/views/ticket-list.html b/agate-webapp/src/main/webapp/app/ticket/views/ticket-list.html deleted file mode 100644 index cc74ef76e..000000000 --- a/agate-webapp/src/main/webapp/app/ticket/views/ticket-list.html +++ /dev/null @@ -1,110 +0,0 @@ - - -
- -

tickets

- -

- ticket.none -

- -

-

- -
-
-
- - - - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - -
IDticket.usernameauthorization.titleticket.createdticket.expiresticket.eventsticket.actions
- - - {{ticket.username}} - - - - - {{ticket.timestamps.created | amDateFormat:'YYYY-MM-DD HH:mm:ss'}} - () - - {{ticket.expires | amDateFormat:'YYYY-MM-DD HH:mm:ss'}} - () - - {{ticket.events.length}} - -
    -
  • - -
  • -
-
-
-
- -

ticket.token-decoder

- -

ticket.token-decoder-help

- -
-
-

ticket.encoded

- - - -
-
-

ticket.decoded

-

- ticket.token-none -

-
{{jwt.header}}
-.
-{{jwt.claims}}
-.
-[signature]
-
-
-
diff --git a/agate-webapp/src/main/webapp/app/ticket/views/ticket-view.html b/agate-webapp/src/main/webapp/app/ticket/views/ticket-view.html deleted file mode 100644 index 97435328e..000000000 --- a/agate-webapp/src/main/webapp/app/ticket/views/ticket-view.html +++ /dev/null @@ -1,130 +0,0 @@ - - -
-

-
    -
  1. tickets
  2. -
  3. {{ticket.id}}
  4. -
-

- - -
-
-

ticket.properties

- - - - - - - - - - - - - - - - - - - -
ticket.username - {{ticket.username}} -
ticket.created{{ticket.timestamps.created | amDateFormat:'YYYY-MM-DD HH:mm:ss'}}
ticket.expires{{ticket.expires | amDateFormat:'YYYY-MM-DD HH:mm:ss'}}
ticket.remembered
- -

authorization.title

- -

ticket.authorization-help

- -

- ticket.authorization-none -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
authorization.code{{ticket.authorization.code}}
authorization.username - {{ticket.authorization.username}} -
authorization.application - {{ticket.authorization.application}} -
authorization.redirectURI{{ticket.authorization.redirectURI}}
authorization.scopes - {{ticket.authorization.scopes.join(" ")}} -
authorization.created{{ticket.authorization.timestamps.created | amDateFormat:'YYYY-MM-DD HH:mm:ss'}}
-
-
-

ticket.events

- -
-
-
- - - - -
-
- -
-
- -
- - - - - - - - - - - - - - - -
ticket.eventApplicationticket.eventActionticket.eventTime
- {{event.application}} - {{event.action}}{{event.time | amDateFormat:'YYYY-MM-DD HH:mm:ss'}}
-
-
-
-
-
diff --git a/agate-webapp/src/main/webapp/app/user/attributes/attributes-controller.js b/agate-webapp/src/main/webapp/app/user/attributes/attributes-controller.js deleted file mode 100644 index c72f320f7..000000000 --- a/agate-webapp/src/main/webapp/app/user/attributes/attributes-controller.js +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.user - - .controller('AttributesFormController', ['$rootScope', '$scope', '$translate', '$log', '$uibModal', 'AttributesService', 'NOTIFICATION_EVENTS', - function ($rootScope, $scope, $translate, $log, $uibModal, AttributesService, NOTIFICATION_EVENTS) { - - $scope.$watch('attributes', function() { - $scope.nonConfigAttributes = AttributesService.findNonConfigAttributes($scope.attributes, $scope.attributesConfig); - }, true); - - /** - * Pops modal for adding new attribute - */ - $scope.addAttribute = function() { - $uibModal - .open({ - templateUrl: 'app/user/attributes/views/attribute-creation-form-modal.html', - controller: 'AttributeCreateFormModalController', - resolve: { - usedNames: function() { - return $scope.usedAttributeNames; - }, - attribute: function () { - return {}; - } - } - }) - .result.then(function (attribute) { - if ($scope.attributes) { - $scope.attributes.push(attribute); - } else { - $scope.attributes = [attribute]; - } - - $scope.usedAttributeNames.push(attribute.name); - - }, function () { - }); - }; - - /** - * Edits selected attribute - * @param attribute - */ - $scope.edit = function(attribute) { - $uibModal - .open({ - templateUrl: 'app/user/attributes/views/attribute-form-modal.html', - controller: 'AttributeFormModalController', - resolve: { - attribute: function () { - return attribute; - } - } - }) - .result.then(function (attribute) { - var index = $scope.attributes.map(function(item) { - return item.name === attribute.name; - }).indexOf(true); - - if (index !== -1) { - $scope.attributes[index] = attribute; - } - }, function () { - }); - }; - - /** - * Deletes a selected attribute from the list - * @param index - */ - $scope.delete = function(attribute) { - var titleKey = 'attribute.delete-dialog.title'; - var messageKey = 'attribute.delete-dialog.message'; - $translate([titleKey, messageKey], {name: attribute.name}) - .then(function (translation) { - $rootScope.$broadcast(NOTIFICATION_EVENTS.showConfirmDialog, - {title: translation[titleKey], message: translation[messageKey]}, attribute); - }); - }; - - /** - * Delete confirmation callback - */ - $scope.$on(NOTIFICATION_EVENTS.confirmDialogAccepted, function (event, attribute) { - var index = $scope.attributes.map(function(item, index) { - return item.name === attribute.name; - }).indexOf(true); - - if (index !== -1) { - $scope.attributes.splice(index, 1); - } - - }); - - }]) - - - .controller('AttributeCreateFormModalController', ['$scope', '$uibModalInstance', '$log', 'attribute', 'usedNames', 'AlertService', - function ($scope, $uibModalInstance, $log, attribute, usedNames, AlertService) { - - $scope.attribute = attribute; - $scope.usedNames = usedNames; - $scope.duplicated = false; - - /** - * Saves attribute changes - * @param form - */ - $scope.save = function (form) { - var duplicated = !form['attribute.name'].$error.required && usedNames.indexOf($scope.attribute.name) !== -1; - var duplicatedName = duplicated ? $scope.attribute.name : ''; // For validation message only - - if (form.$valid && !duplicated) { - $uibModalInstance.close($scope.attribute); - } - else { - if (duplicated) { - AlertService.alert({id: 'AttributeCreateFormModalController', type: 'danger', msgKey: 'attribute.error.duplicated', msgArgs: [duplicatedName]}); - } else { - AlertService.alert({id: 'AttributeCreateFormModalController', type: 'danger', msgKey: 'required', msgArgs: [duplicatedName]}); - } - - form['attribute.name'].$error.duplicated = duplicated; - $scope.form = form; - $scope.form.$invalid = duplicated ? true : $scope.form.$invalid; - $scope.form.saveAttempted = true; - } - }; - - /** - * Closes modal - */ - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; - - }]) - - .controller('AttributeFormModalController', ['$scope', '$uibModalInstance', '$log', 'attribute', - function ($scope, $uibModalInstance, $log, attribute) { - $scope.attribute = $.extend(true, {}, attribute); - - /** - * Saves attribute changes - * @param form - */ - $scope.save = function (form) { - if (form.$valid) { - $uibModalInstance.close($scope.attribute); - } - else { - $scope.form = form; - $scope.form.saveAttempted = true; - } - }; - - /** - * Closes modal - */ - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; - - }]); - - - - - diff --git a/agate-webapp/src/main/webapp/app/user/attributes/attributes-directive.js b/agate-webapp/src/main/webapp/app/user/attributes/attributes-directive.js deleted file mode 100644 index 016c7d4f6..000000000 --- a/agate-webapp/src/main/webapp/app/user/attributes/attributes-directive.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.user - .directive('attributesView', [function () { - return { - restrict: 'E', - replace: true, - scope: { - attributes: '=', - attributesConfig: '=' - }, - templateUrl: 'app/user/attributes/views/attributes-view-template.html' - }; - }]) - - .directive('attributesForm', [function () { - return { - restrict: 'E', - replace: true, - controller: 'AttributesFormController', - scope: { - attributes: '=', - attributesConfig: '=', - usedAttributeNames: '=' - }, - templateUrl: 'app/user/attributes/views/attributes-form-template.html' - }; - }]) - - .directive('attributeItem', ['$compile', 'AttributesService', function ($compile, AttributesService) { - var linker = function(scope, element) { - if (scope.attributeConfig.type === 'BOOLEAN') { - scope.attribute.boolValue = scope.attribute.value === 'true'; - } - - scope.$watch('attribute.boolValue', function () { - if (scope.attributeConfig.type === 'BOOLEAN') { - scope.attribute.value = scope.attribute.boolValue ? 'true' : 'false'; - } - }); - - element.html(AttributesService.getAttributeItemTemplate(scope.attributeConfig)).show(); - $compile(element.contents())(scope); - }; - - return { - restrict: 'E', - link: linker, - scope: { - attribute:'=', - attributeConfig:'=' - } - }; - }]); diff --git a/agate-webapp/src/main/webapp/app/user/attributes/attributes-filter.js b/agate-webapp/src/main/webapp/app/user/attributes/attributes-filter.js deleted file mode 100644 index 5f3b12a13..000000000 --- a/agate-webapp/src/main/webapp/app/user/attributes/attributes-filter.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.user - - .filter('nonConfigAttributes', ['AttributesService', function(AttributesService) { - return function(attributes, attributesConfig) { - return AttributesService.findNonConfigAttributes(attributes, attributesConfig); - }; - }]) - - .filter('requiredConfigAttributes', ['AttributesService', function(AttributesService) { - return function(attributeConfigPairs) { - return AttributesService.findRequiredConfigAttributes(attributeConfigPairs); - }; - }]) - - .filter('nonRequiredConfigAttributes', ['AttributesService', function(AttributesService) { - return function(attributeConfigPairs) { - return AttributesService.findNonRequiredConfigAttributes(attributeConfigPairs); - }; - }]) - - .filter('namesFromAttributeConfigPairs', ['AttributesService', function(AttributesService) { - return function(attributeConfigPairs) { - return AttributesService.getUsedAttributeNames(attributeConfigPairs); - }; - }]); diff --git a/agate-webapp/src/main/webapp/app/user/attributes/attributes-service.js b/agate-webapp/src/main/webapp/app/user/attributes/attributes-service.js deleted file mode 100644 index 9ed846438..000000000 --- a/agate-webapp/src/main/webapp/app/user/attributes/attributes-service.js +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.user - .factory('AttributesService', ['$log', - function ($log) { - - return { - 'findNonConfigAttributes' : function(attributes, attributesConfig) { - - if (attributes && attributesConfig) { - return attributes.filter(function (attribute) { - return attributesConfig.filter(function (attributeConfig) { - return attributeConfig.name === attribute.name; - }).length === 0; - }); - } - - return []; - }, - - 'findConfigAttributes' : function(attributes, attributesConfig) { - if (attributes && attributesConfig) { - return attributes.filter(function (attribute) { - return attributesConfig.filter(function (attributeConfig) { - var found = attributeConfig.name === attribute.name; - if (found) attribute.type = attributeConfig.type; - return found; - }).length > 0; - }); - } - - return []; - }, - - 'findNewAttributes': function(attributes, newAttributes) { - if (attributes) { - var newones = - newAttributes.filter(function (newAttribute) { - return attributes.filter(function (attribute) { - return newAttribute.name === attribute.name; - }).length === 0; - }); - - return newones; - } - - return newAttributes; - }, - - 'findRequiredConfigAttributes': function(attributeConfigPairs) { - if (attributeConfigPairs && attributeConfigPairs.length > 0) { - return attributeConfigPairs.filter(function(attributeConfigPair) { - return attributeConfigPair.attributeConfig.required; - }); - } - - return []; - }, - - 'findNonRequiredConfigAttributes': function(attributeConfigPairs) { - if (attributeConfigPairs) { - return attributeConfigPairs.filter(function(attributeConfigPair) { - return !attributeConfigPair.attributeConfig.required; - }); - } - - return []; - }, - - 'getAttributeConfigPairs' :function(attributes, attributesConfig) { - var result = []; - - if (attributesConfig && attributesConfig.length > 0) { - if (attributes) { - result = createAttributeConfigPair(attributes, attributesConfig); - var unused = findUnusedAttributesConfig(attributes, attributesConfig); - if (unused) { - unused.forEach(function(attributeConfig){ - result.push({attribute: createAttributeFromConfig(attributeConfig), attributeConfig: attributeConfig}); - }); - } - } else { - attributesConfig.forEach(function(attributeConfig) { - result.push({attribute: createAttributeFromConfig(attributeConfig), attributeConfig: attributeConfig}); - }); - } - } - - return result; - }, - - 'getUsedAttributeNames': function (attributes, attributesConfig) { - var result = []; - - if (attributes) { - result = result.concat(attributes.map(function (attribute) { - return attribute.name; - })); - } - - if (attributesConfig) { - result = result.concat(attributesConfig.map(function (attribute) { - return attribute.name; - })); - } - - return result; - }, - - 'getAttributeItemTemplate' : function(attributeConfig) { - var required = attributeConfig.required; - var template = ''; - switch (attributeConfig.type) { - case 'BOOLEAN': - template = booleanTemplate(required); - break; - case 'NUMBER': - case 'INTEGER': - case 'STRING': - if (attributeConfig.values && attributeConfig.values.length > 0) { - template = singleChosenTemplate(required); - } else { - template = inputTemplate(required); - } - break; - - } - - return template; - }, - - 'mergeConfigPairAttributes': function(attributes, attributeConfigPairs) { - var pairedAttributes = (attributeConfigPairs || []).map(function(attributeConfigPair){ - return { - name: attributeConfigPair.attribute.name, - value: attributeConfigPair.attribute.value - }; - }); - - if (attributes && attributes.length > 0) { - let rawAttributes = attributes - .map((attr) => { - return { - name: attr.name, - value: attr.value - } - }); - return rawAttributes - .concat(this.findNewAttributes(rawAttributes, pairedAttributes)); - } - - return pairedAttributes; - } - }; - - function findUnusedAttributesConfig(attributes, attributesConfig) { - return attributes ? attributesConfig.filter(findUnusedAttributesConfigInternal(attributes.map(function(attribute){ - return attribute.name; - }))) : attributesConfig; - } - - function createAttributeConfigPair(attributes, attributesConfig) { - var result = []; - if (attributes && attributes.length > 0) { - attributes.forEach(function(attribute){ - - var attributeConfig = attributesConfig.filter(filterAttributeConfig(attribute))[0]; - if (attributeConfig) { - result.push( - { - attribute: attribute, - attributeConfig: attributesConfig.filter(filterAttributeConfig(attribute))[0] - }); - } - }); - } - - return result; - } - - function createAttributeFromConfig(attributeConfig) { - var attribute = { - name: attributeConfig.name, - description: attributeConfig.description - }; - switch (attributeConfig.type) { - case 'BOOLEAN': - attribute.value = 'false'; - break; - case 'NUMBER': - case 'INTEGER': - case 'STRING': - // leave empty - break; - } - - return attribute; - } - - /** - * Filters the array of config to match the corresponding attribute's config - * @param attribute - * @returns {Function} - */ - function filterAttributeConfig(attribute) { - return function(conf) { - return conf.name === attribute.name; - }; - } - - /** - * Returns attributes that are not in the input list - * @param attribute - * @returns {Function} - */ - function findUnusedAttributesConfigInternal(attributes) { - return function(conf) { - return attributes.indexOf(conf.name) === -1; - }; - } - - function inputTemplate(required) { - var requiredAttr = required ? 'required="true"' : ''; - return '
'; - } - - function singleChosenTemplate(required) { - var requiredAttr = required ? 'required' : ''; - var requiredMarker = required ? '*' : ''; - return '
' + - '' + - '
{{attribute.description}}
'; - } - - function booleanTemplate(required) { - var requiredAttr = required ? 'required="true"' : ''; - return '
'; - } - - }]); diff --git a/agate-webapp/src/main/webapp/app/user/attributes/views/attribute-creation-form-modal.html b/agate-webapp/src/main/webapp/app/user/attributes/views/attribute-creation-form-modal.html deleted file mode 100644 index b228c2b0a..000000000 --- a/agate-webapp/src/main/webapp/app/user/attributes/views/attribute-creation-form-modal.html +++ /dev/null @@ -1,40 +0,0 @@ - - - diff --git a/agate-webapp/src/main/webapp/app/user/attributes/views/attribute-form-modal.html b/agate-webapp/src/main/webapp/app/user/attributes/views/attribute-form-modal.html deleted file mode 100644 index 65729f3c7..000000000 --- a/agate-webapp/src/main/webapp/app/user/attributes/views/attribute-form-modal.html +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/agate-webapp/src/main/webapp/app/user/attributes/views/attributes-form-template.html b/agate-webapp/src/main/webapp/app/user/attributes/views/attributes-form-template.html deleted file mode 100644 index 259f26dfc..000000000 --- a/agate-webapp/src/main/webapp/app/user/attributes/views/attributes-form-template.html +++ /dev/null @@ -1,56 +0,0 @@ -
- - - attribute.add-label - - -

- attribute.none -

- -
-
-
- - - - -
-
- -
-
- -
- - - - - - - - - - - - - - - -
attribute.nameattribute.valueattribute.actions
- {{attribute.name}} - - {{attribute.value}} - -
    -
  • - -
  • -
  • - -
  • -
-
-
-
-
diff --git a/agate-webapp/src/main/webapp/app/user/attributes/views/attributes-view-template.html b/agate-webapp/src/main/webapp/app/user/attributes/views/attributes-view-template.html deleted file mode 100644 index dc93205c0..000000000 --- a/agate-webapp/src/main/webapp/app/user/attributes/views/attributes-view-template.html +++ /dev/null @@ -1,24 +0,0 @@ -
- -

attributes

- - - - - - - - - - - - - - - -
attribute.nameattribute.value
- {{attribute.name}} - - {{attribute.value}} -
-
diff --git a/agate-webapp/src/main/webapp/app/user/user-controller.js b/agate-webapp/src/main/webapp/app/user/user-controller.js deleted file mode 100644 index aba519fb5..000000000 --- a/agate-webapp/src/main/webapp/app/user/user-controller.js +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.user - - .constant('STUDY_EVENTS', { - studyUpdated: 'event:study-updated' - }) - - .controller('UserListController', - [ - '$rootScope', - '$scope', - '$translate', - 'UsersResource', - 'UserResource', - 'UserResetPasswordResource', - 'NOTIFICATION_EVENTS', - 'LocaleStringUtils', - 'RealmsService', - function ($rootScope, - $scope, - $translate, - UsersResource, - UserResource, - UserResetPasswordResource, - NOTIFICATION_EVENTS, - LocaleStringUtils, - RealmsService) { - var onSuccess = function(response) { - $scope.users = response; - response.forEach(function(u) { - u.applicationsGroups = {}; - - if (u.groupApplications) { - u.groupApplications.forEach(function (ga) { - if (!u.applicationsGroups[ga.application]) - u.applicationsGroups[ga.application] = []; - - u.applicationsGroups[ga.application].push(ga.group); - }); - } - }); - $scope.loading = false; - }; - - var onError = function() { - $scope.loading = false; - }; - - $scope.loading = true; - $scope.users = UsersResource.query({}, onSuccess, onError); - // To keep ng-if instead of using ng-show, declare search filter as an object - $scope.search = {text: ''}; - - function getRealms() { - RealmsService.getRealmsNameTitleMap($translate.use()).then(function (realms) { - $scope.realms = realms; - }); - } - - $rootScope.$on('$translateChangeSuccess', function () { - getRealms(); - }); - - /** - * Deletes a user - * @param index - */ - $scope.delete = function (user) { - $scope.userToDelete = user.id; - if (user) { - $rootScope.$broadcast(NOTIFICATION_EVENTS.showConfirmDialog, - { - titleKey: 'user.delete-dialog.title', - messageKey:'user.delete-dialog.message', - messageArgs: [user.name] - }, user.id - ); - } - }; - - /** - * Delete use confirmation callback - */ - $scope.$on(NOTIFICATION_EVENTS.confirmDialogAccepted, function (event, id) { - if ($scope.userToDelete === id) { - UserResource.delete({id: id}, - function () { - UsersResource.query({}, onSuccess, onError); - }); - - delete $scope.userToDelete; - } - }); - - $scope.getStatusTitle = function(status) { - return LocaleStringUtils.translate('user.' + status); - }; - - $scope.resetPassword = function (user) { - $scope.selectedUser = user.id; - $rootScope.$broadcast(NOTIFICATION_EVENTS.showConfirmDialog, - {title: 'Reset Password', message: 'Are you sure to send a reset password message for ' + user.name + '?'}, user.id); - }; - - $scope.$on(NOTIFICATION_EVENTS.confirmDialogAccepted, function (event, id) { - if ($scope.selectedUser === id) { - UserResetPasswordResource.resetPassword({id: id}); - } - }); - - getRealms(); - }]) - - .controller('UserEditController', - ['$rootScope', - '$scope', - '$routeParams', - '$log', - '$location', - '$translate', - '$q', - 'UsersResource', - 'UserResource', - 'FormServerValidation', - 'UserStatusResource', - 'GroupsResource', - 'ApplicationsResource', - 'ConfigurationResource', - 'AttributesService', - 'AlertService', - 'RealmsService', - - function ($rootScope, - $scope, - $routeParams, - $log, - $location, - $translate, - $q, - UsersResource, - UserResource, - FormServerValidation, - UserStatusResource, - GroupsResource, - ApplicationsResource, - ConfigurationResource, - AttributesService, - AlertService, - RealmsService) { - - $scope.roles = ['agate-administrator', 'agate-user']; - $scope.attributesConfig = []; - ConfigurationResource.get(function(config) { - $scope.languages = config.languages; - $scope.attributesConfig = config.userAttributes || []; - if ($routeParams.id) { - UserResource.get({id: $routeParams.id}).$promise.then(function(user) { - $scope.status.selected = $scope.status.list[UserStatusResource.findIndex(user.status)]; - $scope.attributeConfigPairs = AttributesService.getAttributeConfigPairs(user.attributes, $scope.attributesConfig); - $scope.usedAttributeNames = AttributesService.getUsedAttributeNames(user.attributes, $scope.attributesConfig); - $scope.realm.selected = $scope.realmList.filter(function(realm) { - return user.realm === realm.name; - }).pop(); - $scope.user = user; - }); - } else { - $scope.user = { role: 'agate-user'}; - $scope.profile = { - password: null, - confirmPassword: null - }; - } - }); - - $scope.groupList = []; - $scope.applicationList = []; - $q.all([RealmsService.getRealmsForLanguage($translate.use()), GroupsResource.query().$promise, ApplicationsResource.query().$promise]).then(function (resolves) { - var realms = resolves[0]; - $scope.realmList = realms; - $scope.realm = {selected: realms[0]}; - - var groups = resolves[1]; - $scope.groupList = groups.map(function (group) { - return group.name; - }); - - var applications = resolves[2]; - $scope.applicationList = applications.map(function (application) { - return application.id; - }); - }); - - var statusValueList = UserStatusResource.listAsNameValue(); - - $scope.profile = null; - $scope.status = { - list: statusValueList, - selected: statusValueList[UserStatusResource.activeIndex()] - }; - - var saveErrorHandler = function (response) { - $scope.form.saveAttempted = true; - AlertService.alert({id: 'UserEditController', type: 'danger', msgKey: 'fix-error'}); - FormServerValidation.error(response, $scope.form); - }; - - /** - * Updated an existing user properties and attributes - */ - var updateUser = function () { - $scope.user.attributes = - AttributesService.mergeConfigPairAttributes($scope.user.attributes, $scope.attributeConfigPairs); - - $scope.user.$save( - function (user) { - $location.path('/user/' + user.id).replace(); - }, - saveErrorHandler); - }; - - /** - * Create a new user with properties and attributes - */ - var createUser = function() { - if ($scope.profile.password !== $scope.profile.confirmPassword) { - $scope.form.saveAttempted = true; - $scope.form.$invalid = true; - AlertService.alert({id: 'UserEditController', type: 'danger', msgKey: 'password.messages.error.dontmatch'}); - return; - } - - $scope.profile.user = $scope.user; - $scope.user.attributes = ($scope.attributeConfigPairs || []).map(function(attributeConfigPair){ - return attributeConfigPair.attribute; - }); - - $scope.profile.confirmPassword = undefined; - - UsersResource.save($scope.profile, - function (resource, getResponseHeaders) { - var parts = getResponseHeaders().location.split('/'); - $location.path('/user/' + parts[parts.length - 1]).replace(); - }, - saveErrorHandler); - }; - - $scope.save = function () { - if (!$scope.form.$valid) { - $scope.form.saveAttempted = true; - AlertService.alert({id: 'UserEditController', type: 'danger', msgKey: 'fix-error'}); - return; - } - - $scope.user.status = $scope.status.selected.value; - $scope.user.realm = $scope.realm.selected.name; - - if ($scope.user.id) { - updateUser(); - } else { - createUser(); - } - }; - - /** - * Cancels the edit mode - */ - $scope.cancel = function () { - if ($scope.user.id) { - $location.path('/user' + ($scope.user.id ? '/' + $scope.user.id : '')).replace(); - } else { - $location.path('/users'); - } - }; - - $rootScope.$on('$translateChangeSuccess', function (event, locale) { - $scope.locale = locale; - }); - - }]) - - .controller('UserViewController', - ['$rootScope', - '$scope', - '$routeParams', - '$log', - '$location', - '$translate', - 'UserResource', - 'UserOTPResource', - 'UserAuthorizationsResource', - 'UserAuthorizationResource', - 'ConfigurationResource', - 'AttributesService', - 'AlertService', - 'RealmsService', - - function ($rootScope, - $scope, - $routeParams, - $log, - $location, - $translate, - UserResource, - UserOTPResource, - UserAuthorizationsResource, - UserAuthorizationResource, - ConfigurationResource, - AttributesService, - AlertService, - RealmsService) { - - - function getRealms() { - RealmsService.getRealms().then(function (realms) { - $scope.user = $routeParams.id ? - UserResource.get({id: $routeParams.id}, function (user) { - ConfigurationResource.get(function (config) { - $scope.userConfigAttributes = AttributesService.findConfigAttributes(user.attributes, config.userAttributes); - $scope.userNonConfigAttributes = config.userAttributes ? AttributesService.findNonConfigAttributes(user.attributes, config.userAttributes) : user.attributes; - }); - - var realm = realms.filter(function(realm) { - return user.realm === realm.name; - }).pop(); - user.realmTitle = realm ? realm.title : realm.name; - return user; - }) : {}; - }); - } - - $scope.authorizations = $routeParams.id ? - UserAuthorizationsResource.query({id: $routeParams.id}) : []; - - $scope.deleteAuthorization = function(authz) { - UserAuthorizationResource.delete({id: $routeParams.id, authz: authz.id}, function() { - $scope.authorizations = UserAuthorizationsResource.query({id: $routeParams.id}); - }); - }; - - $scope.deleteOTP = function() { - UserOTPResource.delete({id: $routeParams.id}, function() { - $scope.user.otpEnabled = false; - }); - }; - - $scope.onPasswordUpdated = function() { - AlertService.alert({id: 'UserViewController', type: 'success', msgKey: 'password.success', delay: 5000}); - }; - - $scope.locale = {language: $translate.use()}; - getRealms(); - $rootScope.$on('$translateChangeSuccess', function (event, locale) { - $scope.locale = locale; - getRealms(); - }); - }]) - - .controller('UserRequestListController', ['$rootScope', '$scope', '$route', '$http', 'UsersResource', 'UserResource', 'NOTIFICATION_EVENTS', - - function ($rootScope, $scope, $route, $http, UsersResource, UserResource, NOTIFICATION_EVENTS) { - var onSuccess = function(response) { - $scope.users = response; - response.forEach(function(u) { - u.applicationsGroups = {}; - - if (u.groupApplications) { - u.groupApplications.forEach(function (ga) { - if (!u.applicationsGroups[ga.application]) - u.applicationsGroups[ga.application] = []; - - u.applicationsGroups[ga.application].push(ga.group); - }); - } - }); - $scope.loading = false; - }; - - var onError = function() { - $scope.loading = false; - }; - - $scope.loading = true; - UsersResource.query({status: 'pending'}, onSuccess, onError); - - $scope.reject = function (user) { - $scope.requestToDelete = user.id; - $rootScope.$broadcast(NOTIFICATION_EVENTS.showConfirmDialog, - {title: 'Delete Request', message: 'Are you sure to delete the request?'}, user.id); - }; - - $scope.$on(NOTIFICATION_EVENTS.confirmDialogAccepted, function (event, id) { - if ($scope.requestToDelete === id) { - UserResource.delete({id: id}, function() { - $route.reload(); - }); - } - }); - - $scope.approve = function (user) { - $http.put(contextPath + '/ws/user/' + user.id + '/status', $.param({status: 'approved'}), { - headers: {'Content-Type': 'application/x-www-form-urlencoded'} - }).then(function() { - $route.reload(); - }); - }; - }]); diff --git a/agate-webapp/src/main/webapp/app/user/user-router.js b/agate-webapp/src/main/webapp/app/user/user-router.js deleted file mode 100644 index ee6a31d50..000000000 --- a/agate-webapp/src/main/webapp/app/user/user-router.js +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.user - .config(['$routeProvider', - function ($routeProvider) { - $routeProvider - .when('/users', { - templateUrl: 'app/user/views/user-list.html', - controller: 'UserListController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/users/requests', { - templateUrl: 'app/user/views/user-request-list.html', - controller: 'UserRequestListController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/user/new', { - templateUrl: 'app/user/views/user-form.html', - controller: 'UserEditController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/user/:id', { - templateUrl: 'app/user/views/user-view.html', - controller: 'UserViewController', - access: { - authorizedRoles: ['agate-administrator'] - } - }) - .when('/user/:id/edit', { - templateUrl: 'app/user/views/user-form.html', - controller: 'UserEditController', - access: { - authorizedRoles: ['agate-administrator'] - } - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/user/user-service.js b/agate-webapp/src/main/webapp/app/user/user-service.js deleted file mode 100644 index 5eedc406c..000000000 --- a/agate-webapp/src/main/webapp/app/user/user-service.js +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.user - .factory('UsersResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/users', {}, { - 'get': {method: 'GET', errorHandler: true}, - 'save': {method: 'POST', errorHandler: true} - }); - }]) - - .factory('UserResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/user/:id', {}, { - 'save': {method: 'PUT', params: {id: '@id'}, errorHandler: true}, - 'get': {method: 'GET', params: {id: '@id'}}, - 'delete': {method: 'DELETE', params: {id: '@id'}, errorHandler: true} - }); - }]) - - .factory('UserOTPResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/user/:id/otp', {}, { - 'delete': {method: 'DELETE', params: {id: '@id'}, errorHandler: true} - }); - }]) - - .factory('UserAuthorizationsResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/user/:id/authorizations', {}, { - 'get': {method: 'GET', params: {id: '@id'}} - }); - }]) - - .factory('UserAuthorizationResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/user/:id/authorization/:authz', {}, { - 'get': {method: 'GET', params: {id: '@id', authz: '@authz'}}, - 'delete': {method: 'DELETE', params: {id: '@id', authz: '@authz'}, errorHandler: true} - }); - }]) - - .factory('UserStatusResource', ['$log', '$filter', function ($log, $filter) { - var nameValueList = [ - {label: $filter('translate')('user.ACTIVE'), value: 'ACTIVE'}, - {label: $filter('translate')('user.PENDING'), value: 'PENDING'}, - {label: $filter('translate')('user.APPROVED'), value: 'APPROVED'}, - {label: $filter('translate')('user.INACTIVE'), value: 'INACTIVE'} - ]; - - return { - 'activeIndex': function () { - return 0; - }, - - 'listAsNameValue': function () { - return nameValueList; - }, - - 'findIndex': function (value) { - return nameValueList.map(function(nameValue) { - return nameValue.value; - }).indexOf(value); - } - }; - }]) - - .factory('UserResetPasswordResource', ['$resource', - function ($resource) { - return $resource(contextPath + '/ws/user/:id/reset_password', {}, { - 'resetPassword': {method: 'PUT', params: {id: '@id'}} - }); - }]); diff --git a/agate-webapp/src/main/webapp/app/user/user.js b/agate-webapp/src/main/webapp/app/user/user.js deleted file mode 100644 index 65d0b8e7f..000000000 --- a/agate-webapp/src/main/webapp/app/user/user.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2019 OBiBa. All rights reserved. - * - * This program and the accompanying materials - * are made available under the terms of the GNU Public License v3.0. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -'use strict'; - -agate.user = angular.module('agate.user', [ - 'agate.config', - 'obiba.form', - 'obiba.utils', - 'obiba.notification', - 'ngResource', - 'ngRoute', - 'ui.select', - 'ui.bootstrap', - 'ui', - 'pascalprecht.translate' -]); diff --git a/agate-webapp/src/main/webapp/app/user/views/user-access-info-form.html b/agate-webapp/src/main/webapp/app/user/views/user-access-info-form.html deleted file mode 100644 index e55c68996..000000000 --- a/agate-webapp/src/main/webapp/app/user/views/user-access-info-form.html +++ /dev/null @@ -1,70 +0,0 @@ - - -
- - -

- {{realm.selected.description}} -

-
- -
- - -

- user.role-help -

-
- -
- - -

- user.status-help -

-
- -
- - - - - {{group}} - - -

- user.groups-help -

-
- -
- - - - - {{application}} - - -

- user.applications-help -

-
- diff --git a/agate-webapp/src/main/webapp/app/user/views/user-form.html b/agate-webapp/src/main/webapp/app/user/views/user-form.html deleted file mode 100644 index af03eb074..000000000 --- a/agate-webapp/src/main/webapp/app/user/views/user-form.html +++ /dev/null @@ -1,49 +0,0 @@ - - -
- -

-
    -
  1. users
  2. -
  3. {{user.name}}user.new -
  4. -
-

- -
- - - -
-
-

user.general-info

-
-

attributes

- -
-
-

access

-
-
-
- - - - - -
-
diff --git a/agate-webapp/src/main/webapp/app/user/views/user-identification-info-form.html b/agate-webapp/src/main/webapp/app/user/views/user-identification-info-form.html deleted file mode 100644 index ebe36ee75..000000000 --- a/agate-webapp/src/main/webapp/app/user/views/user-identification-info-form.html +++ /dev/null @@ -1,35 +0,0 @@ - - -
-
- -
-
-
-
- -
-
- -
- - -
- -
- -
- -
- -
diff --git a/agate-webapp/src/main/webapp/app/user/views/user-list-header.html b/agate-webapp/src/main/webapp/app/user/views/user-list-header.html deleted file mode 100644 index 466d7113d..000000000 --- a/agate-webapp/src/main/webapp/app/user/views/user-list-header.html +++ /dev/null @@ -1,24 +0,0 @@ - - -
-

users

- -
- -
-
diff --git a/agate-webapp/src/main/webapp/app/user/views/user-list.html b/agate-webapp/src/main/webapp/app/user/views/user-list.html deleted file mode 100644 index 5394aab47..000000000 --- a/agate-webapp/src/main/webapp/app/user/views/user-list.html +++ /dev/null @@ -1,112 +0,0 @@ - - -
- -
- -

users-description

- - - user.add - - - - download - - -

- user.none -

- -

-

- -
-
-
- - - - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
user.nameuser.fullNameuser.emailuser.statususer.roleuser.groupsuser.applicationsuser.realmuser.2fauser.actions
- {{user.name}} - - {{user.firstName}} {{user.lastName}} - - {{user.email}} - - - - {{group}} - -
    -
  • {{app}}
  • -
  • {{app}} -
  • -
-
{{realms[user.realm]}} - - - -
    -
  • - -
  • -
  • - -
  • -
  • - -
  • -
-
-
-
-
diff --git a/agate-webapp/src/main/webapp/app/user/views/user-request-list.html b/agate-webapp/src/main/webapp/app/user/views/user-request-list.html deleted file mode 100644 index 86108135a..000000000 --- a/agate-webapp/src/main/webapp/app/user/views/user-request-list.html +++ /dev/null @@ -1,88 +0,0 @@ - - -
-
- -

- user.none-requests -

- -

-

- -

user.pending-requests-help

- -
-
-
- - - - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - -
user.nameuser.fullNameuser.emailuser.groupsuser.applicationsuser.actions
- {{user.name}} - - {{user.firstName}} {{user.lastName}} - - {{user.email}} - - {{group}} - -
    -
  • {{app}}
  • -
  • {{app}} -
  • -
-
-
    -
  • - -
  • -
  • - -
  • -
-
-
-
-
diff --git a/agate-webapp/src/main/webapp/app/user/views/user-view.html b/agate-webapp/src/main/webapp/app/user/views/user-view.html deleted file mode 100644 index 52e32444a..000000000 --- a/agate-webapp/src/main/webapp/app/user/views/user-view.html +++ /dev/null @@ -1,142 +0,0 @@ - - -
-

-
    -
  1. users
  2. -
  3. {{user.name}}
  4. -
-

- - - -
-
-

user.general-info

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
user.name{{user.name}}
user.firstName{{user.firstName}}
user.lastName{{user.lastName}}
user.email{{user.email}}
user.groups{{group}}
user.applications{{app}}
user.realm
user.role{{user.role}}
user.preferredLanguage{{'language.' + user.preferredLanguage | translate}}
user.status -
user.createdDate - {{user.timestamps.created | amDateFormat:'YYYY-MM-DD HH:mm:ss'}} -
user.lastLogin - -
{{userConfigAttribute.name}} - {{userConfigAttribute.value}} - -
- - - - - - - edit - -
-
- - -

user.authorizations

-

user.authorizations-help

-

user.authorizations-none

-
- - - - - - - - - - - - - - - -
authorization.applicationauthorization.scopesuser.actions
- {{authz.applicationName}} - - {{scope}} - - -
-
- -

user.two-factor-auth.title

-

user.two-factor-auth.enabled

-

user.two-factor-auth.disabled

-

user.two-factor-auth.unknown

- - - -
-
- -
diff --git a/agate-webapp/src/main/webapp/app/views/error.html b/agate-webapp/src/main/webapp/app/views/error.html deleted file mode 100644 index 86eefb476..000000000 --- a/agate-webapp/src/main/webapp/app/views/error.html +++ /dev/null @@ -1,24 +0,0 @@ - - -
-

errors.title

- -
-
- You are logged in as user "Admin". -
- -
- An error has occurred. -
-
-
diff --git a/agate-webapp/src/main/webapp/app/views/login.html b/agate-webapp/src/main/webapp/app/views/login.html deleted file mode 100644 index 3c0f27ddd..000000000 --- a/agate-webapp/src/main/webapp/app/views/login.html +++ /dev/null @@ -1,12 +0,0 @@ - - -
-
diff --git a/agate-webapp/src/main/webapp/app/views/main.html b/agate-webapp/src/main/webapp/app/views/main.html deleted file mode 100644 index 9793cbd24..000000000 --- a/agate-webapp/src/main/webapp/app/views/main.html +++ /dev/null @@ -1,39 +0,0 @@ - - -
-

main.title

-

main.subtitle

- -
-
-
- main.logged.userMessage -
-
- main.logged.adminMessage -
- - join.form.button - - - login.form.button - - - global.menu.myProfile - - - global.menu.logout - -
-
-
diff --git a/agate-webapp/src/main/webapp/app/views/oauth-authorize.html b/agate-webapp/src/main/webapp/app/views/oauth-authorize.html deleted file mode 100644 index 7eb2b897b..000000000 --- a/agate-webapp/src/main/webapp/app/views/oauth-authorize.html +++ /dev/null @@ -1,102 +0,0 @@ - - - -
-
-
-
-

-

-
-

oauth.title

- -
- oauth.application-access-denied -
-
- oauth.unknown-client-application -
- -
-
-

oauth.title

- -
-
- -
-
- -
-

- {{client.name}} oauth.grant-request -

- -
-

{{client.name}}

-

- {{client.description}} -

-
- -
-
oauth.review-permissions
-
-
-
-

{{appScope.application.name}}

-

- {{appScope.application.description}} -

-
    -
  • - {{scope.name}} - {{scope.description}} - oauth.all-permissions -
  • -
-
-
-

{{agateConfig.name}}

-

oauth.openid-request

-
    -
  • - {{scope.name}} - {{'oauth.openid-' + scope.name + '-description' | translate}} -
  • -
-
-
-
-
-
-
-
- - - - - - - -
-
-
-
-
-
-
-
-
diff --git a/agate-webapp/src/main/webapp/app/views/pagination-template.html b/agate-webapp/src/main/webapp/app/views/pagination-template.html deleted file mode 100644 index 7db0c6f1e..000000000 --- a/agate-webapp/src/main/webapp/app/views/pagination-template.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - diff --git a/agate-webapp/src/main/webapp/app/views/profile/profile-view.html b/agate-webapp/src/main/webapp/app/views/profile/profile-view.html deleted file mode 100644 index 262540628..000000000 --- a/agate-webapp/src/main/webapp/app/views/profile/profile-view.html +++ /dev/null @@ -1,13 +0,0 @@ - - -
-
- diff --git a/agate-webapp/src/main/webapp/favicon.ico b/agate-webapp/src/main/webapp/favicon.ico index 9937d43e36ce4828d8b299acf01c41e0df1a75e4..046948fb52db1ead968e7d8edc90e82348d4765e 100644 GIT binary patch literal 67646 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 T?=iaE+j}g^Ap!nh6b}49INcH7 literal 1150 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/agate-webapp/src/main/webapp/fonts/glyphicons-halflings-regular.ttf b/agate-webapp/src/main/webapp/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 1413fc609ab6f21774de0cb7e01360095584f65b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45404 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 G`u_lkUM?>H diff --git a/agate-webapp/src/main/webapp/fonts/glyphicons-halflings-regular.woff2 b/agate-webapp/src/main/webapp/fonts/glyphicons-halflings-regular.woff2 deleted file mode 100644 index 64539b54c3751a6d9adb44c8e3a45ba5a73b77f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18028 zcmV(~K+nH-Pew8T0RR9107h&84*&oF0I^&E07eM_0Rl|`00000000000000000000 z0000#Mn+Uk92y`7U;vDA2m}!b3WBL5f#qcZHUcCAhI9*rFaQJ~1&1OBl~F%;WnyLq z8)b|&?3j;$^FW}&KmNW53flIFARDZ7_Wz%hpoWaWlgHTHEHf()GI0&dMi#DFPaEt6 zCO)z0v0~C~q&0zBj^;=tv8q{$8JxX)>_`b}WQGgXi46R*CHJ}6r+;}OrvwA{_SY+o zK)H-vy{l!P`+NG*`*x6^PGgHH4!dsolgU4RKj@I8Xz~F6o?quCX&=VQ$Q{w01;M0? zKe|5r<_7CD z=eO3*x!r$aX2iFh3;}xNfx0v;SwBfGG+@Z;->HhvqfF4r__4$mU>Dl_1w;-9`~5rF~@!3;r~xP-hZvOfOx)A z#>8O3N{L{naf215f>m=bzbp7_(ssu&cx)Qo-{)!)Yz3A@Z0uZaM2yJ8#OGlzm?JO5gbrj~@)NB4@?>KE(K-$w}{};@dKY#K3+Vi64S<@!Z{(I{7l=!p9 z&kjG^P~0f46i13(w!hEDJga;*Eb z`!n|++@H8VaKG<9>VDh(y89J#=;Z$ei=GnD5TesW#|Wf)^D+9NKN4J3H5PF_t=V+Z zdeo8*h9+8&Zfc?>>1|E4B7MAx)^uy$L>szyXre7W|81fjy+RZ1>Gd}@@${~PCOXo) z$#HZd3)V3@lNGG%(3PyIbvyJTOJAWcN@Uh!FqUkx^&BuAvc)G}0~SKI`8ZZXw$*xP zum-ZdtPciTAUn$XWb6vrS=JX~f5?M%9S(=QsdYP?K%Odn0S0-Ad<-tBtS3W06I^FK z8}d2eR_n!(uK~APZ-#tl@SycxkRJ@5wmypdWV{MFtYBUY#g-Vv?5AEBj1 z`$T^tRKca*sn7gt%s@XUD-t>bij-4q-ilku9^;QJ3Mpc`HJ_EX4TGGQ-Og)`c~qm51<|gp7D@ zp#>Grssv^#A)&M8>ulnDM_5t#Al`#jaFpZ<#YJ@>!a$w@kEZ1<@PGs#L~kxOSz7jj zEhb?;W)eS}0IQQuk4~JT30>4rFJ3!b+77}>$_>v#2FFEnN^%(ls*o80pv0Q>#t#%H z@`Yy-FXQ9ULKh{Up&oA_A4B!(x^9&>i`+T|eD!&QOLVd(_avv-bFX~4^>o{%mzzrg_i~SBnr%DeE|i+^}|8?kaV(Z32{`vA^l!sp15>Z72z52FgXf z^8ZITvJ9eXBT1~iQjW|Q`Fac^ak$^N-vI^*geh5|*CdMz;n16gV_zk|Z7q8tFfCvU zJK^Pptnn0Rc~egGIAK}uv99VZm2WLPezQQ5K<`f zg{8Ll|GioPYfNheMj-7-S87=w4N0WxHP`1V6Y)0M&SkYzVrwp>yfsEF7wj&T0!}dB z)R~gGfP9pOR;GY_e0~K^^oJ-3AT+m~?Al!{>>5gNe17?OWz)$)sMH*xuQiB>FT2{i zQ>6U_8}Ay~r4li;jzG+$&?S12{)+<*k9 z<^SX#xY|jvlvTxt(m~C7{y{3g>7TX#o2q$xQO|fc<%8rE@A3=UW(o?gVg?gDV!0q6O!{MlX$6-Bu_m&0ms66 znWS&zr{O_4O&{2uCLQvA?xC5vGZ}KV1v6)#oTewgIMSnBur0PtM0&{R5t#UEy3I9) z`LVP?3f;o}sz*7g5qdTxJl^gk3>;8%SOPH@B)rmFOJ)m6?PlYa$y=RX%;}KId{m9R#2=LNwosF@OTivgMqxpRGe}5=LtAn?VVl6VWCFLD z7l#^^H8jY~42hR)OoVF#YDW(md!g(&pJ;yMj|UBAQa}UH?ED@%ci=*(q~Opn>kE2Q z_4Kgf|0kEA6ary41A;)^Ku(*nirvP!Y>{FZYBLXLP6QL~vRL+uMlZ?jWukMV*(dsn zL~~KA@jU)(UeoOz^4Gkw{fJsYQ%|UA7i79qO5=DOPBcWlv%pK!A+)*F`3WJ}t9FU3 zXhC4xMV7Z%5RjDs0=&vC4WdvD?Zi5tg4@xg8-GLUI>N$N&3aS4bHrp%3_1u9wqL)i z)XQLsI&{Hd&bQE!3m&D0vd!4D`l1$rt_{3NS?~lj#|$GN5RmvP(j3hzJOk=+0B*2v z)Bw133RMUM%wu_+$vbzOy?yk#kvR?xGsg-ipX4wKyXqd zROKp5))>tNy$HByaEHK%$mqd>-{Yoj`oSBK;w>+eZ&TVcj^DyXjo{DDbZ>vS2cCWB z(6&~GZ}kUdN(*2-nI!hvbnVy@z2E#F394OZD&Jb04}`Tgaj?MoY?1`{ejE2iud51% zQ~J0sijw(hqr_Ckbj@pm$FAVASKY(D4BS0GYPkSMqSDONRaFH+O2+jL{hIltJSJT~e)TNDr(}=Xt7|UhcU9eoXl&QZRR<9WomW%&m)FT~j zTgGd3-j}Uk%CRD;$@X)NNV9+RJbifYu>yr{FkO;p>_&njI> zyBHh_72bW;8}oGeY0gpHOxiV597j7mY<#?WMmkf5x~Kfk*re(&tG_mX<3&2cON*2u%V29tsXUv{#-ijs2>EuNH-x3) zPBpi+V6gI=wn}u164_j8xi-y(B?Au2o;UO=r6&)i5S3Mx*)*{_;u}~i4dh$`VgUS- zMG6t*?DXDYX0D2Oj31MI!HF>|aG8rjrOPnxHu4wZl;!=NGjjDoBpXf?ntrwt^dqxm zs(lE@*QB3NH)!`rH)5kks-D89g@UX&@DU9jvrsY)aI=9b4nPy3bfdX_U;#?zsan{G>DKob2LnhCJv8o}duQK)qP{7iaaf2=K`a-VNcfC582d4a z>sBJA*%S|NEazDxXcGPW_uZ&d7xG`~JB!U>U(}acUSn=FqOA~(pn^!aMXRnqiL0;? zebEZYouRv}-0r;Dq&z9>s#Rt1HL`0p4bB)A&sMyn|rE_9nh z?NO*RrjET8D4s(-`nS{MrdYtv*kyCnJKbsftG2D#ia@;42!8xd?a3P(&Y?vCf9na< zQ&Ni*1Qel&Xq{Z?=%f0SRqQt5m|Myg+8T=GDc)@^};=tM>9IDr7hdvE9-M@@<0pqv45xZTeNecbL- zWFQt4t`9>j8~X%lz}%We>Kzh_=`XO}!;4!OWH?=p*DOs#Nt({k^IvtBEL~Qafn)I^ zm*k{y7_bIs9YE}0B6%r`EIUH8US+MGY!KQA1fi-jCx9*}oz2k1nBsXp;4K<_&SN}}w<)!EylI_)v7}3&c)V;Cfuj*eJ2yc8LK=vugqTL><#65r6%#2e| zdYzZ)9Uq7)A$ol&ynM!|RDHc_7?FlWqjW>8TIHc`jExt)f5W|;D%GC#$u!%B*S%Z0 zsj&;bIU2jrt_7%$=!h4Q29n*A^^AI8R|stsW%O@?i+pN0YOU`z;TVuPy!N#~F8Z29 zzZh1`FU(q31wa>kmw{$q=MY>XBprL<1)Py~5TW4mgY%rg$S=4C^0qr+*A^T)Q)Q-U zGgRb9%MdE-&i#X3xW=I`%xDzAG95!RG9)s?v_5+qx`7NdkQ)If5}BoEp~h}XoeK>kweAMxJ8tehagx~;Nr_WP?jXa zJ&j7%Ef3w*XWf?V*nR)|IOMrX;$*$e23m?QN` zk>sC^GE=h6?*Cr~596s_QE@>Nnr?{EU+_^G=LZr#V&0fEXQ3IWtrM{=t^qJ62Sp=e zrrc>bzX^6yFV!^v7;>J9>j;`qHDQ4uc92eVe6nO@c>H=ouLQot``E~KLNqMqJ7(G+?GWO9Ol+q$w z!^kMv!n{vF?RqLnxVk{a_Ar;^sw0@=+~6!4&;SCh^utT=I zo&$CwvhNOjQpenw2`5*a6Gos6cs~*TD`8H9P4=#jOU_`%L!W;$57NjN%4 z39(61ZC#s7^tv`_4j}wMRT9rgDo*XtZwN-L;Qc$6v8kKkhmRrxSDkUAzGPgJ?}~_t zkwoGS4=6lsD`=RL|8L3O9L()N)lmEn-M15fRC{dhZ}7eYV%O-R^gsAp{q4 z!C1}_T8gy^v@SZ5R&Li5JMJy+K8iZw3LOGA0pN1~y@w7RRl#F()ii6Y5mr~Mdy@Kz z@FT4cm^I&#Fu_9IX(HAFP{XLbRALqm&)>m_we>a`hfv?eE|t z?YdDp2yAhj-~vuw^wzVDuj%w?exOcOT(ls(F*ceCe(C5HlN{lcQ;}|mRPqFDqLEzw zR7ldY+M6xe$$qLwekmk{Z&5cME$gpC?-8)f0m$rqaS|mj9ATNJvvyCgs(f2{r;2E!oy$k5{jik#(;S>do<#m0wVcU<}>)VtYmF9O0%(C>GDzPgh6X z9OkQLMR~y7=|MtaU!LDPPY7O)L{X#SC+M|v^X2CZ?$GS>U_|aC(VA(mIvCNk+biD| zSpj>gd(v>_Cbq>~-x^Y3o|?eHmuC?E&z>;Ij`%{$Pm$hI}bl0Kd`9KD~AchY+goL1?igDxf$qxL9< z4sW@sD)nwWr`T>e2B8MQN|p*DVTT8)3(%AZ&D|@Zh6`cJFT4G^y6`(UdPLY-&bJYJ z*L06f2~BX9qX}u)nrpmHPG#La#tiZ23<>`R@u8k;ueM6 znuSTY7>XEc+I-(VvL?Y>)adHo(cZ;1I7QP^q%hu#M{BEd8&mG_!EWR7ZV_&EGO;d(hGGJzX|tqyYEg2-m0zLT}a{COi$9!?9yK zGN7&yP$a|0gL`dPUt=4d^}?zrLN?HfKP0_gdRvb}1D73Hx!tXq>7{DWPV;^X{-)cm zFa^H5oBDL3uLkaFDWgFF@HL6Bt+_^g~*o*t`Hgy3M?nHhWvTp^|AQDc9_H< zg>IaSMzd7c(Sey;1SespO=8YUUArZaCc~}}tZZX80w%)fNpMExki-qB+;8xVX@dr; z#L52S6*aM-_$P9xFuIui;dN#qZ_MYy^C^hrY;YAMg;K`!ZpKKFc z9feHsool)`tFSS}Su|cL0%F;h!lpR+ym|P>kE-O`3QnHbJ%gJ$dQ_HPTT~>6WNX41 zoDEUpX-g&Hh&GP3koF4##?q*MX1K`@=W6(Gxm1=2Tb{hn8{sJyhQBoq}S>bZT zisRz-xDBYoYxt6--g2M1yh{#QWFCISux}4==r|7+fYdS$%DZ zXVQu{yPO<)Hn=TK`E@;l!09aY{!TMbT)H-l!(l{0j=SEj@JwW0a_h-2F0MZNpyucb zPPb+4&j?a!6ZnPTB>$t`(XSf-}`&+#rI#`GB> zl=$3HORwccTnA2%>$Nmz)u7j%_ywoGri1UXVNRxSf(<@vDLKKxFo;5pTI$R~a|-sQ zd5Rfwj+$k1t0{J`qOL^q>vZUHc7a^`cKKVa{66z?wMuQAfdZBaVVv@-wamPmes$d! z>gv^xx<0jXOz;7HIQS z4RBIFD?7{o^IQ=sNQ-k!ao*+V*|-^I2=UF?{d>bE9avsWbAs{sRE-y`7r zxVAKA9amvo4T}ZAHSF-{y1GqUHlDp4DO9I3mz5h8n|}P-9nKD|$r9AS3gbF1AX=2B zyaK3TbKYqv%~JHKQH8v+%zQ8UVEGDZY|mb>Oe3JD_Z{+Pq%HB+J1s*y6JOlk`6~H) zKt)YMZ*RkbU!GPHzJltmW-=6zqO=5;S)jz{ zFSx?ryqSMxgx|Nhv3z#kFBTuTBHsViaOHs5e&vXZ@l@mVI37<+^KvTE51!pB4Tggq zz!NlRY2ZLno0&6bA|KHPYOMY;;LZG&_lzuLy{@i$&B(}_*~Zk2 z>bkQ7u&Ww%CFh{aqkT{HCbPbRX&EvPRp=}WKmyHc>S_-qbwAr0<20vEoJ(!?-ucjE zKQ+nSlRL^VnOX0h+WcjGb6WI(8;7bsMaHXDb6ynPoOXMlf9nLKre;w*#E_whR#5!! z!^%_+X3eJVKc$fMZP;+xP$~e(CIP1R&{2m+iTQhDoC8Yl@kLM=Wily_cu>7C1wjVU z-^~I0P06ZSNVaN~A`#cSBH2L&tk6R%dU1(u1XdAx;g+5S^Hn9-L$v@p7CCF&PqV{Z?R$}4EJi36+u2JP7l(@fYfP!=e#76LGy^f>~vs0%s*x@X8`|5 zGd6JOHsQ=feES4Vo8%1P_7F5qjiIm#oRT0kO1(?Z_Dk6oX&j=Xd8Klk(;gk3S(ZFnc^8Gc=d;8O-R9tlGyp=2I@1teAZpGWUi;}`n zbJOS_Z2L16nVtDnPpMn{+wR9&yU9~C<-ncppPee`>@1k7hTl5Fn_3_KzQ)u{iJPp3 z)df?Xo%9ta%(dp@DhKuQj4D8=_!*ra#Ib&OXKrsYvAG%H7Kq|43WbayvsbeeimSa= z8~{7ya9ZUAIgLLPeuNmSB&#-`Je0Lja)M$}I41KHb7dQq$wgwX+EElNxBgyyLbA2* z=c1VJR%EPJEw(7!UE?4w@94{pI3E%(acEYd8*Wmr^R7|IM2RZ-RVXSkXy-8$!(iB* zQA`qh2Ze!EY6}Zs7vRz&nr|L60NlIgnO3L*Yz2k2Ivfen?drnVzzu3)1V&-t5S~S? zw#=Sdh>K@2vA25su*@>npw&7A%|Uh9T1jR$mV*H@)pU0&2#Se`7iJlOr$mp79`DKM z5vr*XLrg7w6lc4&S{So1KGKBqcuJ!E|HVFB?vTOjQHi)g+FwJqX@Y3q(qa#6T@3{q zhc@2T-W}XD9x4u+LCdce$*}x!Sc#+rH-sCz6j}0EE`Tk*irUq)y^za`}^1gFnF)C!yf_l_}I<6qfbT$Gc&Eyr?!QwJR~RE4!gKVmqjbI+I^*^ z&hz^7r-dgm@Mbfc#{JTH&^6sJCZt-NTpChB^fzQ}?etydyf~+)!d%V$0faN(f`rJb zm_YaJZ@>Fg>Ay2&bzTx3w^u-lsulc{mX4-nH*A(32O&b^EWmSuk{#HJk}_ULC}SB(L7`YAs>opp9o5UcnB^kVB*rmW6{s0&~_>J!_#+cEWib@v-Ms`?!&=3fDot`oH9v&$f<52>{n2l* z1FRzJ#yQbTHO}}wt0!y8Eh-0*|Um3vjX-nWH>`JN5tWB_gnW%; zUJ0V?_a#+!=>ahhrbGvmvObe8=v1uI8#gNHJ#>RwxL>E^pT05Br8+$@a9aDC1~$@* zicSQCbQcr=DCHM*?G7Hsovk|{$3oIwvymi#YoXeVfWj{Gd#XmnDgzQPRUKNAAI44y z{1WG&rhIR4ipmvBmq$BZ*5tmPIZmhhWgq|TcuR{6lA)+vhj(cH`0;+B^72{&a7ff* zkrIo|pd-Yxm+VVptC@QNCDk0=Re%Sz%ta7y{5Dn9(EapBS0r zLbDKeZepar5%cAcb<^;m>1{QhMzRmRem=+0I3ERot-)gb`i|sII^A#^Gz+x>TW5A& z3PQcpM$lDy`zb%1yf!e8&_>D02RN950KzW>GN6n@2so&Wu09x@PB=&IkIf|zZ1W}P zAKf*&Mo5@@G=w&290aG1@3=IMCB^|G4L7*xn;r3v&HBrD4D)Zg+)f~Ls$7*P-^i#B z4X7ac=0&58j^@2EBZCs}YPe3rqgLAA1L3Y}o?}$%u~)7Rk=LLFbAdSy@-Uw6lv?0K z&P@@M`o2Rll3GoYjotf@WNNjHbe|R?IKVn*?Rzf9v9QoFMq)ODF~>L}26@z`KA82t z43e!^z&WGqAk$Ww8j6bc3$I|;5^BHwt`?e)zf|&+l#!8uJV_Cwy-n1yS0^Q{W*a8B zTzTYL>tt&I&9vzGQUrO?YIm6C1r>eyh|qw~-&;7s7u1achP$K3VnXd8sV8J7ZTxTh z5+^*J5%_#X)XL2@>h(Gmv$@)fZ@ikR$v(2Rax89xscFEi!3_;ORI0dBxw)S{r50qf zg&_a*>2Xe{s@)7OX9O!C?^6fD8tc3bQTq9}fxhbx2@QeaO9Ej+2m!u~+u%Q6?Tgz{ zjYS}bleKcVhW~1$?t*AO^p!=Xkkgwx6OTik*R3~yg^L`wUU9Dq#$Z*iW%?s6pO_f8 zJ8w#u#Eaw7=8n{zJ}C>w{enA6XYHfUf7h)!Qaev)?V=yW{b@-z`hAz;I7^|DoFChP z1aYQnkGauh*ps6x*_S77@z1wwGmF8ky9fMbM$dr*`vsot4uvqWn)0vTRwJqH#&D%g zL3(0dP>%Oj&vm5Re%>*4x|h1J2X*mK5BH1?Nx_#7( zepgF`+n)rHXj!RiipusEq!X81;QQBXlTvLDj=Qub(ha&D=BDx3@-V*d!D9PeXUY?l zwZ0<4=iY!sUj4G>zTS+eYX7knN-8Oynl=NdwHS*nSz_5}*5LQ@=?Yr?uj$`C1m2OR zK`f5SD2|;=BhU#AmaTKe9QaSHQ_DUj1*cUPa*JICFt1<&S3P3zsrs^yUE;tx=x^cmW!Jq!+hohv_B> zPDMT0D&08dC4x@cTD$o1$x%So1Ir(G3_AVQMvQ13un~sP(cEWi$2%5q93E7t{3VJf%K? zuwSyDke~7KuB2?*#DV8YzJw z&}SCDexnUPD!%4|y~7}VzvJ4ch)WT4%sw@ItwoNt(C*RP)h?&~^g##vnhR0!HvIYx z0td2yz9=>t3JNySl*TszmfH6`Ir;ft@RdWs3}!J88UE|gj_GMQ6$ZYphUL2~4OY7} zB*33_bjkRf_@l;Y!7MIdb~bVe;-m78Pz|pdy=O*3kjak63UnLt!{^!!Ljg0rJD3a~ z1Q;y5Z^MF<=Hr}rdoz>yRczx+p3RxxgJE2GX&Si)14B@2t21j4hnnP#U?T3g#+{W+Zb z5s^@>->~-}4|_*!5pIzMCEp|3+i1XKcfUxW`8|ezAh>y{WiRcjSG*asw6;Ef(k#>V ztguN?EGkV_mGFdq!n#W)<7E}1#EZN8O$O|}qdoE|7K?F4zo1jL-v}E8v?9qz(d$&2 zMwyK&xlC9rXo_2xw7Qe0caC?o?Pc*-QAOE!+UvRuKjG+;dk|jQhDDBe?`XT7Y5lte zqSu0t5`;>Wv%|nhj|ZiE^IqA_lZu7OWh!2Y(627zb=r7Ends}wVk7Q5o09a@ojhH7 zU0m&h*8+j4e|OqWyJ&B`V`y=>MVO;K9=hk^6EsmVAGkLT{oUtR{JqSRY{Qi{kKw1k z6s;0SMPJOLp!som|A`*q3t0wIj-=bG8a#MC)MHcMSQU98Juv$?$CvYX)(n`P^!`5| zv3q@@|G@6wMqh;d;m4qvdibx2Yjml}vG9mDv&!0ne02M#D`Bo}xIB0VWh8>>WtNZQ z$&ISlJX;*ORQIO;k62qA{^6P%3!Z=Y1EbmY02{w^yB$`;%!{kur&XTGDiO2cjA)lr zsY^XZWy^DSAaz;kZ_VG?uWnJR7qdN18$~)>(kOoybY0~QYu9||K#|$Mby{3GduV~N zk9H7$7=RSo+?CUYF502`b76ytBy}sFak&|HIwRvB=0D|S`c#QCJPq zP)uOWI)#(n&{6|C4A^G~%B~BY21aOMoz9RuuM`Ip%oBz+NoAlb7?#`E^}7xXo!4S? zFg8I~G%!@nXi8&aJSGFcZAxQf;0m}942=i#p-&teLvE{AKm7Sl2f}Io?!IqbC|J;h z`=5LFOnU5?^w~SV@YwNZx$k_(kLNxZDE z3cf08^-rIT_>A$}B%IJBPcN^)4;90BQtiEi!gT#+EqyAUZ|}*b_}R>SGloq&6?opL zuT_+lwQMgg6!Cso$BwUA;k-1NcrzyE>(_X$B0HocjY~=Pk~Q08+N}(|%HjO_i+*=o z%G6C6A30Ch<0UlG;Zdj@ed!rfUY_i9mYwK8(aYuzcUzlTJ1yPz|Bb-9b33A9zRhGl>Ny-Q#JAq-+qtI@B@&w z$;PJbyiW=!py@g2hAi0)U1v=;avka`gd@8LC4=BEbNqL&K^UAQ5%r95#x%^qRB%KLaqMnG|6xKAm}sx!Qwo}J=2C;NROi$mfADui4)y(3wVA3k~{j^_5%H)C6K zlYAm1eY**HZOj($)xfKIQFtIVw$4&yvz9>(Crs>Gh{ zya6-FG7Dgi92#K)64=9Csj5?Zqe~_9TwSI!2quAwa1w-*uC5!}xY`?tltb0Hq740< zsq2QelPveZ4chr$=~U3!+c&>xyfvA1`)owOqj=i4wjY=A1577Gwg&Ko7;?il9r|_* z8P&IDV_g2D{in5OLFxsO!kx3AhO$5aKeoM|!q|VokqMlYM@HtsRuMtBY%I35#5$+G zpp|JOeoj^U=95HLemB04Yqv{a8X<^K9G2`&ShM_6&Bi1n?o?@MXsDj9Z*A3>#XK%J zRc*&SlFl>l)9DyRQ{*%Z+^e1XpH?0@vhpXrnPPU*d%vOhKkimm-u3c%Q^v3RKp9kx@A2dS?QfS=iigGr7m><)YkV=%LA5h@Uj@9=~ABPMJ z1UE;F&;Ttg5Kc^Qy!1SuvbNEqdgu3*l`=>s5_}dUv$B%BJbMiWrrMm7OXOdi=GOmh zZBvXXK7VqO&zojI2Om9};zCB5i|<210I{iwiGznGCx=FT89=Ef)5!lB1cZ6lbzgDn07*he}G&w7m!;|E(L-?+cz@0<9ZI~LqYQE7>HnPA436}oeN2Y(VfG6 zxNZuMK3Crm^Z_AFeHc~CVRrSl0W^?+Gbteu1g8NGYa3(8f*P{(ZT>%!jtSl6WbYVv zmE(37t0C8vJ6O-5+o*lL9XRcFbd~GSBGbGh3~R!67g&l)7n!kJlWd)~TUyXus#!&G6sR%(l(h1$xyrR5j_jM1zj#giA&@(Xl26@n<9>folx!92bQ z24h570+<)4!$!IQ(5yOU|4_E6aN@4v0+{Kx~Z z;q7fp%0cHziuI%!kB~w}g9@V+1wDz0wFlzX2UOvOy|&;e;t!lAR8tV2KQHgtfk8Uf zw;rs!(4JPODERk4ckd5I2Vq|0rd@@Mwd8MID%0^fITjYIQom^q;qhP8@|eJx{?5xX zc1@Fj*kDknlk{c-rnCloQ3hGh7OU+@efO3>fkRMcM>J?AeVP& zlfzX%cdp=N+4S#E*%^=BQ+N`A7C}|k%$|QUn0yI6S3$MS-NjO!4hm55uyju)Q6e!} z*OVO@A#-mfC9Pha6ng((Xl^V7{d+&u+yx)_B1{~t7d5e8L^i4J>;x<7@5;+l7-Gge zf#9diXJ$&v^rbN5V(ee%q0xBMEgS6%qZm7hNUP%G;^J44I!BmI@M*+FWz0!+s;+iQ zU4CuI+27bvNK8v>?7PZnVxB=heJ&_ymE0nN^W#-rqB%+JXkYGDuRw>JM_LdtLkiq* z6%%3&^BX$jnM@2bjiGc-DymKly)wVkA-pq;jSWL#7_*moZZ4I|-N}o8SK?sIv)p|c zu~9-B%tMc=!)YMFp*SiC0>kfnH8+X5>;+FFVN{~a9YVdIg1uGkZ~kegFy{^PU(4{( z`CbY`XmVA3esai686Yw8djCEyF7`bfB^F1)nwv+AqYLZ&Zy=eFhYT2uMd@{sP_qS4 zbJ&>PxajjZt?&c<1^!T|pLHfX=E^FJ>-l_XCZzvRV%x}@u(FtF(mS+Umw$e+IA74e>gCdTqi;6&=euAIpxd=Y3I5xWR zBhGoT+T`V1@91OlQ}2YO*~P4ukd*TBBdt?Plt)_ou6Y@Db`ss+Q~A-48s>?eaJYA2 zRGOa8^~Em}EFTmKIVVbMb|ob)hJJ7ITg>yHAn2i|{2ZJU!cwt9YNDT0=*WO7Bq#Xj zg@FjEaKoolrF8%c;49|`IT&25?O$dq8kp3#la9&6aH z6G|{>^C(>yP7#Dr$aeFyS0Ai_$ILhL43#*mgEl(c*4?Ae;tRL&S7Vc}Szl>B`mBuI zB9Y%xp%CZwlH!3V(`6W4-ZuETssvI&B~_O;CbULfl)X1V%(H7VSPf`_Ka9ak@8A=z z1l|B1QKT}NLI`WVTRd;2En5u{0CRqy9PTi$ja^inu){LJ&E&6W%JJPw#&PaTxpt?k zpC~gjN*22Q8tpGHR|tg~ye#9a8N<%odhZJnk7Oh=(PKfhYfzLAxdE36r<6a?A;rO&ELp_Y?8Pdw(PT^Fxn!eG_|LEbSYoBrsBA|6Fgr zt5LntyusI{Q2fdy=>ditS;}^B;I2MD4=(>7fWt0Jp~y=?VvfvzHvQhj6dyIef46J$ zl4Xu7U9v_NJV?uBBC0!kcTS0UcrV7+@~is?Fi+jrr@l3XwD|uG zr26jUWiv>Ju48Y^#qn7r9mwIH-Pv6Y|V|V-GZ&+&gQ?S?-`&ts{@5GXPqbmyZjUACC&oVXfNwUX0}ba(v978 zp8z!v9~8Zx8qB@7>oFPDm^iR@+yw`79YF)w^OHB_N;&&x7c3l^3!)IY#)}x)@D(iNaOm9 zC=^*!{`7={3*S=%iU=KsPXh=DDZcc``Ss>057i{pdW8M@4q+Ba@Tt%OytH!4>rbIbQw^-pR zGGYNPzw@n=PV@)b7yVbFr;glF*Qq3>F9oBN5PUXt!?2mdGcpv^o1?Thp`jP10G2Yi z(c93td3F3SW!Le5DUwdub!aDKoVLU6g!O?Ret21l$qOC;kdd@L#M&baVu&JZGt&<6 z!VCkvgRaav6QDW2x}tUy4~Y5(B+#Ej-8vM?DM-1?J_*&PntI3E96M!`WL#<&Z5n2u zo`P!~vBT$YOT~gU9#PB)%JZ zcd_u=m^LYzC!pH#W`yA1!(fA;D~b zG#73@l)NNd;n#XrKXZEfab;@kQRnOFU2Th-1m<4mJzlj9b3pv-GF$elX7ib9!uILM_$ke zHIGB*&=5=;ynQA{y7H93%i^d)T}y@(p>8vVhJ4L)M{0Q*@D^+SPp`EW+G6E%+`Z;u zS3goV@Dic7vc5`?!pCN44Ts@*{)zwy)9?B||AM{zKlN4T}qQRL2 zgv+{K8bv7w)#xge16;kI1fU87!W4pX)N&|cq8&i^1r`W|Hg4366r(?-ecEJ9u&Eaw zrhyikXQB>C9d>cpPGiu=VU3Z-u4|0V_iap!_J3o+K_R5EXk@sfu~zHwwYkpncVh!R zqNe7Cmf_|Wmeq4#(mIO&(wCK@b4(x0?W1Qtk(`$?+$uCJCGZm_%k?l32vuShgDFMa ztc`{$8DhB9)&?~(m&EUc=LzI1=qo#zjy#2{hLT_*aj<618qQ7mD#k2ZFGou&69;=2 z1j7=Su8k}{L*h&mfs7jg^PN&9C1Z@U!p6gXk&-7xM~{X`nqH#aGO`;Xy_zbz^rYacIq0AH%4!Oh93TzJ820%ur)8OyeS@K?sF1V(iFO z37Nnqj1z#1{|v7=_CX`lQA|$<1gtuNMHGNJYp1D_k;WQk-b+T6VmUK(x=bWviOZ~T z|4e%SpuaWLWD?qN2%`S*`P;BQBw(B__wTD6epvGdJ+>DBq2oVlf&F*lz+#avb4)3P1c^Mf#olQheVvZ|Z5 z>xXfgmv!5Z^SYn+_x}K5B%G^sRwiez&z9|f!E!#oJlT2kCOV0000$L_|bHBqAarB4TD{W@grX1CUr72@caw0faEd7-K|4L_|cawbojjHdpd6 zI6~Iv5J?-Q4*&oF000000FV;^004t70Z6Qk1Xl{X9oJ{sRC2(cs?- diff --git a/agate-webapp/src/main/webapp/images/chosen-sprite.png b/agate-webapp/src/main/webapp/images/chosen-sprite.png deleted file mode 100644 index 3611ae4ace1c4b1cbeacd6145b5a79cbc72e0bdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 646 zcmV;10(t$3P)0006_Nkl&pbAC0n?)s%2x5M$#UgGxI1~gymp~v; zh<`zGaTJP5BybQY4tlRo;SIcmE0t>ueW3>*u6N;@_u;;|BoL8PuhZ#FWY9$(flan1oVvxDBL8~}0Q5z;^2p>Ov z7}Q$E7=l>$BZLUt1*uKMCaQwKYf$lsJCyerWMd+%BeGH6f_f&Vpy%=$BN%uK%Ahxi zF+%Jj=Pc-WXF;djSiJw|m4>cN%^Fi|FBZ!E{_yJLS?RI<3U696XLkQSs z{{&kQJ$K(#5CgC1;GbA>mjm56zJZ^-Hg2_ASKI_K@CybPh7Rq}8ud``)NM~eZx}qT z)oK?Lf>t!B;%Uh}*P+)Ef?jbx#w|BNEVb(l{2LK}m#fw4xx>ddF;&j}!S{N-e!<&Q z?kvzyI_AT@H-u4tUz1h&GCh8>?TnA~?BZ7WGP<9`r gQ6DuZO!_~60ju@{TzXF%TmS$707*qoM6N<$g2#CqL;wH) diff --git a/agate-webapp/src/main/webapp/images/development_ribbon.png b/agate-webapp/src/main/webapp/images/development_ribbon.png deleted file mode 100644 index aff99483fb25c9a2adf8eeaa00969fcf00e594ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11495 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 B7G?kd diff --git a/agate-webapp/src/main/webapp/images/glyphicons-halflings.png b/agate-webapp/src/main/webapp/images/glyphicons-halflings.png deleted file mode 100755 index ab5686e89076393550df2769b2624047525dd407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12727 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 diff --git a/agate-webapp/src/main/webapp/images/loading.gif b/agate-webapp/src/main/webapp/images/loading.gif deleted file mode 100644 index 6bdc3b5e698ef1f0882270721fd706990336d3b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmZ?wbhEHb6ky3UH!ouR`=lAT{vl};VeEIUl!ouRtojadCecHBd+kyoPPMtdS z?%g|}ArPSWPs+I{HL)Z$MWH;iBts!FE3qOcKQTowGcPTlLGdRG&>0L2ivPL&TtkAL z9RpmA^bD98fkHYU{UAp&u<9x(^rd9ZTe5)b(J7{N4g$> .ellipsis { - margin-bottom: -5px; -} - -table tbody th { - width: 200px; -} - -td ul, td ol { - margin-bottom: 0; -} - -// Ace editor -.ace_editor { - font-size: 16px !important; - height: 600px; -} - -// The sizes are based on angular-match-media defaults for consistency - -@media (max-width: 1200px) { - .navbar-header { - float: none; - } - .navbar-left,.navbar-right { - float: none !important; - } - .navbar-toggle { - display: block; - } - .navbar-collapse { - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255,255,255,0.1); - } - .navbar-fixed-top { - top: 0; - border-width: 0 0 1px; - } - .navbar-collapse.collapse { - display: none!important; - } - .navbar-nav { - float: none!important; - margin-top: 7.5px; - } - .navbar-nav>li { - float: none; - } - .navbar-nav>li>a { - padding-top: 10px; - padding-bottom: 10px; - } - .collapse.in{ - display:block !important; - } -} diff --git a/agate-webapp/src/main/webapp/less/bootstrap-chosen/bootstrap-chosen-variables.less b/agate-webapp/src/main/webapp/less/bootstrap-chosen/bootstrap-chosen-variables.less deleted file mode 100644 index 2e8e88990..000000000 --- a/agate-webapp/src/main/webapp/less/bootstrap-chosen/bootstrap-chosen-variables.less +++ /dev/null @@ -1,23 +0,0 @@ -// -// bootstrap-chosen-variables.less -// -// An alternate stylesheet for Chosen (http://harvesthq.github.com/chosen/). -// This one is supposed to integrate better with Bootstrap. -// -// Submit bugfixes to: http://github.com/alxlit/bootstrap-chosen -// - -@chosen-background: @input-bg; -@chosen-border: @input-border; -@chosen-border-radius: @input-border-radius; -@chosen-multi-border-radius: 0; -@chosen-box-shadow: ~"inset 0 1px 1px rgba(0, 0, 0, .075)"; -@chosen-drop-border: @gray-light; -@chosen-drop-box-shadow: ~"0 8px 8px rgba(0, 0, 0, .25)"; -@chosen-drop-zindex: 1060; -@chosen-focus-border: rgba(82, 168, 236, .8); -@chosen-focus-box-shadow: ~"0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6)"; -@chosen-focus-transition: ~"border linear .2s, box-shadow linear .2s"; -@chosen-height: @input-height-base; -@chosen-multi-height: @input-height-base + 6px; -@chosen-sprite-path: "../images/chosen-sprite.png"; diff --git a/agate-webapp/src/main/webapp/less/bootstrap-chosen/bootstrap-chosen.less b/agate-webapp/src/main/webapp/less/bootstrap-chosen/bootstrap-chosen.less deleted file mode 100644 index 62d43c9a8..000000000 --- a/agate-webapp/src/main/webapp/less/bootstrap-chosen/bootstrap-chosen.less +++ /dev/null @@ -1,439 +0,0 @@ -// -// bootstrap-chosen.less -// -// An alternate stylesheet for Chosen (http://harvesthq.github.com/chosen/). -// This one is supposed to integrate better with Bootstrap. -// -// Submit bugfixes to: http://github.com/alxlit/bootstrap-chosen -// - -@import "bootstrap-chosen-variables"; - -.chosen-select { width: 100%; } -.chosen-select-deselect { width: 100%; } - -.chosen-container { - display: inline-block; - font-size: @font-size-base; - position: relative; - vertical-align: middle; - - .chosen-drop { - background: @chosen-background; - border: 1px solid @chosen-drop-border; - border-top-color: lighten(@chosen-drop-border, 25%); - .border-bottom-radius(@chosen-border-radius); - .box-shadow(@chosen-drop-box-shadow); - margin-top: -1px; - position: absolute; - top: 100%; - left: -9000px; - z-index: @chosen-drop-zindex; - } - - &.chosen-with-drop .chosen-drop { - left: 0; - right: 0; - } - - .chosen-results { - color: @gray; - margin: 0 4px 4px 0; - max-height: 240px; - padding: 0 0 0 4px; - position: relative; - overflow-x: hidden; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - - li { - display: none; - line-height: @line-height-base; // 15px; - list-style: none; - margin: 0; - padding: 5px 6px; - - em { - background: #feffde; - font-style: normal; - } - - &.group-result { - display: list-item; - cursor: default; - color: #999; - font-weight: bold; - } - - &.group-option { - padding-left: 15px; - } - - &.active-result { - cursor: pointer; - display: list-item; - } - - &.highlighted { - background-color: @link-color; - color: white; - - em { - background: transparent; - } - } - - &.disabled-result { - display: list-item; - color: @gray-light; - } - } - - .no-results { - background: @gray-lighter; - display: list-item; - } - } - - .chosen-results-scroll { - background: white; - margin: 0 4px; - position: absolute; - text-align: center; - width: 321px; - z-index: 1; - - span { - display: inline-block; - height: @line-height-base; // 17px; - text-indent: -5000px; - width: 9px; - } - } - - .chosen-results-scroll-down { - bottom: 0; - - span { - background: url("@{chosen-sprite-path}") no-repeat -4px -3px; - } - } - - .chosen-results-scroll-up { - span { - background: url("@{chosen-sprite-path}") no-repeat -22px -3px; - } - } -} - -.chosen-container-single { - .chosen-single { - background-color: @chosen-background; - #gradient > .vertical(white, @gray-lighter); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - border: 1px solid @chosen-border; - .box-shadow(@chosen-box-shadow); - color: @gray; - display: block; - height: @chosen-height; - overflow: hidden; - line-height: @chosen-height; - padding: 0 0 0 8px; - position: relative; - text-decoration: none; - white-space: nowrap; - - span { - display: block; - margin-right: 26px; - .text-overflow(); - } - - abbr { - background: url("@{chosen-sprite-path}") right top no-repeat; - display: block; - font-size: 1px; - height: 10px; - position: absolute; - right: 26px; - top: (@chosen-height - 10px) / 2; - width: 12px; - - &:hover { - background-position: right -11px; - } - } - - &.chosen-disabled .chosen-single abbr:hover { - background-position: right 2px; - } - - div { - display: block; - height: 100%; - position: absolute; - top: 0; - right: 0; - width: 18px; - - b { - background: url("@{chosen-sprite-path}") no-repeat 0 7px; - display: block; - height: 100%; - width: 100%; - } - } - } - - .chosen-default { - color: @gray-light; - } - - .chosen-search { - margin: 0; - padding: 3px 4px; - position: relative; - white-space: nowrap; - z-index: @zindex-dropdown; - - input { - background: url("@{chosen-sprite-path}") no-repeat 100% -20px, @chosen-background; - border: 1px solid @chosen-border; - .border-top-radius(@chosen-border-radius); - .border-bottom-radius(@chosen-border-radius); - .box-shadow(@chosen-box-shadow); - margin: 1px 0; - padding: 4px 20px 4px 4px; - width: 100%; - } - } - - .chosen-drop { - margin-top: -1px; - .border-bottom-radius(@chosen-border-radius); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - } -} - -.chosen-container-single-nosearch { - .chosen-search { - input { - position: absolute; - left: -9000px; - } - } -} - -.chosen-container-multi { - .chosen-choices { - background-color: @chosen-background; - border: 1px solid @chosen-border; - .border-top-radius(@chosen-multi-border-radius); - .border-bottom-radius(@chosen-multi-border-radius); - .box-shadow(@chosen-box-shadow); - cursor: text; - height: auto !important; - height: 1%; - margin: 0; - overflow: hidden; - padding: 0; - position: relative; - - li { - float: left; - list-style: none; - } - - .search-field { - margin: 0; - padding: 0; - white-space: nowrap; - - input { - background: transparent !important; - border: 0 !important; - .box-shadow(none); - color: @gray; - height: @chosen-multi-height - 8px; - margin: 0; - padding: 4px; - outline: 0; - } - - .default { - color: #999; - } - } - - .search-choice { - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - background-color: @gray-lighter; - border: 1px solid @chosen-border; - .border-top-radius(@chosen-border-radius); - .border-bottom-radius(@chosen-border-radius); - #gradient > .vertical(white, @gray-lighter); - .box-shadow(@chosen-box-shadow); - color: @gray-dark; - cursor: default; - line-height: 13px; - margin: 6px 0 3px 5px; - padding: 3px 20px 3px 5px; - position: relative; - - .search-choice-close { - background: url("@{chosen-sprite-path}") right top no-repeat; - display: block; - font-size: 1px; - height: 10px; - position: absolute; - right: 4px; - top: 5px; - width: 12px; - - &:hover { - background-position: right -11px; - } - } - } - - .search-choice-focus { - background: #d4d4d4; - - .search-choice-close { - background-position: right -11px; - } - } - } - - .chosen-results { - margin: 0 0 0 0; - padding: 0; - } - - .chosen-drop { - .result-selected { - display: none; - } - } -} - -.chosen-container-active { - .chosen-single { - border: 1px solid @chosen-focus-border; - .box-shadow(@chosen-focus-box-shadow); - .transition(@chosen-focus-transition); - } - - &.chosen-with-drop .chosen-single { - background-color: @gray-lighter; - border: 1px solid @chosen-focus-border; - .box-shadow(@chosen-focus-box-shadow); - .transition(@chosen-focus-transition); - - div { - background: transparent; - border-left: none; - - b { - background-position: -18px 7px; - } - } - } - - .chosen-choices { - border: 1px solid @chosen-focus-border; - .border-bottom-radius(0); - .box-shadow(@chosen-focus-box-shadow); - .transition(@chosen-focus-transition); - - .search-field input { - color: #111 !important; - } - } -} - -.chosen-disabled { - cursor: default; - opacity: 0.5 !important; - - .chosen-single { - cursor: default; - } - - .chosen-choices .search-choice .search-choice-close { - cursor: default; - } -} - -.chosen-rtl { - text-align: right; - - .chosen-single { - padding: 0 8px 0 0; - overflow: visible; - - span { - margin-left: 26px; - margin-right: 0; - direction: rtl; - } - - div { - left: 7px; - right: auto; - } - - abbr { - left: 26px; - right: auto; - } - } - - .chosen-choices { - .search-field input { - direction: rtl; - } - - li { - float: right; - } - - .search-choice { - margin: 6px 5px 3px 0; - padding: 3px 5px 3px 19px; - - .search-choice-close { - background-position: right top; - left: 4px; - right: auto; - } - } - } - - &.chosen-container-single .chosen-results { - margin: 0 0 4px 4px; - padding: 0 4px 0 0; - } - - .chosen-results .group-option { - padding-left: 0; - padding-right: 15px; - } - - &.chosen-container-active.chosen-with-drop .chosen-single div { - border-right: none; - } - - .chosen-search input { - background: url("@{chosen-sprite-path}") no-repeat -28px -20px, @chosen-background; - direction: rtl; - padding: 4px 5px 4px 20px; - } -} - diff --git a/agate-webapp/src/main/webapp/less/navs.less b/agate-webapp/src/main/webapp/less/navs.less deleted file mode 100644 index 651a4e340..000000000 --- a/agate-webapp/src/main/webapp/less/navs.less +++ /dev/null @@ -1,475 +0,0 @@ -// -// Navs -// -------------------------------------------------- - -// BASE CLASS -// ---------- - -.nav { - margin-left: 0; - margin-bottom: @line-height-base; - list-style: none; -} - -// Make links block level -.nav > li > a { - display: block; - text-decoration: none !important; -} - -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: @gray-lighter; -} - -// Prevent IE8 from misplacing imgs -// See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989 -.nav > li > a > img { - max-width: none; -} - -// Redeclare pull classes because of specifity -.nav > .pull-right { - float: right; -} - -// Nav headers (for dropdowns and lists) -.nav-header { - display: block; - padding: 3px 15px; - font-size: 13px; - font-weight: bold; - line-height: @line-height-base; - color: @gray-light; - text-shadow: 0 1px 0 rgba(255, 255, 255, .5); - text-transform: uppercase; -} - -// Space them out when they follow another list item (link) -.nav li + .nav-header { - margin-top: 9px; -} - -// NAV LIST -// -------- - -.nav-list { - padding-left: 15px; - padding-right: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-left: -15px; - margin-right: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, .5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: white; - text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); - background-color: @link-color; -} - -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} - -// Dividers (basically an hr) within the dropdown -.nav-list .divider { - .nav-divider(); -} - -// TABS AND PILLS -// ------------- - -// Common styles -.nav-tabs, -.nav-pills { - .clearfix(); -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; // keeps the overall height an even number -} - -// TABS -// ---- - -// Give the tabs something to sit on -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -// Make the list-items overlay the bottom border -.nav-tabs > li { - margin-bottom: -1px; -} - -// Actual tabs (as links) -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: @line-height-base; - border: 1px solid transparent; - .border-top-radius(4); - .border-right-radius(4); - .border-bottom-radius(0); - .border-left-radius(0); - &:hover, - &:focus { - border-color: @gray-lighter @gray-lighter #ddd; - } -} - -// Active state, and it's :hover/:focus to override normal :hover/:focus -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: @gray; - background-color: @body-bg; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} - -// PILLS -// ----- - -// Links rendered as pills -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - .border-top-radius(5); - .border-right-radius(5); - .border-bottom-radius(5); - .border-left-radius(5); -} - -// Active state -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: white; - background-color: @link-color; -} - -// STACKED NAV -// ----------- - -// Stacked tabs and pills -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; // no need for the gap between nav items -} - -// Tabs -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - .border-top-radius(0); - .border-right-radius(0); - .border-bottom-radius(0); - .border-left-radius(0); -} - -.nav-tabs.nav-stacked > li:first-child > a { - .border-top-radius(4px); -} - -.nav-tabs.nav-stacked > li:last-child > a { - .border-bottom-radius(4px); -} - -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - border-color: #ddd; - z-index: 2; -} - -// Pills -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; // decrease margin to match sizing of stacked tabs -} - -// DROPDOWNS -// --------- - -.nav-tabs .dropdown-menu { - // remove the top rounded corners here since there is a hard edge above the menu - .border-top-radius(0); - .border-right-radius(0); - .border-bottom-radius(6); - .border-left-radius(6); -} - -.nav-pills .dropdown-menu { - // make rounded corners match the pills - .border-top-radius(6); - .border-right-radius(6); - .border-bottom-radius(6); - .border-left-radius(6); -} - -// Default dropdown links -// ------------------------- -// Make carets use linkColor to start -.nav .dropdown-toggle .caret { - border-top-color: @link-color; - border-bottom-color: @link-color; - margin-top: 6px; -} - -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: @link-hover-color; - border-bottom-color: @link-hover-color; -} - -/* move down carets for tabs */ -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} - -// Active dropdown links -// ------------------------- -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: @gray; - border-bottom-color: @gray; -} - -// Active:hover/:focus dropdown links -// ------------------------- -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} - -// Open dropdowns -// ------------------------- -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: white; - background-color: @gray-light; - border-color: @gray-light; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: white; - border-bottom-color: white; - .opacity(100); -} - -// Dropdowns in stacked tabs -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: @gray-light; -} - -// TABBABLE -// -------- - -// COMMON STYLES -// ------------- - -// Clear any floats -.tabbable { - .clearfix(); -} - -.tab-content { - overflow: auto; // prevent content from running below tabs -} - -// Remove border on bottom, left, right -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -// Show/hide tabbable areas -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -// BOTTOM -// ------ - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - .border-top-radius(0); - .border-right-radius(0); - .border-bottom-radius(4); - .border-left-radius(4); - &:hover, - &:focus { - border-bottom-color: transparent; - border-top-color: #ddd; - } -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} - -// LEFT & RIGHT -// ------------ - -// Common styles -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -// Tabs on the left -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - .border-top-radius(4); - .border-right-radius(0); - .border-bottom-radius(0); - .border-left-radius(4);} - -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: @gray-lighter #ddd @gray-lighter @gray-lighter; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: white; -} - -// Tabs on the right -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - .border-top-radius(0); - .border-right-radius(4); - .border-bottom-radius(4); - .border-left-radius(0); -} - -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: @gray-lighter @gray-lighter @gray-lighter #ddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: white; -} - -// DISABLED STATES -// --------------- - -// Gray out text -.nav > .disabled > a { - color: @gray-light; -} - -// Nuke hover/focus effects -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - cursor: default; -} - -// MENU -// ---- - -.tabs-menu.tabs-left > ul { - margin-left: -60px; - position: absolute; -} - -.tabs-menu.tabs-left > .nav-tabs > li > a { - min-width: 0px; -} - -// PANEL -// ---- - -.panel-body > .nav-list > li > a, -.panel-body > .nav-list .nav-header { - margin-right: -30px; -} diff --git a/agate-webapp/src/main/webapp/less/variables.less b/agate-webapp/src/main/webapp/less/variables.less deleted file mode 100644 index f7b20dfd0..000000000 --- a/agate-webapp/src/main/webapp/less/variables.less +++ /dev/null @@ -1,829 +0,0 @@ -// Flatly 3.1.1 -// Variables -// -------------------------------------------------- - - -//== Colors -// -//## Gray and brand colors for use across Bootstrap. - -@gray-darker: lighten(#000, 13.5%); // #222 -@gray-dark: #7b8a8b; // #333 -@gray: #95a5a6; // #555 -@gray-light: #b4bcc2; // #999 -@gray-lighter: #ecf0f1; // #eee - -@brand-primary: #2C3E50; -@brand-success: #18BC9C; -@brand-info: #3498DB; -@brand-warning: #F39C12; -@brand-danger: #E74C3C; - - -//== Scaffolding -// -// ## Settings for some of the most global styles. - -//** Background color for ``. -@body-bg: #fff; -//** Global text color on ``. -@text-color: @brand-primary; - -//** Global textual link color. -@link-color: @brand-success; -//** Link hover color set via `darken()` function. -@link-hover-color: @link-color; - - -//== Typography -// -//## Font, line-height, and color for body text, headings, and more. - -@font-family-sans-serif: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; -@font-family-serif: Georgia, "Times New Roman", Times, serif; -//** Default monospace fonts for ``, ``, and `
`.
-@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
-@font-family-base:        @font-family-sans-serif;
-
-@font-size-base:          15px;
-@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
-@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
-
-@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px
-@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px
-@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px
-@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px
-@font-size-h5:            @font-size-base;
-@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px
-
-//** Unit-less `line-height` for use in components like buttons.
-@line-height-base:        1.428571429; // 20/14
-//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
-@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
-
-//** By default, this inherits from the ``.
-@headings-font-family:    @font-family-base;
-@headings-font-weight:    400;
-@headings-line-height:    1.1;
-@headings-color:          inherit;
-
-
-//-- Iconography
-//
-//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.
-
-@icon-font-path:          "../fonts/";
-@icon-font-name:          "glyphicons-halflings-regular";
-@icon-font-svg-id:        "glyphicons_halflingsregular";
-
-//== Components
-//
-//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
-
-@padding-base-vertical:     6px;
-@padding-base-horizontal:   16px;
-
-@padding-large-vertical:    18px;
-@padding-large-horizontal:  27px;
-
-@padding-small-vertical:    6px;
-@padding-small-horizontal:  9px;
-
-@padding-xs-vertical:       1px;
-@padding-xs-horizontal:     5px;
-
-@line-height-large:         1.33;
-@line-height-small:         1.5;
-
-@border-radius-base:        4px;
-@border-radius-large:       6px;
-@border-radius-small:       3px;
-
-//** Global color for active items (e.g., navs or dropdowns).
-@component-active-color:    #fff;
-//** Global background color for active items (e.g., navs or dropdowns).
-@component-active-bg:       @brand-primary;
-
-//** Width of the `border` for generating carets that indicator dropdowns.
-@caret-width-base:          4px;
-//** Carets increase slightly in size for larger components.
-@caret-width-large:         5px;
-
-
-//== Tables
-//
-//## Customizes the `.table` component with basic values, each used across all table variations.
-
-//** Padding for ``s and ``s.
-@table-cell-padding:            8px;
-//** Padding for cells in `.table-condensed`.
-@table-condensed-cell-padding:  5px;
-
-//** Default background color used for all tables.
-@table-bg:                      transparent;
-//** Background color used for `.table-striped`.
-@table-bg-accent:               #f3f3f3;
-//** Background color used for `.table-hover`.
-@table-bg-hover:                @gray-lighter;
-@table-bg-active:               @table-bg-hover;
-
-//** Border color for table and cell borders.
-@table-border-color:            @gray-lighter;
-
-
-//== Buttons
-//
-//## For each of Bootstrap's buttons, define text, background and border color.
-
-@btn-font-weight:                normal;
-
-@btn-default-color:              #fff;
-@btn-default-bg:                 @gray;
-@btn-default-border:             @btn-default-bg;
-
-@btn-primary-color:              @btn-default-color;
-@btn-primary-bg:                 @brand-primary;
-@btn-primary-border:             @btn-primary-bg;
-
-@btn-success-color:              @btn-default-color;
-@btn-success-bg:                 @brand-success;
-@btn-success-border:             @btn-success-bg;
-
-@btn-info-color:                 @btn-default-color;
-@btn-info-bg:                    @brand-info;
-@btn-info-border:                @btn-info-bg;
-
-@btn-warning-color:              @btn-default-color;
-@btn-warning-bg:                 @brand-warning;
-@btn-warning-border:             @btn-warning-bg;
-
-@btn-danger-color:               @btn-default-color;
-@btn-danger-bg:                  @brand-danger;
-@btn-danger-border:              @btn-danger-bg;
-
-@btn-link-disabled-color:        @gray-light;
-
-
-//== Forms
-//
-//##
-
-//** `` background color
-@input-bg:                       #fff;
-//** `` background color
-@input-bg-disabled:              @gray-lighter;
-
-//** Text color for ``s
-@input-color:                    @text-color;
-//** `` border color
-@input-border:                   #dce4ec;
-//** `` border radius
-@input-border-radius:            @border-radius-base;
-//** Border color for inputs on focus
-@input-border-focus:             @brand-primary;
-
-//** Placeholder text color
-@input-color-placeholder:        #acb6c0;
-
-//** Default `.form-control` height
-@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
-//** Large `.form-control` height
-@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
-//** Small `.form-control` height
-@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
-
-@legend-color:                   @text-color;
-@legend-border-color:            transparent;
-
-//** Background color for textual input addons
-@input-group-addon-bg:           @gray-lighter;
-//** Border color for textual input addons
-@input-group-addon-border-color: @input-border;
-
-
-//== Dropdowns
-//
-//## Dropdown menu container and contents.
-
-//** Background for the dropdown menu.
-@dropdown-bg:                    #fff;
-//** Dropdown menu `border-color`.
-@dropdown-border:                rgba(0,0,0,.15);
-//** Dropdown menu `border-color` **for IE8**.
-@dropdown-fallback-border:       #ccc;
-//** Divider color for between dropdown items.
-@dropdown-divider-bg:            #e5e5e5;
-
-//** Dropdown link text color.
-@dropdown-link-color:            @gray-dark;
-//** Hover color for dropdown links.
-@dropdown-link-hover-color:      #fff;
-//** Hover background for dropdown links.
-@dropdown-link-hover-bg:         @dropdown-link-active-bg;
-
-//** Active dropdown menu item text color.
-@dropdown-link-active-color:     #fff;
-//** Active dropdown menu item background color.
-@dropdown-link-active-bg:        @component-active-bg;
-
-//** Disabled dropdown menu item background color.
-@dropdown-link-disabled-color:   @text-muted;
-
-//** Text color for headers within dropdown menus.
-@dropdown-header-color:          @text-muted;
-
-// Note: Deprecated @dropdown-caret-color as of v3.1.0
-@dropdown-caret-color:           #000;
-
-
-//-- Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-//
-// Note: These variables are not generated into the Customizer.
-
-@zindex-navbar:            1000;
-@zindex-dropdown:          1000;
-@zindex-popover:           1010;
-@zindex-tooltip:           1030;
-@zindex-navbar-fixed:      1030;
-@zindex-modal-background:  1040;
-@zindex-modal:             1050;
-
-
-//== Media queries breakpoints
-//
-//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
-
-// Extra small screen / phone
-// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1
-@screen-xs:                  480px;
-@screen-xs-min:              @screen-xs;
-@screen-phone:               @screen-xs-min;
-
-// Small screen / tablet
-// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1
-@screen-sm:                  768px;
-@screen-sm-min:              @screen-sm;
-@screen-tablet:              @screen-sm-min;
-
-// Medium screen / desktop
-// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1
-@screen-md:                  992px;
-@screen-md-min:              @screen-md;
-@screen-desktop:             @screen-md-min;
-
-// Large screen / wide desktop
-// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1
-@screen-lg:                  1400px;
-@screen-lg-min:              @screen-lg;
-@screen-lg-desktop:          @screen-lg-min;
-
-// So media queries don't overlap when required, provide a maximum
-@screen-xs-max:              (@screen-sm-min - 1);
-@screen-sm-max:              (@screen-md-min - 1);
-@screen-md-max:              (@screen-lg-min - 1);
-
-
-//== Grid system
-//
-//## Define your custom responsive grid.
-
-//** Number of columns in the grid.
-@grid-columns:              12;
-//** Padding between columns. Gets divided in half for the left and right.
-@grid-gutter-width:         30px;
-// Navbar collapse
-//** Point at which the navbar becomes uncollapsed.
-@grid-float-breakpoint:     @screen-sm-min;
-//** Point at which the navbar begins collapsing.
-@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
-
-
-//== Container sizes
-//
-//## Define the maximum width of `.container` for different screen sizes.
-
-// Small screen / tablet
-@container-tablet:             ((720px + @grid-gutter-width));
-//** For `@screen-sm-min` and up.
-@container-sm:                 @container-tablet;
-
-// Medium screen / desktop
-@container-desktop:            ((940px + @grid-gutter-width));
-//** For `@screen-md-min` and up.
-@container-md:                 @container-desktop;
-
-// Large screen / wide desktop
-@container-large-desktop:      ((1340px + @grid-gutter-width));
-//** For `@screen-lg-min` and up.
-@container-lg:                 @container-large-desktop;
-
-
-//== Navbar
-//
-//##
-
-// Basics of a navbar
-@navbar-height:                    60px;
-@navbar-margin-bottom:             @line-height-computed;
-@navbar-border-radius:             @border-radius-base;
-@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
-@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
-@navbar-collapse-max-height:       340px;
-
-@navbar-default-color:             #777;
-@navbar-default-bg:                @brand-primary;
-@navbar-default-border:            transparent;
-
-// Navbar links
-@navbar-default-link-color:                #fff;
-@navbar-default-link-hover-color:          @brand-success;
-@navbar-default-link-hover-bg:             transparent;
-@navbar-default-link-active-color:         #fff;
-@navbar-default-link-active-bg:            darken(@navbar-default-bg, 10%);
-@navbar-default-link-disabled-color:       #ccc;
-@navbar-default-link-disabled-bg:          transparent;
-
-// Navbar brand label
-@navbar-default-brand-color:               @navbar-default-link-color;
-@navbar-default-brand-hover-color:         @navbar-default-link-hover-color;
-@navbar-default-brand-hover-bg:            transparent;
-
-// Navbar toggle
-@navbar-default-toggle-hover-bg:           darken(@navbar-default-bg, 10%);
-@navbar-default-toggle-icon-bar-bg:        #fff;
-@navbar-default-toggle-border-color:       darken(@navbar-default-bg, 10%);
-
-
-// Inverted navbar
-// Reset inverted navbar basics
-@navbar-inverse-color:                      #fff;
-@navbar-inverse-bg:                         @brand-success;
-@navbar-inverse-border:                     transparent;
-
-// Inverted navbar links
-@navbar-inverse-link-color:                 #fff;
-@navbar-inverse-link-hover-color:           @brand-primary;
-@navbar-inverse-link-hover-bg:              transparent;
-@navbar-inverse-link-active-color:          #fff;
-@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 5%);
-@navbar-inverse-link-disabled-color:        #ccc;
-@navbar-inverse-link-disabled-bg:           transparent;
-
-// Inverted navbar brand label
-@navbar-inverse-brand-color:                @navbar-inverse-link-color;
-@navbar-inverse-brand-hover-color:          @navbar-inverse-link-hover-color;
-@navbar-inverse-brand-hover-bg:             transparent;
-
-// Inverted navbar toggle
-@navbar-inverse-toggle-hover-bg:            darken(@navbar-inverse-bg, 10%);
-@navbar-inverse-toggle-icon-bar-bg:         #fff;
-@navbar-inverse-toggle-border-color:        darken(@navbar-inverse-bg, 10%);
-
-
-//== Navs
-//
-//##
-
-//=== Shared nav styles
-@nav-link-padding:                          10px 15px;
-@nav-link-hover-bg:                         @gray-lighter;
-
-@nav-disabled-link-color:                   @gray-light;
-@nav-disabled-link-hover-color:             @gray-light;
-
-@nav-open-link-hover-color:                 #fff;
-
-//== Tabs
-@nav-tabs-border-color:                     @gray-lighter;
-
-@nav-tabs-link-hover-border-color:          @gray-lighter;
-
-@nav-tabs-active-link-hover-bg:             @body-bg;
-@nav-tabs-active-link-hover-color:          @brand-primary;
-@nav-tabs-active-link-hover-border-color:   @gray-lighter;
-
-@nav-tabs-justified-link-border-color:            @gray-lighter;
-@nav-tabs-justified-active-link-border-color:     @body-bg;
-
-//== Pills
-@nav-pills-border-radius:                   @border-radius-base;
-@nav-pills-active-link-hover-bg:            @component-active-bg;
-@nav-pills-active-link-hover-color:         @component-active-color;
-
-
-//== Pagination
-//
-//##
-
-@pagination-color:                     #fff;
-@pagination-bg:                        @brand-success;
-@pagination-border:                    transparent;
-
-@pagination-hover-color:               #fff;
-@pagination-hover-bg:                  darken(@brand-success, 15%);
-@pagination-hover-border:              transparent;
-
-@pagination-active-color:              #fff;
-@pagination-active-bg:                 darken(@brand-success, 15%);
-@pagination-active-border:             transparent;
-
-@pagination-disabled-color:            @gray-lighter;
-@pagination-disabled-bg:               lighten(@brand-success, 15%);;
-@pagination-disabled-border:           transparent;
-
-
-//== Pager
-//
-//##
-
-@pager-bg:                             @pagination-bg;
-@pager-border:                         @pagination-border;
-@pager-border-radius:                  15px;
-
-@pager-hover-bg:                       @pagination-hover-bg;
-
-@pager-active-bg:                      @pagination-active-bg;
-@pager-active-color:                   @pagination-active-color;
-
-@pager-disabled-color:                 #fff;
-
-
-//== Jumbotron
-//
-//##
-
-@jumbotron-padding:              30px;
-@jumbotron-color:                inherit;
-@jumbotron-bg:                   @gray-lighter;
-@jumbotron-heading-color:        inherit;
-@jumbotron-font-size:            ceil((@font-size-base * 1.5));
-
-
-//== Form states and alerts
-//
-//## Define colors for form feedback states and, by default, alerts.
-
-@state-success-text:             #fff;
-@state-success-bg:               @brand-success;
-@state-success-border:           @brand-success;
-
-@state-info-text:                #fff;
-@state-info-bg:                  @brand-info;
-@state-info-border:              @brand-info;
-
-@state-warning-text:             #fff;
-@state-warning-bg:               @brand-warning;
-@state-warning-border:           @brand-warning;
-
-@state-danger-text:              #fff;
-@state-danger-bg:                @brand-danger;
-@state-danger-border:            @brand-danger;
-
-
-//== Tooltips
-//
-//##
-
-//** Tooltip max width
-@tooltip-max-width:           200px;
-//** Tooltip text color
-@tooltip-color:               #fff;
-//** Tooltip background color
-@tooltip-bg:                  rgba(0,0,0,.9);
-@tooltip-opacity:             .9;
-
-//** Tooltip arrow width
-@tooltip-arrow-width:         5px;
-//** Tooltip arrow color
-@tooltip-arrow-color:         @tooltip-bg;
-
-
-//== Popovers
-//
-//##
-
-//** Popover body background color
-@popover-bg:                          #fff;
-//** Popover maximum width
-@popover-max-width:                   276px;
-//** Popover border color
-@popover-border-color:                rgba(0,0,0,.2);
-//** Popover fallback border color
-@popover-fallback-border-color:       #ccc;
-
-//** Popover title background color
-@popover-title-bg:                    darken(@popover-bg, 3%);
-
-//** Popover arrow width
-@popover-arrow-width:                 10px;
-//** Popover arrow color
-@popover-arrow-color:                 #fff;
-
-//** Popover outer arrow width
-@popover-arrow-outer-width:           (@popover-arrow-width + 1);
-//** Popover outer arrow color
-@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
-//** Popover outer arrow fallback color
-@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
-
-
-//== Labels
-//
-//##
-
-//** Default label background color
-@label-default-bg:            @btn-default-bg;
-//** Primary label background color
-@label-primary-bg:            @brand-primary;
-//** Success label background color
-@label-success-bg:            @brand-success;
-//** Info label background color
-@label-info-bg:               @brand-info;
-//** Warning label background color
-@label-warning-bg:            @brand-warning;
-//** Danger label background color
-@label-danger-bg:             @brand-danger;
-
-//** Default label text color
-@label-color:                 #fff;
-//** Default text color of a linked label
-@label-link-hover-color:      #fff;
-
-
-//== Modals
-//
-//##
-
-//** Padding applied to the modal body
-@modal-inner-padding:         20px;
-
-//** Padding applied to the modal title
-@modal-title-padding:         15px;
-//** Modal title line-height
-@modal-title-line-height:     @line-height-base;
-
-//** Background color of modal content area
-@modal-content-bg:                             #fff;
-//** Modal content border color
-@modal-content-border-color:                   rgba(0,0,0,.2);
-//** Modal content border color **for IE8**
-@modal-content-fallback-border-color:          #999;
-
-//** Modal backdrop background color
-@modal-backdrop-bg:           #000;
-//** Modal backdrop opacity
-@modal-backdrop-opacity:      .5;
-//** Modal header border color
-@modal-header-border-color:   #e5e5e5;
-//** Modal footer border color
-@modal-footer-border-color:   @modal-header-border-color;
-
-@modal-lg:                    900px;
-@modal-md:                    600px;
-@modal-sm:                    300px;
-
-
-//== Alerts
-//
-//## Define alert colors, border radius, and padding.
-
-@alert-padding:               15px;
-@alert-border-radius:         @border-radius-base;
-@alert-link-font-weight:      bold;
-
-@alert-success-bg:            @state-success-bg;
-@alert-success-text:          @state-success-text;
-@alert-success-border:        @state-success-border;
-
-@alert-info-bg:               @state-info-bg;
-@alert-info-text:             @state-info-text;
-@alert-info-border:           @state-info-border;
-
-@alert-warning-bg:            @state-warning-bg;
-@alert-warning-text:          @state-warning-text;
-@alert-warning-border:        @state-warning-border;
-
-@alert-danger-bg:             @state-danger-bg;
-@alert-danger-text:           @state-danger-text;
-@alert-danger-border:         @state-danger-border;
-
-
-//== Progress bars
-//
-//##
-
-//** Background color of the whole progress component
-@progress-bg:                 @gray-lighter;
-//** Progress bar text color
-@progress-bar-color:          #fff;
-
-//** Default progress bar color
-@progress-bar-bg:             @brand-primary;
-//** Success progress bar color
-@progress-bar-success-bg:     @brand-success;
-//** Warning progress bar color
-@progress-bar-warning-bg:     @brand-warning;
-//** Danger progress bar color
-@progress-bar-danger-bg:      @brand-danger;
-//** Info progress bar color
-@progress-bar-info-bg:        @brand-info;
-
-
-//== List group
-//
-//##
-
-//** Background color on `.list-group-item`
-@list-group-bg:                 #fff;
-//** `.list-group-item` border color
-@list-group-border:             @gray-lighter;
-//** List group border radius
-@list-group-border-radius:      @border-radius-base;
-
-//** Background color of single list elements on hover
-@list-group-hover-bg:           @gray-lighter;
-//** Text color of active list elements
-@list-group-active-color:       @component-active-color;
-//** Background color of active list elements
-@list-group-active-bg:          @component-active-bg;
-//** Border color of active list elements
-@list-group-active-border:      @list-group-active-bg;
-@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
-
-@list-group-link-color:         #555;
-@list-group-link-heading-color: #333;
-
-
-//== Panels
-//
-//##
-
-@panel-bg:                    #fff;
-@panel-body-padding:          15px;
-@panel-border-radius:         @border-radius-base;
-
-//** Border color for elements within panels
-@panel-inner-border:          @gray-lighter;
-@panel-footer-bg:             @gray-lighter;
-
-@panel-default-text:          @text-color;
-@panel-default-border:        @gray-lighter;
-@panel-default-heading-bg:    @gray-lighter;
-
-@panel-primary-text:          #fff;
-@panel-primary-border:        @brand-primary;
-@panel-primary-heading-bg:    @brand-primary;
-
-@panel-success-text:          @state-success-text;
-@panel-success-border:        @state-success-border;
-@panel-success-heading-bg:    @state-success-bg;
-
-@panel-info-text:             @state-info-text;
-@panel-info-border:           @state-info-border;
-@panel-info-heading-bg:       @state-info-bg;
-
-@panel-warning-text:          @state-warning-text;
-@panel-warning-border:        @state-warning-border;
-@panel-warning-heading-bg:    @state-warning-bg;
-
-@panel-danger-text:           @state-danger-text;
-@panel-danger-border:         @state-danger-border;
-@panel-danger-heading-bg:     @state-danger-bg;
-
-
-//== Thumbnails
-//
-//##
-
-//** Padding around the thumbnail image
-@thumbnail-padding:           4px;
-//** Thumbnail background color
-@thumbnail-bg:                @body-bg;
-//** Thumbnail border color
-@thumbnail-border:            @gray-lighter;
-//** Thumbnail border radius
-@thumbnail-border-radius:     @border-radius-base;
-
-//** Custom text color for thumbnail captions
-@thumbnail-caption-color:     @text-color;
-//** Padding around the thumbnail caption
-@thumbnail-caption-padding:   9px;
-
-
-//== Wells
-//
-//##
-
-@well-bg:                     @gray-lighter;
-@well-border:                 transparent;
-
-
-//== Badges
-//
-//##
-
-@badge-color:                 #fff;
-//** Linked badge text color on hover
-@badge-link-hover-color:      #fff;
-@badge-bg:                    @brand-primary;
-
-//** Badge text color in active nav link
-@badge-active-color:          @brand-primary;
-//** Badge background color in active nav link
-@badge-active-bg:             #fff;
-
-@badge-font-weight:           bold;
-@badge-line-height:           1;
-@badge-border-radius:         10px;
-
-
-//== Breadcrumbs
-//
-//##
-
-@breadcrumb-padding-vertical:   8px;
-@breadcrumb-padding-horizontal: 15px;
-//** Breadcrumb background color
-@breadcrumb-bg:                 @gray-lighter;
-//** Breadcrumb text color
-@breadcrumb-color:              #ccc;
-//** Text color of current page in the breadcrumb
-@breadcrumb-active-color:       @gray;
-//** Textual separator for between breadcrumb elements
-@breadcrumb-separator:          "/";
-
-
-//== Carousel
-//
-//##
-
-@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
-
-@carousel-control-color:                      #fff;
-@carousel-control-width:                      15%;
-@carousel-control-opacity:                    .5;
-@carousel-control-font-size:                  20px;
-
-@carousel-indicator-active-bg:                #fff;
-@carousel-indicator-border-color:             #fff;
-
-@carousel-caption-color:                      #fff;
-
-
-//== Close
-//
-//##
-
-@close-font-weight:           bold;
-@close-color:                 #000;
-@close-text-shadow:           none;
-
-
-//== Code
-//
-//##
-
-@code-color:                  #c7254e;
-@code-bg:                     #f9f2f4;
-
-@kbd-color:                   #fff;
-@kbd-bg:                      #333;
-
-@pre-bg:                      @gray-lighter;
-@pre-color:                   @gray-dark;
-@pre-border-color:            #ccc;
-@pre-scrollable-max-height:   340px;
-
-
-//== Type
-//
-//##
-
-//** Text muted color
-@text-muted:                  @gray-light;
-//** Abbreviations and acronyms border color
-@abbr-border-color:           @gray-light;
-//** Headings small color
-@headings-small-color:        @gray-light;
-//** Blockquote small color
-@blockquote-small-color:      @gray-light;
-//** Blockquote font size
-@blockquote-font-size:        (@font-size-base * 1.25);
-//** Blockquote border color
-@blockquote-border-color:     @gray-lighter;
-//** Page header border color
-@page-header-border-color:    transparent;
-
-
-//== Miscellaneous
-//
-//##
-
-//** Horizontal line color.
-@hr-border:                   @gray-lighter;
-
-//** Horizontal offset for forms and lists.
-@component-offset-horizontal: 180px;
diff --git a/agate-webapp/src/main/webapp/styles/agate.css b/agate-webapp/src/main/webapp/styles/agate.css
deleted file mode 100644
index 16707f16e..000000000
--- a/agate-webapp/src/main/webapp/styles/agate.css
+++ /dev/null
@@ -1 +0,0 @@
-@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic");.nav{margin-left:0;margin-bottom:1.42857143;list-style:none}.nav>li>a{display:block;text-decoration:none !important}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#ecf0f1}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:13px;font-weight:bold;line-height:1.42857143;color:#b4bcc2;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:white;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#18BC9C}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{content:" ";display:table}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{content:" ";display:table}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:1.42857143;border:1px solid transparent;border-top-left-radius:4;border-bottom-right-radius:4;border-top-right-radius:4;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#ecf0f1 #ecf0f1 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#95a5a6;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;border-top-right-radius:5;border-bottom-right-radius:5;border-bottom-left-radius:5;border-top-left-radius:5}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:white;background-color:#18BC9C}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0}.nav-tabs.nav-stacked>li:first-child>a{border-top-right-radius:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-right-radius:6;border-bottom-left-radius:6;border-top-left-radius:6}.nav-pills .dropdown-menu{border-top-right-radius:6;border-bottom-right-radius:6;border-bottom-left-radius:6;border-top-left-radius:6}.nav .dropdown-toggle .caret{border-top-color:#18BC9C;border-bottom-color:#18BC9C;margin-top:6px}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#18BC9C;border-bottom-color:#18BC9C}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#95a5a6;border-bottom-color:#95a5a6}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:white;background-color:#b4bcc2;border-color:#b4bcc2}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:white;border-bottom-color:white;opacity:100;filter:alpha(opacity=10000)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#b4bcc2}.tabbable:before,.tabbable:after{content:" ";display:table}.tabbable:after{clear:both}.tabbable:before,.tabbable:after{content:" ";display:table}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{border-top-left-radius:0;border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-right-radius:4;border-bottom-left-radius:4;border-top-left-radius:4}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;border-top-right-radius:4;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom-left-radius:4;border-top-left-radius:4}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#ecf0f1 #ddd #ecf0f1 #ecf0f1}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:white}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;border-top-right-radius:0;border-top-right-radius:4;border-bottom-right-radius:4;border-bottom-left-radius:4;border-bottom-left-radius:0;border-top-left-radius:0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#ecf0f1 #ecf0f1 #ecf0f1 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:white}.nav>.disabled>a{color:#b4bcc2}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default}.tabs-menu.tabs-left>ul{margin-left:-60px;position:absolute}.tabs-menu.tabs-left>.nav-tabs>li>a{min-width:0}.panel-body>.nav-list>li>a,.panel-body>.nav-list .nav-header{margin-right:-30px}/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.42857143;color:#2C3E50;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#18BC9C;text-decoration:none}a:hover,a:focus{color:#18BC9C;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ecf0f1;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #ecf0f1}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#b4bcc2}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}mark,.mark{background-color:#F39C12;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#b4bcc2}.text-primary{color:#2C3E50}a.text-primary:hover,a.text-primary:focus{color:#1a242f}.text-success{color:#fff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#fff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#fff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#fff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff;background-color:#2C3E50}a.bg-primary:hover,a.bg-primary:focus{background-color:#1a242f}.bg-success{background-color:#18BC9C}a.bg-success:hover,a.bg-success:focus{background-color:#128f76}.bg-info{background-color:#3498DB}a.bg-info:hover,a.bg-info:focus{background-color:#217dbb}.bg-warning{background-color:#F39C12}a.bg-warning:hover,a.bg-warning:focus{background-color:#c87f0a}.bg-danger{background-color:#E74C3C}a.bg-danger:hover,a.bg-danger:focus{background-color:#d62c1a}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid transparent}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #b4bcc2}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #ecf0f1}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#b4bcc2}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #ecf0f1;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#7b8a8b;background-color:#ecf0f1;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1400px){.container{width:1370px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1400px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#b4bcc2;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ecf0f1}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ecf0f1}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ecf0f1}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ecf0f1}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ecf0f1}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f3f3f3}.table-hover>tbody>tr:hover{background-color:#ecf0f1}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#ecf0f1}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#dde4e6}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#18BC9C}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#15a589}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#3498DB}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#258cd1}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#F39C12}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#e08e0b}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#E74C3C}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#e43725}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ecf0f1}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 16px;font-size:15px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#fff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#fff;background-color:#95a5a6;border-color:#95a5a6}.btn-default:focus,.btn-default.focus{color:#fff;background-color:#798d8f;border-color:#566566}.btn-default:hover{color:#fff;background-color:#798d8f;border-color:#74898a}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#fff;background-color:#798d8f;border-color:#74898a}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#fff;background-color:#687b7c;border-color:#566566}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#95a5a6;border-color:#95a5a6}.btn-default .badge{color:#95a5a6;background-color:#fff}.btn-primary{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#1a242f;border-color:#000}.btn-primary:hover{color:#fff;background-color:#1a242f;border-color:#161f29}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#1a242f;border-color:#161f29}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#0d1318;border-color:#000}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#2C3E50;border-color:#2C3E50}.btn-primary .badge{color:#2C3E50;background-color:#fff}.btn-success{color:#fff;background-color:#18BC9C;border-color:#18BC9C}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#128f76;border-color:#0a4b3e}.btn-success:hover{color:#fff;background-color:#128f76;border-color:#11866f}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#128f76;border-color:#11866f}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#0e6f5c;border-color:#0a4b3e}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#18BC9C;border-color:#18BC9C}.btn-success .badge{color:#18BC9C;background-color:#fff}.btn-info{color:#fff;background-color:#3498DB;border-color:#3498DB}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#217dbb;border-color:#16527a}.btn-info:hover{color:#fff;background-color:#217dbb;border-color:#2077b2}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#217dbb;border-color:#2077b2}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#1c699d;border-color:#16527a}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#3498DB;border-color:#3498DB}.btn-info .badge{color:#3498DB;background-color:#fff}.btn-warning{color:#fff;background-color:#F39C12;border-color:#F39C12}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#c87f0a;border-color:#7f5006}.btn-warning:hover{color:#fff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#a66908;border-color:#7f5006}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#F39C12;border-color:#F39C12}.btn-warning .badge{color:#F39C12;background-color:#fff}.btn-danger{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#d62c1a;border-color:#921e12}.btn-danger:hover{color:#fff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#b62516;border-color:#921e12}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#E74C3C;border-color:#E74C3C}.btn-danger .badge{color:#E74C3C;background-color:#fff}.btn-link{color:#18BC9C;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#18BC9C;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#b4bcc2;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:18px 27px;font-size:19px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#2C3E50;border:0;border-bottom:1px solid transparent}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:15px;line-height:1.42857143;color:#2C3E50}.form-control{display:block;width:100%;height:35px;padding:6px 16px;font-size:15px;line-height:1.42857143;color:#2C3E50;background-color:#fff;background-image:none;border:1px solid #dce4ec;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#2C3E50;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(44, 62, 80, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(44, 62, 80, 0.6)}.form-control::-moz-placeholder{color:#acb6c0;opacity:1}.form-control:-ms-input-placeholder{color:#acb6c0}.form-control::-webkit-input-placeholder{color:#acb6c0}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ecf0f1;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:35px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:33px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:64px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:33px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-sm{height:33px;line-height:33px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:33px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:33px;line-height:33px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:33px;min-height:34px;padding:7px 9px;font-size:13px;line-height:1.5}.input-lg{height:64px;padding:18px 27px;font-size:19px;line-height:1.33;border-radius:6px}select.input-lg{height:64px;line-height:64px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:64px;padding:18px 27px;font-size:19px;line-height:1.33;border-radius:6px}.form-group-lg select.form-control{height:64px;line-height:64px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:64px;min-height:40px;padding:19px 27px;font-size:19px;line-height:1.33}.has-feedback{position:relative}.has-feedback .form-control{padding-right:43.75px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:35px;height:35px;line-height:35px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:64px;height:64px;line-height:64px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:33px;height:33px;line-height:33px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#fff}.has-success .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#fff;border-color:#fff;background-color:#18BC9C}.has-success .form-control-feedback{color:#fff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#fff}.has-warning .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#fff;border-color:#fff;background-color:#F39C12}.has-warning .form-control-feedback{color:#fff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#fff}.has-error .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#fff;border-color:#fff;background-color:#E74C3C}.has-error .form-control-feedback{color:#fff}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#597ea2}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:28px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:7px;font-size:13px}}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#7b8a8b;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#fff;background-color:#2C3E50}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#2C3E50}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#b4bcc2}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#b4bcc2;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:64px;padding:18px 27px;font-size:19px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:64px;line-height:64px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:33px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:33px;line-height:33px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 16px;font-size:15px;font-weight:normal;line-height:1;color:#2C3E50;text-align:center;background-color:#ecf0f1;border:1px solid #dce4ec;border-radius:4px}.input-group-addon.input-sm{padding:6px 9px;font-size:13px;border-radius:3px}.input-group-addon.input-lg{padding:18px 27px;font-size:19px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#ecf0f1}.nav>li.disabled>a{color:#b4bcc2}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#b4bcc2;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#ecf0f1;border-color:#18BC9C}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ecf0f1}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#ecf0f1 #ecf0f1 #ecf0f1}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#2C3E50;background-color:#fff;border:1px solid #ecf0f1;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ecf0f1}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ecf0f1;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#2C3E50}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ecf0f1}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ecf0f1;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:60px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:19.5px 15px;font-size:19px;line-height:21px;height:60px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:13px;margin-bottom:13px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:9.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:19.5px;padding-bottom:19.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:12.5px;margin-bottom:12.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:12.5px;margin-bottom:12.5px}.navbar-btn.btn-sm{margin-top:13.5px;margin-bottom:13.5px}.navbar-btn.btn-xs{margin-top:19px;margin-bottom:19px}.navbar-text{margin-top:19.5px;margin-bottom:19.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important;float:left}.navbar-right{float:right !important;float:right;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#2C3E50;border-color:transparent}.navbar-default .navbar-brand{color:#fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#18BC9C;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#fff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#18BC9C;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#1a242f}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#1a242f}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#1a242f}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#1a242f;color:#fff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#18BC9C;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#1a242f}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#fff}.navbar-default .navbar-link:hover{color:#18BC9C}.navbar-default .btn-link{color:#fff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#18BC9C}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#18BC9C;border-color:transparent}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#2C3E50;background-color:transparent}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#2C3E50;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#15a589}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#128f76}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#128f76}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#149c82}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#15a589;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#2C3E50;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#15a589}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover{color:#2C3E50}.navbar-inverse .btn-link{color:#fff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#2C3E50}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#ccc}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#ecf0f1;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#95a5a6}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 16px;line-height:1.42857143;text-decoration:none;color:#fff;background-color:#18BC9C;border:1px solid transparent;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#fff;background-color:#0f7864;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#fff;background-color:#0f7864;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#ecf0f1;background-color:#3be6c4;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:18px 27px;font-size:19px;line-height:1.33}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:6px 9px;font-size:13px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#18BC9C;border:1px solid transparent;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#0f7864}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#fff;background-color:#18BC9C;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#95a5a6}.label-default[href]:hover,.label-default[href]:focus{background-color:#798d8f}.label-primary{background-color:#2C3E50}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#1a242f}.label-success{background-color:#18BC9C}.label-success[href]:hover,.label-success[href]:focus{background-color:#128f76}.label-info{background-color:#3498DB}.label-info[href]:hover,.label-info[href]:focus{background-color:#217dbb}.label-warning{background-color:#F39C12}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#c87f0a}.label-danger{background-color:#E74C3C}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d62c1a}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#2C3E50;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2C3E50;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#ecf0f1}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#cfd9db}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.42857143;background-color:#fff;border:1px solid #ecf0f1;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#18BC9C}.thumbnail .caption{padding:9px;color:#2C3E50}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#18BC9C;border-color:#18BC9C;color:#fff}.alert-success hr{border-top-color:#15a589}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#3498DB;border-color:#3498DB;color:#fff}.alert-info hr{border-top-color:#258cd1}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#F39C12;border-color:#F39C12;color:#fff}.alert-warning hr{border-top-color:#e08e0b}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#E74C3C;border-color:#E74C3C;color:#fff}.alert-danger hr{border-top-color:#e43725}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#ecf0f1;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:13px;line-height:21px;color:#fff;text-align:center;background-color:#2C3E50;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#18BC9C}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#3498DB}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#F39C12}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#E74C3C}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ecf0f1}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#ecf0f1}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#ecf0f1;color:#b4bcc2;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#b4bcc2}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#2C3E50;border-color:#2C3E50}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#8aa4be}.list-group-item-success{color:#fff;background-color:#18BC9C}a.list-group-item-success,button.list-group-item-success{color:#fff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#fff;background-color:#15a589}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-info{color:#fff;background-color:#3498DB}a.list-group-item-info,button.list-group-item-info{color:#fff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#fff;background-color:#258cd1}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-warning{color:#fff;background-color:#F39C12}a.list-group-item-warning,button.list-group-item-warning{color:#fff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#fff;background-color:#e08e0b}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-danger{color:#fff;background-color:#E74C3C}a.list-group-item-danger,button.list-group-item-danger{color:#fff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#fff;background-color:#e43725}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#ecf0f1;border-top:1px solid #ecf0f1;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ecf0f1}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ecf0f1}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ecf0f1}.panel-default{border-color:#ecf0f1}.panel-default>.panel-heading{color:#2C3E50;background-color:#ecf0f1;border-color:#ecf0f1}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ecf0f1}.panel-default>.panel-heading .badge{color:#ecf0f1;background-color:#2C3E50}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ecf0f1}.panel-primary{border-color:#2C3E50}.panel-primary>.panel-heading{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2C3E50}.panel-primary>.panel-heading .badge{color:#2C3E50;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2C3E50}.panel-success{border-color:#18BC9C}.panel-success>.panel-heading{color:#fff;background-color:#18BC9C;border-color:#18BC9C}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#18BC9C}.panel-success>.panel-heading .badge{color:#18BC9C;background-color:#fff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#18BC9C}.panel-info{border-color:#3498DB}.panel-info>.panel-heading{color:#fff;background-color:#3498DB;border-color:#3498DB}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3498DB}.panel-info>.panel-heading .badge{color:#3498DB;background-color:#fff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3498DB}.panel-warning{border-color:#F39C12}.panel-warning>.panel-heading{color:#fff;background-color:#F39C12;border-color:#F39C12}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#F39C12}.panel-warning>.panel-heading .badge{color:#F39C12;background-color:#fff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#F39C12}.panel-danger{border-color:#E74C3C}.panel-danger>.panel-heading{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#E74C3C}.panel-danger>.panel-heading .badge{color:#E74C3C;background-color:#fff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#E74C3C}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#ecf0f1;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#000;text-shadow:none;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:rgba(0,0,0,0.9);border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,0.9)}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,0.9)}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,0.9)}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:rgba(0,0,0,0.9)}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:rgba(0,0,0,0.9)}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,0.9)}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,0.9)}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,0.9)}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform 0.6s ease-in-out;-moz-transition:-moz-transform 0.6s ease-in-out;-o-transition:-o-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1399px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1399px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1399px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1399px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1400px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1400px){.visible-lg-block{display:block !important}}@media (min-width:1400px){.visible-lg-inline{display:inline !important}}@media (min-width:1400px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1399px){.hidden-md{display:none !important}}@media (min-width:1400px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border-width:0}.navbar-default .badge{background-color:#fff;color:#2C3E50}.navbar-inverse .badge{background-color:#fff;color:#18BC9C}.navbar-brand{line-height:1}.btn{border-width:2px}.btn:active{-webkit-box-shadow:none;box-shadow:none}.btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.text-primary,.text-primary:hover{color:#2C3E50}.text-success,.text-success:hover{color:#18BC9C}.text-danger,.text-danger:hover{color:#E74C3C}.text-warning,.text-warning:hover{color:#F39C12}.text-info,.text-info:hover{color:#3498DB}table a:not(.btn),.table a:not(.btn){text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .success,.table .success,table .warning,.table .warning,table .danger,.table .danger,table .info,.table .info{color:#fff}table .success>th>a,.table .success>th>a,table .warning>th>a,.table .warning>th>a,table .danger>th>a,.table .danger>th>a,table .info>th>a,.table .info>th>a,table .success>td>a,.table .success>td>a,table .warning>td>a,.table .warning>td>a,table .danger>td>a,.table .danger>td>a,table .info>td>a,.table .info>td>a,table .success>a,.table .success>a,table .warning>a,.table .warning>a,table .danger>a,.table .danger>a,table .info>a,.table .info>a{color:#fff}table>thead>tr>th,.table>thead>tr>th,table>tbody>tr>th,.table>tbody>tr>th,table>tfoot>tr>th,.table>tfoot>tr>th,table>thead>tr>td,.table>thead>tr>td,table>tbody>tr>td,.table>tbody>tr>td,table>tfoot>tr>td,.table>tfoot>tr>td{border:none}table-bordered>thead>tr>th,.table-bordered>thead>tr>th,table-bordered>tbody>tr>th,.table-bordered>tbody>tr>th,table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>th,table-bordered>thead>tr>td,.table-bordered>thead>tr>td,table-bordered>tbody>tr>td,.table-bordered>tbody>tr>td,table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ecf0f1}.form-control,input{border-width:2px;-webkit-box-shadow:none;box-shadow:none}.form-control:focus,input:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#F39C12}.has-warning .form-control,.has-warning .form-control:focus{border:2px solid #F39C12}.has-warning .input-group-addon{border-color:#F39C12}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#E74C3C}.has-error .form-control,.has-error .form-control:focus{border:2px solid #E74C3C}.has-error .input-group-addon{border-color:#E74C3C}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#18BC9C}.has-success .form-control,.has-success .form-control:focus{border:2px solid #18BC9C}.has-success .input-group-addon{border-color:#18BC9C}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:transparent}.pager a,.pager a:hover{color:#fff}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{background-color:#3be6c4}.close{color:#fff;text-decoration:none;opacity:.4}.close:hover,.close:focus{color:#fff;opacity:1}.alert .alert-link{color:#fff;text-decoration:underline}.progress{height:10px;-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:10px;line-height:10px}.well{-webkit-box-shadow:none;box-shadow:none}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border-color:#ecf0f1}a.list-group-item-success.active{background-color:#18BC9C}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#15a589}a.list-group-item-warning.active{background-color:#F39C12}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#e08e0b}a.list-group-item-danger.active{background-color:#E74C3C}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#e43725}.panel-default .close{color:#2C3E50}.modal .close{color:#2C3E50}.popover{color:#2C3E50}@font-face{font-family:'FontAwesome';src:url('../bower_components/font-awesome/fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../bower_components/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../bower_components/font-awesome/fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../bower_components/font-awesome/fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../bower_components/font-awesome/fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../bower_components/font-awesome/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.chosen-select{width:100%}.chosen-select-deselect{width:100%}.chosen-container{display:inline-block;font-size:15px;position:relative;vertical-align:middle}.chosen-container .chosen-drop{background:#fff;border:1px solid #b4bcc2;border-top-color:#fafbfb;border-bottom-right-radius:4px;border-bottom-left-radius:4px;-webkit-box-shadow:0 8px 8px rgba(0, 0, 0, .25);box-shadow:0 8px 8px rgba(0, 0, 0, .25);margin-top:-1px;position:absolute;top:100%;left:-9000px;z-index:1060}.chosen-container.chosen-with-drop .chosen-drop{left:0;right:0}.chosen-container .chosen-results{color:#95a5a6;margin:0 4px 4px 0;max-height:240px;padding:0 0 0 4px;position:relative;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;line-height:1.42857143;list-style:none;margin:0;padding:5px 6px}.chosen-container .chosen-results li em{background:#feffde;font-style:normal}.chosen-container .chosen-results li.group-result{display:list-item;cursor:default;color:#999;font-weight:bold}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li.active-result{cursor:pointer;display:list-item}.chosen-container .chosen-results li.highlighted{background-color:#18BC9C;color:white}.chosen-container .chosen-results li.highlighted em{background:transparent}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#b4bcc2}.chosen-container .chosen-results .no-results{background:#ecf0f1;display:list-item}.chosen-container .chosen-results-scroll{background:white;margin:0 4px;position:absolute;text-align:center;width:321px;z-index:1}.chosen-container .chosen-results-scroll span{display:inline-block;height:1.42857143;text-indent:-5000px;width:9px}.chosen-container .chosen-results-scroll-down{bottom:0}.chosen-container .chosen-results-scroll-down span{background:url("../images/chosen-sprite.png") no-repeat -4px -3px}.chosen-container .chosen-results-scroll-up span{background:url("../images/chosen-sprite.png") no-repeat -22px -3px}.chosen-container-single .chosen-single{background-color:#fff;background-image:-webkit-linear-gradient(top, white 0, #ecf0f1 100%);background-image:-o-linear-gradient(top, white 0, #ecf0f1 100%);background-image:linear-gradient(to bottom, white 0, #ecf0f1 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffecf0f1', GradientType=0);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #dce4ec;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);color:#95a5a6;display:block;height:35px;overflow:hidden;line-height:35px;padding:0 0 0 8px;position:relative;text-decoration:none;white-space:nowrap}.chosen-container-single .chosen-single span{display:block;margin-right:26px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single abbr{background:url("../images/chosen-sprite.png") right top no-repeat;display:block;font-size:1px;height:10px;position:absolute;right:26px;top:12.5px;width:12px}.chosen-container-single .chosen-single abbr:hover{background-position:right -11px}.chosen-container-single .chosen-single.chosen-disabled .chosen-single abbr:hover{background-position:right 2px}.chosen-container-single .chosen-single div{display:block;height:100%;position:absolute;top:0;right:0;width:18px}.chosen-container-single .chosen-single div b{background:url("../images/chosen-sprite.png") no-repeat 0 7px;display:block;height:100%;width:100%}.chosen-container-single .chosen-default{color:#b4bcc2}.chosen-container-single .chosen-search{margin:0;padding:3px 4px;position:relative;white-space:nowrap;z-index:1000}.chosen-container-single .chosen-search input{background:url("../images/chosen-sprite.png") no-repeat 100% -20px,#fff;border:1px solid #dce4ec;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);margin:1px 0;padding:4px 20px 4px 4px;width:100%}.chosen-container-single .chosen-drop{margin-top:-1px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.chosen-container-single-nosearch .chosen-search input{position:absolute;left:-9000px}.chosen-container-multi .chosen-choices{background-color:#fff;border:1px solid #dce4ec;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);cursor:text;height:auto !important;height:1%;margin:0;overflow:hidden;padding:0;position:relative}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices .search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices .search-field input{background:transparent !important;border:0 !important;-webkit-box-shadow:none;box-shadow:none;color:#95a5a6;height:33px;margin:0;padding:4px;outline:0}.chosen-container-multi .chosen-choices .search-field .default{color:#999}.chosen-container-multi .chosen-choices .search-choice{-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;background-color:#ecf0f1;border:1px solid #dce4ec;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;background-image:-webkit-linear-gradient(top, white 0, #ecf0f1 100%);background-image:-o-linear-gradient(top, white 0, #ecf0f1 100%);background-image:linear-gradient(to bottom, white 0, #ecf0f1 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffecf0f1', GradientType=0);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);color:#7b8a8b;cursor:default;line-height:13px;margin:6px 0 3px 5px;padding:3px 20px 3px 5px;position:relative}.chosen-container-multi .chosen-choices .search-choice .search-choice-close{background:url("../images/chosen-sprite.png") right top no-repeat;display:block;font-size:1px;height:10px;position:absolute;right:4px;top:5px;width:12px}.chosen-container-multi .chosen-choices .search-choice .search-choice-close:hover{background-position:right -11px}.chosen-container-multi .chosen-choices .search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices .search-choice-focus .search-choice-close{background-position:right -11px}.chosen-container-multi .chosen-results{margin:0 0 0 0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:none}.chosen-container-active .chosen-single{border:1px solid rgba(82,168,236,0.8);-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6);box-shadow:0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6);-webkit-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s}.chosen-container-active.chosen-with-drop .chosen-single{background-color:#ecf0f1;border:1px solid rgba(82,168,236,0.8);-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6);box-shadow:0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6);-webkit-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s}.chosen-container-active.chosen-with-drop .chosen-single div{background:transparent;border-left:none}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 7px}.chosen-container-active .chosen-choices{border:1px solid rgba(82,168,236,0.8);border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6);box-shadow:0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6);-webkit-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s}.chosen-container-active .chosen-choices .search-field input{color:#111 !important}.chosen-disabled{cursor:default;opacity:.5 !important}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{padding:0 8px 0 0;overflow:visible}.chosen-rtl .chosen-single span{margin-left:26px;margin-right:0;direction:rtl}.chosen-rtl .chosen-single div{left:7px;right:auto}.chosen-rtl .chosen-single abbr{left:26px;right:auto}.chosen-rtl .chosen-choices .search-field input{direction:rtl}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices .search-choice{margin:6px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices .search-choice .search-choice-close{background-position:right top;left:4px;right:auto}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results .group-option{padding-left:0;padding-right:15px}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input{background:url("../images/chosen-sprite.png") no-repeat -28px -20px,#fff;direction:rtl;padding:4px 5px 4px 20px}body{background:#fafafa;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#333}.inline{display:inline}.page-header{margin-top:50px}footer{margin:40px 0;padding:20px 0;border-top:solid 1px #EEEEEE;font-size:.8em}.table{margin-top:5px}.table thead{background-color:#EEEEEE}td.action-column{white-space:nowrap !important;width:1px !important}.ellipsis{white-space:nowrap;width:6em;overflow:hidden;text-overflow:ellipsis}.development{position:absolute;width:149px;height:149px;top:0;left:0;border:0;z-index:10000;background-image:url("../images/development_ribbon.png");background-position:center center;background-repeat:no-repeat}.hero-unit{margin:50px auto 0 auto;width:300px;font-size:18px;font-weight:200;line-height:30px;background-color:#eee;border-radius:6px;padding:60px}.hero-unit h1{font-size:60px;line-height:1;letter-spacing:-1px}.error{color:white;background-color:red}.loading{width:16px;height:11px;background-image:url("../images/loading.gif")}.hand{cursor:pointer}#threadDump .popover,#healthCheck .popover{top:inherit;display:block;font-size:10px;max-width:1024px}#healthCheck .popover{margin-left:-50px}.alert .popover pre{font-size:10px}.voffset{margin-top:2px}.voffset1{margin-top:5px}.voffset2{margin-top:10px}.voffset3{margin-top:15px}.voffset4{margin-top:30px}.voffset5{margin-top:40px}.voffset6{margin-top:60px}.voffset7{margin-top:80px}.voffset8{margin-top:100px}.voffset9{margin-top:150px}.hoffset-right{margin-right:2px}ul#strength{display:inline;list-style:none;margin:0;margin-left:15px;padding:0;vertical-align:2px}ul.no-style-list{list-style:none;margin:0;padding:0}ul.pagination{margin:0}.point:last{margin:0 !important}.point{background:#DDD;border-radius:2px;display:inline-block;height:5px;margin-right:1px;width:20px}.input-error{background-color:#E74C3C;border-color:#E74C3C;color:#fff;padding:2px 5px}.input-error hr{border-top-color:#e43725}.input-error .alert-link{color:#e6e6e6}.input-error:first-letter{text-transform:uppercase}.no-margin-bottom{margin-bottom:0}form .tab-content{padding-top:20px;padding-bottom:20px}ul.sortable li{cursor:move}ul.sortable li .action{margin-left:5px;cursor:pointer}#loading{width:150px;position:absolute;left:50%;margin-left:-75px;padding:2px;border:1px solid transparent;border-radius:4px}.agate-breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#ecf0f1;border-radius:4px;background:none;padding:0 0}.agate-breadcrumb>li{display:inline-block}.agate-breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.agate-breadcrumb>.active{color:#95a5a6}.agate-breadcrumb>.ellipsis{margin-bottom:-5px}table tbody th{width:200px}td ul,td ol{margin-bottom:0}.ace_editor{font-size:16px !important;height:600px}@media (max-width:1200px){.navbar-header{float:none}.navbar-left,.navbar-right{float:none !important}.navbar-toggle{display:block}.navbar-collapse{border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1)}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-collapse.collapse{display:none !important}.navbar-nav{float:none !important;margin-top:7.5px}.navbar-nav>li{float:none}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px}.collapse.in{display:block !important}}/*# sourceMappingURL=agate.css.map */
\ No newline at end of file
diff --git a/agate-webapp/src/main/webapp/styles/documentation.css b/agate-webapp/src/main/webapp/styles/documentation.css
deleted file mode 100644
index 47e64d1e0..000000000
--- a/agate-webapp/src/main/webapp/styles/documentation.css
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright (c) 2017 OBiBa. All rights reserved.
- *
- * This program and the accompanying materials
- * are made available under the terms of the GNU Public License v3.0.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see .
- */
-
-/*!
- * Your CSS files will be generated in this directory by "grunt compass"
- */
- 
\ No newline at end of file
diff --git a/agate-webapp/src/main/webapp/styles/famfamfam-flags.css b/agate-webapp/src/main/webapp/styles/famfamfam-flags.css
deleted file mode 100644
index 016c2581f..000000000
--- a/agate-webapp/src/main/webapp/styles/famfamfam-flags.css
+++ /dev/null
@@ -1,1566 +0,0 @@
-/*
- * Copyright (c) 2017 OBiBa. All rights reserved.
- *
- * This program and the accompanying materials
- * are made available under the terms of the GNU Public License v3.0.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see .
- */
-
-/**
- * FAMFAMFAM flag icons CSS.
- *
- * Code from http://tkrotoff.github.io/famfamfam_flags/
- *
- * Examples:
- *  France
- *  United States
- */
-
-[class^="famfamfam-flag"] {
-  display: inline-block;
-  width: 16px;
-  height: 11px;
-  line-height: 11px;
-  /* vertical-align: text-top; */
-  background-image: url("../images/famfamfam-flags.png");
-  background-position: 0 0;
-  background-repeat: no-repeat;
-}
-
-.famfamfam-flag-zw {
-  background-position: 0px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-zm {
-  background-position: -16px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-za {
-  background-position: 0px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-yt {
-  background-position: -16px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ye {
-  background-position: -32px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ws {
-  background-position: -32px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-wf {
-  background-position: 0px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-wales {
-  background-position: -16px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-vu {
-  background-position: -32px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-vn {
-  background-position: 0px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-vi {
-  background-position: -16px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-vg {
-  background-position: -32px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ve {
-  background-position: -48px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-vc {
-  background-position: -48px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-va {
-  background-position: -48px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-uz {
-  background-position: -48px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-uy {
-  background-position: 0px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-us {
-  background-position: -16px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-um {
-  background-position: -16px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ug {
-  background-position: -32px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ua {
-  background-position: -48px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tz {
-  background-position: -64px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tw {
-  background-position: -64px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tv {
-  background-position: -64px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tt {
-  background-position: -64px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tr {
-  background-position: -64px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-to {
-  background-position: 0px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tn {
-  background-position: -16px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tm {
-  background-position: -32px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tl {
-  background-position: -48px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tk {
-  background-position: -64px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tj {
-  background-position: 0px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-th {
-  background-position: -16px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tg {
-  background-position: -32px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tf {
-  background-position: -48px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-td {
-  background-position: -64px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-tc {
-  background-position: -80px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sz {
-  background-position: -80px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sy {
-  background-position: -80px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sx {
-  background-position: -80px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sv {
-  background-position: -80px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-st {
-  background-position: -80px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ss {
-  background-position: -80px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sr {
-  background-position: 0px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-so {
-  background-position: -16px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sn {
-  background-position: -32px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sm {
-  background-position: -48px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sl {
-  background-position: -64px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sk {
-  background-position: -80px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-si {
-  background-position: -96px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sh {
-  background-position: -96px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sg {
-  background-position: -96px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-se {
-  background-position: -96px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sd {
-  background-position: -96px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-scotland {
-  background-position: -96px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sc {
-  background-position: -96px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sb {
-  background-position: -96px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sa {
-  background-position: 0px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-rw {
-  background-position: -16px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ru {
-  background-position: -32px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-rs {
-  background-position: -48px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ro {
-  background-position: -64px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-qa {
-  background-position: -80px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-py {
-  background-position: -96px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-pw {
-  background-position: 0px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-pt {
-  background-position: -16px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ps {
-  background-position: -32px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-pr {
-  background-position: -48px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-pn {
-  background-position: -64px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-pm {
-  background-position: -80px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-pl {
-  background-position: -96px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-pk {
-  background-position: -112px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ph {
-  background-position: -112px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-pg {
-  background-position: -112px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-pf {
-  background-position: -112px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-pe {
-  background-position: -112px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-pa {
-  background-position: -112px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-om {
-  background-position: -112px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-nz {
-  background-position: -112px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-nu {
-  background-position: -112px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-nr {
-  background-position: -112px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-no {
-  background-position: 0px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bv {
-  background-position: 0px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-sj {
-  background-position: 0px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-nl {
-  background-position: -16px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ni {
-  background-position: -32px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ng {
-  background-position: -48px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-nf {
-  background-position: -64px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ne {
-  background-position: -80px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-nc {
-  background-position: -96px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-na {
-  background-position: -112px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mz {
-  background-position: -128px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-my {
-  background-position: -128px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mx {
-  background-position: -128px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mw {
-  background-position: -128px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mv {
-  background-position: -128px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mu {
-  background-position: -128px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mt {
-  background-position: -128px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ms {
-  background-position: -128px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mr {
-  background-position: -128px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mq {
-  background-position: -128px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mp {
-  background-position: -128px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mo {
-  background-position: 0px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mn {
-  background-position: -16px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mm {
-  background-position: -32px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ml {
-  background-position: -48px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mk {
-  background-position: -64px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mh {
-  background-position: -80px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mg {
-  background-position: -96px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-me {
-  background-position: 0px -132px;
-  width: 16px;
-  height: 12px;
-}
-
-.famfamfam-flag-md {
-  background-position: -112px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mc {
-  background-position: -128px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ma {
-  background-position: -16px -132px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ly {
-  background-position: -32px -132px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-lv {
-  background-position: -48px -132px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-lu {
-  background-position: -64px -132px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-lt {
-  background-position: -80px -132px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ls {
-  background-position: -96px -132px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-lr {
-  background-position: -112px -132px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-lk {
-  background-position: -128px -132px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-li {
-  background-position: -144px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-lc {
-  background-position: -144px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-lb {
-  background-position: -144px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-la {
-  background-position: -144px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-kz {
-  background-position: -144px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ky {
-  background-position: -144px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-kw {
-  background-position: -144px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-kr {
-  background-position: -144px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-kp {
-  background-position: -144px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-kn {
-  background-position: -144px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-km {
-  background-position: -144px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ki {
-  background-position: -144px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-kh {
-  background-position: -144px -132px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-kg {
-  background-position: 0px -144px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ke {
-  background-position: -16px -144px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-jp {
-  background-position: -32px -144px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-jo {
-  background-position: -48px -144px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-jm {
-  background-position: -64px -144px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-je {
-  background-position: -80px -144px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-it {
-  background-position: -96px -144px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-is {
-  background-position: -112px -144px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ir {
-  background-position: -128px -144px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-iq {
-  background-position: -144px -144px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-io {
-  background-position: -160px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-in {
-  background-position: -160px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-im {
-  background-position: -160px -22px;
-  width: 16px;
-  height: 9px;
-}
-
-.famfamfam-flag-il {
-  background-position: -160px -31px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ie {
-  background-position: -160px -42px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-id {
-  background-position: -160px -53px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-hu {
-  background-position: -160px -64px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ht {
-  background-position: -160px -75px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-hr {
-  background-position: -160px -86px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-hn {
-  background-position: -160px -97px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-hk {
-  background-position: -160px -108px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gy {
-  background-position: -160px -119px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gw {
-  background-position: -160px -130px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gu {
-  background-position: -160px -141px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gt {
-  background-position: 0px -155px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gs {
-  background-position: -16px -155px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gr {
-  background-position: -32px -155px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gq {
-  background-position: -48px -155px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gp {
-  background-position: -64px -155px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gn {
-  background-position: -80px -155px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gm {
-  background-position: -96px -155px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gl {
-  background-position: -112px -155px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gi {
-  background-position: -128px -155px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gh {
-  background-position: -144px -155px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gg {
-  background-position: -160px -155px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ge {
-  background-position: -176px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gd {
-  background-position: -176px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gb {
-  background-position: -176px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ga {
-  background-position: -176px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-fr {
-  background-position: -176px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-gf {
-  background-position: -176px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-re {
-  background-position: -176px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-mf {
-  background-position: -176px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bl {
-  background-position: -176px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-fo {
-  background-position: -176px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-fm {
-  background-position: -176px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-fk {
-  background-position: -176px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-fj {
-  background-position: -176px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-fi {
-  background-position: -176px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-fam {
-  background-position: -176px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-eu {
-  background-position: -176px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-et {
-  background-position: -176px -132px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-es {
-  background-position: -176px -143px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-er {
-  background-position: -176px -154px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-england {
-  background-position: 0px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-eh {
-  background-position: -16px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-eg {
-  background-position: -32px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ee {
-  background-position: -48px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ec {
-  background-position: -64px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-dz {
-  background-position: -80px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-do {
-  background-position: -96px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-dm {
-  background-position: -112px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-dk {
-  background-position: -128px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-dj {
-  background-position: -144px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-de {
-  background-position: -160px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cz {
-  background-position: -176px -166px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cy {
-  background-position: 0px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cx {
-  background-position: -16px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cw {
-  background-position: -32px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cv {
-  background-position: -48px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cu {
-  background-position: -64px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cs {
-  background-position: -80px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cr {
-  background-position: -96px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-co {
-  background-position: -112px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cn {
-  background-position: -128px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cm {
-  background-position: -144px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cl {
-  background-position: -160px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ck {
-  background-position: -176px -177px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ci {
-  background-position: -192px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cg {
-  background-position: -192px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cf {
-  background-position: -192px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cd {
-  background-position: -192px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-cc {
-  background-position: -192px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-catalonia {
-  background-position: -192px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ca {
-  background-position: -192px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bz {
-  background-position: -192px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-by {
-  background-position: -192px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bw {
-  background-position: -192px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bt {
-  background-position: -192px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bs {
-  background-position: -192px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-br {
-  background-position: -192px -132px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bq {
-  background-position: -192px -143px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bo {
-  background-position: -192px -154px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bn {
-  background-position: -192px -165px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bm {
-  background-position: -192px -176px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bj {
-  background-position: 0px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bi {
-  background-position: -16px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bh {
-  background-position: -32px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bg {
-  background-position: -48px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bf {
-  background-position: -64px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-be {
-  background-position: -80px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bd {
-  background-position: -96px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-bb {
-  background-position: -112px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ba {
-  background-position: -128px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-az {
-  background-position: -144px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ax {
-  background-position: -160px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-aw {
-  background-position: -176px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-au {
-  background-position: -192px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-hm {
-  background-position: -192px -188px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-at {
-  background-position: -208px 0px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-as {
-  background-position: -208px -11px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ar {
-  background-position: -208px -22px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ao {
-  background-position: -208px -33px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-an {
-  background-position: -208px -44px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-am {
-  background-position: -208px -55px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-al {
-  background-position: -208px -66px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ai {
-  background-position: -208px -77px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ag {
-  background-position: -208px -88px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-af {
-  background-position: -208px -99px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ae {
-  background-position: -208px -110px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-ad {
-  background-position: -208px -121px;
-  width: 16px;
-  height: 11px;
-}
-
-.famfamfam-flag-np {
-  background-position: -208px -132px;
-  width: 9px;
-  height: 11px;
-}
-
-.famfamfam-flag-ch {
-  background-position: -208px -143px;
-  width: 11px;
-  height: 11px;
-}
diff --git a/pom.xml b/pom.xml
index 8ee79346b..64ba70e06 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,6 +25,7 @@
     agate-web-model
     agate-core
     agate-rest
+    agate-ui
     agate-webapp
     agate-dist
   
@@ -77,6 +78,7 @@
     1.7.1
 
     
+    1.15.0
     1.6.0
     1.2.0
     3.1.0