diff --git a/.dockerignore b/.dockerignore index 5d13bb1cc..c1a60d799 100644 --- a/.dockerignore +++ b/.dockerignore @@ -15,5 +15,5 @@ Makefile README.md SECURITY.md ssh_match_hostname -support .js/package-lock.json +js/node_modules \ No newline at end of file diff --git a/.gitignore b/.gitignore index e8659535c..4804240ad 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ erl_crash.dump # secrets files as long as you replace their contents by environment # variables. /config/*.secret.exs -/config/releases.exs +/config/runtime.exs /setup_db.psql diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 79f02f5cf..2b386e9a8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -162,6 +162,7 @@ pages: stage: deploy script: - mkdir public + - mix deps.get - mix docs - mv doc public/backend # #- yarn run --cwd "js" styleguide:build @@ -183,7 +184,7 @@ pages: - mkdir -p /kaniko/.docker - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$CI_REGISTRY_AUTH\",\"email\":\"$CI_REGISTRY_EMAIL\"}}}" > /kaniko/.docker/config.json script: - - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/docker/production/Dockerfile --destination $DOCKER_IMAGE_NAME + - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/docker/production/Dockerfile --destination $DOCKER_IMAGE_NAME --build-arg VCS_REF=$CI_VCS_REF --build-arg BUILD_DATE=$CI_JOB_TIMESTAMP build-docker-master: <<: *docker @@ -205,19 +206,32 @@ build-docker-tag: package-app: stage: package - variables: + variables: &release-variables MIX_ENV: "prod" - script: + script: &release-script - mix local.hex --force - mix local.rebar --force - - cp docker/production/releases.exs ./config/ - mix deps.get - mix phx.digest - - mix release + - mix release --path release/mobilizon + - cd release/mobilizon && ln -s lib/mobilizon-*/priv priv + only: + - tags@framasoft/mobilizon + artifacts: + expire_in: never + paths: + - release + +package-app-dev: + stage: package + variables: *release-variables + script: *release-script + except: + - tags@framasoft/mobilizon artifacts: expire_in: 2 days paths: - - _build/prod/rel + - release release-upload: stage: upload @@ -229,7 +243,7 @@ release-upload: APP_ASSET="${CI_PROJECT_NAME}_${APP_VERSION}_${ARCH}.tar.gz" echo "Artifact: ${APP_ASSET}" - tar czf ${APP_ASSET} -C _build/prod/rel mobilizon + tar czf ${APP_ASSET} -C release mobilizon ls -al ${APP_ASSET} curl --silent --show-error --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file "${APP_ASSET}" ${PACKAGE_REGISTRY_URL}/${APP_VERSION}/${APP_ASSET} diff --git a/.sobelow-conf b/.sobelow-conf index fc0940908..8cd2246e6 100644 --- a/.sobelow-conf +++ b/.sobelow-conf @@ -8,5 +8,5 @@ out: "", threshold: "medium", ignore: ["Config.HTTPS", "Config.CSP"], - ignore_files: ["config/dev.1.secret.exs", "config/dev.2.secret.exs", "config/dev.3.secret.exs", "config/dev.secret.exs", "config/e2e.secret.exs", "config/prod.secret.exs", "config/test.secret.exs"] + ignore_files: ["config/dev.1.secret.exs", "config/dev.2.secret.exs", "config/dev.3.secret.exs", "config/dev.secret.exs", "config/e2e.secret.exs", "config/prod.secret.exs", "config/test.secret.exs", "config/runtime.1.secret.exs", "config/runtime.2.secret.exs", "config/runtime.3.secret.exs", "config/runtime.exs"] ] diff --git a/.sobelow-skips b/.sobelow-skips index 9e3133f2f..0d0acdd80 100644 --- a/.sobelow-skips +++ b/.sobelow-skips @@ -1,2 +1,6 @@ -752C0E897CA81ACD81F4BB215FA5F8E4 \ No newline at end of file +5048AE33D6269B15E21CF28C6F545AB6 + +752C0E897CA81ACD81F4BB215FA5F8E4 +23412CF16549E4E88366DC9DECF39071 +81C1F600C5809C7029EE32DE4818CD7D \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index d7d2e712f..7faf4c0a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,372 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 1.1.4 - 19-05-2021 + +### Fixes + +- Fixes rich media parsers, so that some resource links work again +- Fixes some depreciated calls that were removed in OTP24 +- Fixes groups not being refreshed after joining a group +- Fixes the notice that is shown when joining a group that the content may not be available right away - because the group is remote - being shown everytime, even when the group is local +- Fixes OGP image not being defined for posts + +### Translations + +- French +- Galician +- Italian + +## 1.1.3 - 03-05-2021 + +### Changed + +- Lower the frequency for refreshment of external groups + +### Fixes + +- Fixed spaces being eaten in the rich text editor (event description, comments and public posts) +- Fixed event physical address display +- Fixed tags being limited to 20 characters +- Fixed some ActivityPub errors + +### Translations + +- Galician +- Russian +- Spanish + +## 1.1.2 - 28-04-2021 + +### Changed + +- Added an unique index on the addresses url +- Added org.opencontainers.image.source annotation to the Docker image +- Improved the moderation action logs interface + +### Fixes + +- **Fixed some invalid email headers** +- **Fixed and repaired default profile still pointing on deleted profile** +- Fixed some ActivityPub issues and improve error handling +- Fixed a duplicate sentence in the email changed html template +- Fixed resource metadata remote image URL +- Fixed not only remote groups being refreshed after the acceptation of an invite +- Fixed an UI overflow on the organizer metadata block if the organizer remote username is too long + +### Translations + +- Italian +- German +- Slovenian +- Russian + +## 1.1.1 - 22-04-2021 + +### Changed + +- Allow to remove user location setting and location information on an event or group +- Instance level feeds are now shown on the instance About page, and are exposed as `rel=alternate` links, if instance level feeds are activated in the config +- Webfinger module now queries the host-meta XRD endpoint to detect the webfinger well-known endpoint +- Instance maximum upload sizes are now exposed in the API +- Improve handling of media files which are too heavy +- Improve details when editing or showing an user through CLI +- More strict browser compatibility +- Renamed "Close events" to "Nearby events" ("close" is too close to "closed") +- Improved Sentry integration + +### Fixes + +- Fixed accessing a group discussion page without being a member (the page was just broken) +- Fixed reloading the members list after excluding a member +- Fixed comments being closed under an event message when not connected +- Fixed path issue when fetching favicon for resources +- Fixed content type and size missing for profile avatars +- Fixed HTTP clients user-agent not using runtime configuration +- Fixed the `support` folder not being copied into releases +- Fixed the participation button position when text is too long or in some cases +- Fixed the incorrect CSP configuration +- Fixed discussions being sent to followers instead of members +- Fixed showing broken public UI for deleted/suspended group +- Fixed warning when getting out of creating/editing an unsaved event that was broken for some languages +- Fixed addresses being not trimmed in the iCalendar exports +- Fixed editing an user's email in CLI +- Fixed suspended actors being refreshed + + +### Translations + +- Gaelic +- German +- Kabyle (New!) +- Norwegian +- Russian +- Slovenian +- Spanish + +## 1.1.0 - 31-03-2021 + +This version introduces a new way to install and host Mobilizon : Elixir releases. This is the new default way of installing Mobilizon. Please read [UPGRADE.md](./UPGRADE.md#upgrading-from-10-to-11) for details on how to migrate to Elixir binary releases or stay on source install. + +### Added + +- **Add a group activity logbook** +- **Possibility for user to define a location in their settings to get close events** +- **Support for Elixir releases and runtime.exs, allowing to change configuration without recompiling** +- Support for Sentry +- Added support for custom plural rules on front-end (only Gaelic supported for now) +- Added possibility to bookmark search by location through geohash +- Add ENV parameter to allow Docker users to specify the IP which Mobilizon listens on +- Add instance-wide ICS & Atom feeds of public events (disabled by default) +- Add user and profile secret (tokened) feeds +- Runit configuration files + +### Changed + +- Prune done background jobs +- Improved search form +- Improved backend error page +- Added a confirmation step before deleting a conversation +- The default configuration for Mobilizon now listens only on the local interface +- Creating an event from the group page configures the event creation interface with the group as organizer +- Only provide executables for unix + +### Removed + +- Support for Elixir versions < 1.11 + +### Fixes + +- Fixed editing a group discussion +- Fixed accessing terms and privacy pages +- Fixed refreshing only groups which are stale +- Fixed success message when validating group follower +- Fixed formatted dates using system locale instead of browser/Mobilizon's locale +- Fixed federating draft status +- Fixed group draft posts being sent to followers +- Fixed detecting membership status on group page +- Fixed admin language selection +- Fixed geospatial configuration only being evaluated at compile-time, not at runtime +- Handle ActivityPub Fetcher returning text that's not JSON +- Fix accessing a group profile when not a member +- Fixed accessing the homepage with no location setting defined +- Fixed location field not showing in preferences if setting not already set +- Fixed lasts events published order on the homepage +- Fixed a typo in range/radius showing the wrong radius for close events on homepage +- Fixed hashtags disappearing from content +- Fixed close events order +- Fixed group posts edition +- Fixed validating new email with bad token +- Fixed `.well-known/host-meta` not being accessible with correct `Accept` header +- Fixed posts default publish date overriding remote ones +- Fixed getting a page description in some cases when creating a resource +- Fixed getting metadata from tweets when creating a resource +- Fixed bad handling of duplicate usernames +- Fixed handling of bad URIs to proxify +- Fixed creating discussion with title containing only spaces +- Fixed registering new user account with same email as unconfirmed +- Fixed handling changing default actor unlogged +- Fixed handling getting organized events from an actor when not authorized +- Fixed empty comments being allowed +- Fixed the number of group followers per page +- Fixed issue when selecting a location in your settings +- Fixed group feeds not showing when you are a member of the group +- Fixed handling feeds with unknown format +- Fixed a couple of issues when viewing a remote group +- Fixed issues with the attributed organizer when creating an event +- Fixed HTML entities not being decoded in icalendar exports and feeds +- Fixed instance follows being auto-approved +- Fixed parsing the IP from the MOBILIZON_INSTANCE_LISTEN_IP env variable for Docker +- Fixed release startup in Docker container + +### Translations + +- Arabic +- Belarusian +- Bengali +- Catalan +- Chinese (Traditional) +- English +- French +- Gaelic **New!** +- Galician +- German +- Hungarian +- Italian +- Occitan +- Polish +- Portuguese (Brazil) +- Russian +- Slovenian +- Spanish + +## 1.1.0-rc.3 - 30-03-2021 + +### Changed + +- Only provide executables for unix + +### Fixed + +- Fixed parsing the IP from the MOBILIZON_INSTANCE_LISTEN_IP env variable for Docker +- Fixed release startup in Docker container + +## 1.1.0-rc.2 - 30-03-2021 + +### Added + +- Runit configuration files + +### Fixed + +- Fixed the number of group followers per page +- Fixed issue when selecting a location in your settings +- Fixed group feeds not showing when you are a member of the group +- Fixed handling feeds with unknown format +- Fixed a couple of issues when viewing a remote group +- Fixed issues with the attributed organizer when creating an event +- Fixed HTML entities not being decoded in icalendar exports and feeds +- Fixed instance follows being auto-approved + +### Translations + +- Galician +- German +- Hungarian +- Russian +- Spanish +## 1.1.0-rc.1 - 29-03-2021 + +### Added + +- Add ENV parameter to allow Docker users to specify the IP which Mobilizon listens on +- Add instance-wide ICS & Atom feeds of public events (disabled by default) +- Add user and profile secret (tokened) feeds + +### Changed + +- The default configuration for Mobilizon now listens only on the local interface +- Creating an event from the group page configures the event creation interface with the group as organizer + +### Fixed + +- Fixed hashtags disappearing from content +- Fixed close events order +- Fixed group posts edition +- Fixed validating new email with bad token +- Fixed `.well-known/host-meta` not being accessible with correct `Accept` header +- Fixed posts default publish date overriding remote ones +- Fixed getting a page description in some cases when creating a resource +- Fixed getting metadata from tweets when creating a resource +- Fixed bad handling of duplicate usernames +- Fixed handling of bad URIs to proxify +- Fixed creating discussion with title containing only spaces +- Fixed registering new user account with same email as unconfirmed +- Fixed handling changing default actor unlogged +- Fixed handling getting organized events from an actor when not authorized +- Fixed empty comments being allowed + +### Translations + +- Gaelic +- Galician +- German +- Hungarian +- Italian +- Polish +- Portuguese (Brazil) +- Russian +- Slovenian +- Spanish + +## 1.1.0-beta.6 - 17-03-2021 + +### Fixed +- Fixed a typo in range/radius showing the wrong radius for close events on homepage + +## 1.1.0-beta.5 - 17-03-2021 + +### Fixed +- Fixed a typo in range/radius preventing close events from showing up + +## 1.1.0-beta.4 - 17-03-2021 + +### Fixed + +- Fixed accessing the homepage with no location setting defined +- Fixed location field not showing in preferences if setting not already set +- Fixed lasts events published order on the homepage + +## 1.1.0-beta.3 - 16-03-2021 + +### Fixed +- Handle ActivityPub Fetcher returning text that's not JSON +- Fix accessing a group profile when not a member + +## 1.1.0-beta.2 - 16-03-2021 + +### Fixed +- Fixed geospatial configuration only being evaluated at compile-time, not at runtime + +### Translations +- Slovenian + +## 1.1.0-beta.1 - 10-03-2021 + +This version introduces a new way to install and host Mobilizon : Elixir releases. This is the new default way of installing Mobilizon. Please read [UPGRADE.md](./UPGRADE.md#upgrading-from-10-to-11) for details on how to migrate to Elixir binary releases or stay on source install. + +### Added + +- **Add a group activity logbook** +- **Possibility for user to define a location in their settings to get close events** +- **Support for Elixir releases and runtime.exs, allowing to change configuration without recompiling** +- Support for Sentry +- Added support for custom plural rules on front-end (only Gaelic supported for now) +- Added possibility to bookmark search by location through geohash + +### Changed + +- Prune done background jobs +- Improved search form +- Improved backend error page +- Added a confirmation step before deleting a conversation + +### Removed + +- Support for Elixir versions < 1.11 + +### Fixes + +- Fixed editing a group discussion +- Fixed accessing terms and privacy pages +- Fixed refreshing only groups which are stale +- Fixed success message when validating group follower +- Fixed formatted dates using system locale instead of browser/Mobilizon's locale +- Fixed federating draft status +- Fixed group draft posts being sent to followers +- Fixed detecting membership status on group page +- Fixed admin language selection + +### Translations + +- Arabic +- Belarusian +- Bengali +- Catalan +- Chinese (Traditional) +- English +- French +- Gaelic +- Galician +- German +- Hungarian +- Italian +- Occitan +- Portuguese (Brazil) +- Slovenian +- Spanish +- Russian + ## 1.0.7 - 27-02-2021 ### Fixed diff --git a/UPGRADE.md b/UPGRADE.md new file mode 100644 index 000000000..257e16eb9 --- /dev/null +++ b/UPGRADE.md @@ -0,0 +1,44 @@ +# Upgrading from 1.0 to 1.1 + +The 1.1 version of Mobilizon brings Elixir releases support. An Elixir release is a self-contained directory that contains all of Mobilizon's code (front-end and backend), it's dependencies, as well as the Erlang Virtual Machine and runtime (only the parts you need). As long as the release has been assembled on the same OS and architecture, it can be deploy and run straight away. [Read more about releases](https://elixir-lang.org/getting-started/mix-otp/config-and-releases.html#releases). + +## Comparison +Migrating to releases means: +* You only get a precompiled binary, so you avoid compilation times when updating +* No need to have Elixir/NodeJS installed on the system +* Code/data/config location is more common (/opt, /var/lib, /etc) +* More efficient, as only what you need from the Elixir/Erlang standard libraries is included and all of the code is directly preloaded +* You can't hardcode modifications in Mobilizon's code + +Staying on source releases means: +* You need to recompile everything with each update +* Compiling frontend and backend has higher system requirements than just running Mobilizon +* You can change things in Mobilizon's code and recompile right away to test changes + +## Releases +If you want to migrate to releases, [we provide a full guide](https://docs.joinmobilizon.org/administration/upgrading/source_to_release/). You may do this at any time. + +## Source install +To stay on a source release, you just need to check the following things: +* Rename your configuration file `config/prod.secret.exs` to `config/runtime.exs`. +* If your config file includes `server: true` under `Mobilizon.Web.Endpoint`, remove it. + ```diff + config :mobilizon, Mobilizon.Web.Endpoint, + - server: true, + ``` +* The uploads default directory is now `/var/lib/mobilizon/uploads`. To keep it in the previous `uploads/` directory, just add the following line to `config/runtime.exs`: + ```elixir + config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "uploads" + ``` + Or you may use any other directory where the `mobilizon` user has write permissions. +* The GeoIP database default directory is now `/var/lib/mobilizon/geo/GeoLite2-City.mmdb`. To keep it in the previous `priv/data/GeoLite2-City.mmdb` directory, just add the following line to `config/runtime.exs`: + ```elixir + config :geolix, databases: [ + %{ + id: :city, + adapter: Geolix.Adapter.MMDB2, + source: "priv/data/GeoLite2-City.mmdb" + } + ] + ``` + Or you may use any other directory where the `mobilizon` user has read permissions. \ No newline at end of file diff --git a/config/config.exs b/config/config.exs index f20c3768c..40685256f 100644 --- a/config/config.exs +++ b/config/config.exs @@ -8,7 +8,7 @@ import Config # General application configuration config :mobilizon, ecto_repos: [Mobilizon.Storage.Repo], - env: Mix.env() + env: config_env() config :mobilizon, Mobilizon.Storage.Repo, types: Mobilizon.Storage.PostgresTypes @@ -25,13 +25,16 @@ config :mobilizon, :instance, allow_relay: true, federating: true, remote_limit: 100_000, - upload_limit: 10_000_000, - avatar_upload_limit: 2_000_000, - banner_upload_limit: 4_000_000, + upload_limit: 10_485_760, + avatar_upload_limit: 2_097_152, + banner_upload_limit: 4_194_304, remove_orphan_uploads: true, orphan_upload_grace_period_hours: 48, remove_unconfirmed_users: true, unconfirmed_user_grace_period_hours: 48, + activity_expire_days: 365, + activity_keep_number: 100, + enable_instance_feeds: false, email_from: "noreply@localhost", email_reply_to: "noreply@localhost" @@ -57,7 +60,8 @@ config :mobilizon, Mobilizon.Web.Endpoint, config :mime, :types, %{ "application/activity+json" => ["activity-json"], "application/ld+json" => ["activity-json"], - "application/jrd+json" => ["jrd-json"] + "application/jrd+json" => ["jrd-json"], + "application/xrd+xml" => ["xrd-xml"] } # Upload configuration @@ -79,7 +83,7 @@ config :mobilizon, Mobilizon.Web.Upload, ] ] -config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "uploads" +config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "/var/lib/mobilizon/uploads" config :mobilizon, :media_proxy, enabled: true, @@ -92,8 +96,7 @@ config :mobilizon, :media_proxy, follow_redirect: true, pool: :media ] - ], - whitelist: [] + ] config :mobilizon, Mobilizon.Web.Email.Mailer, adapter: Bamboo.SMTPAdapter, @@ -112,9 +115,14 @@ config :mobilizon, Mobilizon.Web.Email.Mailer, # Configures Elixir's Logger config :logger, :console, + backends: [:console, Sentry.LoggerBackend], format: "$time $metadata[$level] $message\n", metadata: [:request_id] +config :logger, Sentry.LoggerBackend, + level: :warn, + capture_log_messages: true + config :mobilizon, Mobilizon.Web.Auth.Guardian, issuer: "mobilizon" config :guardian, Guardian.DB, @@ -138,30 +146,12 @@ config :ueberauth, config :mobilizon, :auth, oauth_consumer_strategies: [] -config :mobilizon, :ldap, - enabled: System.get_env("LDAP_ENABLED") == "true", - host: System.get_env("LDAP_HOST") || "localhost", - port: String.to_integer(System.get_env("LDAP_PORT") || "389"), - ssl: System.get_env("LDAP_SSL") == "true", - sslopts: [], - tls: System.get_env("LDAP_TLS") == "true", - tlsopts: [], - base: System.get_env("LDAP_BASE") || "dc=example,dc=com", - uid: System.get_env("LDAP_UID") || "cn", - require_bind_for_search: !(System.get_env("LDAP_REQUIRE_BIND_FOR_SEARCH") == "false"), - # The full CN to filter by `memberOf`, or `false` if disabled - group: false, - # Either the admin UID matching the field in `uid`, - # Either a tuple with the fully qualified DN: {:full, uid=admin,dc=example.com,dc=local} - bind_uid: System.get_env("LDAP_BIND_UID"), - bind_password: System.get_env("LDAP_BIND_PASSWORD") - config :geolix, databases: [ %{ id: :city, adapter: Geolix.Adapter.MMDB2, - source: "priv/data/GeoLite2-City.mmdb" + source: "/var/lib/mobilizon/geo/GeoLite2-City.mmdb" } ] @@ -275,13 +265,18 @@ config :mobilizon, :anonymous, config :mobilizon, Oban, repo: Mobilizon.Storage.Repo, log: false, - queues: [default: 10, search: 5, mailers: 10, background: 5], - crontab: [ - {"@hourly", Mobilizon.Service.Workers.BuildSiteMap, queue: :background}, - {"17 * * * *", Mobilizon.Service.Workers.RefreshGroups, queue: :background}, - # To be activated in Mobilizon 1.2 - # {"@hourly", Mobilizon.Service.Workers.CleanOrphanMediaWorker, queue: :background}, - {"@hourly", Mobilizon.Service.Workers.CleanUnconfirmedUsersWorker, queue: :background} + queues: [default: 10, search: 5, mailers: 10, background: 5, activity: 5], + plugins: [ + {Oban.Plugins.Cron, + crontab: [ + {"@hourly", Mobilizon.Service.Workers.BuildSiteMap, queue: :background}, + {"17 4 * * *", Mobilizon.Service.Workers.RefreshGroups, queue: :background}, + # To be activated in Mobilizon 1.2 + # {"@hourly", Mobilizon.Service.Workers.CleanOrphanMediaWorker, queue: :background}, + {"@hourly", Mobilizon.Service.Workers.CleanUnconfirmedUsersWorker, queue: :background}, + {"@daily", Mobilizon.Service.Workers.CleanOldActivityWorker, queue: :background} + ]}, + {Oban.Plugins.Pruner, max_age: 300} ] config :mobilizon, :rich_media, @@ -305,4 +300,4 @@ config :mobilizon, :external_resource_providers, %{ # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. -import_config "#{Mix.env()}.exs" +import_config "#{config_env()}.exs" diff --git a/config/dev.exs b/config/dev.exs index 1945009c3..9a14b0de0 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -8,6 +8,7 @@ import Config # with brunch.io to recompile .js and .css sources. config :mobilizon, Mobilizon.Web.Endpoint, http: [ + ip: {127, 0, 0, 1}, port: 4000 ], url: [ @@ -91,24 +92,9 @@ config :mobilizon, :instance, # config :mobilizon, :activitypub, sign_object_fetches: false +config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "uploads" + config :mobilizon, :anonymous, reports: [ allowed: true ] - -require Logger - -cond do - System.get_env("INSTANCE_CONFIG") && - File.exists?("./config/#{System.get_env("INSTANCE_CONFIG")}") -> - import_config System.get_env("INSTANCE_CONFIG") - - System.get_env("DOCKER", "false") == "false" && File.exists?("./config/dev.secret.exs") -> - import_config "dev.secret.exs" - - System.get_env("DOCKER", "false") == "true" -> - Logger.info("Using environment configuration for Docker") - - true -> - Logger.error("No configuration file found") -end diff --git a/docker/production/releases.exs b/config/docker.exs similarity index 70% rename from docker/production/releases.exs rename to config/docker.exs index b4cd218c2..50252737a 100644 --- a/docker/production/releases.exs +++ b/config/docker.exs @@ -2,11 +2,22 @@ import Config +listen_ip = System.get_env("MOBILIZON_INSTANCE_LISTEN_IP", "::") + +listen_ip = + case listen_ip |> to_charlist() |> :inet.parse_address() do + {:ok, listen_ip} -> listen_ip + _ -> raise "MOBILIZON_INSTANCE_LISTEN_IP does not match the expected IP format." + end + config :mobilizon, Mobilizon.Web.Endpoint, - server: true, - url: [host: System.get_env("MOBILIZON_INSTANCE_HOST", "mobilizon.lan")], - http: [port: System.get_env("MOBILIZON_INSTANCE_PORT", "4000")], - secret_key_base: System.get_env("MOBILIZON_INSTANCE_SECRET_KEY_BASE", "changethis") + server: true, + url: [host: System.get_env("MOBILIZON_INSTANCE_HOST", "mobilizon.lan")], + http: [ + port: System.get_env("MOBILIZON_INSTANCE_PORT", "4000"), + ip: listen_ip + ], + secret_key_base: System.get_env("MOBILIZON_INSTANCE_SECRET_KEY_BASE", "changethis") config :mobilizon, Mobilizon.Web.Auth.Guardian, secret_key: System.get_env("MOBILIZON_INSTANCE_SECRET_KEY", "changethis") @@ -22,11 +33,9 @@ config :mobilizon, :instance, email_from: System.get_env("MOBILIZON_INSTANCE_EMAIL", "noreply@mobilizon.lan"), email_reply_to: System.get_env("MOBILIZON_REPLY_EMAIL", "noreply@mobilizon.lan") - config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: System.get_env("MOBILIZON_UPLOADS", "/app/uploads") - config :mobilizon, Mobilizon.Storage.Repo, adapter: Ecto.Adapters.Postgres, username: System.get_env("MOBILIZON_DATABASE_USERNAME", "username"), @@ -49,3 +58,14 @@ config :mobilizon, Mobilizon.Web.Email.Mailer, retries: 1, no_mx_lookups: false, auth: :if_available + +config :geolix, + databases: [ + %{ + id: :city, + adapter: Geolix.Adapter.MMDB2, + source: "/var/lib/mobilizon/geo_db/GeoLite2-City.mmdb" + } + ] + +config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "/var/lib/mobilizon/uploads" diff --git a/config/prod.exs b/config/prod.exs index 5107dc6bd..198148c1b 100644 --- a/config/prod.exs +++ b/config/prod.exs @@ -47,6 +47,5 @@ cond do import_config "prod.secret.exs" true -> - require Logger - Logger.error("No configuration file found") + :ok end diff --git a/config/test.exs b/config/test.exs index 38f132bd4..4f024d17c 100644 --- a/config/test.exs +++ b/config/test.exs @@ -36,6 +36,24 @@ config :mobilizon, Mobilizon.Storage.Repo, port: System.get_env("MOBILIZON_DATABASE_PORT") || "5432", pool: Ecto.Adapters.SQL.Sandbox +config :mobilizon, :ldap, + enabled: System.get_env("LDAP_ENABLED") == "true", + host: System.get_env("LDAP_HOST") || "localhost", + port: String.to_integer(System.get_env("LDAP_PORT") || "389"), + ssl: System.get_env("LDAP_SSL") == "true", + sslopts: [], + tls: System.get_env("LDAP_TLS") == "true", + tlsopts: [], + base: System.get_env("LDAP_BASE") || "dc=example,dc=com", + uid: System.get_env("LDAP_UID") || "cn", + require_bind_for_search: !(System.get_env("LDAP_REQUIRE_BIND_FOR_SEARCH") == "false"), + # The full CN to filter by `memberOf`, or `false` if disabled + group: false, + # Either the admin UID matching the field in `uid`, + # Either a tuple with the fully qualified DN: {:full, uid=admin,dc=example.com,dc=local} + bind_uid: System.get_env("LDAP_BIND_UID"), + bind_password: System.get_env("LDAP_BIND_PASSWORD") + config :mobilizon, Mobilizon.Web.Email.Mailer, adapter: Bamboo.TestAdapter config :mobilizon, Mobilizon.Web.Upload, filters: [], link_name: false @@ -53,7 +71,7 @@ config :tesla, Mobilizon.Service.HTTP.GeospatialClient, config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.Mock -config :mobilizon, Oban, queues: false, crontab: false, plugins: false +config :mobilizon, Oban, queues: false, plugins: false config :mobilizon, Mobilizon.Web.Auth.Guardian, secret_key: "some secret" diff --git a/docker/production/Dockerfile b/docker/production/Dockerfile index ca01e242b..1f9155a4c 100644 --- a/docker/production/Dockerfile +++ b/docker/production/Dockerfile @@ -1,14 +1,14 @@ # First build the application assets -FROM node:alpine as assets +FROM node:16-alpine as assets -RUN apk add --no-cache python build-base libwebp-tools bash imagemagick ncurses +RUN apk add --no-cache python3 build-base libwebp-tools bash imagemagick ncurses COPY js . RUN yarn install \ && yarn run build # Then, build the application binary -FROM elixir:alpine AS builder +FROM elixir:1.11-alpine AS builder RUN apk add --no-cache build-base git cmake @@ -20,9 +20,10 @@ RUN mix local.hex --force \ COPY lib ./lib COPY priv ./priv -COPY config ./config +COPY config/config.exs config/prod.exs ./config/ +COPY config/docker.exs ./config/runtime.exs COPY rel ./rel -COPY docker/production/releases.exs ./config/ +COPY support ./support COPY --from=assets ./priv/static ./priv/static RUN mix phx.digest \ @@ -31,14 +32,31 @@ RUN mix phx.digest \ # Finally setup the app FROM alpine +ARG BUILD_DATE +ARG VCS_REF + +LABEL org.opencontainers.image.title="mobilizon" \ + org.opencontainers.image.description="Mobilizon for Docker" \ + org.opencontainers.image.vendor="joinmobilizon.org" \ + org.opencontainers.image.documentation="https://docs.joinmobilizon.org" \ + org.opencontainers.image.licenses="AGPL-3.0" \ + org.opencontainers.image.source="https://framagit.org/framasoft/mobilizon" \ + org.opencontainers.image.url="https://joinmobilizon.org" \ + org.opencontainers.image.revision=$VCS_REF \ + org.opencontainers.image.created=$BUILD_DATE + RUN apk add --no-cache openssl ncurses-libs file postgresql-client RUN mkdir -p /app/uploads && chown nobody:nobody /app/uploads +RUN mkdir -p /etc/mobilizon && chown nobody:nobody /etc/mobilizon USER nobody EXPOSE 4000 +ENV MOBILIZON_DOCKER=true + COPY --from=builder --chown=nobody:nobody _build/prod/rel/mobilizon ./ +RUN cp /releases/*/runtime.exs /etc/mobilizon/config.exs COPY docker/production/docker-entrypoint.sh ./ ENTRYPOINT ["./docker-entrypoint.sh"] diff --git a/docker/tests/Dockerfile b/docker/tests/Dockerfile index 1ed045939..73f0d6c8c 100644 --- a/docker/tests/Dockerfile +++ b/docker/tests/Dockerfile @@ -1,9 +1,9 @@ FROM elixir:latest LABEL maintainer="Thomas Citharel " -ENV REFRESHED_AT=2020-10-22 +ENV REFRESHED_AT=2021-05-19 RUN apt-get update -yq && apt-get install -yq build-essential inotify-tools postgresql-client git curl gnupg xvfb libgtk-3-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 cmake exiftool -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash && apt-get install nodejs -yq +RUN curl -sL https://deb.nodesource.com/setup_16.x | bash && apt-get install nodejs -yq RUN npm install -g yarn wait-on RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN mix local.hex --force && mix local.rebar --force diff --git a/js/.prettierrc.json b/js/.prettierrc.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/js/.prettierrc.json @@ -0,0 +1 @@ +{} diff --git a/js/fragmentTypes.json b/js/fragmentTypes.json index daad1c6b3..649592581 100644 --- a/js/fragmentTypes.json +++ b/js/fragmentTypes.json @@ -5,17 +5,50 @@ "kind": "INTERFACE", "name": "ActionLogObject", "possibleTypes": [ + { + "name": "Comment" + }, { "name": "Event" }, { - "name": "Comment" + "name": "Person" }, { "name": "Report" }, { "name": "ReportNote" + }, + { + "name": "User" + } + ] + }, + { + "kind": "INTERFACE", + "name": "ActivityObject", + "possibleTypes": [ + { + "name": "Comment" + }, + { + "name": "Discussion" + }, + { + "name": "Event" + }, + { + "name": "Group" + }, + { + "name": "Member" + }, + { + "name": "Post" + }, + { + "name": "Resource" } ] }, @@ -33,6 +66,18 @@ "name": "Application" } ] + }, + { + "kind": "INTERFACE", + "name": "Interactable", + "possibleTypes": [ + { + "name": "Event" + }, + { + "name": "Group" + } + ] } ] } diff --git a/js/package-lock.json b/js/package-lock.json new file mode 100644 index 000000000..12f30fc7d --- /dev/null +++ b/js/package-lock.json @@ -0,0 +1,22557 @@ +{ + "name": "mobilizon", + "version": "1.1.4", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@absinthe/socket": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@absinthe/socket/-/socket-0.2.1.tgz", + "integrity": "sha512-rCuMRG4WndooGR+QfU5v+xL6U8YKEXFyvjqYt0qTHupAh+k+tpD6a5dlxcLO0g38p/hb1I12OzKvl+0G1XYCkA==", + "requires": { + "@babel/runtime": "7.2.0", + "@jumpn/utils-array": "0.3.4", + "@jumpn/utils-composite": "0.7.0", + "@jumpn/utils-graphql": "0.6.0", + "core-js": "2.6.0", + "zen-observable": "0.8.11" + }, + "dependencies": { + "core-js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.0.tgz", + "integrity": "sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw==" + } + } + }, + "@absinthe/socket-apollo-link": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@absinthe/socket-apollo-link/-/socket-apollo-link-0.2.1.tgz", + "integrity": "sha512-QxEazdjUXth+XMTAdlODZwS5h7fUAq9LEIH5O/EN0c/pS7Q3dFrTM1ZiP6n/0VdSEc+xBZyTisN63N2cPgE8ZQ==", + "requires": { + "@absinthe/socket": "0.2.1", + "@babel/runtime": "7.2.0", + "apollo-link": "1.2.5", + "core-js": "2.6.0", + "flow-static-land": "0.2.8", + "graphql": "14.0.2", + "zen-observable": "0.8.11" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.5.tgz", + "integrity": "sha512-GJHEE4B06oEB58mpRRwW6ISyvgX2aCqCLjpcE3M/6/4e+ZVeX7fRGpMJJDq2zZ8n7qWdrEuY315JfxzpsJmUhA==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.12" + } + }, + "core-js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.0.tgz", + "integrity": "sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw==" + }, + "flow-static-land": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/flow-static-land/-/flow-static-land-0.2.8.tgz", + "integrity": "sha512-pOZFExu2rbscCgcEo7nL7FNhBubMi18dn1Un4lm8LOmQkYhgsHLsrBGMWmuJXRWcYMrOC7I/bPsiqqVjdD3K1g==" + }, + "graphql": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.2.tgz", + "integrity": "sha512-gUC4YYsaiSJT1h40krG3J+USGlwhzNTXSb4IOZljn9ag5Tj+RkoXrWp+Kh7WyE3t1NCfab5kzCuxBIvOMERMXw==", + "requires": { + "iterall": "^1.2.2" + } + } + } + }, + "@apollo/client": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.3.19.tgz", + "integrity": "sha512-vzljWLPP0GwocfBhUopzDCUwsiaNTtii1eu8qDybAXqwj4/ZhnIM46c6dNQmnVcJpAIFRIsNCOxM4OlMDySJug==", + "requires": { + "@graphql-typed-document-node/core": "^3.0.0", + "@types/zen-observable": "^0.8.0", + "@wry/context": "^0.6.0", + "@wry/equality": "^0.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graphql-tag": "^2.12.0", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.16.0", + "prop-types": "^15.7.2", + "symbol-observable": "^2.0.0", + "ts-invariant": "^0.7.0", + "tslib": "^1.10.0", + "zen-observable": "^0.8.14" + }, + "dependencies": { + "@wry/equality": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.4.0.tgz", + "integrity": "sha512-DxN/uawWfhRbgYE55zVCPOoe+jvsQ4m7PT1Wlxjyb/LCCLuU1UsucV2BbCxFAX8bjcSueFBbB5Qfj1Zfe8e7Fw==", + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "ts-invariant": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.7.3.tgz", + "integrity": "sha512-UWDDeovyUTIMWj+45g5nhnl+8oo+GhxL5leTaHn5c8FkQWfh8v66gccLd2/YzVmV5hoQUjCEjhrXnQqVDJdvKA==", + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + } + } + }, + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/compat-data": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", + "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==", + "dev": true + }, + "@babel/core": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", + "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.3", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.2", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.3", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", + "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.3.tgz", + "integrity": "sha512-BnEfi5+6J2Lte9LeiL6TxLWdIlEv9Woacc1qXzXBgbikcOzMRM2Oya5XGg/f/ngotv1ej2A/b+3iJH8wbS1+lQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.14.3", + "@babel/helper-split-export-declaration": "^7.12.13" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz", + "integrity": "sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.1.tgz", + "integrity": "sha512-x3AUTVZNPunaw1opRTa5OwVA5N0YxGlIad9xQ5QflK1uIS7PnAGGU5O2Dj/G183fR//N8AzTq+Q8+oiu9m0VFg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz", + "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.13.15", + "@babel/types": "^7.13.16" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", + "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz", + "integrity": "sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helpers": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "dev": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.3.tgz", + "integrity": "sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ==", + "dev": true + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz", + "integrity": "sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz", + "integrity": "sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.3", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-class-static-block": "^7.12.13" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.2.tgz", + "integrity": "sha512-LauAqDd/VjQDtae58QgBcEOE42NNP+jB2OE+XeC3KBI/E+BhhRjtr5viCIrj1hmu1YvrguLipIPRJZmS5yUcFw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.2", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-decorators": "^7.12.13" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz", + "integrity": "sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz", + "integrity": "sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz", + "integrity": "sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz", + "integrity": "sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz", + "integrity": "sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz", + "integrity": "sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz", + "integrity": "sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.2" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz", + "integrity": "sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz", + "integrity": "sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz", + "integrity": "sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-create-class-features-plugin": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz", + "integrity": "sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", + "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz", + "integrity": "sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz", + "integrity": "sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz", + "integrity": "sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", + "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz", + "integrity": "sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.2", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", + "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.13.12", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz", + "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", + "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz", + "integrity": "sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/preset-env": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.2.tgz", + "integrity": "sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.14.2", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-class-static-block": "^7.13.11", + "@babel/plugin-proposal-dynamic-import": "^7.14.2", + "@babel/plugin-proposal-export-namespace-from": "^7.14.2", + "@babel/plugin-proposal-json-strings": "^7.14.2", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.2", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2", + "@babel/plugin-proposal-numeric-separator": "^7.14.2", + "@babel/plugin-proposal-object-rest-spread": "^7.14.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.2", + "@babel/plugin-proposal-optional-chaining": "^7.14.2", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-private-property-in-object": "^7.14.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.0", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.14.2", + "@babel/plugin-transform-classes": "^7.14.2", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.17", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.14.2", + "@babel/plugin-transform-modules-commonjs": "^7.14.0", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.14.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.14.2", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.13.15", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.2", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz", + "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", + "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@cypress/listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz", + "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "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 + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "@graphql-typed-document-node/core": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.0.tgz", + "integrity": "sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==" + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "dev": true, + "requires": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + } + }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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 + } + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" + } + }, + "@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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 + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + } + } + }, + "@jumpn/utils-array": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jumpn/utils-array/-/utils-array-0.3.4.tgz", + "integrity": "sha1-+0MQEgEI9lnatUB175OrxWE33l4=", + "requires": { + "babel-polyfill": "6.26.0", + "babel-runtime": "6.26.0", + "flow-static-land": "0.2.7" + } + }, + "@jumpn/utils-composite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@jumpn/utils-composite/-/utils-composite-0.7.0.tgz", + "integrity": "sha512-kamRVYJLNvjMrnKKeu2RSFQHLUO/IYFo05gLI7GQcCk063mJzsjCCfRycCievIBI+5Sg8C7A5gwRYxkBA5jY8w==", + "requires": { + "@jumpn/utils-array": "0.3.4", + "babel-polyfill": "6.26.0", + "babel-runtime": "6.26.0", + "fast-deep-equal": "1.0.0", + "flow-static-land": "0.2.8" + }, + "dependencies": { + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "flow-static-land": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/flow-static-land/-/flow-static-land-0.2.8.tgz", + "integrity": "sha512-pOZFExu2rbscCgcEo7nL7FNhBubMi18dn1Un4lm8LOmQkYhgsHLsrBGMWmuJXRWcYMrOC7I/bPsiqqVjdD3K1g==" + } + } + }, + "@jumpn/utils-graphql": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@jumpn/utils-graphql/-/utils-graphql-0.6.0.tgz", + "integrity": "sha512-I5OSEh8Ed4FdLIcUTYzWdpO9noQOoWptdgF8yOZ0xhDD7h7E9IgPYxfy36qbC6v9xlpGTwQMu3Wn8ulkinG/MQ==", + "requires": { + "@babel/runtime": "7.2.0", + "core-js": "2.6.0", + "graphql": "14.0.2" + }, + "dependencies": { + "core-js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.0.tgz", + "integrity": "sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw==" + }, + "graphql": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.2.tgz", + "integrity": "sha512-gUC4YYsaiSJT1h40krG3J+USGlwhzNTXSb4IOZljn9ag5Tj+RkoXrWp+Kh7WyE3t1NCfab5kzCuxBIvOMERMXw==", + "requires": { + "iterall": "^1.2.2" + } + } + } + }, + "@mdi/font": { + "version": "5.9.55", + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-5.9.55.tgz", + "integrity": "sha512-jswRF6q3eq8NWpWiqct6q+6Fg/I7nUhrxYJfiEM8JJpap0wVJLQdbKtyS65GdlK7S7Ytnx3TTi/bmw+tBhkGmg==" + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, + "@popperjs/core": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", + "integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==" + }, + "@soda/friendly-errors-webpack-plugin": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.0.tgz", + "integrity": "sha512-RLotfx6k1+nfLacwNCenj7VnTMPxVwYKoGOcffMFoJDKM8tXzBiCN0hMHFJNnoAojduYAsxuiMm0EOMixgiRow==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "error-stack-parser": "^2.0.2", + "string-width": "^2.0.0", + "strip-ansi": "^5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + } + } + }, + "@soda/get-current-script": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz", + "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", + "dev": true + }, + "@tiptap/core": { + "version": "2.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.0-beta.41.tgz", + "integrity": "sha512-TkopvbzEfYMztcAiWpPMvYM9X8jFrzOA29wqCk894bSsiaQQHfs3EESCMEFjxYfXF6wyAZLz0Br4p6SuWKIHrQ==", + "requires": { + "@types/prosemirror-commands": "^1.0.4", + "@types/prosemirror-inputrules": "^1.0.4", + "@types/prosemirror-keymap": "^1.0.4", + "@types/prosemirror-model": "^1.13.0", + "@types/prosemirror-schema-list": "^1.0.3", + "@types/prosemirror-state": "^1.2.6", + "@types/prosemirror-transform": "^1.1.2", + "@types/prosemirror-view": "^1.17.1", + "prosemirror-commands": "^1.1.7", + "prosemirror-inputrules": "^1.1.3", + "prosemirror-keymap": "^1.1.3", + "prosemirror-model": "^1.14.1", + "prosemirror-schema-list": "^1.1.4", + "prosemirror-state": "^1.3.4", + "prosemirror-transform": "^1.3.2", + "prosemirror-view": "^1.18.2" + } + }, + "@tiptap/extension-blockquote": { + "version": "2.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.6.tgz", + "integrity": "sha512-DOtr1Iy+wdyX2lrSX9KF6BaHvi0Sxg5tWfrAVHxPU7tCfxt33Xp6Ym97fyuZLlwUIbrzsy/DqBkdTYQ5v+CPMA==", + "requires": { + "prosemirror-inputrules": "^1.1.3" + } + }, + "@tiptap/extension-bold": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.13.tgz", + "integrity": "sha512-hMA6GItX/cWN1K9TBI1LeEPo8bFhX9JrE1flr6dxGJ9q58XVbzb2/ojZzcRFVdUp7oxNyQaFe6yP1JhTVcIrog==" + }, + "@tiptap/extension-bubble-menu": { + "version": "2.0.0-beta.9", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.9.tgz", + "integrity": "sha512-GGxHwurQ6PediGy2b6q5at73CRznD6M6f1OSSuFVoIm2Q+FQMOECXKqLHpIOuHke6zYJpaAp1SfdX87/Zs5qaQ==", + "requires": { + "prosemirror-state": "^1.3.4", + "prosemirror-view": "^1.18.2", + "tippy.js": "^6.3.1" + } + }, + "@tiptap/extension-bullet-list": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.13.tgz", + "integrity": "sha512-6W0T6U/Gm3ypLJDTe79K/0mFc88svJrP6TFjj3tcXwpygnwcCpBmpJv4DG656eGmB6rGGVPe1K/zoT1j6HB8+A==", + "requires": { + "prosemirror-inputrules": "^1.1.3" + } + }, + "@tiptap/extension-character-count": { + "version": "2.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-2.0.0-beta.5.tgz", + "integrity": "sha512-zD+K0YrmQL34nIDklMfTDG/cR2sHcj6Pog4EYRPfudBCJTC/lXEEZO6IMoKvbzdh86+UDo1qdwaH1pfoJ91LCw==" + }, + "@tiptap/extension-code": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.0.0-beta.13.tgz", + "integrity": "sha512-em1rGWZXYlH6DrcIWRTvYefBzig34y7HBeWIB3uRHULd2GpRIowfbl8SRFgeapoKj1kbYjAtVr+wshlNi9/ujw==" + }, + "@tiptap/extension-code-block": { + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.0.0-beta.15.tgz", + "integrity": "sha512-iBuK/nnUw37O9mZVnuZu+viSNzLz7SRktjDtFhp6RM3ZVSOYIYjt6pJ05EVJ263QEeXB4Q1Qae8/xJOPPHN9hw==", + "requires": { + "prosemirror-inputrules": "^1.1.3" + } + }, + "@tiptap/extension-document": { + "version": "2.0.0-beta.12", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.0.0-beta.12.tgz", + "integrity": "sha512-i5anc2n98Jg1gi6WDLTaS76jLIUe41FHuMHgL4DCIDXv8m2q0qnktfmOvh9AMF7cPzJ2NVAR9xYw0Pxm3qXY4w==" + }, + "@tiptap/extension-dropcursor": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.0-beta.13.tgz", + "integrity": "sha512-We80k3r//ujjboF2/8H07Y8TStP/U2Nw1nOwTPgWHX5CkrFN2Y9Q0Tdofc8SME8REql+osw8CcSB34iLU+kIcA==", + "requires": { + "@types/prosemirror-dropcursor": "^1.0.1", + "prosemirror-dropcursor": "^1.3.4" + } + }, + "@tiptap/extension-floating-menu": { + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.15.tgz", + "integrity": "sha512-ioBegoCx3N6E2MPLsOgbAWeQEz01I91CLRdRQMorGRx+4Q+mAarlGJV11sNeW2rCV9ZQ/LWTw/QzLuBnyESzrA==", + "requires": { + "prosemirror-state": "^1.3.4", + "prosemirror-view": "^1.18.6", + "tippy.js": "^6.3.1" + } + }, + "@tiptap/extension-gapcursor": { + "version": "2.0.0-beta.17", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.17.tgz", + "integrity": "sha512-ItucjmbjpIfjBkoarkekfZ2BB4nsJuBptZc2xWj36zpC9ehQvH3uVcgyRPM/5To2gvj4uj8MmYyxO8Q6/PszAg==", + "requires": { + "@types/prosemirror-gapcursor": "^1.0.3", + "prosemirror-gapcursor": "^1.1.5" + } + }, + "@tiptap/extension-hard-break": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.13.tgz", + "integrity": "sha512-C84BzpP3G+86iPJOyJTlfA7RK2IhLkiosvo3qKzPMCELVc2I8mICbuA7cEbveO0Rpg24AAyeec0Q0GYf+WiItw==" + }, + "@tiptap/extension-heading": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.13.tgz", + "integrity": "sha512-fGuFs6ZG1mBWceSwes4fAWf4d97xKhbdDWaMjo2+2WAdx6y9fX1s64psYJYwQ5KXnKHaCU+JBPged9igDcXVsg==", + "requires": { + "prosemirror-inputrules": "^1.1.3" + } + }, + "@tiptap/extension-history": { + "version": "2.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.0.0-beta.5.tgz", + "integrity": "sha512-ej0QtStZVm8QInWHEtyduK9WQcYpfPN2EtIkwtPL9HFm9u7xgouBVdj1TqIABV3vJVGL28KKpGVVg8ZuBF4h7g==", + "requires": { + "@types/prosemirror-history": "^1.0.2", + "prosemirror-history": "^1.1.3" + } + }, + "@tiptap/extension-horizontal-rule": { + "version": "2.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.16.tgz", + "integrity": "sha512-Yh8AM5ArI/FfzdA0TcvIZEpMkRo0Rd9lLyEXYfWV0Be6qkPApa/QDzEreQMf4JIKDE8z0R0yX0XRxh/N5iUmew==", + "requires": { + "prosemirror-state": "^1.3.4" + } + }, + "@tiptap/extension-image": { + "version": "2.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.0.0-beta.6.tgz", + "integrity": "sha512-p1AYHPmcSV0WhKNk7Dqj17qYcuVxDsXz1ivPo2xD7R5vFnPphQZ9Bu1Y8BA2BJmn0eheQi11sz/ZUflnNfX7ew==" + }, + "@tiptap/extension-italic": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.13.tgz", + "integrity": "sha512-IUvXnR9bnOiyE+k0Oa2ugCW5p5Nibvstr6W6g/C6RA36AbV9K/zr4XzQgClfZo96pM8Ay5Ia+jCYeYGOD6Mdaw==" + }, + "@tiptap/extension-link": { + "version": "2.0.0-beta.8", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.0.0-beta.8.tgz", + "integrity": "sha512-rBLISgGiQg/mZ0rvFS1/8ylXqqO0kuam20KBc3tnmu6clakwk93MpZ63owNmlJPGQsJVfmPQFRkJypsdRIML3w==", + "requires": { + "prosemirror-state": "^1.3.4" + } + }, + "@tiptap/extension-list-item": { + "version": "2.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.6.tgz", + "integrity": "sha512-zhssny5W2Q7CvB9qZT1Wc7k0V+R7IqCbNBmoijwF9a+uehBpJcxdN1DFB1v0qdmIEdDLU9dnBUfIpWPnLwiAXw==" + }, + "@tiptap/extension-mention": { + "version": "2.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@tiptap/extension-mention/-/extension-mention-2.0.0-beta.42.tgz", + "integrity": "sha512-NMg7mT6aWcTasvUDErWqLVoDpWLpe7+R7+MoD9B1TYBCcQhnhOOteKMJ4tz43dTbwEUUSAif/BIZdRfMBUJdnA==", + "requires": { + "@tiptap/suggestion": "^2.0.0-beta.42" + } + }, + "@tiptap/extension-ordered-list": { + "version": "2.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.6.tgz", + "integrity": "sha512-dUiTO9bV3cuxWedp164KVufW3BzIwY/beQ64aQjnRyA3TPyiPrhp4qvHrxQujm31XPJy4zUY0PO/VafJ+69cGw==", + "requires": { + "prosemirror-inputrules": "^1.1.3" + } + }, + "@tiptap/extension-paragraph": { + "version": "2.0.0-beta.14", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.14.tgz", + "integrity": "sha512-IFc2/WMgmpPTRS/h++5vNCiSyT4yTj/NGG9L+x35aPCDQutTYW2V2i1Lwe2lcxpPVF4ofDX50skjdIiWZoGEqA==" + }, + "@tiptap/extension-strike": { + "version": "2.0.0-beta.14", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.14.tgz", + "integrity": "sha512-25D+neKErB8svQ8TOkUqUq9Nln+O62Kp5doR/aATVtNCohWOqeAF/Q439QL4GsCkAAhXMdh2yQIF/mCSxFsdTQ==" + }, + "@tiptap/extension-text": { + "version": "2.0.0-beta.12", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.0-beta.12.tgz", + "integrity": "sha512-JEWLYOJKSpmpaI0YTzj30uodpsrSYDGSvy5dT5bYvWovIvLmggKPHl0iKIPDWAM5xfd07CkP2+BFFRblMh96IA==" + }, + "@tiptap/extension-underline": { + "version": "2.0.0-beta.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.0.0-beta.7.tgz", + "integrity": "sha512-p5y7WFKohnRy/+te7M+EBB9hLOBfbxtWsqPXwFEm3Puq8bj2RNdGVfOruPqlmHpBoCFJgG73RKi0lmqplo1XZg==" + }, + "@tiptap/starter-kit": { + "version": "2.0.0-beta.37", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.37.tgz", + "integrity": "sha512-RFT6xLIph1xAbqnQJRG7q9fVTrIhaiqUFocPsuW/HHes2wvreR6ODgKzLRCcTM19YMpsmP8wC6f++itd9JwJFg==", + "requires": { + "@tiptap/core": "^2.0.0-beta.41", + "@tiptap/extension-blockquote": "^2.0.0-beta.6", + "@tiptap/extension-bold": "^2.0.0-beta.6", + "@tiptap/extension-bullet-list": "^2.0.0-beta.6", + "@tiptap/extension-code": "^2.0.0-beta.6", + "@tiptap/extension-code-block": "^2.0.0-beta.8", + "@tiptap/extension-document": "^2.0.0-beta.5", + "@tiptap/extension-dropcursor": "^2.0.0-beta.6", + "@tiptap/extension-gapcursor": "^2.0.0-beta.10", + "@tiptap/extension-hard-break": "^2.0.0-beta.6", + "@tiptap/extension-heading": "^2.0.0-beta.6", + "@tiptap/extension-history": "^2.0.0-beta.5", + "@tiptap/extension-horizontal-rule": "^2.0.0-beta.7", + "@tiptap/extension-italic": "^2.0.0-beta.6", + "@tiptap/extension-list-item": "^2.0.0-beta.6", + "@tiptap/extension-ordered-list": "^2.0.0-beta.6", + "@tiptap/extension-paragraph": "^2.0.0-beta.7", + "@tiptap/extension-strike": "^2.0.0-beta.7", + "@tiptap/extension-text": "^2.0.0-beta.5" + } + }, + "@tiptap/suggestion": { + "version": "2.0.0-beta.56", + "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-2.0.0-beta.56.tgz", + "integrity": "sha512-pImKbVHqWyv3L73PRwGks9sP2VykqacXXt3FqKM417T9KSdAfMjjt0i++yedxpxlTFeWhXEZonhTunDvXVjSbw==", + "requires": { + "prosemirror-model": "^1.14.1", + "prosemirror-state": "^1.3.4", + "prosemirror-view": "^1.18.6" + } + }, + "@tiptap/vue-2": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@tiptap/vue-2/-/vue-2-2.0.0-beta.21.tgz", + "integrity": "sha512-WTL6iw6cgMkQQ2b++kClQOxsByAUKYLcjO1UsjmrrWnaSDmfMO1ZpkmKKSp1SsuQAk7W0t9aybeyWrDzjxfU3g==", + "requires": { + "@tiptap/extension-bubble-menu": "^2.0.0-beta.9", + "@tiptap/extension-floating-menu": "^2.0.0-beta.6", + "prosemirror-view": "^1.18.2" + } + }, + "@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.4.tgz", + "integrity": "sha512-Kf8v0wljR5GSCOCF/VQWdV3ZhKOVA73drXtY3geMTQgHy9dgqQ0dLrf31M0hcuWkhFzK5sP0kkS3mJzcKVtZbw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/express": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", + "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", + "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/geojson": { + "version": "7946.0.7", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", + "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/http-proxy": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.6.tgz", + "integrity": "sha512-+qsjqR75S/ib0ig0R9WN+CDoZeOBU6F2XLewgC4KVgdXiNHiKKHFEMRHOrs5PbYE97D5vataw5wPj4KLYfUkuQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", + "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/leaflet": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.7.0.tgz", + "integrity": "sha512-ltv5jR+VjKSMtoDkxH61Rsbo0zLU7iqyOXpVPkAX4F+79fg2eymC7t0msWsfNaEZO1FGTIQATCCCQe+ijWoicg==", + "dev": true, + "requires": { + "@types/geojson": "*" + } + }, + "@types/leaflet.locatecontrol": { + "version": "0.60.7", + "resolved": "https://registry.npmjs.org/@types/leaflet.locatecontrol/-/leaflet.locatecontrol-0.60.7.tgz", + "integrity": "sha512-sac/MeK4gB+3XTJ3JzCe3HqLwKNHblIpZrxUJ6FapWK8uISZ0wcy8motVO7+v/yO47tQgsnYaobwFZ//beWHBQ==", + "dev": true, + "requires": { + "@types/leaflet": "*" + } + }, + "@types/lodash": { + "version": "4.14.168", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", + "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, + "@types/ngeohash": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@types/ngeohash/-/ngeohash-0.6.2.tgz", + "integrity": "sha512-6nlq2eEh75JegDGUXis9wGTYIJpUvbori4qx++PRKQsV3YRkaqUNPNykzphniqPSZADXCouBuAnyptjUkMkhvw==", + "dev": true + }, + "@types/node": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.1.tgz", + "integrity": "sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA==" + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/orderedmap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/orderedmap/-/orderedmap-1.0.0.tgz", + "integrity": "sha512-dxKo80TqYx3YtBipHwA/SdFmMMyLCnP+5mkEqN0eMjcTBzHkiiX0ES118DsjDBjvD+zeSsSU9jULTZ+frog+Gw==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true, + "optional": true + }, + "@types/prosemirror-commands": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/prosemirror-commands/-/prosemirror-commands-1.0.4.tgz", + "integrity": "sha512-utDNYB3EXLjAfYIcRWJe6pn3kcQ5kG4RijbT/0Y/TFOm6yhvYS/D9eJVnijdg9LDjykapcezchxGRqFD5LcyaQ==", + "requires": { + "@types/prosemirror-model": "*", + "@types/prosemirror-state": "*", + "@types/prosemirror-view": "*" + } + }, + "@types/prosemirror-dropcursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/prosemirror-dropcursor/-/prosemirror-dropcursor-1.0.1.tgz", + "integrity": "sha512-nHokhFypOZjknolZBm2XShlR7fx1IUcCiA3S2fBwmAraWu6zv3gboDSwwFpoS9UB2xKc4ismAmBxh2bpL3YNkg==", + "requires": { + "@types/prosemirror-state": "*" + } + }, + "@types/prosemirror-gapcursor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/prosemirror-gapcursor/-/prosemirror-gapcursor-1.0.3.tgz", + "integrity": "sha512-kBVjjbMmUk7ZsgpI1NOyY15makulu1skEGr+V9GgY7GQnT9vqjo8/XiNSgSj9s9vRTsTb/KAaTI9KJwWlhbhxQ==", + "requires": { + "@types/prosemirror-model": "*", + "@types/prosemirror-state": "*" + } + }, + "@types/prosemirror-history": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/prosemirror-history/-/prosemirror-history-1.0.2.tgz", + "integrity": "sha512-AcfpWo+HkIuvq/H2zYjIMi2jxa2GWfYaTNiFTB2sigjkpWNM93CIlb7Cimy/4vNH8lVPp0GwLBjYIMRX6zOUyA==", + "requires": { + "@types/prosemirror-model": "*", + "@types/prosemirror-state": "*" + } + }, + "@types/prosemirror-inputrules": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/prosemirror-inputrules/-/prosemirror-inputrules-1.0.4.tgz", + "integrity": "sha512-lJIMpOjO47SYozQybUkpV6QmfuQt7GZKHtVrvS+mR5UekA8NMC5HRIVMyaIauJLWhKU6oaNjpVaXdw41kh165g==", + "requires": { + "@types/prosemirror-model": "*", + "@types/prosemirror-state": "*" + } + }, + "@types/prosemirror-keymap": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/prosemirror-keymap/-/prosemirror-keymap-1.0.4.tgz", + "integrity": "sha512-ycevwkqUh+jEQtPwqO7sWGcm+Sybmhu8MpBsM8DlO3+YTKnXbKA6SDz/+q14q1wK3UA8lHJyfR+v+GPxfUSemg==", + "requires": { + "@types/prosemirror-commands": "*", + "@types/prosemirror-model": "*", + "@types/prosemirror-state": "*", + "@types/prosemirror-view": "*" + } + }, + "@types/prosemirror-model": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@types/prosemirror-model/-/prosemirror-model-1.13.0.tgz", + "integrity": "sha512-EIUr2R38Zh9n1eA8BQ1C3NX/XLV9U44DhNVk8x3Sth2RW+wa7jNA82XHMPOoapsOTfmpnh32xaHBOzREiBqdPQ==", + "requires": { + "@types/orderedmap": "*" + } + }, + "@types/prosemirror-schema-list": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/prosemirror-schema-list/-/prosemirror-schema-list-1.0.3.tgz", + "integrity": "sha512-uWybOf+M2Ea7rlbs0yLsS4YJYNGXYtn4N+w8HCw3Vvfl6wBAROzlMt0gV/D/VW/7J/LlAjwMezuGe8xi24HzXA==", + "requires": { + "@types/orderedmap": "*", + "@types/prosemirror-model": "*", + "@types/prosemirror-state": "*" + } + }, + "@types/prosemirror-state": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@types/prosemirror-state/-/prosemirror-state-1.2.6.tgz", + "integrity": "sha512-tJo0wC+/cQvbrPDVx01Fnng9Fs41bAMVxgJY1KLOyIsUPN0otUN1KdoQurLMmHNHTvIna9ZXxjZD//xJKLYfJw==", + "requires": { + "@types/prosemirror-model": "*", + "@types/prosemirror-transform": "*", + "@types/prosemirror-view": "*" + } + }, + "@types/prosemirror-transform": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/prosemirror-transform/-/prosemirror-transform-1.1.2.tgz", + "integrity": "sha512-Ozyvs5Dquc49gaFysmC4gNhv6E65r569HSzw4RXdZgIljZ5Y9K4kHFlDvsWBBDH19+1178X9LMmM9J620O6Bug==", + "requires": { + "@types/prosemirror-model": "*" + } + }, + "@types/prosemirror-view": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/prosemirror-view/-/prosemirror-view-1.17.1.tgz", + "integrity": "sha512-PNiGGc6BffxHQzMR09UUilsBR8xFPDsKiPIXb4K/g56voPIvqq1pqySnWFfSR50Vo4ZL0tss3VBLWiiiKzVahQ==", + "requires": { + "@types/prosemirror-model": "*", + "@types/prosemirror-state": "*", + "@types/prosemirror-transform": "*" + } + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "@types/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", + "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sizzle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", + "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", + "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "@types/vuedraggable": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/@types/vuedraggable/-/vuedraggable-2.23.2.tgz", + "integrity": "sha512-rtH0eCzetZf2wL+/Gm1vjpx29Z5R+AJaBVeqz2mpZqUVE1JFgGxj4THWZTMMAcNY4e/0jATKhfHh68dCLczFUA==", + "dev": true, + "requires": { + "vue": "^2.0.0" + } + }, + "@types/webpack": { + "version": "4.41.29", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz", + "integrity": "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "@types/webpack-dev-server": { + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.4.tgz", + "integrity": "sha512-DCKORHjqNNVuMIDWFrlljftvc9CL0+09p3l7lBpb8dRqgN5SmvkWCY4MPKxoI6wJgdRqohmoNbptkxqSKAzLRg==", + "dev": true, + "requires": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-static": "*", + "@types/webpack": "^4", + "http-proxy-middleware": "^1.0.0" + } + }, + "@types/webpack-env": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.0.tgz", + "integrity": "sha512-Fx+NpfOO0CpeYX2g9bkvX8O5qh9wrU1sOF4g8sft4Mu7z+qfe387YlyY8w8daDyDsKY5vUxM0yxkAYnbkRbZEw==", + "dev": true + }, + "@types/webpack-sources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@types/yargs": { + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "dev": true + }, + "@types/zen-observable": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.2.tgz", + "integrity": "sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.0.tgz", + "integrity": "sha512-U8SP9VOs275iDXaL08Ln1Fa/wLXfj5aTr/1c0t0j6CdbOnxh+TruXu1p4I0NAvdPBQgoPjHsgKn28mOi0FzfoA==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.22.0", + "@typescript-eslint/scope-manager": "4.22.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.0.tgz", + "integrity": "sha512-xJXHHl6TuAxB5AWiVrGhvbGL8/hbiCQ8FiWwObO3r0fnvBdrbWEDy1hlvGQOAWc6qsCWuWMKdVWlLAEMpxnddg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.22.0", + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/typescript-estree": "4.22.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.0.tgz", + "integrity": "sha512-z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.22.0", + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/typescript-estree": "4.22.0", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz", + "integrity": "sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/visitor-keys": "4.22.0" + } + }, + "@typescript-eslint/types": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.0.tgz", + "integrity": "sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz", + "integrity": "sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/visitor-keys": "4.22.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz", + "integrity": "sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", + "dev": true + }, + "@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "dev": true + }, + "@vue/babel-plugin-jsx": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.6.tgz", + "integrity": "sha512-RzYsvBhzKUmY2YG6LoV+W5PnlnkInq0thh1AzCmewwctAgGN6e9UFon6ZrQQV1CO5G5PeME7MqpB+/vvGg0h4g==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + } + } + }, + "@vue/babel-preset-app": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.13.tgz", + "integrity": "sha512-pM7CR3yXB6L8Gfn6EmX7FLNE3+V/15I3o33GkSNsWvgsMp6HVGXKkXgojrcfUUauyL1LZOdvTmu4enU2RePGHw==", + "dev": true, + "requires": { + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.2.4", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", + "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + } + }, + "@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + } + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@vue/cli-overlay": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.5.13.tgz", + "integrity": "sha512-jhUIg3klgi5Cxhs8dnat5hi/W2tQJvsqCxR0u6hgfSob0ORODgUBlN+F/uwq7cKIe/pzedVUk1y07F13GQvPqg==", + "dev": true + }, + "@vue/cli-plugin-babel": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.13.tgz", + "integrity": "sha512-ykvEAfD8PgGs+dGMGqr7l/nRmIS39NRzWLhMluPLTvDV1L+IxcoB73HNLGA/aENDpl8CuWrTE+1VgydcOhp+wg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.0", + "@vue/babel-preset-app": "^4.5.13", + "@vue/cli-shared-utils": "^4.5.13", + "babel-loader": "^8.1.0", + "cache-loader": "^4.1.0", + "thread-loader": "^2.1.3", + "webpack": "^4.0.0" + } + }, + "@vue/cli-plugin-e2e-cypress": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-e2e-cypress/-/cli-plugin-e2e-cypress-4.5.13.tgz", + "integrity": "sha512-7AyqCgDqgCj93QxkJYJG5YuXW07enHAYCdGZHPBHZKniIiq8VfvA6/ZT6TTU7DRr2/QxoIbXtbGnmNyDF/Urww==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.5.13", + "cypress": "^3.8.3", + "eslint-plugin-cypress": "^2.10.3" + } + }, + "@vue/cli-plugin-eslint": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.13.tgz", + "integrity": "sha512-yc2uXX6aBiy3vEf5TwaueaDqQbdIXIhk0x0KzEtpPo23jBdLkpOSoU5NCgE06g/ZiGAcettpmBSv73Hfp4wHEw==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.5.13", + "eslint-loader": "^2.2.1", + "globby": "^9.2.0", + "inquirer": "^7.1.0", + "webpack": "^4.0.0", + "yorkie": "^2.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "@vue/cli-plugin-pwa": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.5.13.tgz", + "integrity": "sha512-uU5pp94VU0YscfKq/mNRsKOdxG+CTqVlZWaYkRc+HCcwkJ/m/CnxgaEqQFr0QpHC8zmlX4gILO1RVYygJoR9tw==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.5.13", + "webpack": "^4.0.0", + "workbox-webpack-plugin": "^4.3.1" + }, + "dependencies": { + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "workbox-background-sync": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", + "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-broadcast-update": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", + "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-build": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", + "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.4", + "@hapi/joi": "^15.0.0", + "common-tags": "^1.8.0", + "fs-extra": "^4.0.2", + "glob": "^7.1.3", + "lodash.template": "^4.4.0", + "pretty-bytes": "^5.1.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "workbox-background-sync": "^4.3.1", + "workbox-broadcast-update": "^4.3.1", + "workbox-cacheable-response": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-expiration": "^4.3.1", + "workbox-google-analytics": "^4.3.1", + "workbox-navigation-preload": "^4.3.1", + "workbox-precaching": "^4.3.1", + "workbox-range-requests": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1", + "workbox-streams": "^4.3.1", + "workbox-sw": "^4.3.1", + "workbox-window": "^4.3.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", + "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "workbox-cacheable-response": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", + "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==", + "dev": true + }, + "workbox-expiration": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", + "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-google-analytics": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", + "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", + "dev": true, + "requires": { + "workbox-background-sync": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1" + } + }, + "workbox-navigation-preload": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", + "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-precaching": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", + "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-range-requests": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", + "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-routing": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", + "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-strategies": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", + "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-streams": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", + "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-sw": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", + "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==", + "dev": true + }, + "workbox-webpack-plugin": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", + "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "json-stable-stringify": "^1.0.1", + "workbox-build": "^4.3.1" + } + }, + "workbox-window": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", + "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + } + } + }, + "@vue/cli-plugin-router": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.5.13.tgz", + "integrity": "sha512-tgtMDjchB/M1z8BcfV4jSOY9fZSMDTPgF9lsJIiqBWMxvBIsk9uIZHxp62DibYME4CCKb/nNK61XHaikFp+83w==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.5.13" + } + }, + "@vue/cli-plugin-typescript": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-typescript/-/cli-plugin-typescript-4.5.13.tgz", + "integrity": "sha512-CpLlIdFNV1gn9uC4Yh6QgWI42uk2x5Z3cb2ScxNSwWsR1vgSdr0/1DdNzoBm68aP8RUtnHHO/HZfPnvXiq42xA==", + "dev": true, + "requires": { + "@types/webpack-env": "^1.15.2", + "@vue/cli-shared-utils": "^4.5.13", + "cache-loader": "^4.1.0", + "fork-ts-checker-webpack-plugin": "^3.1.1", + "fork-ts-checker-webpack-plugin-v5": "npm:fork-ts-checker-webpack-plugin@^5.0.11", + "globby": "^9.2.0", + "thread-loader": "^2.1.3", + "ts-loader": "^6.2.2", + "tslint": "^5.20.1", + "webpack": "^4.0.0", + "yorkie": "^2.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "@vue/cli-plugin-unit-jest": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-4.5.13.tgz", + "integrity": "sha512-8t7QIihJWB9Kv85FamrEzWbJnvsLhQdyXHl3h+qhAihrZdLL+9mj905y88cBCq+i2PqqZ/qAoabbpf4DxDAb7g==", + "dev": true, + "requires": { + "@babel/core": "^7.11.0", + "@babel/plugin-transform-modules-commonjs": "^7.9.6", + "@types/jest": "^24.0.19", + "@vue/cli-shared-utils": "^4.5.13", + "babel-core": "^7.0.0-bridge.0", + "babel-jest": "^24.9.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "deepmerge": "^4.2.2", + "jest": "^24.9.0", + "jest-environment-jsdom-fifteen": "^1.0.2", + "jest-serializer-vue": "^2.0.2", + "jest-transform-stub": "^2.0.0", + "jest-watch-typeahead": "^0.4.2", + "ts-jest": "^24.2.0", + "vue-jest": "^3.0.5" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz", + "integrity": "sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==", + "dev": true, + "requires": { + "jest-diff": "^24.3.0" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "@vue/cli-plugin-vuex": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.13.tgz", + "integrity": "sha512-I1S9wZC7iI0Wn8kw8Zh+A2Qkf6s1M6vTGBkx8boXjuzfwEEyEHRxadsVCecZc8Mkpydo0nykj+MyYF96TKFuVA==", + "dev": true + }, + "@vue/cli-service": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.5.13.tgz", + "integrity": "sha512-CKAZN4iokMMsaUyJRU22oUAz3oS/X9sVBSKAF2/shFBV5xh3jqAlKl8OXZYz4cXGFLA6djNuYrniuLAo7Ku97A==", + "dev": true, + "requires": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@soda/get-current-script": "^1.0.0", + "@types/minimist": "^1.2.0", + "@types/webpack": "^4.0.0", + "@types/webpack-dev-server": "^3.11.0", + "@vue/cli-overlay": "^4.5.13", + "@vue/cli-plugin-router": "^4.5.13", + "@vue/cli-plugin-vuex": "^4.5.13", + "@vue/cli-shared-utils": "^4.5.13", + "@vue/component-compiler-utils": "^3.1.2", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^7.4.0", + "acorn-walk": "^7.1.1", + "address": "^1.1.2", + "autoprefixer": "^9.8.6", + "browserslist": "^4.12.0", + "cache-loader": "^4.1.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.4", + "clipboardy": "^2.3.0", + "cliui": "^6.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.5.3", + "cssnano": "^4.1.10", + "debug": "^4.1.1", + "default-gateway": "^5.0.5", + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^4.2.0", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.9.0", + "minimist": "^1.2.5", + "pnp-webpack-plugin": "^1.6.4", + "portfinder": "^1.0.26", + "postcss-loader": "^3.0.0", + "ssri": "^8.0.1", + "terser-webpack-plugin": "^1.4.4", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.9.2", + "vue-loader-v16": "npm:vue-loader@^16.1.0", + "vue-style-loader": "^4.1.2", + "webpack": "^4.0.0", + "webpack-bundle-analyzer": "^3.8.0", + "webpack-chain": "^6.4.0", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^4.2.2" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "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 + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "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, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "@vue/cli-shared-utils": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.13.tgz", + "integrity": "sha512-HpnOrkLg42RFUsQGMJv26oTG3J3FmKtO2WSRhKIIL+1ok3w9OjGCtA3nMMXN27f9eX14TqO64M36DaiSZ1fSiw==", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.88.2", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@vue/component-compiler-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", + "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "optional": true + }, + "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 + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@vue/eslint-config-prettier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-6.0.0.tgz", + "integrity": "sha512-wFQmv45c3ige5EA+ngijq40YpVcIkAy0Lihupnsnd1Dao5CBbPyfCzqtejFLZX1EwH/kCJdpz3t6s+5wd3+KxQ==", + "dev": true, + "requires": { + "eslint-config-prettier": "^6.0.0" + } + }, + "@vue/eslint-config-typescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-7.0.0.tgz", + "integrity": "sha512-UxUlvpSrFOoF8aQ+zX1leYiEBEm7CZmXYn/ZEM1zwSadUzpamx56RB4+Htdjisv1mX2tOjBegNUqH3kz2OL+Aw==", + "dev": true, + "requires": { + "vue-eslint-parser": "^7.0.0" + } + }, + "@vue/preload-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "dev": true + }, + "@vue/test-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.2.0.tgz", + "integrity": "sha512-poBTLqeJYNq1TXVhtVfnY8vELUVOFdJY8KZZoUuaAkIqPTWsxonU1M8nMWpZT+xEMrM+49+YcuEqtMHVD9Q9gw==", + "dev": true, + "requires": { + "dom-event-types": "^1.0.0", + "lodash": "^4.17.15", + "pretty": "^2.0.0" + } + }, + "@vue/web-component-wrapper": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", + "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@wry/context": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.6.0.tgz", + "integrity": "sha512-sAgendOXR8dM7stJw3FusRxFHF/ZinU0lffsA2YTyyIOfic86JX02qlPqPVqJNZJPAxFt+2EE8bvq6ZlS0Kf+Q==", + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@wry/equality": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", + "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@wry/trie": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.0.tgz", + "integrity": "sha512-Yw1akIogPhAT6XPYsRHlZZIS0tIGmAl9EYXHi2scf7LPKKqdqmow/Hu4kEqP2cJR3EjaU/9L0ZlAjFf3hFxmug==", + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@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 + }, + "@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 + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "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 + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "apollo-absinthe-upload-link": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/apollo-absinthe-upload-link/-/apollo-absinthe-upload-link-1.7.0.tgz", + "integrity": "sha512-Dt5R6OkN2xigCaN1WHjpgyf5M5Tx5wFJMF4zA4J72Bjd990ImXhoCT/Gs2Cl8S0lXchpP2BndJSJN7MrSJz2CA==", + "requires": { + "@apollo/client": "^3.0.0", + "graphql": "^15.0.0", + "rxjs": "~6.2.2" + } + }, + "apollo-cache": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.3.5.tgz", + "integrity": "sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA==", + "requires": { + "apollo-utilities": "^1.3.4", + "tslib": "^1.10.0" + } + }, + "apollo-cache-inmemory": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.6.tgz", + "integrity": "sha512-L8pToTW/+Xru2FFAhkZ1OA9q4V4nuvfoPecBM34DecAugUZEBhI2Hmpgnzq2hTKZ60LAMrlqiASm0aqAY6F8/A==", + "requires": { + "apollo-cache": "^1.3.5", + "apollo-utilities": "^1.3.4", + "optimism": "^0.10.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "@wry/context": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.4.4.tgz", + "integrity": "sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag==", + "requires": { + "@types/node": ">=6", + "tslib": "^1.9.3" + } + }, + "optimism": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.10.3.tgz", + "integrity": "sha512-9A5pqGoQk49H6Vhjb9kPgAeeECfUDF6aIICbMDL23kDLStBn1MWk3YvcZ4xWF9CsSf6XEgvRLkXy4xof/56vVw==", + "requires": { + "@wry/context": "^0.4.0" + } + } + } + }, + "apollo-client": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.6.10.tgz", + "integrity": "sha512-jiPlMTN6/5CjZpJOkGeUV0mb4zxx33uXWdj/xQCfAMkuNAC3HN7CvYDyMHHEzmcQ5GV12LszWoQ/VlxET24CtA==", + "requires": { + "@types/zen-observable": "^0.8.0", + "apollo-cache": "1.3.5", + "apollo-link": "^1.0.0", + "apollo-utilities": "1.3.4", + "symbol-observable": "^1.0.2", + "ts-invariant": "^0.4.0", + "tslib": "^1.10.0", + "zen-observable": "^0.8.0" + }, + "dependencies": { + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + } + } + }, + "apollo-link": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", + "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", + "requires": { + "apollo-utilities": "^1.3.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3", + "zen-observable-ts": "^0.8.21" + } + }, + "apollo-link-error": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/apollo-link-error/-/apollo-link-error-1.1.13.tgz", + "integrity": "sha512-jAZOOahJU6bwSqb2ZyskEK1XdgUY9nkmeclCrW7Gddh1uasHVqmoYc4CKdb0/H0Y1J9lvaXKle2Wsw/Zx1AyUg==", + "requires": { + "apollo-link": "^1.2.14", + "apollo-link-http-common": "^0.2.16", + "tslib": "^1.9.3" + } + }, + "apollo-link-http": { + "version": "1.5.17", + "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.17.tgz", + "integrity": "sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==", + "requires": { + "apollo-link": "^1.2.14", + "apollo-link-http-common": "^0.2.16", + "tslib": "^1.9.3" + } + }, + "apollo-link-http-common": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz", + "integrity": "sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==", + "requires": { + "apollo-link": "^1.2.14", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3" + } + }, + "apollo-link-ws": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/apollo-link-ws/-/apollo-link-ws-1.0.20.tgz", + "integrity": "sha512-mjSFPlQxmoLArpHBeUb2Xj+2HDYeTaJqFGOqQ+I8NVJxgL9lJe84PDWcPah/yMLv3rB7QgBDSuZ0xoRFBPlySw==", + "requires": { + "apollo-link": "^1.2.14", + "tslib": "^1.9.3" + } + }, + "apollo-utilities": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", + "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", + "requires": { + "@wry/equality": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.10.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "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 + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "optional": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "dev": true + }, + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "dev": true, + "requires": { + "babylon": "^6.18.0" + } + }, + "babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "dev": true, + "requires": { + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "babel-plugin-jest-hoist": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.1.tgz", + "integrity": "sha512-hXGSPbr6IbjeMyGew+3uGIAkRjBFSOJ9FLDZNOfHuyJZCcoia4nd/72J0bSgvfytcVfUcP/dxEVcUhVJuQRtSw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.1", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.1.tgz", + "integrity": "sha512-WZCqF3DLUhdTD/P381MDJfuP18hdCZ+iqJ+wHtzhWENpsiof284JJ1tMQg1CE+hfCWyG48F7e5gDMk2c3Laz7w==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.1", + "core-js-compat": "^3.9.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.1.tgz", + "integrity": "sha512-T3bYyL3Sll2EtC94v3f+fA8M28q7YPTOZdB++SRHjvYZTvtd+WorMUq3tDTD4Q7Kjk1LG0gGromslKjcO5p2TA==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.1" + } + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, + "babel-preset-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.9.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "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 + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "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 + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bezier-easing": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz", + "integrity": "sha1-wE3+i5JtbsrKGBPWn/F5t8ICXYY=" + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "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 + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buefy": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/buefy/-/buefy-0.9.7.tgz", + "integrity": "sha512-Fli0ZjNDgtFtHm0LItWmfhNJ1oLjDwPzUWccvwXXoo2mADXaH8JQxyhY+drUuUV5/GMu5PtwqQSqPgZy942VZg==", + "requires": { + "bulma": "0.9.2" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bulma": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.2.tgz", + "integrity": "sha512-e14EF+3VSZ488yL/lJH0tR8mFWiEQVCMi/BQUMi2TGMBOk+zrDg4wryuwm/+dRSHJw0gMawp2tsW7X1JYUCE3A==" + }, + "bulma-divider": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bulma-divider/-/bulma-divider-0.2.0.tgz", + "integrity": "sha512-REe3k56GECRfDaqFjC8cwLhV4RxXmV0RubuzDJqwior9wlJcdHlN0qfW0tvUX+qphikaTQegIeRuhjRIAqkjkw==" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "dev": true, + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + } + }, + "cachedir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-1.3.0.tgz", + "integrity": "sha512-O1ji32oyON9laVPJL1IZ5bmwd2cB46VfpxkDequezH+15FDzzVddEyrGEeX4WusDSqKxdyFdDQDEG1yo1GoWkg==", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001228", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", + "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "dev": true + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "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, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true + } + } + }, + "cli-spinners": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "dev": true + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + } + }, + "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 + }, + "clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "dev": true, + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "dependencies": { + "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, + "requires": { + "is-docker": "^2.0.0" + } + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "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, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "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==", + "requires": { + "color-name": "1.1.3" + }, + "dependencies": { + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "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 + }, + "color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "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 + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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 + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "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 + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "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 + } + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } + }, + "core-js": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.11.1.tgz", + "integrity": "sha512-k93Isqg7e4txZWMGNYwevZL9MiogLk8pd1PtwrmFmi8IBq4GXqUaVW/a33Llt6amSI36uSjd0GWwc9pTT9ALlQ==" + }, + "core-js-compat": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.12.1.tgz", + "integrity": "sha512-i6h5qODpw6EsHAoIdQhKoZdWn+dGBF3dSS8m5tif36RlWvW3A6+yu2S16QHUo3CrkzrnEskMAt9f8FxmY9fhWQ==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "optional": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "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 + } + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "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 + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "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 + } + } + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "cypress": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.8.3.tgz", + "integrity": "sha512-I9L/d+ilTPPA4vq3NC1OPKmw7jJIpMKNdyfR8t1EXYzYCjyqbc59migOm1YSse/VRbISLJ+QGb5k4Y3bz2lkYw==", + "dev": true, + "requires": { + "@cypress/listr-verbose-renderer": "0.4.1", + "@cypress/xvfb": "1.2.4", + "@types/sizzle": "2.3.2", + "arch": "2.1.1", + "bluebird": "3.5.0", + "cachedir": "1.3.0", + "chalk": "2.4.2", + "check-more-types": "2.24.0", + "commander": "2.15.1", + "common-tags": "1.8.0", + "debug": "3.2.6", + "eventemitter2": "4.1.2", + "execa": "0.10.0", + "executable": "4.1.1", + "extract-zip": "1.6.7", + "fs-extra": "5.0.0", + "getos": "3.1.1", + "is-ci": "1.2.1", + "is-installed-globally": "0.1.0", + "lazy-ass": "1.6.0", + "listr": "0.12.0", + "lodash": "4.17.15", + "log-symbols": "2.2.0", + "minimist": "1.2.0", + "moment": "2.24.0", + "ramda": "0.24.1", + "request": "2.88.0", + "request-progress": "3.0.0", + "supports-color": "5.5.0", + "tmp": "0.1.0", + "untildify": "3.0.3", + "url": "0.11.0", + "yauzl": "2.10.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "date-fns": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.21.1.tgz", + "integrity": "sha512-m1WR0xGiC6j6jNFAyW4Nvh4WxAi4JF4w9jRJwSI8nBmNcyZXPcP9VUQG+6gHQXAmqaGEKDKhOqAtENDC941UkA==" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "deasync": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.21.tgz", + "integrity": "sha512-kUmM8Y+PZpMpQ+B4AuOW9k2Pfx/mSupJtxOsLzmnHY2WqZUYRFccFn2RhzPAqt3Xb+sorK/badW2D4zNzqZz5w==", + "dev": true, + "requires": { + "bindings": "^1.5.0", + "node-addon-api": "^1.7.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-gateway": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.5.tgz", + "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==", + "dev": true, + "requires": { + "execa": "^3.3.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "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 + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "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, + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-event-types": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.0.0.tgz", + "integrity": "sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domready": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/domready/-/domready-1.0.8.tgz", + "integrity": "sha1-kfJS5Ze2Wvd+dFriTdAYXV4m1Yw=", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-object": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-2.1.4.tgz", + "integrity": "sha512-7FXnyyCLFawNYJ+NhkqyP9Wd2yzuo+7n9pGiYpkmXCTYa8Ci2U0eUNDVg5OuO5Pm6aFXI2SWN8/N/w7SJWu1WA==", + "dev": true, + "requires": { + "commander": "^4.0.0", + "glob": "^7.1.5" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + } + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.737", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.737.tgz", + "integrity": "sha512-P/B84AgUSQXaum7a8m11HUsYL8tj9h/Pt5f7Hg7Ty6bm5DxlFq+e5+ouHUoNQMsKDJ7u4yGfI8mOErCmSH9wyg==", + "dev": true + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "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 + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "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, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dev": true, + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "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, + "optional": true + } + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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 + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-loader": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz", + "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + } + }, + "eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-cypress": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.2.tgz", + "integrity": "sha512-1SergF1sGbVhsf7MYfOLiBhdOg6wqyeV9pXUAIDIffYTGMN3dTBQS9nFAzhLsHhO+Bn0GaVM1Ecm71XUidQ7VA==", + "dev": true, + "requires": { + "globals": "^11.12.0" + } + }, + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + } + } + }, + "eslint-plugin-prettier": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-vue": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz", + "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==", + "dev": true, + "requires": { + "natural-compare": "^1.4.0", + "semver": "^5.6.0", + "vue-eslint-parser": "^7.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "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, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "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 + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "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, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true + }, + "eventemitter2": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-4.1.2.tgz", + "integrity": "sha1-DhqEd6+CGm7zmVsxG/dMI6UkfxU=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "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 + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "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, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extract-from-css": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/extract-from-css/-/extract-from-css-0.4.4.tgz", + "integrity": "sha1-HqffLnx8brmSL6COitrqSG9vj5I=", + "dev": true, + "requires": { + "css": "^2.1.0" + } + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "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 + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-babel-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "dev": true, + "requires": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flow-static-land": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/flow-static-land/-/flow-static-land-0.2.7.tgz", + "integrity": "sha1-k3+dyyeAiJpgkVXl0aVamTvC/7M=" + }, + "flush-promises": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-promises/-/flush-promises-1.0.2.tgz", + "integrity": "sha512-G0sYfLQERwKz4+4iOZYQEZVpOt9zQrlItIxQAAYAWpfby3gbHrx0osCHz5RLl/XoXevXk0xoN4hDFky/VV9TrA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "fork-ts-checker-webpack-plugin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", + "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^3.3.0", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "fork-ts-checker-webpack-plugin-v5": { + "version": "npm:fork-ts-checker-webpack-plugin@5.2.1", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.2.1.tgz", + "integrity": "sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "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, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "optional": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "optional": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "optional": true + } + } + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true, + "optional": true + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "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==", + "dev": true + }, + "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 + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getos": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.1.tgz", + "integrity": "sha512-oUP1rnEhAr97rkitiszGP9EgDVYnmchgFzfqRzSkgtfv7ai6tEi7Ko8GgjNXts7VLWEqrTWyhsOKLe5C5b/Zkg==", + "dev": true, + "requires": { + "async": "2.6.1" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "graphql": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.0.tgz", + "integrity": "sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA==" + }, + "graphql-tag": { + "version": "2.12.4", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.4.tgz", + "integrity": "sha512-VV1U4O+9x99EkNpNmCUV5RZwq6MnK4+pGbRYWG+lA/m3uo7TSqJF81OkcOP148gFP6fzdl7JWYBrwWVTS9jXww==", + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "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==", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "highlight.js": { + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.2.tgz", + "integrity": "sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } + } + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "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, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "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, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "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, + "requires": { + "type-fest": "^0.21.3" + } + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "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 + }, + "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 + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "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, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "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 + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "dependencies": { + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + } + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "intersection-observer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.0.tgz", + "integrity": "sha512-2Vkz8z46Dv401zTWudDGwO7KiGHNDkMv417T5ItcNYfmvHR/1qCTVBO9vwH8zZmQ0WkA/1ARwpysR9bsnop4NQ==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "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 + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "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 + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + } + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "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, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "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 + } + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, + "iterall": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" + }, + "javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true + }, + "jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "dev": true, + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "jest-cli": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "dev": true, + "requires": { + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + } + } + } + }, + "jest-changed-files": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "jest-config": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + } + } + }, + "jest-docblock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "jest-environment-jsdom": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", + "jsdom": "^11.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "jest-environment-jsdom-fifteen": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fifteen/-/jest-environment-jsdom-fifteen-1.0.2.tgz", + "integrity": "sha512-nfrnAfwklE1872LIB31HcjM65cWTh1wzvMSp10IYtPJjLDUbTTvDpajZgIxUnhRmzGvogdHDayCIlerLK0OBBg==", + "dev": true, + "requires": { + "@jest/environment": "^24.3.0", + "@jest/fake-timers": "^24.3.0", + "@jest/types": "^24.3.0", + "jest-mock": "^24.0.0", + "jest-util": "^24.0.0", + "jsdom": "^15.2.1" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "dev": true + } + } + }, + "jest-environment-node": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "jest-jasmine2": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.9.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", + "throat": "^4.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "jest-junit": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.0.0.tgz", + "integrity": "sha512-+8K35LlboWiPuCnXSyiid7rFdxNlpCWWM20WEYe6IZH6psfUWKZmSpSRQ5tk0C0cBeDsvsnIzcef5mYhyJsbug==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^3.3.3", + "xml": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "jest-leak-detector": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "dev": true, + "requires": { + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "dev": true + }, + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "jest-runner": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "jest-runtime": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^13.3.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "dev": true + }, + "jest-serializer-vue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jest-serializer-vue/-/jest-serializer-vue-2.0.2.tgz", + "integrity": "sha1-sjjvKGNX7GtIBCG9RxRQUJh9WbM=", + "dev": true, + "requires": { + "pretty": "2.0.0" + } + }, + "jest-snapshot": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "jest-transform-stub": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz", + "integrity": "sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==", + "dev": true + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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 + } + } + }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "jest-watch-typeahead": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", + "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.1", + "jest-regex-util": "^24.9.0", + "jest-watcher": "^24.3.0", + "slash": "^3.0.0", + "string-length": "^3.1.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "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, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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 + } + } + }, + "jest-watcher": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.9.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + } + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-beautify": { + "version": "1.13.13", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.13.13.tgz", + "integrity": "sha512-oH+nc0U5mOAqX8M5JO1J0Pw/7Q35sAdOsM5W3i87pir9Ntx6P/5Gx1xLNoK+MGyvHk4rqqRCE4Oq58H6xl2W7A==", + "dev": true, + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "mkdirp": "^1.0.4", + "nopt": "^5.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true + }, + "js-queue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", + "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", + "dev": true, + "requires": { + "easy-stack": "^1.0.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "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 + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "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 + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "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": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "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 + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", + "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "launch-editor-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz", + "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==", + "dev": true, + "requires": { + "launch-editor": "^2.2.1" + } + }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", + "dev": true + }, + "leaflet": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.7.1.tgz", + "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==" + }, + "leaflet.locatecontrol": { + "version": "0.73.0", + "resolved": "https://registry.npmjs.org/leaflet.locatecontrol/-/leaflet.locatecontrol-0.73.0.tgz", + "integrity": "sha512-e6v6SyDU2nzG5AiH80eH7qhXw5J+EfgmEFHkuzTRC9jqCSbfAm/3HlZDuoa9WYsaZbn5ovvqNeaLW/JSMsgg5g==" + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "listr": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz", + "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.2.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^5.0.0-beta.11", + "stream-to-observable": "^0.1.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" + } + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz", + "integrity": "sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "loader-fs-cache": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", + "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "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 + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "dev": true, + "requires": { + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" + }, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + } + } + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true + }, + "loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha1-akAhj9x64V/HbD0PPmdsRlOIYD4=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memfs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.2.tgz", + "integrity": "sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q==", + "dev": true, + "optional": true, + "requires": { + "fs-monkey": "1.0.3" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.1" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "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==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "dev": true + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dev": true, + "requires": { + "mime-db": "1.47.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mitt": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.2.tgz", + "integrity": "sha1-OA5hSA1qYVtmDwertg1R4KTkvtY=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mock-apollo-client": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mock-apollo-client/-/mock-apollo-client-0.6.0.tgz", + "integrity": "sha512-HPo6yVkAE+uxIpB8oPO9ISM86hFDwefrHKz5uOowecT/hR79e/NbXAl372LOQ1lWYVNVgCaP3RIMgWEhVFWtjw==", + "dev": true + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "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 + }, + "ngeohash": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/ngeohash/-/ngeohash-0.6.3.tgz", + "integrity": "sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true + }, + "node-cache": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.1.tgz", + "integrity": "sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A==", + "dev": true, + "requires": { + "clone": "2.x", + "lodash": "^4.17.15" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + } + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-ipc": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.4.tgz", + "integrity": "sha512-A+f0mn2KxUt1uRTSd5ktxQUsn2OEhj5evo7NUi/powBzMSZ0vocdzDjlq9QN2v3LH6CJi3e5xAenpZ1QwU5A8g==", + "dev": true, + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.7", + "js-queue": "2.0.2" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", + "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "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 + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimism": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz", + "integrity": "sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg==", + "requires": { + "@wry/context": "^0.6.0", + "@wry/trie": "^0.3.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "orderedmap": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.1.tgz", + "integrity": "sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ==" + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-debounce": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-debounce/-/p-debounce-4.0.0.tgz", + "integrity": "sha512-4Ispi9I9qYGO4lueiLDhe4q4iK5ERK8reLsuzH6BPaXn53EGaua8H66PXIFGrW897hwjXp+pVLrm/DLxN0RF0A==" + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "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, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "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 + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "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 + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "phoenix": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/phoenix/-/phoenix-1.5.8.tgz", + "integrity": "sha512-oyWPdegBD8KU7zAs1+P3PRqCEchm973yqoUkdMtU9UhMnB0+PY6diofGOPwkxHrUjw6Whi5GqJMv/3Px2JTlkw==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "dev": true, + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-prefix-selector": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.9.0.tgz", + "integrity": "sha512-tTUHUNP+/Qfgg+fvbljUIeLs1ijICWb8+CT3bZM2joE2pkd+EnuBzSfZNHY2RMmozNRp44yEFv+I+6IIiLcoCg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha1-9MBtufZ7Yf0XxOJW5+PZUVv3Jv0=", + "dev": true, + "requires": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + } + }, + "posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha1-NdUw3jhnQMK6JP8usvrznM3ycd0=", + "dev": true, + "requires": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true + }, + "posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "requires": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, + "prettier-eslint": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-12.0.0.tgz", + "integrity": "sha512-N8SGGQwAosISXTNl1E57sBbtnqUGlyRWjcfIUxyD3HF4ynehA9GZ8IfJgiep/OfYvCof/JEpy9ZqSl250Wia7A==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "^3.0.0", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^7.9.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^2.0.0", + "pretty-format": "^23.0.1", + "require-relative": "^0.8.7", + "typescript": "^3.9.3", + "vue-eslint-parser": "~7.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", + "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.10.1", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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 + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "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 + }, + "eslint": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.27.0.tgz", + "integrity": "sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + } + }, + "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, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "globals": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", + "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "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 + }, + "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 + }, + "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, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "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 + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "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, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "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 + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", + "integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + } + } + }, + "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, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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 + }, + "typescript": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", + "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", + "dev": true + }, + "vue-eslint-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz", + "integrity": "sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.0.1", + "lodash": "^4.17.15" + }, + "dependencies": { + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + } + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=", + "dev": true, + "requires": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + } + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "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 + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "prosemirror-commands": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.8.tgz", + "integrity": "sha512-EIj/WAlrK2rVugxNxsFG6pI4430RL63ka2QKB9dO7vvStsLO//nq/oMjmd3VXp08+QNrmmLE23utqBUZwbS9Jg==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-dropcursor": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.5.tgz", + "integrity": "sha512-tNUwcF2lPAkwKBZPZRtbxpwljnODRNZ3eiYloN1DSUqDjMT1nBZm0nejaEMS1TvNQ+3amibUSAiV4hX+jpASFA==", + "requires": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "prosemirror-gapcursor": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.5.tgz", + "integrity": "sha512-SjbUZq5pgsBDuV3hu8GqgIpZR5eZvGLM+gPQTqjVVYSMUCfKW3EGXTEYaLHEl1bGduwqNC95O3bZflgtAb4L6w==", + "requires": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "prosemirror-history": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.1.3.tgz", + "integrity": "sha512-zGDotijea+vnfnyyUGyiy1wfOQhf0B/b6zYcCouBV8yo6JmrE9X23M5q7Nf/nATywEZbgRLG70R4DmfSTC+gfg==", + "requires": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "rope-sequence": "^1.3.0" + } + }, + "prosemirror-inputrules": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.3.tgz", + "integrity": "sha512-ZaHCLyBtvbyIHv0f5p6boQTIJjlD6o2NPZiEaZWT2DA+j591zS29QQEMT4lBqwcLW3qRSf7ZvoKNbf05YrsStw==", + "requires": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-keymap": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.1.4.tgz", + "integrity": "sha512-Al8cVUOnDFL4gcI5IDlG6xbZ0aOD/i3B17VT+1JbHWDguCgt/lBHVTHUBcKvvbSg6+q/W4Nj1Fu6bwZSca3xjg==", + "requires": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "prosemirror-model": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.14.1.tgz", + "integrity": "sha512-vZcbI+24VloFefKZkDnMaEpipL/vSKKPdFiik4KOnTzq3e6AO7+CAOixZ2G/SsfRaYC965XvnOIEbhIQdgki7w==", + "requires": { + "orderedmap": "^1.1.0" + } + }, + "prosemirror-schema-list": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.1.4.tgz", + "integrity": "sha512-pNTuZflacFOBlxrTcWSdWhjoB8BaucwfJVp/gJNxztOwaN3wQiC65axclXyplf6TKgXD/EkWfS/QAov3/Znadw==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-state": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.4.tgz", + "integrity": "sha512-Xkkrpd1y/TQ6HKzN3agsQIGRcLckUMA9u3j207L04mt8ToRgpGeyhbVv0HI7omDORIBHjR29b7AwlATFFf2GLA==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-transform": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.3.2.tgz", + "integrity": "sha512-/G6d/u9Mf6Bv3H1XR8VxhpjmUO75LYmnvj+s3ZfZpakU1hnQbsvCEybml1B3f2IWUAAQRFkbO1PnsbFhLZsYsw==", + "requires": { + "prosemirror-model": "^1.0.0" + } + }, + "prosemirror-view": { + "version": "1.18.7", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.18.7.tgz", + "integrity": "sha512-pUCxoyuWnbVfJ/ukhQ+7+bfDMArG3wu6hHnnTFi61C7Teb5OILUhkkhEhF2/RsppBFWrkwsNcf8rQm8SSoSKRg==", + "requires": { + "prosemirror-model": "^1.1.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "ramda": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", + "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "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 + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "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 + } + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", + "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + } + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "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==" + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "dev": true, + "requires": { + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "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 + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "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 + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rope-sequence": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz", + "integrity": "sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg==" + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "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 + }, + "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==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", + "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "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==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "sass": { + "version": "1.32.12", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.12.tgz", + "integrity": "sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "requires": { + "xmlchars": "^2.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, + "sortablejs": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz", + "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==" + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-utils": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "stream-to-observable": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz", + "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "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, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "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 + } + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dev": true, + "requires": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + }, + "dependencies": { + "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 + } + } + }, + "svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "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 + } + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "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 + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "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 + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "svg-baker-runtime": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/svg-baker-runtime/-/svg-baker-runtime-1.4.7.tgz", + "integrity": "sha512-Zorfwwj5+lWjk/oxwSMsRdS2sPQQdTmmsvaSpzU+i9ZWi3zugHLt6VckWfnswphQP0LmOel3nggpF5nETbt6xw==", + "dev": true, + "requires": { + "deepmerge": "1.3.2", + "mitt": "1.1.2", + "svg-baker": "^1.7.0" + }, + "dependencies": { + "deepmerge": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz", + "integrity": "sha1-FmNpFinU2/42T6EqKk8KqGqjoFA=", + "dev": true + } + } + }, + "svg-sprite-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-4.3.0.tgz", + "integrity": "sha512-IkXI2e0bWr32G6VCqw0g8x8eRsMSUKkyd3axnI6D5pEZ9zv3Zi7FTVVnOUi/Io3i2D1UAofOW+35N8qwIUql4w==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "deepmerge": "1.3.2", + "domready": "1.0.8", + "escape-string-regexp": "1.0.5", + "html-webpack-plugin": "^3.2.0", + "loader-utils": "^1.1.0", + "svg-baker": "^1.5.0", + "svg-baker-runtime": "^1.4.7", + "url-slug": "2.0.0" + }, + "dependencies": { + "deepmerge": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz", + "integrity": "sha1-FmNpFinU2/42T6EqKk8KqGqjoFA=", + "dev": true + } + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svg-to-vue": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/svg-to-vue/-/svg-to-vue-0.4.0.tgz", + "integrity": "sha512-g/ZHtEFf4QDsDtTk9tuYX/MJ2HESTUBMTkuLoffQGQ3xMtlmD9Ec4YyTgmMkP1P8QJtWWu2FiGdOnlKaXc/X/Q==", + "dev": true, + "requires": { + "svgo": "^1.1.1" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + } + } + }, + "symbol-observable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==" + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "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 + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "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 + } + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "dev": true, + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "throttle-debounce": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", + "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==" + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tippy.js": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.1.tgz", + "integrity": "sha512-JnFncCq+rF1dTURupoJ4yPie5Cof978inW6/4S6kmWV7LL9YOSEVMifED3KdrVPEG+Z/TFH2CDNJcQEfaeuQww==", + "requires": { + "@popperjs/core": "^2.8.3" + } + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "requires": { + "rimraf": "^2.6.3" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "requires": { + "tslib": "^1.9.3" + } + }, + "ts-jest": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.3.0.tgz", + "integrity": "sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "0.x", + "resolve": "1.x", + "semver": "^5.5", + "yargs-parser": "10.x" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "ts-loader": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.2.tgz", + "integrity": "sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^4.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "requires": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + }, + "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, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", + "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "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 + } + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "unidecode": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz", + "integrity": "sha1-77swFTi8RSRqmsjFWdcvAVMFBT4=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "untildify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", + "dev": true + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + } + }, + "url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/url-slug/-/url-slug-2.0.0.tgz", + "integrity": "sha1-p4nVrtSZXA2VrzM3etHVxo1NcCc=", + "dev": true, + "requires": { + "unidecode": "0.1.8" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", + "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "for-each": "^0.3.3", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.1" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v-tooltip": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/v-tooltip/-/v-tooltip-2.1.3.tgz", + "integrity": "sha512-xXngyxLQTOx/yUEy50thb8te7Qo4XU6h4LZB6cvEfVd9mnysUxLEoYwGWDdqR+l69liKsy3IPkdYff3J1gAJ5w==", + "requires": { + "@babel/runtime": "^7.13.10", + "lodash": "^4.17.21", + "popper.js": "^1.16.1", + "vue-resize": "^1.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", + "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "vue": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", + "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==" + }, + "vue-apollo": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vue-apollo/-/vue-apollo-3.0.7.tgz", + "integrity": "sha512-EUfIn4cJmoflnDJiSNP8gH4fofIEzd0I2AWnd9nhHB8mddmzIfgSNjIRihDcRB10wypYG1OG0GcU335CFgZRfA==", + "requires": { + "chalk": "^2.4.2", + "serialize-javascript": "^4.0.0", + "throttle-debounce": "^2.1.0" + } + }, + "vue-class-component": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-7.2.6.tgz", + "integrity": "sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w==" + }, + "vue-cli-plugin-svg": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/vue-cli-plugin-svg/-/vue-cli-plugin-svg-0.1.3.tgz", + "integrity": "sha512-RE6HNQxKNoYDxlfD0jcOo3y3RWuOB3NsoAkW4noCFU0j/H70XnrxmoVhHFGLBDU2v2TRsOfSpImFOSU1G54j7w==", + "dev": true, + "requires": { + "file-loader": "^4.0.0", + "lodash": "^4.17.11", + "svg-sprite-loader": "^4.1.6", + "url-loader": "^2.0.0", + "vue-svg-loader": "^0.12.0" + } + }, + "vue-eslint-parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz", + "integrity": "sha512-QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.4.0", + "lodash": "^4.17.15" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-i18n": { + "version": "8.24.4", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.24.4.tgz", + "integrity": "sha512-RZE94WUAGxEiBAANxQ0pptbRwDkNKNSXl3fnJslpFOxVMF6UkUtMDSuYGuW2blDrVgweIXVpethOVkYoNNT9xw==" + }, + "vue-i18n-extract": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/vue-i18n-extract/-/vue-i18n-extract-1.2.3.tgz", + "integrity": "sha512-ZLtF6wp732KHKawHx5ZSmjyydkli9g26z0NfGLP89DkiGx4nKFYZ2oIH35HtImdhcfq1zqkeSwxs7kRzarLoVw==", + "dev": true, + "requires": { + "commander": "^6.1.0", + "dot-object": "^2.1.4", + "glob": "^7.1.6", + "is-valid-glob": "^1.0.0", + "js-yaml": "^3.14.0" + }, + "dependencies": { + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + } + } + }, + "vue-jest": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-3.0.7.tgz", + "integrity": "sha512-PIOxFM+wsBMry26ZpfBvUQ/DGH2hvp5khDQ1n51g3bN0TwFwTy4J85XVfxTRMukqHji/GnAoGUnlZ5Ao73K62w==", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "chalk": "^2.1.0", + "deasync": "^0.1.15", + "extract-from-css": "^0.4.4", + "find-babel-config": "^1.1.0", + "js-beautify": "^1.6.14", + "node-cache": "^4.1.1", + "object-assign": "^4.1.1", + "source-map": "^0.5.6", + "tsconfig": "^7.0.0", + "vue-template-es2015-compiler": "^1.6.0" + } + }, + "vue-loader": { + "version": "15.9.7", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.7.tgz", + "integrity": "sha512-qzlsbLV1HKEMf19IqCJqdNvFJRCI58WNbS6XbPqK13MrLz65es75w392MSQ5TsARAfIjUw+ATm3vlCXUJSOH9Q==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.2.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.2.0.tgz", + "integrity": "sha512-TitGhqSQ61RJljMmhIGvfWzJ2zk9m1Qug049Ugml6QP3t0e95o0XJjk29roNEiPKJQBEi8Ord5hFuSuELzSp8Q==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "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, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "vue-meta": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/vue-meta/-/vue-meta-2.4.0.tgz", + "integrity": "sha512-XEeZUmlVeODclAjCNpWDnjgw+t3WA6gdzs6ENoIAgwO1J1d5p1tezDhtteLUFwcaQaTtayRrsx7GL6oXp/m2Jw==", + "requires": { + "deepmerge": "^4.2.2" + } + }, + "vue-property-decorator": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-9.1.2.tgz", + "integrity": "sha512-xYA8MkZynPBGd/w5QFJ2d/NM0z/YeegMqYTphy7NJQXbZcuU6FC6AOdUAcy4SXP+YnkerC6AfH+ldg7PDk9ESQ==" + }, + "vue-resize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz", + "integrity": "sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w==", + "requires": { + "@babel/runtime": "^7.13.10" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", + "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, + "vue-router": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz", + "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw==" + }, + "vue-scrollto": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/vue-scrollto/-/vue-scrollto-2.20.0.tgz", + "integrity": "sha512-7i+AGKJTThZnMEkhIPgrZjyAX+fXV7/rGdg+CV283uZZwCxwiMXaBLTmIc5RTA4uwGnT+E6eJle3mXQfM2OD3A==", + "requires": { + "bezier-easing": "2.1.0" + } + }, + "vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, + "vue-svg-loader": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/vue-svg-loader/-/vue-svg-loader-0.12.0.tgz", + "integrity": "sha512-pg8H6iKCj+DAC7FZuxdfGJMHiFpJPv/YyoN1M7Iqlf+Hu4eU6Q/W/sEFx978syQA+aOx0NXrp+uQUAajqQvXbQ==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "svg-to-vue": "^0.4.0" + } + }, + "vue-template-compiler": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz", + "integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "vue2-leaflet": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/vue2-leaflet/-/vue2-leaflet-2.7.0.tgz", + "integrity": "sha512-uT7lpFoVEDhINMyTpiAthh6aiKFGHuYWLoVH8JJ0YNNSch+XMZFl4YBQ0S2hHYDquQIsh8zx+yINeUI01y9ugw==" + }, + "vuedraggable": { + "version": "2.24.3", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz", + "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==", + "requires": { + "sortablejs": "1.10.2" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-keyname": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz", + "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz", + "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.19", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "dependencies": { + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "dev": true, + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "optional": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + }, + "dependencies": { + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + } + } + }, + "yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", + "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", + "dev": true, + "requires": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.21", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", + "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", + "requires": { + "tslib": "^1.9.3", + "zen-observable": "^0.8.0" + } + } + } +} diff --git a/js/package.json b/js/package.json index 6087d6a50..b8dc795ed 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "mobilizon", - "version": "1.0.7", + "version": "1.1.4", "private": true, "scripts": { "serve": "vue-cli-service serve", @@ -15,6 +15,19 @@ "@absinthe/socket": "^0.2.1", "@absinthe/socket-apollo-link": "^0.2.1", "@mdi/font": "^5.0.45", + "@tiptap/core": "^2.0.0-beta.41", + "@tiptap/extension-blockquote": "^2.0.0-beta.6", + "@tiptap/extension-bubble-menu": "^2.0.0-beta.9", + "@tiptap/extension-character-count": "^2.0.0-beta.5", + "@tiptap/extension-history": "^2.0.0-beta.5", + "@tiptap/extension-image": "^2.0.0-beta.6", + "@tiptap/extension-link": "^2.0.0-beta.8", + "@tiptap/extension-list-item": "^2.0.0-beta.6", + "@tiptap/extension-mention": "^2.0.0-beta.42", + "@tiptap/extension-ordered-list": "^2.0.0-beta.6", + "@tiptap/extension-underline": "^2.0.0-beta.7", + "@tiptap/starter-kit": "^2.0.0-beta.37", + "@tiptap/vue-2": "^2.0.0-beta.21", "apollo-absinthe-upload-link": "^1.5.0", "apollo-cache": "^1.3.5", "apollo-cache-inmemory": "^1.6.6", @@ -28,21 +41,19 @@ "bulma-divider": "^0.2.0", "core-js": "^3.6.4", "date-fns": "^2.16.0", - "eslint-plugin-cypress": "^2.10.3", "graphql": "^15.0.0", "graphql-tag": "^2.10.3", "intersection-observer": "^0.12.0", "leaflet": "^1.4.0", - "leaflet.locatecontrol": "^0.72.0", + "leaflet.locatecontrol": "^0.73.0", "lodash": "^4.17.11", "ngeohash": "^0.6.3", + "p-debounce": "^4.0.0", "phoenix": "^1.4.11", "register-service-worker": "^1.7.1", "tippy.js": "^6.2.3", - "tiptap": "^1.32.0", - "tiptap-extensions": "^1.34.0", "unfetch": "^4.2.0", - "v-tooltip": "^2.1.2", + "v-tooltip": "^2.1.3", "vue": "^2.6.11", "vue-apollo": "^3.0.3", "vue-class-component": "^7.2.3", @@ -65,30 +76,32 @@ "@types/prosemirror-state": "^1.2.4", "@types/prosemirror-view": "^1.11.4", "@types/vuedraggable": "^2.23.0", - "@typescript-eslint/eslint-plugin": "^4.14.1", - "@typescript-eslint/parser": "^4.14.1", - "@vue/cli-plugin-babel": "~4.5.11", - "@vue/cli-plugin-e2e-cypress": "~4.5.11", - "@vue/cli-plugin-eslint": "~4.5.11", - "@vue/cli-plugin-pwa": "~4.5.11", - "@vue/cli-plugin-router": "~4.5.11", - "@vue/cli-plugin-typescript": "~4.5.11", - "@vue/cli-plugin-unit-jest": "~4.5.11", - "@vue/cli-service": "~4.5.11", + "@typescript-eslint/eslint-plugin": "^4.18.0", + "@typescript-eslint/parser": "^4.18.0", + "@vue/cli-plugin-babel": "~4.5.13", + "@vue/cli-plugin-e2e-cypress": "~4.5.13", + "@vue/cli-plugin-eslint": "~4.5.13", + "@vue/cli-plugin-pwa": "~4.5.13", + "@vue/cli-plugin-router": "~4.5.13", + "@vue/cli-plugin-typescript": "~4.5.13", + "@vue/cli-plugin-unit-jest": "~4.5.13", + "@vue/cli-service": "~4.5.13", "@vue/eslint-config-prettier": "^6.0.0", "@vue/eslint-config-typescript": "^7.0.0", "@vue/test-utils": "^1.1.0", - "eslint": "^7.7.0", - "eslint-config-prettier": "^7.0.0", - "eslint-plugin-prettier": "^3.1.3", - "eslint-plugin-vue": "^7.0.0", + "eslint": "^6.7.2", + "eslint-plugin-cypress": "^2.10.3", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-vue": "^6.2.2", + "flush-promises": "^1.0.2", "jest-junit": "^12.0.0", - "mock-apollo-client": "^0.5", - "prettier": "2.2.1", + "mock-apollo-client": "^0.6", + "prettier": "^2.2.1", "prettier-eslint": "^12.0.0", "sass": "^1.29.0", - "sass-loader": "^10.0.1", - "typescript": "~4.1.2", + "sass-loader": "^8.0.2", + "typescript": "~4.1.5", "vue-cli-plugin-svg": "~0.1.3", "vue-i18n-extract": "^1.0.2", "vue-template-compiler": "^2.6.11", diff --git a/js/public/img/koena-a11y.svg b/js/public/img/koena-a11y.svg new file mode 100644 index 000000000..4ef920d2f --- /dev/null +++ b/js/public/img/koena-a11y.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/js/src/apollo/utils.ts b/js/src/apollo/utils.ts index c94e5bd08..92cdcd585 100644 --- a/js/src/apollo/utils.ts +++ b/js/src/apollo/utils.ts @@ -6,28 +6,10 @@ import { AUTH_ACCESS_TOKEN, AUTH_REFRESH_TOKEN } from "@/constants"; import { REFRESH_TOKEN } from "@/graphql/auth"; import { saveTokenData } from "@/utils/auth"; import { ApolloClient } from "apollo-client"; +import introspectionQueryResultData from "../../fragmentTypes.json"; export const fragmentMatcher = new IntrospectionFragmentMatcher({ - introspectionQueryResultData: { - __schema: { - types: [ - { - kind: "UNION", - name: "SearchResult", - possibleTypes: [ - { name: "Event" }, - { name: "Person" }, - { name: "Group" }, - ], - }, - { - kind: "INTERFACE", - name: "Actor", - possibleTypes: [{ name: "Person" }, { name: "Group" }], - }, - ], - }, - }, + introspectionQueryResultData, }); export async function refreshAccessToken( diff --git a/js/src/components/Account/ActorAutoComplete.vue b/js/src/components/Account/ActorAutoComplete.vue index 879935102..a7f14334e 100644 --- a/js/src/components/Account/ActorAutoComplete.vue +++ b/js/src/components/Account/ActorAutoComplete.vue @@ -10,7 +10,7 @@ @select="handleSelect" @infinite-scroll="getAsyncData" > - + diff --git a/js/src/views/User/EmailValidate.vue b/js/src/views/User/EmailValidate.vue index 1a3fd435b..f6085314b 100644 --- a/js/src/views/User/EmailValidate.vue +++ b/js/src/views/User/EmailValidate.vue @@ -47,6 +47,7 @@ export default class Validate extends Vue { this.loading = false; await this.$router.push({ name: RouteName.HOME }); } catch (err) { + this.loading = false; console.error(err); this.failed = true; } diff --git a/js/src/views/User/Login.vue b/js/src/views/User/Login.vue index 88c11e713..b21f28443 100644 --- a/js/src/views/User/Login.vue +++ b/js/src/views/User/Login.vue @@ -67,7 +67,7 @@

-

@@ -156,9 +156,7 @@ import AuthProviders from "../../components/User/AuthProviders.vue"; }, metaInfo() { return { - // if no subcomponents specify a metaInfo.title, this title will be used title: this.$t("Login on Mobilizon!") as string, - // all titles will be injected into this template titleTemplate: "%s | Mobilizon", }; }, @@ -224,44 +222,51 @@ export default class Login extends Vue { } saveUserData(data.login); - - await this.$apollo.mutate({ - mutation: UPDATE_CURRENT_USER_CLIENT, - variables: { - id: data.login.user.id, - email: this.credentials.email, - isLoggedIn: true, - role: data.login.user.role, - }, - }); - try { - await initializeCurrentActor(this.$apollo.provider.defaultClient); - } catch (err) { - if (err instanceof NoIdentitiesException) { - this.$router.push({ - name: RouteName.REGISTER_PROFILE, - params: { - email: this.currentUser.email, - userAlreadyActivated: "true", - }, - }); - } - } + await this.setupClientUserAndActors(data.login); if (this.$route.query.redirect) { - console.log("redirect", this.$route.query.redirect); this.$router.push(this.$route.query.redirect as string); return; } - window.localStorage.setItem("welcome-back", "yes"); + if (window.localStorage) { + window.localStorage.setItem("welcome-back", "yes"); + } this.$router.push({ name: RouteName.HOME }); return; } catch (err) { this.submitted = false; - console.error(err); - err.graphQLErrors.forEach(({ message }: { message: string }) => { - this.errors.push(message); - }); + if (err.graphQLErrors) { + err.graphQLErrors.forEach(({ message }: { message: string }) => { + this.errors.push(message); + }); + } else if (err.networkError) { + this.errors.push(err.networkError.message); + } + } + } + + private async setupClientUserAndActors(login: ILogin): Promise { + await this.$apollo.mutate({ + mutation: UPDATE_CURRENT_USER_CLIENT, + variables: { + id: login.user.id, + email: this.credentials.email, + isLoggedIn: true, + role: login.user.role, + }, + }); + try { + await initializeCurrentActor(this.$apollo.provider.defaultClient); + } catch (err) { + if (err instanceof NoIdentitiesException) { + this.$router.push({ + name: RouteName.REGISTER_PROFILE, + params: { + email: this.currentUser.email, + userAlreadyActivated: "true", + }, + }); + } } } } diff --git a/js/src/views/User/Register.vue b/js/src/views/User/Register.vue index 9b02d28c6..dd82c556b 100644 --- a/js/src/views/User/Register.vue +++ b/js/src/views/User/Register.vue @@ -203,11 +203,9 @@ import AuthProviders from "../../components/User/AuthProviders.vue"; components: { Subtitle, AuthProviders }, metaInfo() { return { - // if no subcomponents specify a metaInfo.title, this title will be used // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore title: this.title, - // all titles will be injected into this template titleTemplate: "%s | Mobilizon", }; }, diff --git a/js/src/vue-apollo.ts b/js/src/vue-apollo.ts index 8ffe60a97..3191afd56 100644 --- a/js/src/vue-apollo.ts +++ b/js/src/vue-apollo.ts @@ -13,7 +13,6 @@ import buildCurrentUserResolver from "@/apollo/user"; import { isServerError } from "@/types/apollo"; import { AUTH_ACCESS_TOKEN } from "@/constants"; import { logout } from "@/utils/auth"; -import { SnackbarProgrammatic as Snackbar } from "buefy"; import { Socket as PhoenixSocket } from "phoenix"; import * as AbsintheSocket from "@absinthe/socket"; import { createAbsintheSocketLink } from "@absinthe/socket-apollo-link"; @@ -123,12 +122,7 @@ const errorLink = onError( } if (networkError) { - console.log(`[Network error]: ${networkError}`); - Snackbar.open({ - message: "Please refresh the page and retry.", - type: "is-danger", - position: "is-bottom", - }); + console.error(`[Network error]: ${networkError}`); } } ); diff --git a/js/tests/e2e/support/commands.js b/js/tests/e2e/support/commands.js index 8268b7ee3..442fb374e 100644 --- a/js/tests/e2e/support/commands.js +++ b/js/tests/e2e/support/commands.js @@ -106,29 +106,27 @@ const decreaseFetches = () => { Cypress.env("fetchCount", count - 1); }; -const buildTrackableFetchWithSessionId = (fetch) => ( - fetchUrl, - fetchOptions -) => { - const { headers } = fetchOptions; - const modifiedHeaders = { - "x-session-id": Cypress.env("sessionId"), - ...headers, +const buildTrackableFetchWithSessionId = + (fetch) => (fetchUrl, fetchOptions) => { + const { headers } = fetchOptions; + const modifiedHeaders = { + "x-session-id": Cypress.env("sessionId"), + ...headers, + }; + + const modifiedOptions = { ...fetchOptions, headers: modifiedHeaders }; + + return fetch(fetchUrl, modifiedOptions) + .then((result) => { + decreaseFetches(); + return Promise.resolve(result); + }) + .catch((result) => { + decreaseFetches(); + return Promise.reject(result); + }); }; - const modifiedOptions = { ...fetchOptions, headers: modifiedHeaders }; - - return fetch(fetchUrl, modifiedOptions) - .then((result) => { - decreaseFetches(); - return Promise.resolve(result); - }) - .catch((result) => { - decreaseFetches(); - return Promise.reject(result); - }); -}; - Cypress.on("window:before:load", (win) => { cy.stub(win, "fetch", buildTrackableFetchWithSessionId(fetch)); }); diff --git a/js/tests/unit/specs/boot/routes.spec.ts b/js/tests/unit/specs/boot/routes.spec.ts index d4d715266..bed0a1093 100644 --- a/js/tests/unit/specs/boot/routes.spec.ts +++ b/js/tests/unit/specs/boot/routes.spec.ts @@ -2,23 +2,45 @@ import { config, createLocalVue, mount } from "@vue/test-utils"; import { routes } from "@/router"; import App from "@/App.vue"; import VueRouter from "vue-router"; -import Home from "@/views/Home.vue"; +import Buefy from "buefy"; const localVue = createLocalVue(); config.mocks.$t = (key: string): string => key; localVue.use(VueRouter); - -const router = new VueRouter({ routes }); -const wrapper = mount(App, { - localVue, - router, - stubs: ["NavBar", "mobilizon-footer"], -}); +localVue.use(Buefy); describe("routing", () => { test("Homepage", async () => { - router.push("/"); + const router = new VueRouter({ routes, mode: "history" }); + const wrapper = mount(App, { + localVue, + router, + stubs: { + NavBar: true, + "mobilizon-footer": true, + }, + }); + + expect(wrapper.html()).toContain('
'); + }); + + test("About", async () => { + const router = new VueRouter({ routes, mode: "history" }); + const wrapper = mount(App, { + localVue, + router, + stubs: { + NavBar: true, + "mobilizon-footer": true, + }, + }); + + router.push("/about"); await wrapper.vm.$nextTick(); - expect(wrapper.findComponent(Home).exists()).toBe(true); + await wrapper.vm.$nextTick(); + expect(wrapper.vm.$route.path).toBe("/about/instance"); + expect(wrapper.html()).toContain( + ' { let requestHandlers: Record; const generateWrapper = (handlers = {}, baseData = {}) => { - const cache = new InMemoryCache({ addTypename: false }); + const cache = new InMemoryCache({ addTypename: true }); mockClient = createMockClient({ cache, @@ -88,10 +88,13 @@ describe("CommentTree", () => { it("renders a comment tree", async () => { generateWrapper(); - expect(wrapper.findComponent({ name: "b-notification" }).text()).toBe( - "The organiser has chosen to close comments." - ); + expect(wrapper.exists()).toBe(true); expect(wrapper.find(".loading").text()).toBe("Loading comments…"); + + await wrapper.vm.$nextTick(); + await wrapper.vm.$nextTick(); // because of the + + expect(wrapper.find(".no-comments").text()).toBe("No comments yet"); expect(wrapper.html()).toMatchSnapshot(); }); diff --git a/js/tests/unit/specs/components/Comment/__snapshots__/CommentTree.spec.ts.snap b/js/tests/unit/specs/components/Comment/__snapshots__/CommentTree.spec.ts.snap index 48a66f29d..f00005715 100644 --- a/js/tests/unit/specs/components/Comment/__snapshots__/CommentTree.spec.ts.snap +++ b/js/tests/unit/specs/components/Comment/__snapshots__/CommentTree.spec.ts.snap @@ -2,21 +2,26 @@ exports[`CommentTree renders a comment tree 1`] = `
- The organiser has chosen to close comments. -

- Loading comments… -

+ + + + + + +
No comments yet
+
`; exports[`CommentTree renders a comment tree 2`] = `
- The organiser has chosen to close comments. - + + - +
No comments yet
+
`; diff --git a/js/tests/unit/specs/components/Participation/ParticipationSection.spec.ts b/js/tests/unit/specs/components/Participation/ParticipationSection.spec.ts index 2d6eb7657..2b20839bb 100644 --- a/js/tests/unit/specs/components/Participation/ParticipationSection.spec.ts +++ b/js/tests/unit/specs/components/Participation/ParticipationSection.spec.ts @@ -42,7 +42,7 @@ describe("ParticipationSection", () => { customProps: Record = {}, baseData: Record = {} ) => { - const cache = new InMemoryCache({ addTypename: false }); + const cache = new InMemoryCache({ addTypename: true }); mockClient = createMockClient({ cache, diff --git a/js/tests/unit/specs/components/Participation/ParticipationWithoutAccount.spec.ts b/js/tests/unit/specs/components/Participation/ParticipationWithoutAccount.spec.ts index f69fa7009..5c7923183 100644 --- a/js/tests/unit/specs/components/Participation/ParticipationWithoutAccount.spec.ts +++ b/js/tests/unit/specs/components/Participation/ParticipationWithoutAccount.spec.ts @@ -65,7 +65,7 @@ describe("ParticipationWithoutAccount", () => { customProps: Record = {}, baseData: Record = {} ) => { - const cache = new InMemoryCache({ addTypename: false }); + const cache = new InMemoryCache({ addTypename: true }); mockClient = createMockClient({ cache, diff --git a/js/tests/unit/specs/components/User/login.spec.ts b/js/tests/unit/specs/components/User/login.spec.ts new file mode 100644 index 000000000..67698e7fc --- /dev/null +++ b/js/tests/unit/specs/components/User/login.spec.ts @@ -0,0 +1,183 @@ +import { config, createLocalVue, mount, Wrapper } from "@vue/test-utils"; +import Login from "@/views/User/Login.vue"; +import Buefy from "buefy"; +import { + createMockClient, + MockApolloClient, + RequestHandler, +} from "mock-apollo-client"; +import VueApollo from "vue-apollo"; +import buildCurrentUserResolver from "@/apollo/user"; +import { InMemoryCache } from "apollo-cache-inmemory"; +import { configMock } from "../../mocks/config"; +import { i18n } from "@/utils/i18n"; +import { CONFIG } from "@/graphql/config"; +import { loginMock, loginResponseMock } from "../../mocks/auth"; +import { LOGIN } from "@/graphql/auth"; +import { CURRENT_USER_CLIENT } from "@/graphql/user"; +import { ICurrentUser } from "@/types/current-user.model"; +import flushPromises from "flush-promises"; +import RouteName from "@/router/name"; + +const localVue = createLocalVue(); +localVue.use(Buefy); +config.mocks.$t = (key: string): string => key; +const $router = { push: jest.fn() }; + +describe("Render login form", () => { + let wrapper: Wrapper; + let mockClient: MockApolloClient | null; + let apolloProvider; + let requestHandlers: Record; + + const generateWrapper = ( + handlers: Record = {}, + customProps: Record = {}, + baseData: Record = {}, + customMocks: Record = {} + ) => { + const cache = new InMemoryCache({ addTypename: true }); + + mockClient = createMockClient({ + cache, + resolvers: buildCurrentUserResolver(cache), + }); + + requestHandlers = { + configQueryHandler: jest.fn().mockResolvedValue(configMock), + loginMutationHandler: jest.fn().mockResolvedValue(loginResponseMock), + ...handlers, + }; + mockClient.setRequestHandler(CONFIG, requestHandlers.configQueryHandler); + mockClient.setRequestHandler(LOGIN, requestHandlers.loginMutationHandler); + + apolloProvider = new VueApollo({ + defaultClient: mockClient, + }); + + wrapper = mount(Login, { + localVue, + i18n, + apolloProvider, + propsData: { + ...customProps, + }, + mocks: { + $route: { query: {} }, + $router, + ...customMocks, + }, + stubs: ["router-link", "router-view"], + data() { + return { + ...baseData, + }; + }, + }); + }; + + afterEach(() => { + wrapper.destroy(); + mockClient = null; + apolloProvider = null; + $router.push.mockReset(); + }); + + it("requires email and password to be filled", async () => { + generateWrapper(); + await wrapper.vm.$nextTick(); + await wrapper.vm.$nextTick(); + + expect(wrapper.exists()).toBe(true); + expect(requestHandlers.configQueryHandler).toHaveBeenCalled(); + expect(wrapper.vm.$apollo.queries.config).toBeTruthy(); + wrapper.find('form input[type="email"]').setValue(""); + wrapper.find('form input[type="password"]').setValue(""); + wrapper.find("form button.button").trigger("click"); + const form = wrapper.find("form"); + expect(form.exists()).toBe(true); + const formElement = form.element as HTMLFormElement; + expect(formElement.checkValidity()).toBe(false); + }); + + it("renders and submits the login form", async () => { + generateWrapper(); + await wrapper.vm.$nextTick(); + await wrapper.vm.$nextTick(); + + expect(wrapper.exists()).toBe(true); + expect(requestHandlers.configQueryHandler).toHaveBeenCalled(); + expect(wrapper.vm.$apollo.queries.config).toBeTruthy(); + wrapper.find('form input[type="email"]').setValue("some@email.tld"); + wrapper.find('form input[type="password"]').setValue("somepassword"); + wrapper.find("form").trigger("submit"); + await wrapper.vm.$nextTick(); + expect(requestHandlers.loginMutationHandler).toHaveBeenCalledWith({ + ...loginMock, + }); + await wrapper.vm.$nextTick(); + await wrapper.vm.$nextTick(); + const currentUser = mockClient?.cache.readQuery<{ + currentUser: ICurrentUser; + }>({ + query: CURRENT_USER_CLIENT, + })?.currentUser; + expect(currentUser?.email).toBe("some@email.tld"); + expect(currentUser?.id).toBe("1"); + expect(jest.isMockFunction(wrapper.vm.$router.push)).toBe(true); + await flushPromises(); + expect($router.push).toHaveBeenCalledWith({ name: RouteName.HOME }); + }); + + it("handles a login error", async () => { + generateWrapper({ + loginMutationHandler: jest.fn().mockResolvedValue({ + errors: [ + { + message: + '"Impossible to authenticate, either your email or password are invalid."', + }, + ], + }), + }); + + await wrapper.vm.$nextTick(); + await wrapper.vm.$nextTick(); + + expect(wrapper.exists()).toBe(true); + expect(requestHandlers.configQueryHandler).toHaveBeenCalled(); + expect(wrapper.vm.$apollo.queries.config).toBeTruthy(); + wrapper.find('form input[type="email"]').setValue("some@email.tld"); + wrapper.find('form input[type="password"]').setValue("somepassword"); + wrapper.find("form").trigger("submit"); + await wrapper.vm.$nextTick(); + expect(requestHandlers.loginMutationHandler).toHaveBeenCalledWith({ + ...loginMock, + }); + await flushPromises(); + expect(wrapper.find("article.message.is-danger").text()).toContain( + "Impossible to authenticate, either your email or password are invalid." + ); + expect($router.push).not.toHaveBeenCalled(); + }); + + it("handles redirection after login", async () => { + generateWrapper( + {}, + {}, + {}, + { + $route: { query: { redirect: "/about/instance" } }, + } + ); + + await wrapper.vm.$nextTick(); + await wrapper.vm.$nextTick(); + + wrapper.find('form input[type="email"]').setValue("some@email.tld"); + wrapper.find('form input[type="password"]').setValue("somepassword"); + wrapper.find("form").trigger("submit"); + await flushPromises(); + expect($router.push).toHaveBeenCalledWith("/about/instance"); + }); +}); diff --git a/js/tests/unit/specs/components/navbar.spec.ts b/js/tests/unit/specs/components/navbar.spec.ts index b96fa4124..f2123eed1 100644 --- a/js/tests/unit/specs/components/navbar.spec.ts +++ b/js/tests/unit/specs/components/navbar.spec.ts @@ -25,7 +25,7 @@ describe("App component", () => { let requestHandlers: Record; const createComponent = (handlers = {}, baseData = {}) => { - const cache = new InMemoryCache({ addTypename: false }); + const cache = new InMemoryCache({ addTypename: true }); mockClient = createMockClient({ cache, diff --git a/js/tests/unit/specs/mocks/auth.ts b/js/tests/unit/specs/mocks/auth.ts new file mode 100644 index 000000000..3caba2803 --- /dev/null +++ b/js/tests/unit/specs/mocks/auth.ts @@ -0,0 +1,20 @@ +export const loginMock = { + email: "some@email.tld", + password: "somepassword", +}; + +export const loginResponseMock = { + data: { + login: { + __typename: "Login", + accessToken: "some access token", + refreshToken: "some refresh token", + user: { + __typename: "User", + email: "some@email.tld", + id: "1", + role: "ADMINISTRATOR", + }, + }, + }, +}; diff --git a/js/tests/unit/specs/mocks/config.ts b/js/tests/unit/specs/mocks/config.ts index 271d71ce3..8c581e6cf 100644 --- a/js/tests/unit/specs/mocks/config.ts +++ b/js/tests/unit/specs/mocks/config.ts @@ -1,37 +1,49 @@ export const configMock = { data: { config: { + __typename: "Config", anonymous: { + __typename: "Anonymous", actorId: "1", eventCreation: { + __typename: "AnonymousEventCreation", allowed: false, validation: { + __typename: "AnonymousEventCreationValidation", captcha: { + __typename: "AnonymousEventCreationValidationCaptcha", enabled: false, }, email: { + __typename: "AnonymousEventCreationValidationEmail", confirmationRequired: true, enabled: true, }, }, }, participation: { + __typename: "AnonymousParticipation", allowed: true, validation: { + __typename: "AnonymousParticipationValidation", captcha: { + __typename: "AnonymousParticipationValidationCaptcha", enabled: false, }, email: { + __typename: "AnonymousParticipationValidationEmail", confirmationRequired: true, enabled: true, }, }, }, reports: { + __typename: "AnonymousReports", allowed: false, }, }, auth: { + __typename: "Auth", ldap: false, oauthProviders: [], }, @@ -39,24 +51,31 @@ export const configMock = { demoMode: false, description: "Mobilizon.fr est l'instance Mobilizon de Framasoft.", features: { + __typename: "Features", eventCreation: true, groups: true, + koenaConnect: false, }, geocoding: { + __typename: "Geocoding", autocomplete: true, provider: "Elixir.Mobilizon.Service.Geospatial.Pelias", }, languages: ["fr"], location: { + __typename: "Lonlat", latitude: 48.8717, longitude: 2.32075, }, maps: { + __typename: "Maps", tiles: { + __typename: "Tiles", attribution: "© The OpenStreetMap Contributors", endpoint: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", }, routing: { + __typename: "Routing", type: "OPENSTREETMAP", }, }, @@ -65,22 +84,35 @@ export const configMock = { registrationsOpen: true, resourceProviders: [ { + __typename: "ResourceProvider", endpoint: "https://lite.framacalc.org/", software: "calc", type: "ethercalc", }, { + __typename: "ResourceProvider", endpoint: "https://hebdo.framapad.org/p/", software: "pad", type: "etherpad", }, { + __typename: "ResourceProvider", endpoint: "https://framatalk.org/", software: "visio", type: "jitsi", }, ], slogan: null, + uploadLimits: { + __typename: "UploadLimits", + default: 10_000_000, + avatar: 2_000_000, + banner: 4_000_000, + }, + instanceFeeds: { + __typename: "InstanceFeeds", + enabled: false, + }, }, }, }; diff --git a/js/tests/unit/specs/mocks/event.ts b/js/tests/unit/specs/mocks/event.ts index 5c284b037..abe00d4a4 100644 --- a/js/tests/unit/specs/mocks/event.ts +++ b/js/tests/unit/specs/mocks/event.ts @@ -12,6 +12,7 @@ export const fetchEventBasicMock = { uuid: "f37910ea-fd5a-4756-9679-00971f3f4106", joinOptions: EventJoinOptions.FREE, participantStats: { + __typename: "ParticipantStats", notApproved: 0, notConfirmed: 0, rejected: 0, @@ -28,18 +29,26 @@ export const fetchEventBasicMock = { export const joinEventResponseMock = { data: { joinEvent: { + __typename: "Participant", id: "5", role: ParticipantRole.NOT_APPROVED, insertedAt: "2020-12-07T09:33:41Z", metadata: { + __typename: "ParticipantMetadata", cancellationToken: "some token", message: "a message long enough", }, event: { + __typename: "Event", id: "1", uuid: "f37910ea-fd5a-4756-9679-00971f3f4106", }, actor: { + __typename: "Person", + preferredUsername: "some_actor", + name: "Some actor", + avatar: null, + domain: null, id: "1", }, }, @@ -65,15 +74,16 @@ export const eventCommentThreadsMock = { __typename: "Comment", id: "2", uuid: "e37910ea-fd5a-4756-9679-00971f3f4107", - url: - "https://some-instance.tld/comments/e37910ea-fd5a-4756-9679-00971f3f4107", + url: "https://some-instance.tld/comments/e37910ea-fd5a-4756-9679-00971f3f4107", text: "my comment text", local: true, visibility: "PUBLIC", totalReplies: 5, updatedAt: "2020-12-03T09:02:00Z", actor: { + __typename: "Person", avatar: { + __typename: "Media", id: "78", url: "http://someavatar.url.me", }, @@ -89,15 +99,16 @@ export const eventCommentThreadsMock = { __typename: "Comment", id: "29", uuid: "e37910ea-fd5a-4756-9679-01171f3f4107", - url: - "https://some-instance.tld/comments/e37910ea-fd5a-4756-9679-01171f3f4107", + url: "https://some-instance.tld/comments/e37910ea-fd5a-4756-9679-01171f3f4107", text: "a second comment", local: true, visibility: "PUBLIC", totalReplies: 0, updatedAt: "2020-12-03T11:02:00Z", actor: { + __typename: "Person", avatar: { + __typename: "Media", id: "78", url: "http://someavatar.url.me", }, @@ -123,10 +134,10 @@ export const newCommentForEventMock = { export const newCommentForEventResponse: DataMock = { data: { createComment: { + __typename: "Comment", id: "79", uuid: "e37910ea-fd5a-4756-9679-01171f3f4444", - url: - "https://some-instance.tld/comments/e37910ea-fd5a-4756-9679-01171f3f4444", + url: "https://some-instance.tld/comments/e37910ea-fd5a-4756-9679-01171f3f4444", text: newCommentForEventMock.text, local: true, visibility: "PUBLIC", @@ -134,8 +145,11 @@ export const newCommentForEventResponse: DataMock = { updatedAt: "2020-12-03T13:02:00Z", originComment: null, inReplyToComment: null, + replies: [], actor: { + __typename: "Person", avatar: { + __typename: "Media", id: "78", url: "http://someavatar.url.me", }, diff --git a/js/vue.config.js b/js/vue.config.js index cacda4b92..f695a6a54 100644 --- a/js/vue.config.js +++ b/js/vue.config.js @@ -38,7 +38,7 @@ module.exports = { css: { loaderOptions: { scss: { - additionalData: `@import "@/variables.scss";`, + prependData: `@import "@/variables.scss";`, }, }, }, diff --git a/js/yarn.lock b/js/yarn.lock index cd2f8536a..7f7f625e6 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -28,24 +28,31 @@ zen-observable "0.8.11" "@apollo/client@^3.0.0": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.7.tgz#f15bf961dc0c2bee37a47bf86b8881fdc6183810" - integrity sha512-Cb0OqqvlehlRHtHIXRIS/Pe5WYU4hHl1FznXTRSxBAN42WmBUM3zy/Unvw183RdWMyV6Kc2pFKOEuaG1K7JTAQ== + version "3.3.19" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.19.tgz#f1172dc9b9d7eae04c8940b047fd3b452ef92d2c" + integrity sha512-vzljWLPP0GwocfBhUopzDCUwsiaNTtii1eu8qDybAXqwj4/ZhnIM46c6dNQmnVcJpAIFRIsNCOxM4OlMDySJug== dependencies: "@graphql-typed-document-node/core" "^3.0.0" "@types/zen-observable" "^0.8.0" - "@wry/context" "^0.5.2" - "@wry/equality" "^0.3.0" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.4.0" fast-json-stable-stringify "^2.0.0" - graphql-tag "^2.11.0" + graphql-tag "^2.12.0" hoist-non-react-statics "^3.3.2" - optimism "^0.14.0" + optimism "^0.16.0" prop-types "^15.7.2" symbol-observable "^2.0.0" - ts-invariant "^0.6.0" + ts-invariant "^0.7.0" tslib "^1.10.0" zen-observable "^0.8.14" +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" @@ -53,38 +60,38 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/compat-data@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8" - integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" + integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== "@babel/core@^7.1.0", "@babel/core@^7.11.0", "@babel/core@^7.8.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.13.tgz#b73a87a3a3e7d142a66248bf6ad88b9ceb093425" - integrity sha512-BQKE9kXkPlXHPeqissfxo0lySWJcYdEP0hdtJOH/iJfDdhOCcgtNCjftCJg3qqauB4h+lz2N6ixM++b9DN1Tcw== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" + integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.12.13" - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helpers" "^7.12.13" - "@babel/parser" "^7.12.13" + "@babel/generator" "^7.14.3" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.2" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.3" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" + gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" - semver "^5.4.1" + semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.12.13", "@babel/generator@^7.4.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.13.tgz#5f6ebe6c85db99886db2d7b044409196f872a503" - integrity sha512-9qQ8Fgo8HaSvHEt6A5+BATP7XktD/AdAnObUeTRz5/e2y3kbrxZgz32qUJJsdmwUvBJzF4AeV21nGTNwv05Mpw== +"@babel/generator@^7.14.2", "@babel/generator@^7.14.3", "@babel/generator@^7.4.0": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" + integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.14.2" jsesc "^2.5.1" source-map "^0.5.0" @@ -103,50 +110,65 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-compilation-targets@^7.12.13", "@babel/helper-compilation-targets@^7.9.6": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.13.tgz#d689cdef88810aa74e15a7a94186f26a3d773c98" - integrity sha512-dXof20y/6wB5HnLOGyLh/gobsMvDNoekcC+8MCV2iaTd5JemhFkPD73QB+tK3iFC9P0xJC73B6MvKkyUfS9cCw== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.9.6": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" + integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== dependencies: - "@babel/compat-data" "^7.12.13" - "@babel/helper-validator-option" "^7.12.11" + "@babel/compat-data" "^7.13.15" + "@babel/helper-validator-option" "^7.12.17" browserslist "^4.14.5" - semver "^5.5.0" + semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.13.tgz#0f1707c2eec1a4604f2a22a6fb209854ef2a399a" - integrity sha512-Vs/e9wv7rakKYeywsmEBSRC9KtmE7Px+YBlESekLeJOF0zbGUicGfXSNi3o+tfXSNS48U/7K9mIOOCR79Cl3+Q== +"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.2", "@babel/helper-create-class-features-plugin@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.3.tgz#832111bcf4f57ca57a4c5b1a000fc125abc6554a" + integrity sha512-BnEfi5+6J2Lte9LeiL6TxLWdIlEv9Woacc1qXzXBgbikcOzMRM2Oya5XGg/f/ngotv1ej2A/b+3iJH8wbS1+lQ== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.14.2" + "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-replace-supers" "^7.14.3" "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.13.tgz#0996d370a92896c612ae41a4215544bd152579c0" - integrity sha512-XC+kiA0J3at6E85dL5UnCYfVOcIZ834QcAY0TIpgUVnz0zDzg+0TtvZTnJ4g9L1dPRGe30Qi03XCIS4tYCLtqw== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz#149aa6d78c016e318c43e2409a0ae9c136a86688" + integrity sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" -"@babel/helper-explode-assignable-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a" - integrity sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw== +"@babel/helper-define-polyfill-provider@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" + integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== dependencies: - "@babel/types" "^7.12.13" + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== +"@babel/helper-explode-assignable-expression@^7.12.13": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" + integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== + dependencies: + "@babel/types" "^7.13.0" + +"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" + integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== dependencies: "@babel/helper-get-function-arity" "^7.12.13" "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/types" "^7.14.2" "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" @@ -155,41 +177,41 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-hoist-variables@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz#13aba58b7480b502362316ea02f52cca0e9796cd" - integrity sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw== +"@babel/helper-hoist-variables@^7.13.0": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz#1b1651249e94b51f8f0d33439843e33e39775b30" + integrity sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg== dependencies: - "@babel/types" "^7.12.13" + "@babel/traverse" "^7.13.15" + "@babel/types" "^7.13.16" -"@babel/helper-member-expression-to-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz#c5715695b4f8bab32660dbdcdc2341dec7e3df40" - integrity sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ== +"@babel/helper-member-expression-to-functions@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" + integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.13.12" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" - integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12", "@babel/helper-module-imports@^7.8.3": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" + integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.13.12" -"@babel/helper-module-transforms@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz#01afb052dcad2044289b7b20beb3fa8bd0265bea" - integrity sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA== +"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0", "@babel/helper-module-transforms@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" + integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-simple-access" "^7.13.12" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" - lodash "^4.17.19" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" @@ -198,36 +220,36 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" - integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== -"@babel/helper-remap-async-to-generator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878" - integrity sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA== +"@babel/helper-remap-async-to-generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" + integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-wrap-function" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-wrap-function" "^7.13.0" + "@babel/types" "^7.13.0" -"@babel/helper-replace-supers@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121" - integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg== +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.12", "@babel/helper-replace-supers@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz#ca17b318b859d107f0e9b722d58cf12d94436600" + integrity sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA== dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" -"@babel/helper-simple-access@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" - integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== +"@babel/helper-simple-access@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" + integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.13.12" "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" @@ -243,156 +265,186 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== -"@babel/helper-validator-option@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f" - integrity sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw== +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== -"@babel/helper-wrap-function@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz#e3ea8cb3ee0a16911f9c1b50d9e99fe8fe30f9ff" - integrity sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw== +"@babel/helper-wrap-function@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" + integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== dependencies: "@babel/helper-function-name" "^7.12.13" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" -"@babel/helpers@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.13.tgz#3c75e993632e4dadc0274eae219c73eb7645ba47" - integrity sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ== +"@babel/helpers@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" + integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== dependencies: "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" -"@babel/highlight@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" - integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== +"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.4.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.13.tgz#3ee7be4131fe657ba9143d5c5b3a9f253fdb75e9" - integrity sha512-z7n7ybOUzaRc3wwqLpAX8UFIXsrVXUJhtNGBwAnLz6d1KUapqyq7ad2La8gZ6CXhHmGAIL32cop8Tst4/PNWLw== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.4.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" + integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== -"@babel/plugin-proposal-async-generator-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5" - integrity sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" + integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-remap-async-to-generator" "^7.12.13" - "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" -"@babel/plugin-proposal-class-properties@^7.12.13", "@babel/plugin-proposal-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8" - integrity sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA== +"@babel/plugin-proposal-async-generator-functions@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz#3a2085abbf5d5f962d480dbc81347385ed62eb1e" + integrity sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.8.3": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" + integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-proposal-class-static-block@^7.13.11": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz#5a527e2cae4a4753119c3a3e7f64ecae8ccf1360" + integrity sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.3" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-class-static-block" "^7.12.13" "@babel/plugin-proposal-decorators@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.13.tgz#d4c89b40c2b7a526b0d394de4f4def36191e413e" - integrity sha512-x2aOr5w4ARJoYHFKoG2iEUL/Xe99JAJXjAasHijXp3/KgaetJXGE62SmHgsW3Tia/XUT5AxF2YC0F+JyhPY/0Q== + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.2.tgz#e68c3c5e4a6a08834456568256fc3e71b93590cf" + integrity sha512-LauAqDd/VjQDtae58QgBcEOE42NNP+jB2OE+XeC3KBI/E+BhhRjtr5viCIrj1hmu1YvrguLipIPRJZmS5yUcFw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.14.2" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-decorators" "^7.12.13" -"@babel/plugin-proposal-dynamic-import@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" - integrity sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ== +"@babel/plugin-proposal-dynamic-import@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz#01ebabd7c381cff231fa43e302939a9de5be9d9f" + integrity sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" - integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== +"@babel/plugin-proposal-export-namespace-from@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz#62542f94aa9ce8f6dba79eec698af22112253791" + integrity sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz#ced7888a2db92a3d520a2e35eb421fdb7fcc9b5d" - integrity sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg== +"@babel/plugin-proposal-json-strings@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz#830b4e2426a782e8b2878fbfe2cba85b70cbf98c" + integrity sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350" - integrity sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ== +"@babel/plugin-proposal-logical-assignment-operators@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz#222348c080a1678e0e74ea63fe76f275882d1fd7" + integrity sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde" - integrity sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz#425b11dc62fc26939a2ab42cbba680bdf5734546" + integrity sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" - integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== +"@babel/plugin-proposal-numeric-separator@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz#82b4cc06571143faf50626104b335dd71baa4f9e" + integrity sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz#f93f3116381ff94bc676fdcb29d71045cd1ec011" - integrity sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg== +"@babel/plugin-proposal-object-rest-spread@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz#e17d418f81cc103fedd4ce037e181c8056225abc" + integrity sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.13" + "@babel/compat-data" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.14.2" -"@babel/plugin-proposal-optional-catch-binding@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5" - integrity sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg== +"@babel/plugin-proposal-optional-catch-binding@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz#150d4e58e525b16a9a1431bd5326c4eed870d717" + integrity sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.13.tgz#63a7d805bc8ce626f3234ee5421a2a7fb23f66d9" - integrity sha512-0ZwjGfTcnZqyV3y9DSD1Yk3ebp+sIUpT2YDqP8hovzaNZnQq2Kd7PEqa6iOIUDBXBt7Jl3P7YAcEIL5Pz8u09Q== +"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz#df8171a8b9c43ebf4c1dabe6311b432d83e1b34e" + integrity sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71" - integrity sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg== +"@babel/plugin-proposal-private-methods@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" + integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-proposal-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz#b1a1f2030586b9d3489cc26179d2eb5883277636" + integrity sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.13" @@ -402,7 +454,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-async-generators@^7.8.0": +"@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== @@ -416,6 +468,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-class-static-block@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz#8e3d674b0613e67975ceac2776c97b60cafc5c9c" + integrity sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-decorators@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" @@ -423,7 +482,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": +"@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -437,7 +496,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-json-strings@^7.8.0": +"@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== @@ -458,7 +517,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== @@ -472,27 +531,34 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.0": +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.0": +"@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz#762a4babec61176fec6c88480dec40372b140c0b" + integrity sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-top-level-await@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" @@ -500,21 +566,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-arrow-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz#eda5670b282952100c229f8a3bd49e0f6a72e9fe" - integrity sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg== +"@babel/plugin-transform-arrow-functions@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" + integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-async-to-generator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae" - integrity sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A== +"@babel/plugin-transform-async-to-generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" + integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== dependencies: "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-remap-async-to-generator" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" "@babel/plugin-transform-block-scoped-functions@^7.12.13": version "7.12.13" @@ -523,39 +589,39 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" - integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== +"@babel/plugin-transform-block-scoping@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz#761cb12ab5a88d640ad4af4aa81f820e6b5fdf5c" + integrity sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-classes@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz#9728edc1838b5d62fc93ad830bd523b1fcb0e1f6" - integrity sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA== +"@babel/plugin-transform-classes@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz#3f1196c5709f064c252ad056207d87b7aeb2d03d" + integrity sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-replace-supers" "^7.13.12" "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d" - integrity sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA== +"@babel/plugin-transform-computed-properties@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" + integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb" - integrity sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ== +"@babel/plugin-transform-destructuring@^7.13.17": + version "7.13.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" + integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.12.13" @@ -580,12 +646,12 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-for-of@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz#561ff6d74d9e1c8879cb12dbaf4a14cd29d15cf6" - integrity sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ== +"@babel/plugin-transform-for-of@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" + integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-transform-function-name@^7.12.13": version "7.12.13" @@ -609,43 +675,43 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz#43db16249b274ee2e551e2422090aa1c47692d56" - integrity sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA== +"@babel/plugin-transform-modules-amd@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz#6622806fe1a7c07a1388444222ef9535f2ca17b0" + integrity sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw== dependencies: - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-module-transforms" "^7.14.2" + "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.12.13", "@babel/plugin-transform-modules-commonjs@^7.9.6": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50" - integrity sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ== +"@babel/plugin-transform-modules-commonjs@^7.14.0", "@babel/plugin-transform-modules-commonjs@^7.9.6": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161" + integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ== dependencies: - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-simple-access" "^7.13.12" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5" - integrity sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA== +"@babel/plugin-transform-modules-systemjs@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" + integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== dependencies: - "@babel/helper-hoist-variables" "^7.12.13" - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-hoist-variables" "^7.13.0" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37" - integrity sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w== +"@babel/plugin-transform-modules-umd@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz#2f8179d1bbc9263665ce4a65f305526b2ea8ac34" + integrity sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw== dependencies: - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": version "7.12.13" @@ -669,12 +735,12 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-parameters@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz#461e76dfb63c2dfd327b8a008a9e802818ce9853" - integrity sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA== +"@babel/plugin-transform-parameters@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz#e4290f72e0e9e831000d066427c4667098decc31" + integrity sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-transform-property-literals@^7.12.13": version "7.12.13" @@ -683,10 +749,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-regenerator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" - integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== +"@babel/plugin-transform-regenerator@^7.13.15": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" + integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ== dependencies: regenerator-transform "^0.14.2" @@ -698,13 +764,16 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-runtime@^7.11.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.13.tgz#93a47630c80dab152a2b71011d1e1fd37b31b8e1" - integrity sha512-ho1CV2lm8qn2AxD3JdvPgtLVHCYLDaOszlf0gosdHcJAIfgNizag76WI+FoibrvfT+h117fgf8h+wgvo4O2qbA== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz#1fd885a2d0de1d3c223795a4e9be72c2db4515cf" + integrity sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - semver "^5.5.1" + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" + semver "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.12.13": version "7.12.13" @@ -713,12 +782,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-spread@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz#ca0d5645abbd560719c354451b849f14df4a7949" - integrity sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg== +"@babel/plugin-transform-spread@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" + integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-transform-sticky-regex@^7.12.13": @@ -728,12 +797,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-template-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz#655037b07ebbddaf3b7752f55d15c2fd6f5aa865" - integrity sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg== +"@babel/plugin-transform-template-literals@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" + integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-transform-typeof-symbol@^7.12.13": version "7.12.13" @@ -758,78 +827,85 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.8.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.13.tgz#3aa2d09cf7d255177538dff292ac9af29ad46525" - integrity sha512-JUVlizG8SoFTz4LmVUL8++aVwzwxcvey3N0j1tRbMAXVEy95uQ/cnEkmEKHN00Bwq4voAV3imQGnQvpkLAxsrw== + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.2.tgz#e80612965da73579c84ad2f963c2359c71524ed5" + integrity sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ== dependencies: - "@babel/compat-data" "^7.12.13" - "@babel/helper-compilation-targets" "^7.12.13" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-validator-option" "^7.12.11" - "@babel/plugin-proposal-async-generator-functions" "^7.12.13" - "@babel/plugin-proposal-class-properties" "^7.12.13" - "@babel/plugin-proposal-dynamic-import" "^7.12.1" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.12.13" - "@babel/plugin-proposal-logical-assignment-operators" "^7.12.13" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.13" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.12.13" - "@babel/plugin-proposal-optional-catch-binding" "^7.12.13" - "@babel/plugin-proposal-optional-chaining" "^7.12.13" - "@babel/plugin-proposal-private-methods" "^7.12.13" + "@babel/compat-data" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-async-generator-functions" "^7.14.2" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-class-static-block" "^7.13.11" + "@babel/plugin-proposal-dynamic-import" "^7.14.2" + "@babel/plugin-proposal-export-namespace-from" "^7.14.2" + "@babel/plugin-proposal-json-strings" "^7.14.2" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.2" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.2" + "@babel/plugin-proposal-numeric-separator" "^7.14.2" + "@babel/plugin-proposal-object-rest-spread" "^7.14.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.2" + "@babel/plugin-proposal-optional-chaining" "^7.14.2" + "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-proposal-private-property-in-object" "^7.14.0" "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" - "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-class-static-block" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.12.13" - "@babel/plugin-transform-async-to-generator" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.13.0" + "@babel/plugin-transform-async-to-generator" "^7.13.0" "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.12.13" - "@babel/plugin-transform-computed-properties" "^7.12.13" - "@babel/plugin-transform-destructuring" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.14.2" + "@babel/plugin-transform-classes" "^7.14.2" + "@babel/plugin-transform-computed-properties" "^7.13.0" + "@babel/plugin-transform-destructuring" "^7.13.17" "@babel/plugin-transform-dotall-regex" "^7.12.13" "@babel/plugin-transform-duplicate-keys" "^7.12.13" "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.13.0" "@babel/plugin-transform-function-name" "^7.12.13" "@babel/plugin-transform-literals" "^7.12.13" "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.12.13" - "@babel/plugin-transform-modules-commonjs" "^7.12.13" - "@babel/plugin-transform-modules-systemjs" "^7.12.13" - "@babel/plugin-transform-modules-umd" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.14.2" + "@babel/plugin-transform-modules-commonjs" "^7.14.0" + "@babel/plugin-transform-modules-systemjs" "^7.13.8" + "@babel/plugin-transform-modules-umd" "^7.14.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" "@babel/plugin-transform-new-target" "^7.12.13" "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.14.2" "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.13.15" "@babel/plugin-transform-reserved-words" "^7.12.13" "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.12.13" + "@babel/plugin-transform-spread" "^7.13.0" "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.13.0" "@babel/plugin-transform-typeof-symbol" "^7.12.13" "@babel/plugin-transform-unicode-escapes" "^7.12.13" "@babel/plugin-transform-unicode-regex" "^7.12.13" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.13" - core-js-compat "^3.8.0" - semver "^5.5.0" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.14.2" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" + core-js-compat "^3.9.0" + semver "^6.3.0" -"@babel/preset-modules@^0.1.3": +"@babel/preset-modules@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== @@ -847,10 +923,10 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.11.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.13.tgz#0a21452352b02542db0ffb928ac2d3ca7cb6d66d" - integrity sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw== +"@babel/runtime@^7.11.0", "@babel/runtime@^7.13.10", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== dependencies: regenerator-runtime "^0.13.4" @@ -863,28 +939,26 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.12.13", "@babel/traverse@^7.4.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0" - integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.4.3": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" + integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" + "@babel/generator" "^7.14.2" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/parser" "^7.14.2" + "@babel/types" "^7.14.2" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611" - integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" + integrity sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" "@cnakazawa/watch@^1.0.3": @@ -913,10 +987,10 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@eslint/eslintrc@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" - integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== +"@eslint/eslintrc@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" + integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -925,7 +999,6 @@ ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" - lodash "^4.17.20" minimatch "^3.0.4" strip-json-comments "^3.1.1" @@ -1202,10 +1275,10 @@ "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" -"@popperjs/core@^2.4.4": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.6.0.tgz#f022195afdfc942e088ee2101285a1d31c7d727f" - integrity sha512-cPqjjzuFWNK3BSKLm0abspP0sp/IGOli4p5I5fKFAzdS8fvjdOwDCfZqAaIiXd9lPkOWi3SUUfZof3hEb7J/uw== +"@popperjs/core@^2.8.3": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353" + integrity sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q== "@rollup/plugin-node-resolve@^7.1.1": version "7.1.3" @@ -1219,9 +1292,9 @@ resolve "^1.14.2" "@rollup/plugin-replace@^2.3.1": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.3.4.tgz#7dd84c17755d62b509577f2db37eb524d7ca88ca" - integrity sha512-waBhMzyAtjCL1GwZes2jaE9MjuQ/DQF2BatH3fRivUF3z0JBFrU0U6iBNC/4WR+2rLKhaAhPWDNPYp4mI6RqdQ== + version "2.4.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== dependencies: "@rollup/pluginutils" "^3.1.0" magic-string "^0.25.7" @@ -1258,15 +1331,240 @@ ejs "^2.6.1" magic-string "^0.25.0" +"@tiptap/core@^2.0.0-beta.41", "@tiptap/core@^2.0.0-beta.65": + version "2.0.0-beta.65" + resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.65.tgz#624dc3bf70686633a2476db8946c90238ff4a73d" + integrity sha512-mdPhJ19Tcx371tGqvw4dVZ9B/1p7V89tocIt+vLXjxsQSoORA7sr4CFS5+femHjp4SKySmjcUsl+zRG/4EhJDQ== + dependencies: + "@types/prosemirror-commands" "^1.0.4" + "@types/prosemirror-inputrules" "^1.0.4" + "@types/prosemirror-keymap" "^1.0.4" + "@types/prosemirror-model" "^1.13.0" + "@types/prosemirror-schema-list" "^1.0.3" + "@types/prosemirror-state" "^1.2.6" + "@types/prosemirror-transform" "^1.1.3" + "@types/prosemirror-view" "^1.17.1" + prosemirror-commands "^1.1.7" + prosemirror-inputrules "^1.1.3" + prosemirror-keymap "^1.1.3" + prosemirror-model "^1.14.1" + prosemirror-schema-list "^1.1.4" + prosemirror-state "^1.3.4" + prosemirror-transform "^1.3.2" + prosemirror-view "^1.18.6" + +"@tiptap/extension-blockquote@^2.0.0-beta.13", "@tiptap/extension-blockquote@^2.0.0-beta.6": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.13.tgz#72a26dd54e5edb9abc4488ad7c1f0a43d4089bd5" + integrity sha512-7Pis9bXMjyyXVIZS9zIytfRohofEhbTS8tQWCPrBNfb3ceSMQhNZf4jBBXQsngQntkO+0Di5LI1hFpa+XF+RYA== + dependencies: + prosemirror-inputrules "^1.1.3" + +"@tiptap/extension-bold@^2.0.0-beta.13": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.13.tgz#d6b8f3797a6f7932ae38b9d761cc1effa886b715" + integrity sha512-hMA6GItX/cWN1K9TBI1LeEPo8bFhX9JrE1flr6dxGJ9q58XVbzb2/ojZzcRFVdUp7oxNyQaFe6yP1JhTVcIrog== + +"@tiptap/extension-bubble-menu@^2.0.0-beta.18", "@tiptap/extension-bubble-menu@^2.0.0-beta.9": + version "2.0.0-beta.18" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.18.tgz#b3f197f2d7492472e3c5bae0f1fd18c62c99756a" + integrity sha512-cCllHCVE4jF1jGVeKTAeM0yqr5I6dzfG5N61gibwDlbjP7rNN0bs1zqCBRGUKJ6u3t0CM975rKYsb8MtHyQuiw== + dependencies: + prosemirror-state "^1.3.4" + prosemirror-view "^1.18.6" + tippy.js "^6.3.1" + +"@tiptap/extension-bullet-list@^2.0.0-beta.13": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.13.tgz#8b2c4ec8decc5562ae9bb5d97b0a99e0b27f9794" + integrity sha512-6W0T6U/Gm3ypLJDTe79K/0mFc88svJrP6TFjj3tcXwpygnwcCpBmpJv4DG656eGmB6rGGVPe1K/zoT1j6HB8+A== + dependencies: + prosemirror-inputrules "^1.1.3" + +"@tiptap/extension-character-count@^2.0.0-beta.5": + version "2.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@tiptap/extension-character-count/-/extension-character-count-2.0.0-beta.12.tgz#3431c1ba784ccbe879cea7cb0418f7762328ab8f" + integrity sha512-45mh/63Y3u9yCFp3DcSyq/Vv6TI9NCIZfGvFLKIxPIm3mD0+DG3y7LnuaWYcZLgC66OdYSFidoLtD9u3/tdK2w== + +"@tiptap/extension-code-block@^2.0.0-beta.15": + version "2.0.0-beta.15" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.0.0-beta.15.tgz#3fb0f04c38f8276195a1a958cc7d3399b52dc46a" + integrity sha512-iBuK/nnUw37O9mZVnuZu+viSNzLz7SRktjDtFhp6RM3ZVSOYIYjt6pJ05EVJ263QEeXB4Q1Qae8/xJOPPHN9hw== + dependencies: + prosemirror-inputrules "^1.1.3" + +"@tiptap/extension-code@^2.0.0-beta.13": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.0.0-beta.13.tgz#fa2d14c61fe213c2c40b196e1b1b7a8862cec987" + integrity sha512-em1rGWZXYlH6DrcIWRTvYefBzig34y7HBeWIB3uRHULd2GpRIowfbl8SRFgeapoKj1kbYjAtVr+wshlNi9/ujw== + +"@tiptap/extension-document@^2.0.0-beta.12": + version "2.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.0.0-beta.12.tgz#dfbc7e686075a38662a43708903cd2047cf7f4b2" + integrity sha512-i5anc2n98Jg1gi6WDLTaS76jLIUe41FHuMHgL4DCIDXv8m2q0qnktfmOvh9AMF7cPzJ2NVAR9xYw0Pxm3qXY4w== + +"@tiptap/extension-dropcursor@^2.0.0-beta.13": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.0-beta.13.tgz#2cec03275e23a5394af9da98e7ce1b6c77bbfef7" + integrity sha512-We80k3r//ujjboF2/8H07Y8TStP/U2Nw1nOwTPgWHX5CkrFN2Y9Q0Tdofc8SME8REql+osw8CcSB34iLU+kIcA== + dependencies: + "@types/prosemirror-dropcursor" "^1.0.1" + prosemirror-dropcursor "^1.3.4" + +"@tiptap/extension-floating-menu@^2.0.0-beta.15": + version "2.0.0-beta.15" + resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.15.tgz#876526535a2329e27374bd09775d8981c94bfd47" + integrity sha512-ioBegoCx3N6E2MPLsOgbAWeQEz01I91CLRdRQMorGRx+4Q+mAarlGJV11sNeW2rCV9ZQ/LWTw/QzLuBnyESzrA== + dependencies: + prosemirror-state "^1.3.4" + prosemirror-view "^1.18.6" + tippy.js "^6.3.1" + +"@tiptap/extension-gapcursor@^2.0.0-beta.17": + version "2.0.0-beta.17" + resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.17.tgz#774037fddab50379b21a58cab91bfd988b9b793f" + integrity sha512-ItucjmbjpIfjBkoarkekfZ2BB4nsJuBptZc2xWj36zpC9ehQvH3uVcgyRPM/5To2gvj4uj8MmYyxO8Q6/PszAg== + dependencies: + "@types/prosemirror-gapcursor" "^1.0.3" + prosemirror-gapcursor "^1.1.5" + +"@tiptap/extension-hard-break@^2.0.0-beta.13": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.13.tgz#36b5433e70e8eac121d6d26871ff60527b500442" + integrity sha512-C84BzpP3G+86iPJOyJTlfA7RK2IhLkiosvo3qKzPMCELVc2I8mICbuA7cEbveO0Rpg24AAyeec0Q0GYf+WiItw== + +"@tiptap/extension-heading@^2.0.0-beta.13": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.13.tgz#7d6f4a0e28af47ad1a1e455af01dbd1997a9f948" + integrity sha512-fGuFs6ZG1mBWceSwes4fAWf4d97xKhbdDWaMjo2+2WAdx6y9fX1s64psYJYwQ5KXnKHaCU+JBPged9igDcXVsg== + dependencies: + prosemirror-inputrules "^1.1.3" + +"@tiptap/extension-history@^2.0.0-beta.12", "@tiptap/extension-history@^2.0.0-beta.5": + version "2.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.0.0-beta.12.tgz#a25607aab594998d6b46576724d56701a2833689" + integrity sha512-8H7fQ1dHMAnNxRar6WOdDJ9+7/S7DX8Mg2hJbahUqN3UfTKZxqorXJB+k/QSeicozz5xWHp+b/RxqiHA3nMu5g== + dependencies: + "@types/prosemirror-history" "^1.0.2" + prosemirror-history "^1.1.3" + +"@tiptap/extension-horizontal-rule@^2.0.0-beta.16": + version "2.0.0-beta.16" + resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.16.tgz#7f8a3e14de2fc8bbb52816a697450a61d8797689" + integrity sha512-Yh8AM5ArI/FfzdA0TcvIZEpMkRo0Rd9lLyEXYfWV0Be6qkPApa/QDzEreQMf4JIKDE8z0R0yX0XRxh/N5iUmew== + dependencies: + prosemirror-state "^1.3.4" + +"@tiptap/extension-image@^2.0.0-beta.6": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.0.0-beta.13.tgz#58a2e66533e2ef63e67aeb7980fe642b75fa17a0" + integrity sha512-3uapkYVV8xp62+qYWteKYYIzUgP8AK8HzWFnnN/QMO5yZg7Me3u+r+1hJ7FrCQeT+4IyxBlni7jHDEDftmVR4w== + +"@tiptap/extension-italic@^2.0.0-beta.13": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.13.tgz#8b0810e41dc5c3bfb0640d638b0b40464cd81fea" + integrity sha512-IUvXnR9bnOiyE+k0Oa2ugCW5p5Nibvstr6W6g/C6RA36AbV9K/zr4XzQgClfZo96pM8Ay5Ia+jCYeYGOD6Mdaw== + +"@tiptap/extension-link@^2.0.0-beta.8": + version "2.0.0-beta.17" + resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.0.0-beta.17.tgz#5a3c28762cf332bb4de0fb13ce6973b11496697a" + integrity sha512-/xvUEMRh3E651kXidTEpmlSGqdVXjtnA0KuVModmCmxMchDCpO7kTIpjzS60joCl2Nx2WgICFoJ4SO6dSTMf/w== + dependencies: + prosemirror-state "^1.3.4" + +"@tiptap/extension-list-item@^2.0.0-beta.13", "@tiptap/extension-list-item@^2.0.0-beta.6": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.13.tgz#49f32d70a554897ffa3b37b492ebaf5953f8a975" + integrity sha512-5nvrCvcV35J6WjLd8xQCQWnj2HIDsfTalr0D57jMwym3ZCIEvLwf23DQQ1nNsOHhopmS/Emixh+RQpXUZjH8lQ== + +"@tiptap/extension-mention@^2.0.0-beta.42": + version "2.0.0-beta.56" + resolved "https://registry.yarnpkg.com/@tiptap/extension-mention/-/extension-mention-2.0.0-beta.56.tgz#6c113ec84488d982400bf826779d3888fe88d1f3" + integrity sha512-4o3Y8zjmflJJmr6uLOaYVtur1VISWf5rvSl6QNR2UaLVFYofEx0JanMZ83qlv5GchDDNvB1tQ2tqE/jhphAOPg== + dependencies: + "@tiptap/suggestion" "^2.0.0-beta.56" + +"@tiptap/extension-ordered-list@^2.0.0-beta.13", "@tiptap/extension-ordered-list@^2.0.0-beta.6": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.13.tgz#4df2264e1405f73848cd2fedcea95f3064911cd7" + integrity sha512-BX4cGRmiNJ/n6VHao7BALJOMAofwcp1zrleWI5d0/7YqkUKP7ExIMiRFVrgjrg4qxq9cVNXa00GLs++FeuySQA== + dependencies: + prosemirror-inputrules "^1.1.3" + +"@tiptap/extension-paragraph@^2.0.0-beta.14": + version "2.0.0-beta.14" + resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.14.tgz#6b8c64166f3b581a1f8e1ae415b895e5bd2952d1" + integrity sha512-IFc2/WMgmpPTRS/h++5vNCiSyT4yTj/NGG9L+x35aPCDQutTYW2V2i1Lwe2lcxpPVF4ofDX50skjdIiWZoGEqA== + +"@tiptap/extension-strike@^2.0.0-beta.14": + version "2.0.0-beta.14" + resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.14.tgz#409ec292368d65ba8b4e55fb9825f4e44cc075ad" + integrity sha512-25D+neKErB8svQ8TOkUqUq9Nln+O62Kp5doR/aATVtNCohWOqeAF/Q439QL4GsCkAAhXMdh2yQIF/mCSxFsdTQ== + +"@tiptap/extension-text@^2.0.0-beta.12": + version "2.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.0.0-beta.12.tgz#b857f36dda5e8cedd350f9bad7115e4060f8d9c0" + integrity sha512-JEWLYOJKSpmpaI0YTzj30uodpsrSYDGSvy5dT5bYvWovIvLmggKPHl0iKIPDWAM5xfd07CkP2+BFFRblMh96IA== + +"@tiptap/extension-underline@^2.0.0-beta.7": + version "2.0.0-beta.14" + resolved "https://registry.yarnpkg.com/@tiptap/extension-underline/-/extension-underline-2.0.0-beta.14.tgz#b85f3421a773422f4e6d3ee8b46432c23a311774" + integrity sha512-x/XN12gKrKwNx4RB5/h8bC474fpacivnM2F5A5zUWKIviS+kYJ8pZgAPhQBvMjeJoFrn5oLgUc5f+HEjJaLJJw== + +"@tiptap/starter-kit@^2.0.0-beta.37": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.62.tgz#56813fe45c59f613c3568b1ee070fcbfb8735c17" + integrity sha512-49BV+CtqK/g6/sxiC3iCcONKbjGZ6/QEdpYdmOVPs0MgCI19woign6DomOv+HeV3XbhYraq+MWwYG77Q21rxcg== + dependencies: + "@tiptap/core" "^2.0.0-beta.65" + "@tiptap/extension-blockquote" "^2.0.0-beta.13" + "@tiptap/extension-bold" "^2.0.0-beta.13" + "@tiptap/extension-bullet-list" "^2.0.0-beta.13" + "@tiptap/extension-code" "^2.0.0-beta.13" + "@tiptap/extension-code-block" "^2.0.0-beta.15" + "@tiptap/extension-document" "^2.0.0-beta.12" + "@tiptap/extension-dropcursor" "^2.0.0-beta.13" + "@tiptap/extension-gapcursor" "^2.0.0-beta.17" + "@tiptap/extension-hard-break" "^2.0.0-beta.13" + "@tiptap/extension-heading" "^2.0.0-beta.13" + "@tiptap/extension-history" "^2.0.0-beta.12" + "@tiptap/extension-horizontal-rule" "^2.0.0-beta.16" + "@tiptap/extension-italic" "^2.0.0-beta.13" + "@tiptap/extension-list-item" "^2.0.0-beta.13" + "@tiptap/extension-ordered-list" "^2.0.0-beta.13" + "@tiptap/extension-paragraph" "^2.0.0-beta.14" + "@tiptap/extension-strike" "^2.0.0-beta.14" + "@tiptap/extension-text" "^2.0.0-beta.12" + +"@tiptap/suggestion@^2.0.0-beta.56": + version "2.0.0-beta.56" + resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.0.0-beta.56.tgz#cbf52f698d78de83a8dd72b781d4d4011731cd5e" + integrity sha512-pImKbVHqWyv3L73PRwGks9sP2VykqacXXt3FqKM417T9KSdAfMjjt0i++yedxpxlTFeWhXEZonhTunDvXVjSbw== + dependencies: + prosemirror-model "^1.14.1" + prosemirror-state "^1.3.4" + prosemirror-view "^1.18.6" + +"@tiptap/vue-2@^2.0.0-beta.21": + version "2.0.0-beta.31" + resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.31.tgz#7262f1c24ea39930281dc6644057019c93dbc76d" + integrity sha512-kx37cU8rz41rSBahhoveQloVp/vHuTSIn/e9gpZGysWg4Yudsc/Cv75L9efPUAebdtFIqiHDVpKUq04Ag6Omcg== + dependencies: + "@tiptap/extension-bubble-menu" "^2.0.0-beta.18" + "@tiptap/extension-floating-menu" "^2.0.0-beta.15" + prosemirror-view "^1.18.6" + "@types/anymatch@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" - integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-3.0.0.tgz#c95ff14401dbb2869913afac3935af4ad0d37f1a" + integrity sha512-qLChUo6yhpQ9k905NwL74GU7TxH+9UODwwQ6ICNI+O6EDMExqH/Cv9NsbmcZ7yC/rRXJ/AHCzfgjsFRY5fKjYw== + dependencies: + anymatch "*" "@types/babel__core@^7.1.0": - version "7.1.12" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" - integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== + version "7.1.14" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" + integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1290,9 +1588,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.0.tgz#b9a1efa635201ba9bc850323a8793ee2d36c04a0" - integrity sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg== + version "7.11.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.1.tgz#654f6c4f67568e24c23b367e947098c6206fa639" + integrity sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw== dependencies: "@babel/types" "^7.3.0" @@ -1305,9 +1603,9 @@ "@types/node" "*" "@types/connect-history-api-fallback@*": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.3.tgz#4772b79b8b53185f0f4c9deab09236baf76ee3b4" - integrity sha512-7SxFCd+FLlxCfwVwbyPxbR4khL9aNikJhrorw8nUIOqeuooc9gifBuDQOJw5kzN7i6i3vLn9G8Wde/4QDihpYw== + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.4.tgz#8c0f0e6e5d8252b699f5a662f51bdf82fd9d8bb8" + integrity sha512-Kf8v0wljR5GSCOCF/VQWdV3ZhKOVA73drXtY3geMTQgHy9dgqQ0dLrf31M0hcuWkhFzK5sP0kkS3mJzcKVtZbw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" @@ -1325,9 +1623,9 @@ integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== "@types/estree@*": - version "0.0.46" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" - integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== + version "0.0.47" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" + integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== "@types/estree@0.0.39": version "0.0.39" @@ -1335,9 +1633,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.18" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.18.tgz#8371e260f40e0e1ca0c116a9afcd9426fa094c40" - integrity sha512-m4JTwx5RUBNZvky/JJ8swEJPKFd8si08pPF2PfizYjGZOKr/svUWPcoUmLow6MmPzhasphB7gSTINY67xn3JNA== + version "4.17.19" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" + integrity sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1366,19 +1664,10 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/http-proxy-middleware@*": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@types/http-proxy-middleware/-/http-proxy-middleware-0.19.3.tgz#b2eb96fbc0f9ac7250b5d9c4c53aade049497d03" - integrity sha512-lnBTx6HCOUeIJMLbI/LaL5EmdKLhczJY5oeXZpX/cXE4rRqb3RmV7VcMpiEfYkmTjipv3h7IAyIINe4plEv7cA== - dependencies: - "@types/connect" "*" - "@types/http-proxy" "*" - "@types/node" "*" - -"@types/http-proxy@*": - version "1.17.5" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.5.tgz#c203c5e6e9dc6820d27a40eb1e511c70a220423d" - integrity sha512-GNkDE7bTv6Sf8JbV2GksknKOsk7OznNYHSdrtvPJXO0qJ9odZig6IZKUi5RFGi6d1bf6dgIAe4uXi3DBc7069Q== +"@types/http-proxy@^1.17.5": + version "1.17.6" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.6.tgz#62dc3fade227d6ac2862c8f19ee0da9da9fd8616" + integrity sha512-+qsjqR75S/ib0ig0R9WN+CDoZeOBU6F2XLewgC4KVgdXiNHiKKHFEMRHOrs5PbYE97D5vataw5wPj4KLYfUkuQ== dependencies: "@types/node" "*" @@ -1417,18 +1706,23 @@ jest-diff "^24.3.0" "@types/jest@^26.0.18": - version "26.0.20" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.20.tgz#cd2f2702ecf69e86b586e1f5223a60e454056307" - integrity sha512-9zi2Y+5USJRxd0FsahERhBwlcvFh6D2GLQnY2FH2BzK8J9s9omvNHIbvABwIluXa0fD8XVKMLTO0aOEuUfACAA== + version "26.0.23" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" + integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA== dependencies: jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5": version "7.0.7" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + "@types/leaflet.locatecontrol@^0.60.7": version "0.60.7" resolved "https://registry.yarnpkg.com/@types/leaflet.locatecontrol/-/leaflet.locatecontrol-0.60.7.tgz#96d258bf27376b53bb4b3e9276a14e38f270215b" @@ -1437,16 +1731,16 @@ "@types/leaflet" "*" "@types/leaflet@*", "@types/leaflet@^1.5.2": - version "1.5.21" - resolved "https://registry.yarnpkg.com/@types/leaflet/-/leaflet-1.5.21.tgz#994c44f2bfc45744120f01924c8973c5e960e051" - integrity sha512-b+BOkwJDq6DK4m+jFUOHNCFinIkO4CF1MjnOwYgZFX+oElpYpXCCIsxZ3+zQWIRSLVUbRXvaQq2K935jGIyp7A== + version "1.7.0" + resolved "https://registry.yarnpkg.com/@types/leaflet/-/leaflet-1.7.0.tgz#3700fb5d29a8214fbd496565b08ec28e40cee808" + integrity sha512-ltv5jR+VjKSMtoDkxH61Rsbo0zLU7iqyOXpVPkAX4F+79fg2eymC7t0msWsfNaEZO1FGTIQATCCCQe+ijWoicg== dependencies: "@types/geojson" "*" "@types/lodash@^4.14.141": - version "4.14.168" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" - integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== + version "4.14.169" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.169.tgz#83c217688f07a4d9ef8f28a3ebd1d318f6ff4cbb" + integrity sha512-DvmZHoHTFJ8zhVYwCLWbQ7uAbYQEk52Ev2/ZiQ7Y7gQGeV9pjBqjnQpECMHfKS1rCYAhMI7LHVxwyZLZinJgdw== "@types/mime@^1": version "1.3.2" @@ -1454,9 +1748,9 @@ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== "@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" + integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== "@types/minimist@^1.2.0": version "1.2.1" @@ -1469,9 +1763,9 @@ integrity sha512-6nlq2eEh75JegDGUXis9wGTYIJpUvbori4qx++PRKQsV3YRkaqUNPNykzphniqPSZADXCouBuAnyptjUkMkhvw== "@types/node@*", "@types/node@>=6": - version "14.14.22" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.22.tgz#0d29f382472c4ccf3bd96ff0ce47daf5b7b84b18" - integrity sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw== + version "15.3.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.3.0.tgz#d6fed7d6bc6854306da3dea1af9f874b00783e26" + integrity sha512-8/bnjSZD86ZfpBsDlCIkNXIvm+h6wi9g7IqL+kmFkQ+Wvu3JrasgLElfiPgoo8V8vVfnEi0QVS12gbl94h9YsQ== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1488,7 +1782,39 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/prosemirror-inputrules@^1.0.2": +"@types/prosemirror-commands@*", "@types/prosemirror-commands@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/prosemirror-commands/-/prosemirror-commands-1.0.4.tgz#d08551415127d93ae62e7239d30db0b5e7208e22" + integrity sha512-utDNYB3EXLjAfYIcRWJe6pn3kcQ5kG4RijbT/0Y/TFOm6yhvYS/D9eJVnijdg9LDjykapcezchxGRqFD5LcyaQ== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + "@types/prosemirror-view" "*" + +"@types/prosemirror-dropcursor@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/prosemirror-dropcursor/-/prosemirror-dropcursor-1.0.1.tgz#3ba98dd861ff2a62559e70f453f996a1ef5ec55d" + integrity sha512-nHokhFypOZjknolZBm2XShlR7fx1IUcCiA3S2fBwmAraWu6zv3gboDSwwFpoS9UB2xKc4ismAmBxh2bpL3YNkg== + dependencies: + "@types/prosemirror-state" "*" + +"@types/prosemirror-gapcursor@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/prosemirror-gapcursor/-/prosemirror-gapcursor-1.0.3.tgz#989e98c734e01e2ed4cab39992e60a1b0646cab6" + integrity sha512-kBVjjbMmUk7ZsgpI1NOyY15makulu1skEGr+V9GgY7GQnT9vqjo8/XiNSgSj9s9vRTsTb/KAaTI9KJwWlhbhxQ== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + +"@types/prosemirror-history@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/prosemirror-history/-/prosemirror-history-1.0.2.tgz#f90a009a0dcd71393faa69ce705593dec76347a1" + integrity sha512-AcfpWo+HkIuvq/H2zYjIMi2jxa2GWfYaTNiFTB2sigjkpWNM93CIlb7Cimy/4vNH8lVPp0GwLBjYIMRX6zOUyA== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + +"@types/prosemirror-inputrules@^1.0.2", "@types/prosemirror-inputrules@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@types/prosemirror-inputrules/-/prosemirror-inputrules-1.0.4.tgz#4cb75054d954aa0f6f42099be05eb6c0e6958bae" integrity sha512-lJIMpOjO47SYozQybUkpV6QmfuQt7GZKHtVrvS+mR5UekA8NMC5HRIVMyaIauJLWhKU6oaNjpVaXdw41kh165g== @@ -1496,14 +1822,33 @@ "@types/prosemirror-model" "*" "@types/prosemirror-state" "*" -"@types/prosemirror-model@*", "@types/prosemirror-model@^1.7.2": - version "1.11.2" - resolved "https://registry.yarnpkg.com/@types/prosemirror-model/-/prosemirror-model-1.11.2.tgz#af7a9571a8d43ad433f0580099628627962cc11b" - integrity sha512-mohs15V+gxj10QWJGVooErzSE9ryTo1Wy92lULiQ0BSN5Po9K4vngPzfKmLft0+gAPbEghovTX+I2zQW3bZo1w== +"@types/prosemirror-keymap@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/prosemirror-keymap/-/prosemirror-keymap-1.0.4.tgz#f73c79810e8d0e0a20d153d84f998f02e5afbc0c" + integrity sha512-ycevwkqUh+jEQtPwqO7sWGcm+Sybmhu8MpBsM8DlO3+YTKnXbKA6SDz/+q14q1wK3UA8lHJyfR+v+GPxfUSemg== + dependencies: + "@types/prosemirror-commands" "*" + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + "@types/prosemirror-view" "*" + +"@types/prosemirror-model@*", "@types/prosemirror-model@^1.13.0", "@types/prosemirror-model@^1.7.2": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@types/prosemirror-model/-/prosemirror-model-1.13.0.tgz#d05937e918c3cac2cf49630ccab04a65fc5fffd6" + integrity sha512-EIUr2R38Zh9n1eA8BQ1C3NX/XLV9U44DhNVk8x3Sth2RW+wa7jNA82XHMPOoapsOTfmpnh32xaHBOzREiBqdPQ== dependencies: "@types/orderedmap" "*" -"@types/prosemirror-state@*", "@types/prosemirror-state@^1.2.4": +"@types/prosemirror-schema-list@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/prosemirror-schema-list/-/prosemirror-schema-list-1.0.3.tgz#bdf1893a7915fbdc5c49b3cac9368e96213d70de" + integrity sha512-uWybOf+M2Ea7rlbs0yLsS4YJYNGXYtn4N+w8HCw3Vvfl6wBAROzlMt0gV/D/VW/7J/LlAjwMezuGe8xi24HzXA== + dependencies: + "@types/orderedmap" "*" + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + +"@types/prosemirror-state@*", "@types/prosemirror-state@^1.2.4", "@types/prosemirror-state@^1.2.6": version "1.2.6" resolved "https://registry.yarnpkg.com/@types/prosemirror-state/-/prosemirror-state-1.2.6.tgz#bb0169084239a8393b354c6fda5420fc347d6bab" integrity sha512-tJo0wC+/cQvbrPDVx01Fnng9Fs41bAMVxgJY1KLOyIsUPN0otUN1KdoQurLMmHNHTvIna9ZXxjZD//xJKLYfJw== @@ -1512,14 +1857,14 @@ "@types/prosemirror-transform" "*" "@types/prosemirror-view" "*" -"@types/prosemirror-transform@*": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/prosemirror-transform/-/prosemirror-transform-1.1.2.tgz#fe883c19a5a9f1882346a294efd09d55c6764c7a" - integrity sha512-Ozyvs5Dquc49gaFysmC4gNhv6E65r569HSzw4RXdZgIljZ5Y9K4kHFlDvsWBBDH19+1178X9LMmM9J620O6Bug== +"@types/prosemirror-transform@*", "@types/prosemirror-transform@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/prosemirror-transform/-/prosemirror-transform-1.1.3.tgz#cf30d275976978d1c0317d0659145426fc49ce6f" + integrity sha512-qtnd4jMoBgUAF2Vy2uRCVY4/LN3d069PP9XTIKrfk7mwWPYKonBYv1NsaBGTpK26sOPu0p7eJNZwaiNYmbfIwA== dependencies: "@types/prosemirror-model" "*" -"@types/prosemirror-view@*", "@types/prosemirror-view@^1.11.4": +"@types/prosemirror-view@*", "@types/prosemirror-view@^1.11.4", "@types/prosemirror-view@^1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/prosemirror-view/-/prosemirror-view-1.17.1.tgz#0895df5a57ae6e68d4f3f8020d9be4ef52192980" integrity sha512-PNiGGc6BffxHQzMR09UUilsBR8xFPDsKiPIXb4K/g56voPIvqq1pqySnWFfSR50Vo4ZL0tss3VBLWiiiKzVahQ== @@ -1534,9 +1879,9 @@ integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== "@types/qs@*": - version "6.9.5" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" - integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== + version "6.9.6" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" + integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== "@types/range-parser@*": version "1.2.3" @@ -1583,23 +1928,18 @@ resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== -"@types/tapable@*": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" - integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== +"@types/tapable@^1": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.7.tgz#545158342f949e8fd3bfd813224971ecddc3fac4" + integrity sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ== "@types/uglify-js@*": - version "3.11.1" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.11.1.tgz#97ff30e61a0aa6876c270b5f538737e2d6ab8ceb" - integrity sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q== + version "3.13.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.0.tgz#1cad8df1fb0b143c5aba08de5712ea9d1ff71124" + integrity sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q== dependencies: source-map "^0.6.1" -"@types/ungap__global-this@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@types/ungap__global-this/-/ungap__global-this-0.3.1.tgz#18ce9f657da556037a29d50604335614ce703f4c" - integrity sha512-+/DsiV4CxXl6ZWefwHZDXSe1Slitz21tom38qPCaG0DYCS1NnDPIQDTKcmQ/tvK/edJUKkmuIDBJbmKDiB0r/g== - "@types/vuedraggable@^2.23.0": version "2.23.2" resolved "https://registry.yarnpkg.com/@types/vuedraggable/-/vuedraggable-2.23.2.tgz#643a10bc07a06760cbf5994aeb2f6b66f64af7da" @@ -1608,15 +1948,15 @@ vue "^2.0.0" "@types/webpack-dev-server@^3.11.0": - version "3.11.1" - resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz#f8f4dac1da226d530bd15a1d5dc34b23ba766ccb" - integrity sha512-rIb+LtUkKnh7+oIJm3WiMJONd71Q0lZuqGLcSqhZ5qjN9gV/CNmZe7Bai+brnBPZ/KVYOsr+4bFLiNZwjBicLw== + version "3.11.4" + resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.4.tgz#90d47dd660b696d409431ab8c1e9fa3615103a07" + integrity sha512-DCKORHjqNNVuMIDWFrlljftvc9CL0+09p3l7lBpb8dRqgN5SmvkWCY4MPKxoI6wJgdRqohmoNbptkxqSKAzLRg== dependencies: "@types/connect-history-api-fallback" "*" "@types/express" "*" - "@types/http-proxy-middleware" "*" "@types/serve-static" "*" - "@types/webpack" "*" + "@types/webpack" "^4" + http-proxy-middleware "^1.0.0" "@types/webpack-env@^1.15.2": version "1.16.0" @@ -1632,14 +1972,14 @@ "@types/source-list-map" "*" source-map "^0.7.3" -"@types/webpack@*", "@types/webpack@^4.0.0": - version "4.41.26" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.26.tgz#27a30d7d531e16489f9c7607c747be6bc1a459ef" - integrity sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA== +"@types/webpack@^4", "@types/webpack@^4.0.0": + version "4.41.28" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.28.tgz#0069a2159b7ad4d83d0b5801942c17d54133897b" + integrity sha512-Nn84RAiJjKRfPFFCVR8LC4ueTtTdfWAMZ03THIzZWRJB+rX24BD3LqPSFnbMscWauEsT4segAsylPDIaZyZyLQ== dependencies: "@types/anymatch" "*" "@types/node" "*" - "@types/tapable" "*" + "@types/tapable" "^1" "@types/uglify-js" "*" "@types/webpack-sources" "*" source-map "^0.6.0" @@ -1668,13 +2008,13 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71" integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg== -"@typescript-eslint/eslint-plugin@^4.14.1": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.14.2.tgz#47a15803cfab89580b96933d348c2721f3d2f6fe" - integrity sha512-uMGfG7GFYK/nYutK/iqYJv6K/Xuog/vrRRZX9aEP4Zv1jsYXuvFUMDFLhUnc8WFv3D2R5QhNQL3VYKmvLS5zsQ== +"@typescript-eslint/eslint-plugin@^4.18.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.24.0.tgz#03801ffc25b2af9d08f3dc9bccfc0b7ce3780d0f" + integrity sha512-qbCgkPM7DWTsYQGjx9RTuQGswi+bEt0isqDBeo+CKV0953zqI0Tp7CZ7Fi9ipgFA6mcQqF4NOVNwS/f2r6xShw== dependencies: - "@typescript-eslint/experimental-utils" "4.14.2" - "@typescript-eslint/scope-manager" "4.14.2" + "@typescript-eslint/experimental-utils" "4.24.0" + "@typescript-eslint/scope-manager" "4.24.0" debug "^4.1.1" functional-red-black-tree "^1.0.1" lodash "^4.17.15" @@ -1693,15 +2033,15 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/experimental-utils@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.2.tgz#9df35049d1d36b6cbaba534d703648b9e1f05cbb" - integrity sha512-mV9pmET4C2y2WlyHmD+Iun8SAEqkLahHGBkGqDVslHkmoj3VnxnGP4ANlwuxxfq1BsKdl/MPieDbohCEQgKrwA== +"@typescript-eslint/experimental-utils@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.24.0.tgz#c23ead9de44b99c3a5fd925c33a106b00165e172" + integrity sha512-IwTT2VNDKH1h8RZseMH4CcYBz6lTvRoOLDuuqNZZoThvfHEhOiZPQCow+5El3PtyxJ1iDr6UXZwYtE3yZQjhcw== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.14.2" - "@typescript-eslint/types" "4.14.2" - "@typescript-eslint/typescript-estree" "4.14.2" + "@typescript-eslint/scope-manager" "4.24.0" + "@typescript-eslint/types" "4.24.0" + "@typescript-eslint/typescript-estree" "4.24.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" @@ -1716,33 +2056,33 @@ "@typescript-eslint/typescript-estree" "3.10.1" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/parser@^4.14.1": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.14.2.tgz#31e216e4baab678a56e539f9db9862e2542c98d0" - integrity sha512-ipqSP6EuUsMu3E10EZIApOJgWSpcNXeKZaFeNKQyzqxnQl8eQCbV+TSNsl+s2GViX2d18m1rq3CWgnpOxDPgHg== +"@typescript-eslint/parser@^4.18.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.24.0.tgz#2e5f1cc78ffefe43bfac7e5659309a92b09a51bd" + integrity sha512-dj1ZIh/4QKeECLb2f/QjRwMmDArcwc2WorWPRlB8UNTZlY1KpTVsbX7e3ZZdphfRw29aTFUSNuGB8w9X5sS97w== dependencies: - "@typescript-eslint/scope-manager" "4.14.2" - "@typescript-eslint/types" "4.14.2" - "@typescript-eslint/typescript-estree" "4.14.2" + "@typescript-eslint/scope-manager" "4.24.0" + "@typescript-eslint/types" "4.24.0" + "@typescript-eslint/typescript-estree" "4.24.0" debug "^4.1.1" -"@typescript-eslint/scope-manager@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.14.2.tgz#64cbc9ca64b60069aae0c060b2bf81163243b266" - integrity sha512-cuV9wMrzKm6yIuV48aTPfIeqErt5xceTheAgk70N1V4/2Ecj+fhl34iro/vIssJlb7XtzcaD07hWk7Jk0nKghg== +"@typescript-eslint/scope-manager@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.24.0.tgz#38088216f0eaf235fa30ed8cabf6948ec734f359" + integrity sha512-9+WYJGDnuC9VtYLqBhcSuM7du75fyCS/ypC8c5g7Sdw7pGL4NDTbeH38eJPfzIydCHZDoOgjloxSAA3+4l/zsA== dependencies: - "@typescript-eslint/types" "4.14.2" - "@typescript-eslint/visitor-keys" "4.14.2" + "@typescript-eslint/types" "4.24.0" + "@typescript-eslint/visitor-keys" "4.24.0" "@typescript-eslint/types@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== -"@typescript-eslint/types@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.14.2.tgz#d96da62be22dc9dc6a06647f3633815350fb3174" - integrity sha512-LltxawRW6wXy4Gck6ZKlBD05tCHQUj4KLn4iR69IyRiDHX3d3NCAhO+ix5OR2Q+q9bjCrHE/HKt+riZkd1At8Q== +"@typescript-eslint/types@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.24.0.tgz#6d0cca2048cbda4e265e0c4db9c2a62aaad8228c" + integrity sha512-tkZUBgDQKdvfs8L47LaqxojKDE+mIUmOzdz7r+u+U54l3GDkTpEbQ1Jp3cNqqAU9vMUCBA1fitsIhm7yN0vx9Q== "@typescript-eslint/typescript-estree@3.10.1": version "3.10.1" @@ -1758,17 +2098,16 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.2.tgz#9c5ebd8cae4d7b014f890acd81e8e17f309c9df9" - integrity sha512-ESiFl8afXxt1dNj8ENEZT12p+jl9PqRur+Y19m0Z/SPikGL6rqq4e7Me60SU9a2M28uz48/8yct97VQYaGl0Vg== +"@typescript-eslint/typescript-estree@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.24.0.tgz#b49249679a98014d8b03e8d4b70864b950e3c90f" + integrity sha512-kBDitL/by/HK7g8CYLT7aKpAwlR8doshfWz8d71j97n5kUa5caHWvY0RvEUEanL/EqBJoANev8Xc/mQ6LLwXGA== dependencies: - "@typescript-eslint/types" "4.14.2" - "@typescript-eslint/visitor-keys" "4.14.2" + "@typescript-eslint/types" "4.24.0" + "@typescript-eslint/visitor-keys" "4.24.0" debug "^4.1.1" globby "^11.0.1" is-glob "^4.0.1" - lodash "^4.17.15" semver "^7.3.2" tsutils "^3.17.1" @@ -1779,19 +2118,14 @@ dependencies: eslint-visitor-keys "^1.1.0" -"@typescript-eslint/visitor-keys@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.2.tgz#997cbe2cb0690e1f384a833f64794e98727c70c6" - integrity sha512-KBB+xLBxnBdTENs/rUgeUKO0UkPBRs2vD09oMRRIkj5BEN8PX1ToXV532desXfpQnZsYTyLLviS7JrPhdL154w== +"@typescript-eslint/visitor-keys@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.24.0.tgz#a8fafdc76cad4e04a681a945fbbac4e35e98e297" + integrity sha512-4ox1sjmGHIxjEDBnMCtWFFhErXtKA1Ec0sBpuz0fqf3P+g3JFGyTxxbF06byw0FRsPnnbq44cKivH7Ks1/0s6g== dependencies: - "@typescript-eslint/types" "4.14.2" + "@typescript-eslint/types" "4.24.0" eslint-visitor-keys "^2.0.0" -"@ungap/global-this@^0.4.2": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@ungap/global-this/-/global-this-0.4.4.tgz#8a1b2cfcd3e26e079a847daba879308c924dd695" - integrity sha512-mHkm6FvepJECMNthFuIgpAEFmPOk71UyXuIxYfjytvFTnSDBIz7jmViO+LfHI/AjrazWije0PnSP3+/NlwzqtA== - "@vue/babel-helper-vue-jsx-merge-props@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81" @@ -1802,10 +2136,10 @@ resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz#9b9c691cd06fc855221a2475c3cc831d774bc7dc" integrity sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA== -"@vue/babel-plugin-jsx@^1.0.0-0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.2.tgz#6bfd8e39c48e53391a56705649f81a35fe20b6a1" - integrity sha512-1uZlQCLCeuqJgDYLCmg3qfsvTVtOQiXh278ES4bvPTYYbv2Bi/rElLETK6AdjI9xxzyTUf5n1QEiH8Xxz0eZrg== +"@vue/babel-plugin-jsx@^1.0.3": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.6.tgz#184bf3541ab6efdbe5079ab8b20c19e2af100bfb" + integrity sha512-RzYsvBhzKUmY2YG6LoV+W5PnlnkInq0thh1AzCmewwctAgGN6e9UFon6ZrQQV1CO5G5PeME7MqpB+/vvGg0h4g== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.0.0" @@ -1829,10 +2163,10 @@ lodash.kebabcase "^4.1.1" svg-tags "^1.0.0" -"@vue/babel-preset-app@^4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-4.5.11.tgz#f677bc10472e418f71f61f10dde5a79976a215b8" - integrity sha512-9VoFlm/9vhynKNGM+HA7qBsoQSUEnuG5i5kcFI9vTLLrh8A0fxrwUyVLLppO6T1sAZ6vrKdQFnEkjL+RkRAwWQ== +"@vue/babel-preset-app@^4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-4.5.13.tgz#cb475321e4c73f7f110dac29a48c2a9cb80afeb6" + integrity sha512-pM7CR3yXB6L8Gfn6EmX7FLNE3+V/15I3o33GkSNsWvgsMp6HVGXKkXgojrcfUUauyL1LZOdvTmu4enU2RePGHw== dependencies: "@babel/core" "^7.11.0" "@babel/helper-compilation-targets" "^7.9.6" @@ -1844,14 +2178,14 @@ "@babel/plugin-transform-runtime" "^7.11.0" "@babel/preset-env" "^7.11.0" "@babel/runtime" "^7.11.0" - "@vue/babel-plugin-jsx" "^1.0.0-0" - "@vue/babel-preset-jsx" "^1.1.2" + "@vue/babel-plugin-jsx" "^1.0.3" + "@vue/babel-preset-jsx" "^1.2.4" babel-plugin-dynamic-import-node "^2.3.3" core-js "^3.6.5" core-js-compat "^3.6.5" semver "^6.1.0" -"@vue/babel-preset-jsx@^1.1.2": +"@vue/babel-preset-jsx@^1.2.4": version "1.2.4" resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz#92fea79db6f13b01e80d3a0099e2924bdcbe4e87" integrity sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w== @@ -1914,68 +2248,68 @@ "@vue/babel-plugin-transform-vue-jsx" "^1.2.1" camelcase "^5.0.0" -"@vue/cli-overlay@^4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-4.5.11.tgz#ea99493131182285f7ac2762290354d6e5b188e8" - integrity sha512-aDQNw+oGk5+KR0vL9TocjfzyYHTJxR2lS8iPbcL4lRglCs2dudOE7QWXypj5dM4rQus0jJ5fxJTS55o9uy9fcQ== +"@vue/cli-overlay@^4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-4.5.13.tgz#4f1fd2161be8f69d6cba8079f3f0d7dc4dee47a7" + integrity sha512-jhUIg3klgi5Cxhs8dnat5hi/W2tQJvsqCxR0u6hgfSob0ORODgUBlN+F/uwq7cKIe/pzedVUk1y07F13GQvPqg== -"@vue/cli-plugin-babel@~4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.11.tgz#7c1db4ca2f911e2156e7d1cf774fe2ad0f7428eb" - integrity sha512-ogUMeO2waDtghIWwmuAzMJAnnPdmqRdJlwJDca9u6BK9jX1bxNThBSFS/MN2VmlYzulOnqH4zAC87jTWNg/czg== +"@vue/cli-plugin-babel@~4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.13.tgz#a89c482edcc4ea1d135645cec502a7f5fd4c30e7" + integrity sha512-ykvEAfD8PgGs+dGMGqr7l/nRmIS39NRzWLhMluPLTvDV1L+IxcoB73HNLGA/aENDpl8CuWrTE+1VgydcOhp+wg== dependencies: "@babel/core" "^7.11.0" - "@vue/babel-preset-app" "^4.5.11" - "@vue/cli-shared-utils" "^4.5.11" + "@vue/babel-preset-app" "^4.5.13" + "@vue/cli-shared-utils" "^4.5.13" babel-loader "^8.1.0" cache-loader "^4.1.0" thread-loader "^2.1.3" webpack "^4.0.0" -"@vue/cli-plugin-e2e-cypress@~4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-e2e-cypress/-/cli-plugin-e2e-cypress-4.5.11.tgz#4fb86caf10b942425cb41ba2a1355a2be75e43cb" - integrity sha512-0SjUlNpjXHyZRdBMrOSsSuWDIi4DyRVmJhkkBLUpGHJt1SSyWOY70NRfemhef2yJZVWyFA4GjN9Mn6xYAH6z/w== +"@vue/cli-plugin-e2e-cypress@~4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-e2e-cypress/-/cli-plugin-e2e-cypress-4.5.13.tgz#c014ba1b4d08e582c26b36890cc65844b12e9dde" + integrity sha512-7AyqCgDqgCj93QxkJYJG5YuXW07enHAYCdGZHPBHZKniIiq8VfvA6/ZT6TTU7DRr2/QxoIbXtbGnmNyDF/Urww== dependencies: - "@vue/cli-shared-utils" "^4.5.11" + "@vue/cli-shared-utils" "^4.5.13" cypress "^3.8.3" eslint-plugin-cypress "^2.10.3" -"@vue/cli-plugin-eslint@~4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.11.tgz#660eb7f8077a022c93bfad7b1cfb81e70a8be142" - integrity sha512-6XrF3A3ryjtqoPMYL0ltZaP0631HS2a68Ye34KIkz111EKXtC5ip+gz6bSPWrH5SbhinU3R8cstA8xVASz9kwg== +"@vue/cli-plugin-eslint@~4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.13.tgz#8baf22d0d96d76720c7506646b96f4f62c05bdfa" + integrity sha512-yc2uXX6aBiy3vEf5TwaueaDqQbdIXIhk0x0KzEtpPo23jBdLkpOSoU5NCgE06g/ZiGAcettpmBSv73Hfp4wHEw== dependencies: - "@vue/cli-shared-utils" "^4.5.11" + "@vue/cli-shared-utils" "^4.5.13" eslint-loader "^2.2.1" globby "^9.2.0" inquirer "^7.1.0" webpack "^4.0.0" yorkie "^2.0.0" -"@vue/cli-plugin-pwa@~4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.5.11.tgz#3031b4d3798707c353f2ad47b7c57a4708a17611" - integrity sha512-7wvNdR8EXRWaLlybPlk4B6+lE8y+sG2kXq69EyH4ILRmZnFYc22dY22eUhR1EIFTmRxHR0g8qDBrp1BvaNeaYA== +"@vue/cli-plugin-pwa@~4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.5.13.tgz#a800639814b6f62a38f04198c340cfaee7295c3f" + integrity sha512-uU5pp94VU0YscfKq/mNRsKOdxG+CTqVlZWaYkRc+HCcwkJ/m/CnxgaEqQFr0QpHC8zmlX4gILO1RVYygJoR9tw== dependencies: - "@vue/cli-shared-utils" "^4.5.11" + "@vue/cli-shared-utils" "^4.5.13" webpack "^4.0.0" workbox-webpack-plugin "^4.3.1" -"@vue/cli-plugin-router@^4.5.11", "@vue/cli-plugin-router@~4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-4.5.11.tgz#3b6df738c5a1a5f50376822bf661d9a3b0c3fa62" - integrity sha512-09tzw3faOs48IUPwLutYaNC7eoyyL140fKruTwdFdXuBLDdSQVida57Brx0zj2UKXc5qF8hk4GoGrOshN0KfNg== +"@vue/cli-plugin-router@^4.5.13", "@vue/cli-plugin-router@~4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-4.5.13.tgz#0b67c8898a2bf132941919a2a2e5f3aacbd9ffbe" + integrity sha512-tgtMDjchB/M1z8BcfV4jSOY9fZSMDTPgF9lsJIiqBWMxvBIsk9uIZHxp62DibYME4CCKb/nNK61XHaikFp+83w== dependencies: - "@vue/cli-shared-utils" "^4.5.11" + "@vue/cli-shared-utils" "^4.5.13" -"@vue/cli-plugin-typescript@~4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-typescript/-/cli-plugin-typescript-4.5.11.tgz#846ee0bf2b4dc3db1243c3dabea709af8d14fcf6" - integrity sha512-oVv4p/gec/xqFuJOUqBxVuThk7fj2QMfoDpe6QfkWIVQU+g8JLpZvOQo0wDMoiHtURQKtqGQCwC57jkKOCufqg== +"@vue/cli-plugin-typescript@~4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-typescript/-/cli-plugin-typescript-4.5.13.tgz#f514f661e16f9096a89a9ca6e69a2d762c6d8464" + integrity sha512-CpLlIdFNV1gn9uC4Yh6QgWI42uk2x5Z3cb2ScxNSwWsR1vgSdr0/1DdNzoBm68aP8RUtnHHO/HZfPnvXiq42xA== dependencies: "@types/webpack-env" "^1.15.2" - "@vue/cli-shared-utils" "^4.5.11" + "@vue/cli-shared-utils" "^4.5.13" cache-loader "^4.1.0" fork-ts-checker-webpack-plugin "^3.1.1" globby "^9.2.0" @@ -1987,15 +2321,15 @@ optionalDependencies: fork-ts-checker-webpack-plugin-v5 "npm:fork-ts-checker-webpack-plugin@^5.0.11" -"@vue/cli-plugin-unit-jest@~4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-4.5.11.tgz#d988e6e8420540954ceaf70fa050c469c45b69ab" - integrity sha512-PGpWz1RB9mfSJ5diTshFJUZsAschJBdLtJl7mmou/AVH2Yf8gTy3Zh9YZwkvhGt/wKXFbincmL6tyAQFGMa8Ow== +"@vue/cli-plugin-unit-jest@~4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-4.5.13.tgz#6aca031452a5883f39580ec50ea926c982e1d138" + integrity sha512-8t7QIihJWB9Kv85FamrEzWbJnvsLhQdyXHl3h+qhAihrZdLL+9mj905y88cBCq+i2PqqZ/qAoabbpf4DxDAb7g== dependencies: "@babel/core" "^7.11.0" "@babel/plugin-transform-modules-commonjs" "^7.9.6" "@types/jest" "^24.0.19" - "@vue/cli-shared-utils" "^4.5.11" + "@vue/cli-shared-utils" "^4.5.13" babel-core "^7.0.0-bridge.0" babel-jest "^24.9.0" babel-plugin-transform-es2015-modules-commonjs "^6.26.2" @@ -2008,15 +2342,15 @@ ts-jest "^24.2.0" vue-jest "^3.0.5" -"@vue/cli-plugin-vuex@^4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.11.tgz#f6f619bcfb66c86cc45340d73152844635e548bd" - integrity sha512-JBPeZLubiSHbRkEKDj0tnLiU43AJ3vt6JULn4IKWH1XWZ6MFC8vElaP5/AA4O3Zko5caamDDBq3TRyxdA2ncUQ== +"@vue/cli-plugin-vuex@^4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.13.tgz#98646d8bc1e69cf6c6a6cba2fed3eace0356c360" + integrity sha512-I1S9wZC7iI0Wn8kw8Zh+A2Qkf6s1M6vTGBkx8boXjuzfwEEyEHRxadsVCecZc8Mkpydo0nykj+MyYF96TKFuVA== -"@vue/cli-service@~4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-4.5.11.tgz#b157e2eee2351889cbbd4ccb4a4a9d8575409175" - integrity sha512-FXeJh2o6B8q/njv2Ebhe9EsLXt9sPMXGDY5zVvcV5jgj9wkoej9yLfnmwWCau5kegNClP6bcM+BEHuMYxJ+ubQ== +"@vue/cli-service@~4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-4.5.13.tgz#a09e684a801684b6e24e5414ad30650970eec9ed" + integrity sha512-CKAZN4iokMMsaUyJRU22oUAz3oS/X9sVBSKAF2/shFBV5xh3jqAlKl8OXZYz4cXGFLA6djNuYrniuLAo7Ku97A== dependencies: "@intervolga/optimize-cssnano-plugin" "^1.0.5" "@soda/friendly-errors-webpack-plugin" "^1.7.1" @@ -2024,10 +2358,10 @@ "@types/minimist" "^1.2.0" "@types/webpack" "^4.0.0" "@types/webpack-dev-server" "^3.11.0" - "@vue/cli-overlay" "^4.5.11" - "@vue/cli-plugin-router" "^4.5.11" - "@vue/cli-plugin-vuex" "^4.5.11" - "@vue/cli-shared-utils" "^4.5.11" + "@vue/cli-overlay" "^4.5.13" + "@vue/cli-plugin-router" "^4.5.13" + "@vue/cli-plugin-vuex" "^4.5.13" + "@vue/cli-shared-utils" "^4.5.13" "@vue/component-compiler-utils" "^3.1.2" "@vue/preload-webpack-plugin" "^1.1.0" "@vue/web-component-wrapper" "^1.2.0" @@ -2062,8 +2396,8 @@ pnp-webpack-plugin "^1.6.4" portfinder "^1.0.26" postcss-loader "^3.0.0" - ssri "^7.1.0" - terser-webpack-plugin "^2.3.6" + ssri "^8.0.1" + terser-webpack-plugin "^1.4.4" thread-loader "^2.1.3" url-loader "^2.2.0" vue-loader "^15.9.2" @@ -2076,10 +2410,10 @@ optionalDependencies: vue-loader-v16 "npm:vue-loader@^16.1.0" -"@vue/cli-shared-utils@^4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.11.tgz#fff71673ee9128f998c691515b9d327071b4f41e" - integrity sha512-+aaQ+ThQG3+WMexfSWNl0y6f43edqVqRNbguE53F3TIH81I7saS5S750ayqXhZs2r6STJJyqorQnKtAWfHo29A== +"@vue/cli-shared-utils@^4.5.13": + version "4.5.13" + resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.13.tgz#acd40f31b4790f1634292bdaa5fca95dc1e0ff50" + integrity sha512-HpnOrkLg42RFUsQGMJv26oTG3J3FmKtO2WSRhKIIL+1ok3w9OjGCtA3nMMXN27f9eX14TqO64M36DaiSZ1fSiw== dependencies: "@hapi/joi" "^15.0.1" chalk "^2.4.2" @@ -2130,18 +2464,18 @@ integrity sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ== "@vue/test-utils@^1.1.0": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.1.2.tgz#fdb487448dceefeaf3d01d465f7c836a3d666dbc" - integrity sha512-utbIL7zn9c+SjhybPwh48lpWCiluFCbP1yyRNAy1fQsw/6hiNFioaWy05FoVAFIZXC5WwBf+5r4ypfM1j/nI4A== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.2.0.tgz#3bc8c17ed549157275f0aec6b95da40887f7297f" + integrity sha512-poBTLqeJYNq1TXVhtVfnY8vELUVOFdJY8KZZoUuaAkIqPTWsxonU1M8nMWpZT+xEMrM+49+YcuEqtMHVD9Q9gw== dependencies: dom-event-types "^1.0.0" lodash "^4.17.15" pretty "^2.0.0" "@vue/web-component-wrapper@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz#bb0e46f1585a7e289b4ee6067dcc5a6ae62f1dd1" - integrity sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz#b6b40a7625429d2bd7c2281ddba601ed05dc7f1a" + integrity sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA== "@webassemblyjs/ast@1.9.0": version "1.9.0" @@ -2296,12 +2630,12 @@ "@types/node" ">=6" tslib "^1.9.3" -"@wry/context@^0.5.2": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.5.3.tgz#537db8a5b51f98507dc38f869b3a48c672f48942" - integrity sha512-n0uKHiWpf2ArHhmcHcUsKA+Dj0gtye/h56VmsDcoMRuK/ZPFeHKi8ck5L/ftqtF12ZbQR9l8xMPV7y+xybaRDA== +"@wry/context@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.0.tgz#f903eceb89d238ef7e8168ed30f4511f92d83e06" + integrity sha512-sAgendOXR8dM7stJw3FusRxFHF/ZinU0lffsA2YTyyIOfic86JX02qlPqPVqJNZJPAxFt+2EE8bvq6ZlS0Kf+Q== dependencies: - tslib "^1.14.1" + tslib "^2.1.0" "@wry/equality@^0.1.2": version "0.1.11" @@ -2310,19 +2644,19 @@ dependencies: tslib "^1.9.3" -"@wry/equality@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.3.1.tgz#81080cdc2e0d8265cd303faa0c64b38a77884e06" - integrity sha512-8/Ftr3jUZ4EXhACfSwPIfNsE8V6WKesdjp+Dxi78Bej6qlasAxiz0/F8j0miACRj9CL4vC5Y5FsfwwEYAuhWbg== +"@wry/equality@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.4.0.tgz#474491869a8d0590f4a33fd2a4850a77a0f63408" + integrity sha512-DxN/uawWfhRbgYE55zVCPOoe+jvsQ4m7PT1Wlxjyb/LCCLuU1UsucV2BbCxFAX8bjcSueFBbB5Qfj1Zfe8e7Fw== dependencies: - tslib "^1.14.1" + tslib "^2.1.0" -"@wry/trie@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.2.1.tgz#4191e1d4a85dd77dfede383d65563138ed82fc47" - integrity sha512-sYkuXZqArky2MLQCv4tLW6hX3N8AfTZ5ZMBc8jC6Yy35WYr82UYLLtjS7k/uRGHOA0yTSjuNadG6QQ6a5CS5hQ== +"@wry/trie@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.0.tgz#3245e74988c4e3033299e479a1bf004430752463" + integrity sha512-Yw1akIogPhAT6XPYsRHlZZIS0tIGmAl9EYXHi2scf7LPKKqdqmow/Hu4kEqP2cJR3EjaU/9L0ZlAjFf3hFxmug== dependencies: - tslib "^1.14.1" + tslib "^2.1.0" "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -2395,14 +2729,6 @@ address@^1.1.2: resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -2413,7 +2739,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2423,10 +2749,10 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.4.tgz#827e5f5ae32f5e5c1637db61f253a112229b5e2f" - integrity sha512-xzzzaqgEQfmuhbhAoqjJ8T/1okb6gAzXn/eQRNpAN1AEUoHJTNF9xCDRTtf/s3SKldtZfa+RJeTs+BQq+eZ/sw== +ajv@^8.0.1: + version "8.4.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.4.0.tgz#48984fdb2ce225cab15795f0772a8d85669075e4" + integrity sha512-7QD2l6+KBSLwf+7MuYocbWvRPdOu63/trReTLu2KFwkgctnub1auoF+Y1WYcm09CTM7quuscrzqmASaLHC/K4Q== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2459,11 +2785,11 @@ ansi-escapes@^3.0.0: integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.11.0" + type-fest "^0.21.3" ansi-html@0.0.7: version "0.0.7" @@ -2514,6 +2840,14 @@ any-promise@^1.0.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= +anymatch@*, anymatch@~3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2522,14 +2856,6 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - apollo-absinthe-upload-link@^1.5.0: version "1.7.0" resolved "https://registry.yarnpkg.com/apollo-absinthe-upload-link/-/apollo-absinthe-upload-link-1.7.0.tgz#74e76ef510cd6bbf24809f764220280c9e5179e9" @@ -2687,6 +3013,17 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-includes@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" + is-string "^1.0.5" + array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -2709,6 +3046,15 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + asn1.js@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" @@ -2891,6 +3237,30 @@ babel-plugin-jest-hoist@^24.9.0: dependencies: "@types/babel__traverse" "^7.0.6" +babel-plugin-polyfill-corejs2@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" + integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" + integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.0" + core-js-compat "^3.9.1" + +babel-plugin-polyfill-regenerator@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" + integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.0" + babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" @@ -2989,9 +3359,9 @@ babylon@^6.18.0: integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.0.2: version "1.5.1" @@ -3076,14 +3446,14 @@ bluebird@^3.1.1, bluebird@^3.5.0, bluebird@^3.5.5: integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.0.0, bn.js@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" - integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== body-parser@1.19.0: version "1.19.0" @@ -3227,16 +3597,16 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.1: - version "4.16.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" - integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001181" - colorette "^1.2.1" - electron-to-chromium "^1.3.649" + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" escalade "^3.1.1" - node-releases "^1.1.70" + node-releases "^1.1.71" bs-logger@0.x: version "0.2.6" @@ -3253,11 +3623,11 @@ bser@2.1.1: node-int64 "^0.4.0" buefy@^0.9.0: - version "0.9.4" - resolved "https://registry.yarnpkg.com/buefy/-/buefy-0.9.4.tgz#01e2e2cf1e61b914239a5f2570e5ea8ed6786927" - integrity sha512-LRSIYVNrKTPQhmNRegASkntX+ObtZ7aSSA/3cybDKXzGtPNy8g8cl2tp79Rl8/LBVH/KkRT5rmmzJ21nxz9IcQ== + version "0.9.7" + resolved "https://registry.yarnpkg.com/buefy/-/buefy-0.9.7.tgz#694e73fe0b32632a53d94c5ba9cfa4468363badd" + integrity sha512-Fli0ZjNDgtFtHm0LItWmfhNJ1oLjDwPzUWccvwXXoo2mADXaH8JQxyhY+drUuUV5/GMu5PtwqQSqPgZy942VZg== dependencies: - bulma "0.9.1" + bulma "0.9.2" buffer-crc32@~0.2.3: version "0.2.13" @@ -3313,10 +3683,10 @@ bulma-divider@^0.2.0: resolved "https://registry.yarnpkg.com/bulma-divider/-/bulma-divider-0.2.0.tgz#a9b4d9fe8b270c7cb7573023c575062bc62616f3" integrity sha512-REe3k56GECRfDaqFjC8cwLhV4RxXmV0RubuzDJqwior9wlJcdHlN0qfW0tvUX+qphikaTQegIeRuhjRIAqkjkw== -bulma@0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.9.1.tgz#2bf0e25062a22166db5c92e8c3dcb4605ab040d8" - integrity sha512-LSF69OumXg2HSKl2+rN0/OEXJy7WFEb681wtBlNS/ulJYR27J3rORHibdXZ6GVb/vyUzzYK/Arjyh56wjbFedA== +bulma@0.9.2: + version "0.9.2" + resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.9.2.tgz#340011e119c605f19b8ca886bfea595f1deaf23c" + integrity sha512-e14EF+3VSZ488yL/lJH0tR8mFWiEQVCMi/BQUMi2TGMBOk+zrDg4wryuwm/+dRSHJw0gMawp2tsW7X1JYUCE3A== bytes@3.0.0: version "3.0.0" @@ -3349,30 +3719,6 @@ cacache@^12.0.2, cacache@^12.0.3: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" - integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== - dependencies: - chownr "^1.1.2" - figgy-pudding "^3.5.1" - fs-minipass "^2.0.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - minipass "^3.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - p-map "^3.0.0" - promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^7.0.0" - unique-filename "^1.1.1" - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -3477,10 +3823,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001181: - version "1.0.30001183" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001183.tgz#7a57ba9d6584119bb5f2bc76d3cc47ba9356b3e2" - integrity sha512-7JkwTEE1hlRKETbCFd8HDZeLiQIUcl8rC6JgNjvHCNaxOeNmQ9V4LvQXRUsKIV2CC73qKxljwVhToaA3kLRqTw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: + version "1.0.30001228" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" + integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== capture-exit@^2.0.0: version "2.0.0" @@ -3490,9 +3836,9 @@ capture-exit@^2.0.0: rsvp "^4.8.4" case-sensitive-paths-webpack-plugin@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" - integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== + version "2.4.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== caseless@~0.12.0: version "0.12.0" @@ -3520,9 +3866,9 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: supports-color "^2.0.0" chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -3542,7 +3888,7 @@ check-types@^8.0.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== -"chokidar@>=2.0.0 <4.0.0", chokidar@^3.3.0, chokidar@^3.4.1: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.3.0, chokidar@^3.4.1: version "3.5.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== @@ -3576,17 +3922,15 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chownr@^1.1.1, chownr@^1.1.2: +chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^1.5.0: version "1.6.0" @@ -3623,11 +3967,6 @@ clean-css@4.2.x: dependencies: source-map "~0.6.0" -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -3650,12 +3989,12 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-highlight@^2.1.4: - version "2.1.10" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.10.tgz#26a087da9209dce4fcb8cf5427dc97cd96ac173a" - integrity sha512-CcPFD3JwdQ2oSzy+AMG6j3LRTkNjM82kzcSKzoVw6cLanDCJNlsLjeqVTOTfOfucnWv5F0rmBemVf1m9JiIasw== + version "2.1.11" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" + integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== dependencies: chalk "^4.0.0" - highlight.js "^10.0.0" + highlight.js "^10.7.1" mz "^2.4.0" parse5 "^5.1.1" parse5-htmlparser2-tree-adapter "^6.0.0" @@ -3667,9 +4006,9 @@ cli-spinners@^0.1.2: integrity sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw= cli-spinners@^2.0.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" - integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== + version "2.6.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" + integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== cli-truncate@^0.2.1: version "0.2.1" @@ -3720,6 +4059,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + clone@2.x, clone@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" @@ -3782,9 +4130,9 @@ color-name@^1.0.0, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" - integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== + version "1.5.5" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" + integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -3797,10 +4145,10 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.4" -colorette@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" - integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== +colorette@^1.2.1, colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" @@ -3928,6 +4276,14 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +contains-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-1.0.0.tgz#3458b332185603e8eed18f518d4a10888a3abc91" + integrity sha1-NFizMhhWA+ju0Y9RjUoQiIo6vJE= + dependencies: + normalize-path "^2.1.1" + path-starts-with "^1.0.0" + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -3992,12 +4348,12 @@ copy-webpack-plugin@^5.1.1: serialize-javascript "^4.0.0" webpack-log "^2.0.0" -core-js-compat@^3.6.5, core-js-compat@^3.8.0: - version "3.8.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.3.tgz#9123fb6b9cad30f0651332dc77deba48ef9b0b3f" - integrity sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog== +core-js-compat@^3.6.5, core-js-compat@^3.9.0, core-js-compat@^3.9.1: + version "3.12.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.12.1.tgz#2c302c4708505fa7072b0adb5156d26f7801a18b" + integrity sha512-i6h5qODpw6EsHAoIdQhKoZdWn+dGBF3dSS8m5tif36RlWvW3A6+yu2S16QHUo3CrkzrnEskMAt9f8FxmY9fhWQ== dependencies: - browserslist "^4.16.1" + browserslist "^4.16.6" semver "7.0.0" core-js@2.6.0: @@ -4011,9 +4367,9 @@ core-js@^2.4.0, core-js@^2.5.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.6.4, core-js@^3.6.5: - version "3.8.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0" - integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q== + version "3.12.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.1.tgz#6b5af4ff55616c08a44d386f1f510917ff204112" + integrity sha512-Ne9DKPHTObRuB09Dru5AjwKjY4cJHVGu+y5f7coGn1E9Grkc3p2iBwE9AI/nJzsE29mQF7oq+mhYYRqOMFN1Bw== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -4179,9 +4535,9 @@ css-tree@1.0.0-alpha.37: source-map "^0.6.1" css-tree@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" - integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" source-map "^0.6.1" @@ -4206,10 +4562,10 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== +cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== dependencies: css-declaration-sorter "^4.0.1" cssnano-util-raw-cache "^4.0.1" @@ -4239,7 +4595,7 @@ cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.7: postcss-ordered-values "^4.1.2" postcss-reduce-initial "^4.0.3" postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" + postcss-svgo "^4.0.3" postcss-unique-selectors "^4.0.1" cssnano-util-get-arguments@^4.0.0: @@ -4265,12 +4621,12 @@ cssnano-util-same-parent@^4.0.0: integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== cssnano@^4.0.0, cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + version "4.1.11" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== dependencies: cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" + cssnano-preset-default "^4.0.8" is-resolvable "^1.0.0" postcss "^7.0.0" @@ -4371,9 +4727,9 @@ date-fns@^1.27.2: integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== date-fns@^2.16.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b" - integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ== + version "2.21.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.21.3.tgz#8f5f6889d7a96bbcc1f0ea50239b397a83357f9b" + integrity sha512-HeYdzCaFflc1i4tGbj7JKMjM4cKGYoyxwcIIkHzNgCkX8xXDNJDZXgDDVchIWpN4eQc3lH37WarduXFZJOtxfw== de-indent@^1.0.2: version "1.0.2" @@ -4388,7 +4744,7 @@ deasync@^0.1.15: bindings "^1.5.0" node-addon-api "^1.7.1" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4402,7 +4758,7 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@^3.1.0, debug@^3.1.1, debug@^3.2.6: +debug@^3.1.0, debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -4556,9 +4912,9 @@ detect-newline@^2.1.0: integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== diff-sequences@^24.9.0: version "24.9.0" @@ -4623,6 +4979,13 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -4661,9 +5024,9 @@ domelementtype@1, domelementtype@^1.3.1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" - integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== domexception@^1.0.1: version "1.0.1" @@ -4713,9 +5076,9 @@ dotenv-expand@^5.1.0: integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== dotenv@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== duplexer@^0.1.1: version "0.1.2" @@ -4765,10 +5128,10 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.649: - version "1.3.652" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.652.tgz#9465d884d609acffd131ba71096de7bfabd63670" - integrity sha512-85J5D0Ksxjq2MIHfgwOURRej72UMlexbaa7t+oKTJan3Pa/RBE8vJ4/JzwaQjLCElPvd0XeLWi7+xYTVrq96aA== +electron-to-chromium@^1.3.723: + version "1.3.731" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.731.tgz#9f17f7e16f798eaddb21409d80aa755b5b5053dc" + integrity sha512-dn1Nyd0DuFa3xhqZJr6/L9phyk+YXJpvrz6Vcu6mFxFqr5TQ9r/F3yvOYFUrEwY4Tbb1YBjN19TDKnSVCQvalA== elegant-spinner@^1.0.1: version "1.0.1" @@ -4867,42 +5230,27 @@ error-stack-parser@^2.0.2: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.2: - version "1.17.7" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" - integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.1: - version "1.18.0-next.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" - integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== +es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" - get-intrinsic "^1.0.2" + get-intrinsic "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" + has-symbols "^1.0.2" + is-callable "^1.2.3" is-negative-zero "^2.0.1" - is-regex "^1.1.1" + is-regex "^1.1.2" + is-string "^1.0.5" object-inspect "^1.9.0" object-keys "^1.1.1" object.assign "^4.1.2" - string.prototype.trimend "^1.0.3" - string.prototype.trimstart "^1.0.3" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -4952,10 +5300,13 @@ eslint-config-prettier@^6.0.0: dependencies: get-stdin "^6.0.0" -eslint-config-prettier@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz#f4a4bd2832e810e8cc7c1411ec85b3e85c0c53f9" - integrity sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg== +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" eslint-loader@^2.2.1: version "2.2.1" @@ -4968,29 +5319,58 @@ eslint-loader@^2.2.1: object-hash "^1.1.4" rimraf "^2.6.1" +eslint-module-utils@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz#b51be1e473dd0de1c5ea638e22429c2490ea8233" + integrity sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A== + dependencies: + debug "^3.2.7" + pkg-dir "^2.0.0" + eslint-plugin-cypress@^2.10.3: - version "2.11.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.2.tgz#a8f3fe7ec840f55e4cea37671f93293e6c3e76a0" - integrity sha512-1SergF1sGbVhsf7MYfOLiBhdOg6wqyeV9pXUAIDIffYTGMN3dTBQS9nFAzhLsHhO+Bn0GaVM1Ecm71XUidQ7VA== + version "2.11.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.3.tgz#54ee4067aa8192aa62810cd35080eb577e191ab7" + integrity sha512-hOoAid+XNFtpvOzZSNWP5LDrQBEJwbZwjib4XJ1KcRYKjeVj0mAmPmucG4Egli4j/aruv+Ow/acacoloWWCl9Q== dependencies: globals "^11.12.0" -eslint-plugin-prettier@^3.1.3: - version "3.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz#7079cfa2497078905011e6f82e8dd8453d1371b7" - integrity sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ== +eslint-plugin-import@^2.20.2: + version "2.23.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.23.2.tgz#ee15dd68fc7a1a1ba4c653c734e0d01c100d3484" + integrity sha512-LmNoRptHBxOP+nb0PIKz1y6OSzCJlB+0g0IGS3XV4KaKk2q4szqQ6s6F1utVf5ZRkxk/QOTjdxe7v4VjS99Bsg== + dependencies: + array-includes "^3.1.3" + array.prototype.flat "^1.2.4" + contains-path "^1.0.0" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.1" + find-up "^2.0.0" + has "^1.0.3" + is-core-module "^2.4.0" + minimatch "^3.0.4" + object.values "^1.1.3" + pkg-up "^2.0.0" + read-pkg-up "^3.0.0" + resolve "^1.20.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-prettier@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7" + integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-vue@^7.0.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.5.0.tgz#cc6d983eb22781fa2440a7573cf39af439bb5725" - integrity sha512-QnMMTcyV8PLxBz7QQNAwISSEs6LYk2LJvGlxalXvpCtfKnqo7qcY0aZTIxPe8QOnHd7WCwiMZLOJzg6A03T0Gw== +eslint-plugin-vue@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz#27fecd9a3a24789b0f111ecdd540a9e56198e0fe" + integrity sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ== dependencies: - eslint-utils "^2.1.0" natural-compare "^1.4.0" - semver "^7.3.2" - vue-eslint-parser "^7.4.1" + semver "^5.6.0" + vue-eslint-parser "^7.0.0" eslint-scope@^4.0.3: version "4.0.3" @@ -5008,6 +5388,13 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -5021,17 +5408,60 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@^7.7.0, eslint@^7.9.0: - version "7.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.19.0.tgz#6719621b196b5fad72e43387981314e5d0dc3f41" - integrity sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg== +eslint@^6.7.2: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== dependencies: "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.3.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +eslint@^7.9.0: + version "7.26.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.26.0.tgz#d416fdcdcb3236cd8f282065312813f8c13982f6" + integrity sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.1" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -5042,12 +5472,12 @@ eslint@^7.7.0, eslint@^7.9.0: eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" - esquery "^1.2.0" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^6.0.0" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" - globals "^12.1.0" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -5055,7 +5485,7 @@ eslint@^7.7.0, eslint@^7.9.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.20" + lodash "^4.17.21" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -5068,7 +5498,7 @@ eslint@^7.7.0, eslint@^7.9.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.2.1: +espree@^6.1.2, espree@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== @@ -5091,10 +5521,10 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.0.1, esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" @@ -5151,14 +5581,14 @@ eventemitter3@^4.0.0: integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== eventsource@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" - integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== dependencies: original "^1.0.0" @@ -5171,9 +5601,9 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: safe-buffer "^5.1.1" exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== execa@0.10.0: version "0.10.0" @@ -5435,19 +5865,12 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e" - integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== dependencies: reusify "^1.0.4" -fault@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - faye-websocket@^0.11.3: version "0.11.3" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" @@ -5496,10 +5919,17 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" - integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" @@ -5594,6 +6024,13 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -5619,6 +6056,15 @@ findup-sync@^3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -5627,6 +6073,11 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + flatted@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" @@ -5642,6 +6093,11 @@ flow-static-land@0.2.8: resolved "https://registry.yarnpkg.com/flow-static-land/-/flow-static-land-0.2.8.tgz#49617e531396928bae6eb5d8ba32e7071637e5b9" integrity sha512-pOZFExu2rbscCgcEo7nL7FNhBubMi18dn1Un4lm8LOmQkYhgsHLsrBGMWmuJXRWcYMrOC7I/bPsiqqVjdD3K1g== +flush-promises@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flush-promises/-/flush-promises-1.0.2.tgz#4948fd58f15281fed79cbafc86293d5bb09b2ced" + integrity sha512-G0sYfLQERwKz4+4iOZYQEZVpOt9zQrlItIxQAAYAWpfby3gbHrx0osCHz5RLl/XoXevXk0xoN4hDFky/VV9TrA== + flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -5651,9 +6107,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.13.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" - integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== + version "1.14.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== for-each@^0.3.3: version "0.3.3" @@ -5712,11 +6168,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -format@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= - forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -5779,17 +6230,10 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-monkey@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.1.tgz#4a82f36944365e619f4454d9fff106553067b781" - integrity sha512-fcSa+wyTqZa46iWweI7/ZiUfegOZl0SG8+dltIwFXo7+zYU9J9kpS3NB6pZcSlJdhvIwp81Adx2XhZorncxiaA== +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== fs-write-stream-atomic@^1.0.8: version "1.0.10" @@ -5815,9 +6259,9 @@ fsevents@^1.2.7: nan "^2.12.1" fsevents@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" - integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" @@ -5829,7 +6273,7 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gensync@^1.0.0-beta.1: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -5839,10 +6283,10 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.0.tgz#892e62931e6938c8a23ea5aaebcfb67bd97da97e" - integrity sha512-M11rgtQp5GZMZzDL7jLTNxbDfurpzuau5uqRWDPvlHjfvg3TdScAZo96GLvhMjImrmR8uAt0FS2RLoMrfWGKlg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -5905,9 +6349,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" @@ -5917,9 +6361,9 @@ glob-to-regexp@^0.3.0: integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.5, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5983,15 +6427,22 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globals@^13.6.0: + version "13.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" + integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== + dependencies: + type-fest "^0.20.2" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globby@^11.0.1: - version "11.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" - integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -6037,15 +6488,17 @@ globby@^9.2.0: pify "^4.0.1" slash "^2.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== -graphql-tag@^2.10.3, graphql-tag@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.11.0.tgz#1deb53a01c46a7eb401d6cb59dec86fa1cccbffd" - integrity sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA== +graphql-tag@^2.10.3, graphql-tag@^2.12.0: + version "2.12.4" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.4.tgz#d34066688a4f09e72d6f4663c74211e9b4b7c4bf" + integrity sha512-VV1U4O+9x99EkNpNmCUV5RZwq6MnK4+pGbRYWG+lA/m3uo7TSqJF81OkcOP148gFP6fzdl7JWYBrwWVTS9jXww== + dependencies: + tslib "^2.1.0" graphql@14.0.2: version "14.0.2" @@ -6097,6 +6550,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -6112,10 +6570,10 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-value@^0.3.1: version "0.3.1" @@ -6192,10 +6650,10 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== -highlight.js@^10.0.0, highlight.js@~10.5.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.5.0.tgz#3f09fede6a865757378f2d9ebdcbc15ba268f98f" - integrity sha512-xTmvd9HiIHR6L53TMC7TKolEj65zG1XU+Onr8oi86mYa+nLcIbxTTWkpW7CsEwv/vK7u1zb8alZIMLDqqN6KTw== +highlight.js@^10.7.1: + version "10.7.2" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360" + integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg== hmac-drbg@^1.0.1: version "1.0.1" @@ -6226,9 +6684,9 @@ hoopy@^0.1.4: integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hpack.js@^2.1.6: version "2.1.6" @@ -6250,11 +6708,6 @@ hsla-regex@^1.0.0: resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -6372,7 +6825,18 @@ http-proxy-middleware@0.19.1: lodash "^4.17.11" micromatch "^3.1.10" -http-proxy@^1.17.0: +http-proxy-middleware@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665" + integrity sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.17.0, http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== @@ -6509,7 +6973,7 @@ indexes-of@^1.0.1: resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= -infer-owner@^1.0.3, infer-owner@^1.0.4: +infer-owner@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== @@ -6542,7 +7006,7 @@ ini@^1.3.4, ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^7.1.0: +inquirer@^7.0.0, inquirer@^7.1.0: version "7.3.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== @@ -6642,6 +7106,11 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -6656,12 +7125,19 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + dependencies: + call-bind "^1.0.2" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.2: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== @@ -6692,10 +7168,10 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== +is-core-module@^2.2.0, is-core-module@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== dependencies: has "^1.0.3" @@ -6714,9 +7190,9 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== is-descriptor@^0.1.0: version "0.1.6" @@ -6742,9 +7218,9 @@ is-directory@^0.3.1: integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -6822,6 +7298,11 @@ is-negative-zero@^2.0.1: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-number-object@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -6875,6 +7356,11 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -6887,13 +7373,13 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== -is-regex@^1.0.4, is-regex@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" - integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== +is-regex@^1.0.4, is-regex@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== dependencies: call-bind "^1.0.2" - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-regexp@^1.0.0: version "1.0.0" @@ -6915,19 +7401,17 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== - dependencies: - html-comment-regex "^1.1.0" +is-string@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-typedarray@~1.0.0: version "1.0.0" @@ -7039,9 +7523,9 @@ iterall@^1.2.2: integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== javascript-stringify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.0.1.tgz#6ef358035310e35d667c675ed63d3eb7c1aa19e5" - integrity sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow== + version "2.1.0" + resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" + integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== jest-changed-files@^24.9.0: version "24.9.0" @@ -7451,14 +7935,6 @@ jest-worker@^24.6.0, jest-worker@^24.9.0: merge-stream "^2.0.0" supports-color "^6.1.0" -jest-worker@^25.4.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" - integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== - dependencies: - merge-stream "^2.0.0" - supports-color "^7.0.0" - jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" @@ -7473,9 +7949,9 @@ js-base64@^2.1.9: integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== js-beautify@^1.6.12, js-beautify@^1.6.14: - version "1.13.5" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.5.tgz#a08a97890cae55daf1d758d3f6577bd4a64d7014" - integrity sha512-MsXlH6Z/BiRYSkSRW3clNDqDjSpiSNOiG8xYVUBXt4k0LnGvDhlTGOlHX1VFtAdoLmtwjxMG5qiWKy/g+Ipv5w== + version "1.13.13" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.13.tgz#756907d1728f329f2b84c42efd56ad17514620bf" + integrity sha512-oH+nc0U5mOAqX8M5JO1J0Pw/7Q35sAdOsM5W3i87pir9Ntx6P/5Gx1xLNoK+MGyvHk4rqqRCE4Oq58H6xl2W7A== dependencies: config-chain "^1.1.12" editorconfig "^0.15.3" @@ -7711,11 +8187,6 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -klona@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" - integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== - launch-editor-middleware@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz#e14b07e6c7154b0a4b86a0fd345784e45804c157" @@ -7736,10 +8207,10 @@ lazy-ass@1.6.0: resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= -leaflet.locatecontrol@^0.72.0: - version "0.72.0" - resolved "https://registry.yarnpkg.com/leaflet.locatecontrol/-/leaflet.locatecontrol-0.72.0.tgz#7de5c109a0e10a928bae85e4996e5efa49a3c905" - integrity sha512-enAf10UG9Z1bV0siTP/+vG/ZVncDqSA3V8c6iZ3s6KWL5Ngkk4A4mk9Ssefj46ey98I9HSYWqoS+k2Y7EaKjwQ== +leaflet.locatecontrol@^0.73.0: + version "0.73.0" + resolved "https://registry.yarnpkg.com/leaflet.locatecontrol/-/leaflet.locatecontrol-0.73.0.tgz#768d9edb0470f86c913ea6c2a70ec62380fd45c5" + integrity sha512-e6v6SyDU2nzG5AiH80eH7qhXw5J+EfgmEFHkuzTRC9jqCSbfAm/3HlZDuoa9WYsaZbn5ovvqNeaLW/JSMsgg5g== leaflet@^1.4.0: version "1.7.1" @@ -7756,6 +8227,14 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -7764,14 +8243,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" @@ -7879,6 +8350,14 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -7899,6 +8378,16 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.defaultsdeep@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" @@ -7954,6 +8443,11 @@ lodash.transform@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0" integrity sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A= +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -7964,10 +8458,10 @@ lodash@4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.3, lodash@^4.17.4: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@2.2.0, log-symbols@^2.2.0: version "2.2.0" @@ -8016,14 +8510,6 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= -lowlight@^1.17.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.18.0.tgz#cfff11cfb125ca66f1c12cb43d27fff68cbeafa9" - integrity sha512-Zlc3GqclU71HRw5fTOy00zz5EOlqAdKMYhOFIO8ay4SQEDQgFuhR8JNwDIzAGMLoqTsWxe0elUNmq5o2USRAzw== - dependencies: - fault "^1.0.0" - highlight.js "~10.5.0" - lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -8117,11 +8603,11 @@ media-typer@0.3.0: integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memfs@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.2.0.tgz#f9438e622b5acd1daa8a4ae160c496fdd1325b26" - integrity sha512-f/xxz2TpdKv6uDn6GtHee8ivFyxwxmPuXatBb1FBwxYNuVpbM3k/Y1Z+vC0mH/dIXXrukYfe3qe5J32Dfjg93A== + version "3.2.2" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.2.2.tgz#5de461389d596e3f23d48bb7c2afb6161f4df40e" + integrity sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q== dependencies: - fs-monkey "1.0.1" + fs-monkey "1.0.3" memory-fs@^0.4.1: version "0.4.1" @@ -8217,12 +8703,12 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: to-regex "^3.0.2" micromatch@^4.0.0, micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" - picomatch "^2.0.5" + picomatch "^2.2.3" miller-rabin@^4.0.0: version "4.0.1" @@ -8232,17 +8718,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.45.0, "mime-db@>= 1.43.0 < 2": - version "1.45.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" - integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.28" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" - integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: - mime-db "1.45.0" + mime-db "1.47.0" mime@1.6.0: version "1.6.0" @@ -8250,9 +8736,9 @@ mime@1.6.0: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.0.tgz#2b4af934401779806ee98026bb42e8c1ae1876b1" - integrity sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag== + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== mimic-fn@^1.0.0: version "1.2.0" @@ -8306,28 +8792,7 @@ minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: +minipass@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== @@ -8382,10 +8847,10 @@ mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mock-apollo-client@^0.5: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mock-apollo-client/-/mock-apollo-client-0.5.0.tgz#8f0d6a1ba0d349ebde87a1dcd85c7fd353076922" - integrity sha512-qdMUt1NhmNXLjHd/IaHbvbX5LaEE91WZB4glfj7AfUUs413/z148kBuXKg6XpMZqvJr+XdR/9i1V+YGY7UnCKA== +mock-apollo-client@^0.6: + version "0.6.0" + resolved "https://registry.yarnpkg.com/mock-apollo-client/-/mock-apollo-client-0.6.0.tgz#ff1760f18798789931e421c6668bfc0e7f1f0649" + integrity sha512-HPo6yVkAE+uxIpB8oPO9ISM86hFDwefrHKz5uOowecT/hR79e/NbXAl372LOQ1lWYVNVgCaP3RIMgWEhVFWtjw== moment@2.24.0: version "2.24.0" @@ -8483,7 +8948,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -8529,9 +8994,9 @@ node-int64@^0.4.0: integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-ipc@^9.1.1: - version "9.1.3" - resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.1.3.tgz#1df3f069d103184ae9127fa885dbdaea56a4436f" - integrity sha512-8RS4RZyS/KMKKYG8mrje+cLxwATe9dBCuOiqKFSWND4oOuKytfuKCiR9yinvhoXF/nGdX/WnbywaUee+9U87zA== + version "9.1.4" + resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.1.4.tgz#2acf962681afdac2602876d98fe6434d54d9bd3c" + integrity sha512-A+f0mn2KxUt1uRTSd5ktxQUsn2OEhj5evo7NUi/powBzMSZ0vocdzDjlq9QN2v3LH6CJi3e5xAenpZ1QwU5A8g== dependencies: event-pubsub "4.3.0" js-message "1.0.7" @@ -8572,9 +9037,9 @@ node-modules-regexp@^1.0.0: integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= node-notifier@^5.4.2: - version "5.4.3" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" - integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + version "5.4.5" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef" + integrity sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ== dependencies: growly "^1.3.0" is-wsl "^1.1.0" @@ -8582,10 +9047,10 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-releases@^1.1.70: - version "1.1.70" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" - integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== +node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== nopt@^5.0.0: version "5.0.0" @@ -8701,17 +9166,17 @@ object-hash@^1.1.4: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-inspect@^1.8.0, object-inspect@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== +object-inspect@^1.9.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== object-is@^1.0.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.4.tgz#63d6c83c00a43f4cbc9434eb9757c8a5b8565068" - integrity sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg== + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" object-keys@^1.0.12, object-keys@^1.1.1: @@ -8726,7 +9191,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: +object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -8737,13 +9202,13 @@ object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0, object.getownpropertydescriptors@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" - integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" + es-abstract "^1.18.0-next.2" object.pick@^1.3.0: version "1.3.0" @@ -8752,14 +9217,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" - integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== +object.values@^1.1.0, object.values@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" + integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" obuf@^1.0.0, obuf@^1.1.2: @@ -8831,15 +9296,15 @@ optimism@^0.10.0: dependencies: "@wry/context" "^0.4.0" -optimism@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.14.0.tgz#256fb079a3428585b40a3a8462f907e0abd2fc49" - integrity sha512-ygbNt8n4DOCVpkwiLF+IrKKeNHOjtr9aXLWGP9HNJGoblSGsnVbJLstcH6/nE9Xy5ZQtlkSioFQNnthmENW6FQ== +optimism@^0.16.0: + version "0.16.1" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" + integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== dependencies: - "@wry/context" "^0.5.2" - "@wry/trie" "^0.2.1" + "@wry/context" "^0.6.0" + "@wry/trie" "^0.3.0" -optionator@^0.8.1: +optionator@^0.8.1, optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -8912,6 +9377,11 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +p-debounce@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-debounce/-/p-debounce-4.0.0.tgz#348e3f44489baa9435cc7d807f17b3bb2fb16b24" + integrity sha512-4Ispi9I9qYGO4lueiLDhe4q4iK5ERK8reLsuzH6BPaXn53EGaua8H66PXIFGrW897hwjXp+pVLrm/DLxN0RF0A== + p-each-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" @@ -8929,13 +9399,27 @@ p-finally@^2.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1, p-limit@^2.3.0: +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -8960,13 +9444,6 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" @@ -8979,6 +9456,11 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -9135,6 +9617,13 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-starts-with@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-starts-with/-/path-starts-with-1.0.0.tgz#b28243015e8b138de572682ac52da42e646ad84e" + integrity sha1-soJDAV6LE43lcmgqxS2kLmRq2E4= + dependencies: + normalize-path "^2.1.1" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -9153,9 +9642,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -9174,14 +9663,14 @@ performance-now@^2.1.0: integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= phoenix@^1.4.11: - version "1.5.7" - resolved "https://registry.yarnpkg.com/phoenix/-/phoenix-1.5.7.tgz#86775bc51271e49930fd7d879ec3ec2addd6bf08" - integrity sha512-RgVdTRsK5NpnUPkjPyLg9P8qQQvuDaUsazH06t+ARu9EnPryQ7asE76VDjVZ43fqjY/p8er6y6OQb17YViG47g== + version "1.5.9" + resolved "https://registry.yarnpkg.com/phoenix/-/phoenix-1.5.9.tgz#5aad82072c8d90e7e20a187063c5db9b9ab9b5cd" + integrity sha512-NBRQaCYIrXL/wd5+OoO+DLlNTIdRvxKat0DSkfJ/c8qwYqKK7jNrf1GWPBOPzSVJ9HNMPjgmniJ87m9Os9IQGg== -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" + integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== pify@^2.0.0, pify@^2.2.0: version "2.3.0" @@ -9224,6 +9713,13 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -9238,6 +9734,13 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -9250,7 +9753,7 @@ pnp-webpack-plugin@^1.6.4: dependencies: ts-pnp "^1.1.6" -popper.js@^1.16.0: +popper.js@^1.16.1: version "1.16.1" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== @@ -9529,9 +10032,9 @@ postcss-ordered-values@^4.1.2: postcss-value-parser "^3.0.0" postcss-prefix-selector@^1.6.0: - version "1.7.2" - resolved "https://registry.yarnpkg.com/postcss-prefix-selector/-/postcss-prefix-selector-1.7.2.tgz#3adeed903985734298f19d8f5e0b657f9d90d43c" - integrity sha512-ddmzjWNmGs7E/nyolJ021/Gk6oBLRQLyyXKGV4Mu+Y0gquo+XlXSDP0/Y2J8C/cad/GLyftf2H0XtuDFQZxN3w== + version "1.9.0" + resolved "https://registry.yarnpkg.com/postcss-prefix-selector/-/postcss-prefix-selector-1.9.0.tgz#db549802b79f9f91f7419c8c1f86d31d974aff5e" + integrity sha512-tTUHUNP+/Qfgg+fvbljUIeLs1ijICWb8+CT3bZM2joE2pkd+EnuBzSfZNHY2RMmozNRp44yEFv+I+6IIiLcoCg== dependencies: postcss "^7.0.0" @@ -9565,21 +10068,18 @@ postcss-selector-parser@^3.0.0: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" - integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== dependencies: cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" util-deprecate "^1.0.2" -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== dependencies: - is-svg "^3.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" svgo "^1.0.0" @@ -9700,20 +10200,20 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@2.2.1, prettier@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" - integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== - prettier@^1.18.2: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.0.0, prettier@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" + integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== + pretty-bytes@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.5.0.tgz#0cecda50a74a941589498011cf23275aa82b339e" - integrity sha512-p+T744ZyjjiaFlMUZZv6YPC5JrkNj8maRmPaQCWFJFplUAzpIUTRaTcS+7wmZtUoFXHtESJb23ISliaWyz3SHA== + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== pretty-error@^2.0.2: version "2.1.2" @@ -9781,9 +10281,9 @@ promise-inflight@^1.0.1: integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= prompts@^2.0.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" - integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" @@ -9797,26 +10297,19 @@ prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" -prosemirror-collab@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/prosemirror-collab/-/prosemirror-collab-1.2.2.tgz#8d2c0e82779cfef5d051154bd0836428bd6d9c4a" - integrity sha512-tBnHKMLgy5Qmx9MYVcLfs3pAyjtcqYYDd9kp3y+LSiQzkhMQDfZSV3NXWe4Gsly32adSef173BvObwfoSQL5MA== - dependencies: - prosemirror-state "^1.0.0" - -prosemirror-commands@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.1.5.tgz#3f07a5b13e424ad8728168b6b45e1b17e47c2b81" - integrity sha512-4CKAnDxLTtUHpjRZZVEF/LLMUYh7NbS3Ze3mP5UEAgar4WRWQYg3Js01wnp/GMqaZueNHhsp9UVvOrAK+7DWbQ== +prosemirror-commands@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.1.7.tgz#5b31ae0fe82835d36d22c780641c0b651f27dd03" + integrity sha512-tuQr8q5euDjE+WAHWmu1JMLYWsPfUDH80QLLpnQrPYOPysO26FZyyHwEvA0+hUzvF8fOt1oMj0+/YM9UsPkZiA== dependencies: prosemirror-model "^1.0.0" prosemirror-state "^1.0.0" prosemirror-transform "^1.0.0" -prosemirror-dropcursor@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.2.tgz#28738c4ed7102e814d7a8a26d70018523fc7cd6d" - integrity sha512-4c94OUGyobGnwcQI70OXyMhE/9T4aTgjU+CHxkd5c7D+jH/J0mKM/lk+jneFVKt7+E4/M0D9HzRPifu8U28Thw== +prosemirror-dropcursor@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.4.tgz#a7f799ff9ecb520d3e1dbb3cb39d27ce41066618" + integrity sha512-eVmpMG5+fmvANT3xDzRirmG240rB/piI31ExIfW0Mkvo5/cYC/lm1fFMAOzjO22uc5OQXiodRqOnyE05+g3UqA== dependencies: prosemirror-state "^1.0.0" prosemirror-transform "^1.1.0" @@ -9841,7 +10334,7 @@ prosemirror-history@^1.1.3: prosemirror-transform "^1.0.0" rope-sequence "^1.3.0" -prosemirror-inputrules@^1.1.2, prosemirror-inputrules@^1.1.3: +prosemirror-inputrules@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.1.3.tgz#93f9199ca02473259c30d7e352e4c14022d54638" integrity sha512-ZaHCLyBtvbyIHv0f5p6boQTIJjlD6o2NPZiEaZWT2DA+j591zS29QQEMT4lBqwcLW3qRSf7ZvoKNbf05YrsStw== @@ -9849,7 +10342,7 @@ prosemirror-inputrules@^1.1.2, prosemirror-inputrules@^1.1.3: prosemirror-state "^1.0.0" prosemirror-transform "^1.0.0" -prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.1.4: +prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.1.4.tgz#8b481bf8389a5ac40d38dbd67ec3da2c7eac6a6d" integrity sha512-Al8cVUOnDFL4gcI5IDlG6xbZ0aOD/i3B17VT+1JbHWDguCgt/lBHVTHUBcKvvbSg6+q/W4Nj1Fu6bwZSca3xjg== @@ -9857,10 +10350,10 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.1.4: prosemirror-state "^1.0.0" w3c-keyname "^2.2.0" -prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.13.1, prosemirror-model@^1.8.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.13.1.tgz#fa3dc888cf6928bd3968620588ffe6458d201f9f" - integrity sha512-PNH+b5bilAJi1B5yJ8QzoNY3ZV+nlD0jKG3XCBk7PmE/YUTJomBkFBS005vfU+3M9yeVR8/6spAEDsfVFUhNeQ== +prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.14.1.tgz#d784c67f95a5d66b853e82ff9a87a50353ef9cd5" + integrity sha512-vZcbI+24VloFefKZkDnMaEpipL/vSKKPdFiik4KOnTzq3e6AO7+CAOixZ2G/SsfRaYC965XvnOIEbhIQdgki7w== dependencies: orderedmap "^1.1.0" @@ -9872,7 +10365,7 @@ prosemirror-schema-list@^1.1.4: prosemirror-model "^1.0.0" prosemirror-transform "^1.0.0" -prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.3.3: +prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.3.4.tgz#4c6b52628216e753fc901c6d2bfd84ce109e8952" integrity sha512-Xkkrpd1y/TQ6HKzN3agsQIGRcLckUMA9u3j207L04mt8ToRgpGeyhbVv0HI7omDORIBHjR29b7AwlATFFf2GLA== @@ -9880,28 +10373,17 @@ prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, pr prosemirror-model "^1.0.0" prosemirror-transform "^1.0.0" -prosemirror-tables@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.1.1.tgz#ad66300cc49500455cf1243bb129c9e7d883321e" - integrity sha512-LmCz4jrlqQZRsYRDzCRYf/pQ5CUcSOyqZlAj5kv67ZWBH1SVLP2U9WJEvQfimWgeRlIz0y0PQVqO1arRm1+woA== - dependencies: - prosemirror-keymap "^1.1.2" - prosemirror-model "^1.8.1" - prosemirror-state "^1.3.1" - prosemirror-transform "^1.2.1" - prosemirror-view "^1.13.3" - -prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.2.8: - version "1.2.9" - resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.2.9.tgz#dfa048102c12a457deaf4c60ae633ac3eaacc7c9" - integrity sha512-oiocfgn7J7Fulvl7luBsyxdAf0CJp96+0FIcqhHSvYVr/R4KqZNxXcU9xESaI9Xw+tTvDUiiS3gedVk3AOic4w== +prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.3.2.tgz#5620ebe7379e6fae4f34ecc881886cb22ce96579" + integrity sha512-/G6d/u9Mf6Bv3H1XR8VxhpjmUO75LYmnvj+s3ZfZpakU1hnQbsvCEybml1B3f2IWUAAQRFkbO1PnsbFhLZsYsw== dependencies: prosemirror-model "^1.0.0" -prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.16.5: - version "1.17.3" - resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.17.3.tgz#66a51da731e840a83ddcc9531f2e5f2b519ce5ff" - integrity sha512-jZiuoLe/5wY4ztFZrLbnpCf2EfCpW0gCBwLNoF07ACSNTWvjcnR8WaHTiSxBK75TbSPvtqr3B8dW4K1bdYUSLg== +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.18.6: + version "1.18.6" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.18.6.tgz#52dbad5e0748a4babce017359d7ab3750baa0ac2" + integrity sha512-ufY4EFvvTOI6011KFNFt6AXKEcSMUVxMOvoTrCiXR8UZOKTSx5CmPNzGoF+vYE5cDCco76ciokDrucAFN5imbQ== dependencies: prosemirror-model "^1.1.0" prosemirror-state "^1.0.0" @@ -10025,6 +10507,11 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + ramda@0.24.1: version "0.24.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" @@ -10066,9 +10553,17 @@ react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^17.0.1: - version "17.0.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" - integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" read-pkg-up@^4.0.0: version "4.0.0" @@ -10197,6 +10692,11 @@ regexp.prototype.flags@^1.2.0: call-bind "^1.0.2" define-properties "^1.1.3" +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + regexpp@^3.0.0, regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" @@ -10225,9 +10725,9 @@ regjsgen@^0.5.1: integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.6.4: - version "0.6.7" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c" - integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== + version "0.6.9" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" + integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== dependencies: jsesc "~0.5.0" @@ -10253,9 +10753,9 @@ renderkid@^2.0.4: strip-ansi "^3.0.0" repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" @@ -10404,12 +10904,12 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.3.2: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== +resolve@1.x, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.3.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: - is-core-module "^2.1.0" + is-core-module "^2.2.0" path-parse "^1.0.6" restore-cursor@^1.0.1: @@ -10461,7 +10961,14 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -10534,9 +11041,11 @@ run-async@^2.4.0: integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" - integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -10553,9 +11062,9 @@ rxjs@^5.0.0-beta.11: symbol-observable "1.0.1" rxjs@^6.6.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" @@ -10603,23 +11112,23 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sass-loader@^10.0.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d" - integrity sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw== +sass-loader@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== dependencies: - klona "^2.0.4" - loader-utils "^2.0.0" - neo-async "^2.6.2" - schema-utils "^3.0.0" - semver "^7.3.2" + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.6.1" + semver "^6.3.0" sass@^1.29.0: - version "1.32.6" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.6.tgz#e3646c8325cd97ff75a8a15226007f3ccd221393" - integrity sha512-1bcDHDcSqeFtMr0JXI3xc/CXX6c4p0wHHivJdru8W7waM7a1WjKMm4m/Z5sY7CbVw4Whi2Chpcw6DFfSWwGLzQ== + version "1.32.13" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.13.tgz#8d29c849e625a415bce71609c7cf95e15f74ed00" + integrity sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA== dependencies: - chokidar ">=2.0.0 <4.0.0" + chokidar ">=3.0.0 <4.0.0" sax@^1.2.4, sax@~1.2.4: version "1.2.4" @@ -10651,7 +11160,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: +schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.7.0: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -10660,28 +11169,19 @@ schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.5, schema-utils@^2.6 ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" - integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== - dependencies: - "@types/json-schema" "^7.0.6" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selfsigned@^1.10.8: - version "1.10.8" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" - integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== dependencies: node-forge "^0.10.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -10691,15 +11191,15 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.0, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.2.1, semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" @@ -10790,6 +11290,13 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -10866,6 +11373,15 @@ slice-ansi@0.0.4: resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -10906,16 +11422,16 @@ snapdragon@^0.8.1: use "^3.1.0" sockjs-client@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.0.tgz#2f8ff5d4b659e0d092f7aba0b7c386bd2aa20add" - integrity sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q== + version "1.5.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6" + integrity sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ== dependencies: debug "^3.2.6" eventsource "^1.0.7" faye-websocket "^0.11.3" inherits "^2.0.4" json3 "^3.3.3" - url-parse "^1.4.7" + url-parse "^1.5.1" sockjs@^0.3.21: version "0.3.21" @@ -11009,9 +11525,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + version "3.0.8" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.8.tgz#eb1e97ad99b11bf3f82a3b71a0472dd9a00f2ecf" + integrity sha512-NDgA96EnaLSvtbM7trJj+t1LUR3pirkDCcz9nOUlPb5DMBGsH7oES6C3hs3j7R9oHEa1EMvReS/BUAIT5Tcr0g== spdy-transport@^3.0.0: version "3.0.0" @@ -11064,18 +11580,17 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" -ssri@^7.0.0, ssri@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" - integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== +ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== dependencies: - figgy-pudding "^3.5.1" minipass "^3.1.1" stable@^0.1.8: @@ -11084,9 +11599,9 @@ stable@^0.1.8: integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.4.tgz#4b600971dcfc6aed0cbdf2a8268177cc916c87c8" - integrity sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w== + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== dependencies: escape-string-regexp "^2.0.0" @@ -11198,28 +11713,28 @@ string-width@^3.0.0, string-width@^3.1.0: strip-ansi "^5.1.0" string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" - integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" -string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" - integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" string_decoder@^1.0.0, string_decoder@^1.1.1: @@ -11306,7 +11821,7 @@ strip-json-comments@^2.0.0: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -11346,7 +11861,7 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -11447,15 +11962,27 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^6.0.4: - version "6.0.7" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" - integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== dependencies: - ajv "^7.0.2" - lodash "^4.17.20" + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +table@^6.0.4: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" @@ -11476,7 +12003,7 @@ tempy@^0.3.0: type-fest "^0.3.1" unique-string "^1.0.0" -terser-webpack-plugin@^1.4.3: +terser-webpack-plugin@^1.4.3, terser-webpack-plugin@^1.4.4: version "1.4.5" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== @@ -11491,22 +12018,7 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser-webpack-plugin@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" - integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== - dependencies: - cacache "^13.0.1" - find-cache-dir "^3.3.1" - jest-worker "^25.4.0" - p-limit "^2.3.0" - schema-utils "^2.6.6" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.6.12" - webpack-sources "^1.4.3" - -terser@^4.1.2, terser@^4.6.12, terser@^4.6.2: +terser@^4.1.2, terser@^4.6.2: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== @@ -11598,67 +12110,12 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tippy.js@^6.2.3: - version "6.2.7" - resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.2.7.tgz#62fb34eda23f7d78151ddca922b62818c1ab9869" - integrity sha512-k+kWF9AJz5xLQHBi3K/XlmJiyu+p9gsCyc5qZhxxGaJWIW8SMjw1R+C7saUnP33IM8gUhDA2xX//ejRSwqR0tA== +tippy.js@^6.2.3, tippy.js@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.1.tgz#3788a007be7015eee0fd589a66b98fb3f8f10181" + integrity sha512-JnFncCq+rF1dTURupoJ4yPie5Cof978inW6/4S6kmWV7LL9YOSEVMifED3KdrVPEG+Z/TFH2CDNJcQEfaeuQww== dependencies: - "@popperjs/core" "^2.4.4" - -tiptap-commands@^1.17.1: - version "1.17.1" - resolved "https://registry.yarnpkg.com/tiptap-commands/-/tiptap-commands-1.17.1.tgz#a8974a26d87db57b2fd4fc56a552520c69e43a4a" - integrity sha512-CyGvMD/c6fNer5LThWGtrVMXHAqHn93ivGQpqJ58x3HNZFuoIiF9QTWXAiWbY/4QrG0ANYHKCSe9n5afickTqw== - dependencies: - prosemirror-commands "^1.1.4" - prosemirror-inputrules "^1.1.2" - prosemirror-model "^1.13.1" - prosemirror-schema-list "^1.1.4" - prosemirror-state "^1.3.3" - prosemirror-tables "^1.1.1" - tiptap-utils "^1.13.1" - -tiptap-extensions@^1.34.0: - version "1.35.1" - resolved "https://registry.yarnpkg.com/tiptap-extensions/-/tiptap-extensions-1.35.1.tgz#6227362b08dbad8d0ab0141b508876deca276c55" - integrity sha512-aCYvEKPUUtHBALBFQ9n70Iy/nfu/8DHHYkeXMgUJuwLLJ6LrJQBqUnV5EGRwPxNalNdqTdXjV+2z5flZfisovQ== - dependencies: - lowlight "^1.17.0" - prosemirror-collab "^1.2.2" - prosemirror-history "^1.1.3" - prosemirror-model "^1.13.1" - prosemirror-state "^1.3.3" - prosemirror-tables "^1.1.1" - prosemirror-transform "^1.2.8" - prosemirror-view "^1.16.5" - tiptap "^1.32.1" - tiptap-commands "^1.17.1" - tiptap-utils "^1.13.1" - -tiptap-utils@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/tiptap-utils/-/tiptap-utils-1.13.1.tgz#f2150ded432465d66aa03a5ab333803415cddd20" - integrity sha512-RoCvMfkdu7fp9u7nsRr1OgsYU8RFjoHKHEKpx075rJ9X0t+j5Vxah9n6QzTTr4yjvcavq22WO2flFacm36zYtA== - dependencies: - prosemirror-model "^1.13.1" - prosemirror-state "^1.3.3" - prosemirror-tables "^1.1.1" - -tiptap@^1.32.0, tiptap@^1.32.1: - version "1.32.1" - resolved "https://registry.yarnpkg.com/tiptap/-/tiptap-1.32.1.tgz#92b47008d163e31d25d44dc18809a7e928fe1daf" - integrity sha512-jXET6IAuvE67GdpcGdNE/RQ7I1eoeULXSrbriAa5fnyTUJQsDICd31/8LVaCh10OV1qkvQVCg/6oL1lQdakBLA== - dependencies: - prosemirror-commands "^1.1.4" - prosemirror-dropcursor "^1.3.2" - prosemirror-gapcursor "^1.1.5" - prosemirror-inputrules "^1.1.3" - prosemirror-keymap "^1.1.4" - prosemirror-model "^1.13.1" - prosemirror-state "^1.3.3" - prosemirror-view "^1.16.5" - tiptap-commands "^1.17.1" - tiptap-utils "^1.13.1" + "@popperjs/core" "^2.8.3" tmp@0.1.0: version "0.1.0" @@ -11785,14 +12242,12 @@ ts-invariant@^0.4.0: dependencies: tslib "^1.9.3" -ts-invariant@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.6.0.tgz#44066ecfeb7a806ff1c3b0b283408a337a885412" - integrity sha512-caoafsfgb8QxdrKzFfjKt627m4i8KTtfAiji0DYJfWI4A/S9ORNNpzYuD9br64kyKFgxn9UNaLLbSupam84mCA== +ts-invariant@^0.7.0: + version "0.7.3" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.7.3.tgz#13aae22a4a165393aaf5cecdee45ef4128d358b8" + integrity sha512-UWDDeovyUTIMWj+45g5nhnl+8oo+GhxL5leTaHn5c8FkQWfh8v66gccLd2/YzVmV5hoQUjCEjhrXnQqVDJdvKA== dependencies: - "@types/ungap__global-this" "^0.3.1" - "@ungap/global-this" "^0.4.2" - tslib "^1.9.3" + tslib "^2.1.0" ts-jest@^24.2.0: version "24.3.0" @@ -11826,6 +12281,16 @@ ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + tsconfig@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" @@ -11836,11 +12301,16 @@ tsconfig@^7.0.0: strip-bom "^3.0.0" strip-json-comments "^2.0.0" -tslib@^1.10.0, tslib@^1.14.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.10.0, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + tslint@^5.20.1: version "5.20.1" resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" @@ -11868,9 +12338,9 @@ tsutils@^2.29.0: tslib "^1.8.1" tsutils@^3.17.1: - version "3.20.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.20.0.tgz#ea03ea45462e146b53d70ce0893de453ff24f698" - integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -11905,10 +12375,15 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.3.1: version "0.3.1" @@ -11939,14 +12414,14 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^3.9.3: - version "3.9.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" - integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== + version "3.9.9" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" + integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== -typescript@~4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" - integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== +typescript@~4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" + integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== uglify-js@3.4.x: version "3.4.10" @@ -11956,6 +12431,16 @@ uglify-js@3.4.x: commander "~2.19.0" source-map "~0.6.1" +unbox-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -12094,10 +12579,10 @@ url-loader@^2.0.0, url-loader@^2.2.0: mime "^2.4.4" schema-utils "^2.5.0" -url-parse@^1.4.3, url-parse@^1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== +url-parse@^1.4.3, url-parse@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" + integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -12185,19 +12670,20 @@ uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v-tooltip@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/v-tooltip/-/v-tooltip-2.1.2.tgz#5d3cd0c13eecdd365a0ad734b2f6c938bc8f7885" - integrity sha512-6c4NotnvDvinmZnBiqW50Rn6Q3MMk+pUV9Nla+JHkgJulgXh5snrU3RYbIZVf9p2ZlFoaZL/3QhTNgcQIc2GFQ== +v-tooltip@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/v-tooltip/-/v-tooltip-2.1.3.tgz#281c2015d1e73787f13c8956aa295b8c3a73f261" + integrity sha512-xXngyxLQTOx/yUEy50thb8te7Qo4XU6h4LZB6cvEfVd9mnysUxLEoYwGWDdqR+l69liKsy3IPkdYff3J1gAJ5w== dependencies: - lodash "^4.17.15" - popper.js "^1.16.0" - vue-resize "^1.0.0" + "@babel/runtime" "^7.13.10" + lodash "^4.17.21" + popper.js "^1.16.1" + vue-resize "^1.0.1" v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" - integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -12232,9 +12718,9 @@ vm-browserify@^1.0.1: integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== vue-apollo@^3.0.3: - version "3.0.5" - resolved "https://registry.yarnpkg.com/vue-apollo/-/vue-apollo-3.0.5.tgz#d4c7e8c7f36d76a7eed005fe565621eb0fb20522" - integrity sha512-Y9EMf47rEXLUpn8hPVZt4Iu9/KoI+OFmAznAYjL7oVoYvVGbt71jWhZWHQiN9YBriI1SscF5Exy0a2bV7XVA3A== + version "3.0.7" + resolved "https://registry.yarnpkg.com/vue-apollo/-/vue-apollo-3.0.7.tgz#97a031d45641faa4888a6d5a7f71c40834359704" + integrity sha512-EUfIn4cJmoflnDJiSNP8gH4fofIEzd0I2AWnd9nhHB8mddmzIfgSNjIRihDcRB10wypYG1OG0GcU335CFgZRfA== dependencies: chalk "^2.4.2" serialize-javascript "^4.0.0" @@ -12256,16 +12742,16 @@ vue-cli-plugin-svg@~0.1.3: url-loader "^2.0.0" vue-svg-loader "^0.12.0" -vue-eslint-parser@^7.0.0, vue-eslint-parser@^7.4.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.4.1.tgz#e4adcf7876a7379758d9056a72235af18a587f92" - integrity sha512-AFvhdxpFvliYq1xt/biNBslTHE/zbEvSnr1qfHA/KxRIpErmEDrQZlQnvEexednRHmLfDNOMuDYwZL5xkLzIXQ== +vue-eslint-parser@^7.0.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz#01ea1a2932f581ff244336565d712801f8f72561" + integrity sha512-QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA== dependencies: debug "^4.1.1" eslint-scope "^5.0.0" eslint-visitor-keys "^1.1.0" espree "^6.2.1" - esquery "^1.0.1" + esquery "^1.4.0" lodash "^4.17.15" vue-eslint-parser@~7.1.0: @@ -12286,9 +12772,9 @@ vue-hot-reload-api@^2.3.0: integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== vue-i18n-extract@^1.0.2: - version "1.1.11" - resolved "https://registry.yarnpkg.com/vue-i18n-extract/-/vue-i18n-extract-1.1.11.tgz#4c27f32a25639e22714ab885443a1b4cbc41615f" - integrity sha512-CYblIKYrqvQkVH2VPPmCiz7k3OJo2F97bBFve1c/zcTPjAI42AJEFO2t6Yei8TWbwsIl6/wh18N9+g3pO2TvIA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/vue-i18n-extract/-/vue-i18n-extract-1.2.3.tgz#7a16bbce29d587476df0bad85c0f9453b5bcfcbe" + integrity sha512-ZLtF6wp732KHKawHx5ZSmjyydkli9g26z0NfGLP89DkiGx4nKFYZ2oIH35HtImdhcfq1zqkeSwxs7kRzarLoVw== dependencies: commander "^6.1.0" dot-object "^2.1.4" @@ -12297,9 +12783,9 @@ vue-i18n-extract@^1.0.2: js-yaml "^3.14.0" vue-i18n@^8.14.0: - version "8.22.4" - resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.22.4.tgz#255cbdab4ffa7337c5819b82dd171208af74e385" - integrity sha512-XLI5s0AdqMP2Lf4I4CmdmOq8kjb5DDFGR77wAuxCfpEuYSfhTRyyx6MetgZMiL6Lxa0DasjBOiOcciU3NkL3/Q== + version "8.24.4" + resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.24.4.tgz#b158614c1df7db183d9cadddbb73e1d540269492" + integrity sha512-RZE94WUAGxEiBAANxQ0pptbRwDkNKNSXl3fnJslpFOxVMF6UkUtMDSuYGuW2blDrVgweIXVpethOVkYoNNT9xw== vue-jest@^3.0.5: version "3.0.7" @@ -12319,18 +12805,18 @@ vue-jest@^3.0.5: vue-template-es2015-compiler "^1.6.0" "vue-loader-v16@npm:vue-loader@^16.1.0": - version "16.1.2" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.1.2.tgz#5c03b6c50d2a5f983c7ceba15c50d78ca2b298f4" - integrity sha512-8QTxh+Fd+HB6fiL52iEVLKqE9N1JSlMXLR92Ijm6g8PZrwIxckgpqjPDWRP5TWxdiPaHR+alUWsnu1ShQOwt+Q== + version "16.2.0" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.2.0.tgz#046a53308dd47e58efe20ddec1edec027ce3b46e" + integrity sha512-TitGhqSQ61RJljMmhIGvfWzJ2zk9m1Qug049Ugml6QP3t0e95o0XJjk29roNEiPKJQBEi8Ord5hFuSuELzSp8Q== dependencies: chalk "^4.1.0" hash-sum "^2.0.0" loader-utils "^2.0.0" vue-loader@^15.9.2: - version "15.9.6" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.6.tgz#f4bb9ae20c3a8370af3ecf09b8126d38ffdb6b8b" - integrity sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg== + version "15.9.7" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.7.tgz#15b05775c3e0c38407679393c2ce6df673b01044" + integrity sha512-qzlsbLV1HKEMf19IqCJqdNvFJRCI58WNbS6XbPqK13MrLz65es75w392MSQ5TsARAfIjUw+ATm3vlCXUJSOH9Q== dependencies: "@vue/component-compiler-utils" "^3.1.0" hash-sum "^1.0.2" @@ -12350,10 +12836,12 @@ vue-property-decorator@^9.0.0: resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-9.1.2.tgz#266a2eac61ba6527e2e68a6933cfb98fddab5457" integrity sha512-xYA8MkZynPBGd/w5QFJ2d/NM0z/YeegMqYTphy7NJQXbZcuU6FC6AOdUAcy4SXP+YnkerC6AfH+ldg7PDk9ESQ== -vue-resize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/vue-resize/-/vue-resize-1.0.0.tgz#380565b36e411190d85f8fbd3aa230a4cc22f1a5" - integrity sha512-SkIi19neeJClapYavfmHiewFZkkTfITVWskg/dIL8b1Eb+RlvnCb8fjGUwLjQJmsw2qsRiiAo4o7BAJVM4pcOA== +vue-resize@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vue-resize/-/vue-resize-1.0.1.tgz#c120bed4e09938771d622614f57dbcf58a5147ee" + integrity sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w== + dependencies: + "@babel/runtime" "^7.13.10" vue-router@^3.1.6: version "3.5.1" @@ -12368,9 +12856,9 @@ vue-scrollto@^2.17.1: bezier-easing "2.1.0" vue-style-loader@^4.1.0, vue-style-loader@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8" - integrity sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ== + version "4.1.3" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35" + integrity sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg== dependencies: hash-sum "^1.0.2" loader-utils "^1.0.2" @@ -12397,9 +12885,9 @@ vue-template-es2015-compiler@^1.6.0, vue-template-es2015-compiler@^1.9.0: integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== vue2-leaflet@^2.0.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/vue2-leaflet/-/vue2-leaflet-2.6.0.tgz#c83c60a745fbc2a74d9dbd0f75b2a5ae07d220a9" - integrity sha512-JG+w9TtNuk1yRpPta+RjzH6J+opdRUPzSo8UuBnwk+a/6XD0f2tsaB6g3D6ZpBgIE4wZA2dbZ0dZFz2ulYMj3A== + version "2.7.0" + resolved "https://registry.yarnpkg.com/vue2-leaflet/-/vue2-leaflet-2.7.0.tgz#e8a78671b8fa843ab19cfd93582bc166a05ec3ed" + integrity sha512-uT7lpFoVEDhINMyTpiAthh6aiKFGHuYWLoVH8JJ0YNNSch+XMZFl4YBQ0S2hHYDquQIsh8zx+yINeUI01y9ugw== vue@^2.0.0, vue@^2.6.11: version "2.6.12" @@ -12587,7 +13075,7 @@ webpack-merge@^4.2.2: dependencies: lodash "^4.17.15" -webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: +webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -12668,6 +13156,17 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -12900,6 +13399,13 @@ write-file-atomic@2.4.1: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" @@ -12915,9 +13421,9 @@ ws@^6.0.0, ws@^6.2.1: async-limiter "~1.0.0" ws@^7.0.0: - version "7.4.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" - integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== + version "7.4.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" + integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== xml-name-validator@^3.0.0: version "3.0.0" @@ -12940,14 +13446,14 @@ xtend@^4.0.0, xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" - integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^2.1.2: version "2.1.2" @@ -12965,9 +13471,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.7.2: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yargs-parser@10.x: version "10.1.0" @@ -12985,9 +13491,9 @@ yargs-parser@^13.1.2: decamelize "^1.2.0" yargs-parser@^20.2.2: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== yargs@^13.3.0, yargs@^13.3.2: version "13.3.2" diff --git a/lib/config_provider.ex b/lib/config_provider.ex new file mode 100644 index 000000000..6b393f23a --- /dev/null +++ b/lib/config_provider.ex @@ -0,0 +1,34 @@ +defmodule Mobilizon.ConfigProvider do + @moduledoc """ + Module to provide configuration from a custom file + """ + @behaviour Config.Provider + + def init(path) when is_binary(path), do: path + + def load(config, path) do + config_path = System.get_env("MOBILIZON_CONFIG_PATH") || path + + cond do + File.exists?(config_path) -> + runtime_config = Config.Reader.read!(config_path) + + Config.Reader.merge(config, runtime_config) + + is_nil(System.get_env("MOBILIZON_DOCKER")) -> + warning = [ + IO.ANSI.red(), + IO.ANSI.bright(), + "!!! #{config_path} not found! Please ensure it exists and that MOBILIZON_CONFIG_PATH is unset or points to an existing file", + IO.ANSI.reset() + ] + + IO.puts(warning) + config + + true -> + IO.puts("No runtime config file found, but using environment variables for Docker") + config + end + end +end diff --git a/lib/federation/activity_pub/activity_pub.ex b/lib/federation/activity_pub/activity_pub.ex index 7aec827c2..0e11c056a 100644 --- a/lib/federation/activity_pub/activity_pub.ex +++ b/lib/federation/activity_pub/activity_pub.ex @@ -39,11 +39,12 @@ defmodule Mobilizon.Federation.ActivityPub do Visibility } + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor + alias Mobilizon.Federation.ActivityPub.Types.{Managable, Ownable} - alias Mobilizon.Federation.ActivityStream.{Converter, Convertible} + alias Mobilizon.Federation.ActivityStream.Convertible alias Mobilizon.Federation.HTTPSignatures.Signature - alias Mobilizon.Federation.WebFinger alias Mobilizon.Service.Notifications.Scheduler alias Mobilizon.Storage.Page @@ -79,7 +80,6 @@ defmodule Mobilizon.Federation.ActivityPub do {:ok, struct()} | {:error, any()} def fetch_object_from_url(url, options \\ []) do Logger.info("Fetching object from url #{url}") - force_fetch = Keyword.get(options, :force, false) with {:not_http, true} <- {:not_http, String.starts_with?(url, "http")}, {:existing, nil} <- @@ -99,77 +99,63 @@ defmodule Mobilizon.Federation.ActivityPub do Preloader.maybe_preload(entity) else {:existing, entity} -> - Logger.debug("Entity is already existing") + handle_existing_entity(url, entity, options) - res = - if force_fetch and not are_same_origin?(url, Endpoint.url()) do - Logger.debug("Entity is external and we want a force fetch") - - case Fetcher.fetch_and_update(url, options) do - {:ok, _activity, entity} -> - {:ok, entity} - - {:error, "Gone"} -> - {:error, "Gone", entity} - - {:error, "Not found"} -> - {:error, "Not found", entity} - end - else - {:ok, entity} - end - - Logger.debug("Going to preload an existing entity") - - case res do - {:ok, entity} -> - Preloader.maybe_preload(entity) - - {:error, status, entity} -> - {:ok, entity} = Preloader.maybe_preload(entity) - {:error, status, entity} - - err -> - err - end + {:error, e} -> + Logger.warn("Something failed while fetching url #{url} #{inspect(e)}") + {:error, e} e -> - Logger.warn("Something failed while fetching url #{inspect(e)}") + Logger.warn("Something failed while fetching url #{url} #{inspect(e)}") {:error, e} end end - @doc """ - Getting an actor from url, eventually creating it if we don't have it locally or if it needs an update - """ - @spec get_or_fetch_actor_by_url(String.t(), boolean) :: {:ok, Actor.t()} | {:error, String.t()} - def get_or_fetch_actor_by_url(url, preload \\ false) + @spec handle_existing_entity(String.t(), struct(), Keyword.t()) :: + {:ok, struct()} + | {:ok, struct()} + | {:error, String.t(), struct()} + | {:error, String.t()} + defp handle_existing_entity(url, entity, options) do + Logger.debug("Entity is already existing") + Logger.debug("Going to preload an existing entity") - def get_or_fetch_actor_by_url(nil, _preload), do: {:error, "Can't fetch a nil url"} + case refresh_entity(url, entity, options) do + {:ok, entity} -> + Preloader.maybe_preload(entity) - def get_or_fetch_actor_by_url("https://www.w3.org/ns/activitystreams#Public", _preload) do - with %Actor{url: url} <- Relay.get_actor() do - get_or_fetch_actor_by_url(url) + {:error, status, entity} -> + {:ok, entity} = Preloader.maybe_preload(entity) + {:error, status, entity} + + err -> + err end end - @spec get_or_fetch_actor_by_url(String.t(), boolean()) :: {:ok, Actor.t()} | {:error, any()} - def get_or_fetch_actor_by_url(url, preload) do - with {:ok, %Actor{} = cached_actor} <- Actors.get_actor_by_url(url, preload), - false <- Actors.needs_update?(cached_actor) do - {:ok, cached_actor} - else - _ -> - # For tests, see https://github.com/jjh42/mock#not-supported---mocking-internal-function-calls and Mobilizon.Federation.ActivityPubTest - case __MODULE__.make_actor_from_url(url, preload) do - {:ok, %Actor{} = actor} -> - {:ok, actor} + @spec refresh_entity(String.t(), struct(), Keyword.t()) :: + {:ok, struct()} | {:error, String.t(), struct()} | {:error, String.t()} + defp refresh_entity(url, entity, options) do + force_fetch = Keyword.get(options, :force, false) - err -> - Logger.warn("Could not fetch by AP id") - Logger.debug(inspect(err)) - {:error, "Could not fetch by AP id"} - end + if force_fetch and not are_same_origin?(url, Endpoint.url()) do + Logger.debug("Entity is external and we want a force fetch") + + case Fetcher.fetch_and_update(url, options) do + {:ok, _activity, entity} -> + {:ok, entity} + + {:error, "Gone"} -> + {:error, "Gone", entity} + + {:error, "Not found"} -> + {:error, "Not found", entity} + + {:error, "Object origin check failed"} -> + {:error, "Object origin check failed"} + end + else + {:ok, entity} end end @@ -287,7 +273,8 @@ defmodule Mobilizon.Federation.ActivityPub do local \\ true, public \\ true ) do - with {:ok, %Actor{id: object_owner_actor_id}} <- get_or_fetch_actor_by_url(object["actor"]), + with {:ok, %Actor{id: object_owner_actor_id}} <- + ActivityPubActor.get_or_fetch_actor_by_url(object["actor"]), {:ok, %Share{} = _share} <- Share.create(object["id"], actor.id, object_owner_actor_id), announce_data <- make_announce_data(actor, object, activity_id, public), {:ok, activity} <- create_activity(announce_data, local), @@ -459,6 +446,7 @@ defmodule Mobilizon.Federation.ActivityPub do Map.get(additional, :force_member_removal, false) || !Actors.is_only_administrator?(member_id, group_id)}, {:delete, {:ok, %Member{} = member}} <- {:delete, Actors.delete_member(member)}, + Mobilizon.Service.Activity.Member.insert_activity(member, subject: "member_quit"), leave_data <- %{ "to" => [group_members_url], "cc" => [group_url], @@ -477,12 +465,17 @@ defmodule Mobilizon.Federation.ActivityPub do def remove( %Member{} = member, %Actor{type: :Group, url: group_url, members_url: group_members_url}, - %Actor{url: moderator_url}, + %Actor{url: moderator_url} = moderator, local, _additional \\ %{} ) do with {:ok, %Member{id: member_id}} <- Actors.update_member(member, %{role: :rejected}), %Member{} = member <- Actors.get_member(member_id), + {:ok, _} <- + Mobilizon.Service.Activity.Member.insert_activity(member, + moderator: moderator, + subject: "member_removed" + ), :ok <- Group.send_notification_to_removed_member(member), remove_data <- %{ "to" => [group_members_url], @@ -518,6 +511,11 @@ defmodule Mobilizon.Federation.ActivityPub do invited_by_id: actor_id, url: Map.get(additional, :url) }), + {:ok, _} <- + Mobilizon.Service.Activity.Member.insert_activity(member, + moderator: actor, + subject: "member_invited" + ), invite_data <- %{ "type" => "Invite", "attributedTo" => group_url, @@ -581,7 +579,7 @@ defmodule Mobilizon.Federation.ActivityPub do Enum.each(Users.list_moderators(), fn moderator -> moderator |> Admin.report(report) - |> Mailer.deliver_later() + |> Mailer.send_email_later() end) {:ok, activity, report} @@ -593,64 +591,6 @@ defmodule Mobilizon.Federation.ActivityPub do end end - @doc """ - Create an actor locally by its URL (AP ID) - """ - @spec make_actor_from_url(String.t(), boolean()) :: {:ok, %Actor{}} | {:error, any()} - def make_actor_from_url(url, preload \\ false) do - if are_same_origin?(url, Endpoint.url()) do - {:error, "Can't make a local actor from URL"} - else - case fetch_and_prepare_actor_from_url(url) do - {:ok, data} -> - Actors.upsert_actor(data, preload) - - # Request returned 410 - {:error, :actor_deleted} -> - Logger.info("Actor was deleted") - {:error, :actor_deleted} - - e -> - Logger.warn("Failed to make actor from url") - {:error, e} - end - end - end - - @doc """ - Find an actor in our local database or call WebFinger to find what's its AP ID is and then fetch it - """ - @spec find_or_make_actor_from_nickname(String.t(), atom() | nil) :: tuple() - def find_or_make_actor_from_nickname(nickname, type \\ nil) do - case Actors.get_actor_by_name(nickname, type) do - %Actor{} = actor -> - {:ok, actor} - - nil -> - make_actor_from_nickname(nickname) - end - end - - @spec find_or_make_person_from_nickname(String.t()) :: tuple() - def find_or_make_person_from_nickname(nick), do: find_or_make_actor_from_nickname(nick, :Person) - - @spec find_or_make_group_from_nickname(String.t()) :: tuple() - def find_or_make_group_from_nickname(nick), do: find_or_make_actor_from_nickname(nick, :Group) - - @doc """ - Create an actor inside our database from username, using WebFinger to find out its AP ID and then fetch it - """ - @spec make_actor_from_nickname(String.t()) :: {:ok, %Actor{}} | {:error, any()} - def make_actor_from_nickname(nickname) do - case WebFinger.finger(nickname) do - {:ok, %{"url" => url}} when not is_nil(url) -> - make_actor_from_url(url) - - _e -> - {:error, "No ActivityPub URL found in WebFinger"} - end - end - @spec is_create_activity?(Activity.t()) :: boolean defp is_create_activity?(%Activity{data: %{"type" => "Create"}}), do: true defp is_create_activity?(_), do: false @@ -699,7 +639,7 @@ defmodule Mobilizon.Federation.ActivityPub do @spec publish(Actor.t(), Activity.t()) :: :ok def publish(actor, %Activity{recipients: recipients} = activity) do Logger.debug("Publishing an activity") - Logger.debug(inspect(activity)) + Logger.debug(inspect(activity, pretty: true)) public = Visibility.is_public?(activity) Logger.debug("is public ? #{public}") @@ -768,36 +708,6 @@ defmodule Mobilizon.Federation.ActivityPub do ) end - # Fetching a remote actor's information through its AP ID - @spec fetch_and_prepare_actor_from_url(String.t()) :: {:ok, struct()} | {:error, atom()} | any() - defp fetch_and_prepare_actor_from_url(url) do - Logger.debug("Fetching and preparing actor from url") - Logger.debug(inspect(url)) - - res = - with {:ok, %{status: 200, body: body}} <- - Tesla.get(url, - headers: [{"Accept", "application/activity+json"}], - follow_redirect: true - ), - :ok <- Logger.debug("response okay, now decoding json"), - {:ok, data} <- Jason.decode(body) do - Logger.debug("Got activity+json response at actor's endpoint, now converting data") - {:ok, Converter.Actor.as_to_model_data(data)} - else - # Actor is gone, probably deleted - {:ok, %{status: 410}} -> - Logger.info("Response HTTP 410") - {:error, :actor_deleted} - - e -> - Logger.warn("Could not decode actor at fetch #{url}, #{inspect(e)}") - {:error, e} - end - - res - end - @doc """ Return all public activities (events & comments) for an actor """ @@ -914,12 +824,16 @@ defmodule Mobilizon.Federation.ActivityPub do defp accept_join(%Member{} = member, additional) do with {:ok, %Member{} = member} <- Actors.update_member(member, %{role: :member}), - _ <- - unless(is_nil(member.parent.domain), - do: Refresher.fetch_group(member.parent.url, member.actor) + {:ok, _} <- + Mobilizon.Service.Activity.Member.insert_activity(member, + subject: "member_approved" ), + _ <- maybe_refresh_group(member), Absinthe.Subscription.publish(Endpoint, member.actor, - group_membership_changed: member.actor.id + group_membership_changed: [ + Actor.preferred_username_and_domain(member.parent), + member.actor.id + ] ), member_as_data <- Convertible.model_to_as(member), audience <- @@ -949,6 +863,11 @@ defmodule Mobilizon.Federation.ActivityPub do %Actor{url: actor_url} <- Actors.get_actor(actor_id), {:ok, %Member{id: member_id} = member} <- Actors.update_member(member, %{role: :member}), + {:ok, _} <- + Mobilizon.Service.Activity.Member.insert_activity(member, + subject: "member_accepted_invitation" + ), + _ <- maybe_refresh_group(member), accept_data <- %{ "type" => "Accept", "attributedTo" => member.parent.url, @@ -962,6 +881,14 @@ defmodule Mobilizon.Federation.ActivityPub do end end + defp maybe_refresh_group(%Member{ + parent: %Actor{domain: parent_domain, url: parent_url}, + actor: %Actor{} = actor + }) do + unless is_nil(parent_domain), + do: Refresher.fetch_group(parent_url, actor) + end + @spec reject_join(Participant.t(), map()) :: {:ok, Participant.t(), Activity.t()} | any() defp reject_join(%Participant{} = participant, additional) do with {:ok, %Participant{} = participant} <- @@ -1029,6 +956,9 @@ defmodule Mobilizon.Federation.ActivityPub do %Actor{url: actor_url} <- Actors.get_actor(actor_id), {:ok, %Member{url: member_url, id: member_id} = member} <- Actors.delete_member(member), + Mobilizon.Service.Activity.Member.insert_activity(member, + subject: "member_rejected_invitation" + ), accept_data <- %{ "type" => "Reject", "actor" => actor_url, diff --git a/lib/federation/activity_pub/actor.ex b/lib/federation/activity_pub/actor.ex new file mode 100644 index 000000000..0cc3b589f --- /dev/null +++ b/lib/federation/activity_pub/actor.ex @@ -0,0 +1,106 @@ +defmodule Mobilizon.Federation.ActivityPub.Actor do + @moduledoc """ + Module to handle ActivityPub Actor interactions + """ + + alias Mobilizon.Actors + alias Mobilizon.Actors.Actor + alias Mobilizon.Federation.ActivityPub.{Fetcher, Relay} + alias Mobilizon.Federation.WebFinger + alias Mobilizon.Web.Endpoint + require Logger + import Mobilizon.Federation.ActivityPub.Utils, only: [are_same_origin?: 2] + + @doc """ + Getting an actor from url, eventually creating it if we don't have it locally or if it needs an update + """ + @spec get_or_fetch_actor_by_url(String.t(), boolean) :: {:ok, Actor.t()} | {:error, String.t()} + def get_or_fetch_actor_by_url(url, preload \\ false) + + def get_or_fetch_actor_by_url(nil, _preload), do: {:error, "Can't fetch a nil url"} + + def get_or_fetch_actor_by_url("https://www.w3.org/ns/activitystreams#Public", _preload) do + with %Actor{url: url} <- Relay.get_actor() do + get_or_fetch_actor_by_url(url) + end + end + + @spec get_or_fetch_actor_by_url(String.t(), boolean()) :: {:ok, Actor.t()} | {:error, any()} + def get_or_fetch_actor_by_url(url, preload) do + with {:ok, %Actor{} = cached_actor} <- Actors.get_actor_by_url(url, preload), + false <- Actors.needs_update?(cached_actor) do + {:ok, cached_actor} + else + _ -> + # For tests, see https://github.com/jjh42/mock#not-supported---mocking-internal-function-calls and Mobilizon.Federation.ActivityPubTest + case __MODULE__.make_actor_from_url(url, preload) do + {:ok, %Actor{} = actor} -> + {:ok, actor} + + {:error, err} -> + Logger.debug("Could not fetch by AP id") + Logger.debug(inspect(err)) + {:error, "Could not fetch by AP id"} + end + end + end + + @doc """ + Create an actor locally by its URL (AP ID) + """ + @spec make_actor_from_url(String.t(), boolean()) :: + {:ok, %Actor{}} | {:error, :actor_deleted} | {:error, :http_error} | {:error, any()} + def make_actor_from_url(url, preload \\ false) do + if are_same_origin?(url, Endpoint.url()) do + {:error, "Can't make a local actor from URL"} + else + case Fetcher.fetch_and_prepare_actor_from_url(url) do + {:ok, data} -> + Actors.upsert_actor(data, preload) + + # Request returned 410 + {:error, :actor_deleted} -> + Logger.info("Actor was deleted") + {:error, :actor_deleted} + + {:error, :http_error} -> + {:error, :http_error} + + {:error, e} -> + Logger.warn("Failed to make actor from url") + {:error, e} + end + end + end + + @doc """ + Find an actor in our local database or call WebFinger to find what's its AP ID is and then fetch it + """ + @spec find_or_make_actor_from_nickname(String.t(), atom() | nil) :: tuple() + def find_or_make_actor_from_nickname(nickname, type \\ nil) do + case Actors.get_actor_by_name(nickname, type) do + %Actor{} = actor -> + {:ok, actor} + + nil -> + make_actor_from_nickname(nickname) + end + end + + @spec find_or_make_group_from_nickname(String.t()) :: tuple() + def find_or_make_group_from_nickname(nick), do: find_or_make_actor_from_nickname(nick, :Group) + + @doc """ + Create an actor inside our database from username, using WebFinger to find out its AP ID and then fetch it + """ + @spec make_actor_from_nickname(String.t()) :: {:ok, %Actor{}} | {:error, any()} + def make_actor_from_nickname(nickname) do + case WebFinger.finger(nickname) do + {:ok, url} when is_binary(url) -> + make_actor_from_url(url) + + _e -> + {:error, "No ActivityPub URL found in WebFinger"} + end + end +end diff --git a/lib/federation/activity_pub/audience.ex b/lib/federation/activity_pub/audience.ex index 1e491cb3a..f129e59b9 100644 --- a/lib/federation/activity_pub/audience.ex +++ b/lib/federation/activity_pub/audience.ex @@ -123,19 +123,29 @@ defmodule Mobilizon.Federation.ActivityPub.Audience do end def calculate_to_and_cc_from_mentions(%Post{ - attributed_to: %Actor{members_url: members_url}, - visibility: visibility + attributed_to: %Actor{members_url: members_url, followers_url: followers_url}, + visibility: visibility, + draft: draft }) do - case visibility do - :public -> - %{"to" => [@ap_public, members_url], "cc" => []} + cond do + # If the post is draft we send it only to members + draft == true -> + %{"to" => [members_url], "cc" => []} - :unlisted -> - %{"to" => [members_url], "cc" => [@ap_public]} + # If public everyone + visibility == :public -> + %{"to" => [@ap_public, members_url], "cc" => [followers_url]} - :private -> + # Otherwise just followers + visibility == :unlisted -> + %{"to" => [followers_url, members_url], "cc" => [@ap_public]} + + visibility == :private -> # Private is restricted to only the members %{"to" => [members_url], "cc" => []} + + true -> + %{"to" => [], "cc" => []} end end diff --git a/lib/federation/activity_pub/federator.ex b/lib/federation/activity_pub/federator.ex index d9027084f..4bed74643 100644 --- a/lib/federation/activity_pub/federator.ex +++ b/lib/federation/activity_pub/federator.ex @@ -13,6 +13,7 @@ defmodule Mobilizon.Federation.ActivityPub.Federator do alias Mobilizon.Actors.Actor alias Mobilizon.Federation.ActivityPub alias Mobilizon.Federation.ActivityPub.{Activity, Transmogrifier} + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor require Logger @@ -42,7 +43,8 @@ defmodule Mobilizon.Federation.ActivityPub.Federator do Logger.debug(inspect(activity)) Logger.debug(fn -> "Running publish for #{activity.data["id"]}" end) - with {:ok, %Actor{} = actor} <- ActivityPub.get_or_fetch_actor_by_url(activity.data["actor"]) do + with {:ok, %Actor{} = actor} <- + ActivityPubActor.get_or_fetch_actor_by_url(activity.data["actor"]) do Logger.info(fn -> "Sending #{activity.data["id"]} out via AP" end) ActivityPub.publish(actor, activity) end @@ -61,7 +63,7 @@ defmodule Mobilizon.Federation.ActivityPub.Federator do e -> # Just drop those for now - Logger.error("Unhandled activity") + Logger.debug("Unhandled activity") Logger.debug(inspect(e)) Logger.debug(Jason.encode!(params)) end diff --git a/lib/federation/activity_pub/fetcher.ex b/lib/federation/activity_pub/fetcher.ex index a6ece6a36..019e0237e 100644 --- a/lib/federation/activity_pub/fetcher.ex +++ b/lib/federation/activity_pub/fetcher.ex @@ -8,6 +8,7 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do alias Mobilizon.Federation.HTTPSignatures.Signature alias Mobilizon.Federation.ActivityPub.{Relay, Transmogrifier} + alias Mobilizon.Federation.ActivityStream.Converter.Actor, as: ActorConverter alias Mobilizon.Service.HTTP.ActivityPub, as: ActivityPubClient import Mobilizon.Federation.ActivityPub.Utils, @@ -17,7 +18,8 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do def fetch(url, options \\ []) do on_behalf_of = Keyword.get(options, :on_behalf_of, Relay.get_actor()) - with date <- Signature.generate_date_header(), + with false <- address_invalid(url), + date <- Signature.generate_date_header(), headers <- [{:Accept, "application/activity+json"}] |> maybe_date_fetch(date) @@ -29,15 +31,18 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do {:ok, data} else {:ok, %Tesla.Env{status: 410}} -> - Logger.warn("Resource at #{url} is 410 Gone") + Logger.debug("Resource at #{url} is 410 Gone") {:error, "Gone"} {:ok, %Tesla.Env{status: 404}} -> - Logger.warn("Resource at #{url} is 404 Gone") + Logger.debug("Resource at #{url} is 404 Gone") {:error, "Not found"} {:ok, %Tesla.Env{} = res} -> {:error, res} + + {:error, err} -> + {:error, err} end end @@ -59,6 +64,10 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do Logger.warn("Object origin check failed") {:error, "Object origin check failed"} + # Returned content is not JSON + {:ok, data} when is_binary(data) -> + {:error, "Failed to parse content as JSON"} + {:error, err} -> {:error, err} end @@ -67,7 +76,7 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do @spec fetch_and_update(String.t(), Keyword.t()) :: {:ok, map(), struct()} def fetch_and_update(url, options \\ []) do with {:ok, data} when is_map(data) <- fetch(url, options), - {:origin_check, true} <- {:origin_check, origin_check?(url, data)}, + {:origin_check, true} <- {:origin_check, origin_check(url, data)}, params <- %{ "type" => "Update", "to" => data["to"], @@ -79,11 +88,69 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do Transmogrifier.handle_incoming(params) else {:origin_check, false} -> - Logger.warn("Object origin check failed") {:error, "Object origin check failed"} {:error, err} -> {:error, err} end end + + @doc """ + Fetching a remote actor's information through its AP ID + """ + @spec fetch_and_prepare_actor_from_url(String.t()) :: {:ok, map()} | {:error, atom()} | any() + def fetch_and_prepare_actor_from_url(url) do + Logger.debug("Fetching and preparing actor from url") + Logger.debug(inspect(url)) + + res = + with {:ok, %{status: 200, body: body}} <- + Tesla.get(url, + headers: [{"Accept", "application/activity+json"}], + follow_redirect: true + ), + :ok <- Logger.debug("response okay, now decoding json"), + {:ok, data} <- Jason.decode(body) do + Logger.debug("Got activity+json response at actor's endpoint, now converting data") + {:ok, ActorConverter.as_to_model_data(data)} + else + # Actor is gone, probably deleted + {:ok, %{status: 410}} -> + Logger.info("Response HTTP 410") + {:error, :actor_deleted} + + {:ok, %Tesla.Env{}} -> + Logger.info("Non 200 HTTP Code") + {:error, :http_error} + + {:error, e} -> + Logger.warn("Could not decode actor at fetch #{url}, #{inspect(e)}") + {:error, e} + + e -> + Logger.warn("Could not decode actor at fetch #{url}, #{inspect(e)}") + {:error, e} + end + + res + end + + @spec origin_check(String.t(), map()) :: boolean() + defp origin_check(url, data) do + if origin_check?(url, data) do + true + else + Sentry.capture_message("Object origin check failed", extra: %{url: url, data: data}) + Logger.debug("Object origin check failed") + false + end + end + + @spec address_invalid(String.t()) :: false | {:error, :invalid_url} + defp address_invalid(address) do + with %URI{host: host, scheme: scheme} <- URI.parse(address), + true <- is_nil(host) or is_nil(scheme) do + {:error, :invalid_url} + end + end end diff --git a/lib/federation/activity_pub/preloader.ex b/lib/federation/activity_pub/preloader.ex index 79db7a65a..bf8325acc 100644 --- a/lib/federation/activity_pub/preloader.ex +++ b/lib/federation/activity_pub/preloader.ex @@ -12,6 +12,7 @@ defmodule Mobilizon.Federation.ActivityPub.Preloader do alias Mobilizon.Resources.Resource alias Mobilizon.Tombstone + @spec maybe_preload(struct()) :: {:ok, struct()} | {:error, struct()} def maybe_preload(%Event{url: url}), do: {:ok, Events.get_public_event_by_url_with_preload!(url)} diff --git a/lib/federation/activity_pub/refresher.ex b/lib/federation/activity_pub/refresher.ex index 0aee6d6e6..8c466838c 100644 --- a/lib/federation/activity_pub/refresher.ex +++ b/lib/federation/activity_pub/refresher.ex @@ -6,8 +6,8 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do alias Mobilizon.Actors alias Mobilizon.Actors.Actor alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityPub.{Fetcher, Relay, Transmogrifier, Utils} - alias Mobilizon.Storage.Repo require Logger @doc """ @@ -32,7 +32,7 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do end def refresh_profile(%Actor{type: type, url: url}) when type in [:Person, :Application] do - with {:ok, %Actor{outbox_url: outbox_url}} <- ActivityPub.make_actor_from_url(url), + with {:ok, %Actor{outbox_url: outbox_url}} <- ActivityPubActor.make_actor_from_url(url), :ok <- fetch_collection(outbox_url, Relay.get_actor()) do :ok end @@ -50,7 +50,7 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do discussions_url: discussions_url, events_url: events_url }} <- - ActivityPub.make_actor_from_url(group_url), + ActivityPubActor.make_actor_from_url(group_url), :ok <- fetch_collection(outbox_url, on_behalf_of), :ok <- fetch_collection(members_url, on_behalf_of), :ok <- fetch_collection(resources_url, on_behalf_of), @@ -60,9 +60,31 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do :ok <- fetch_collection(events_url, on_behalf_of) do :ok else + {:error, :actor_deleted} -> + {:error, :actor_deleted} + + {:error, :http_error} -> + {:error, :http_error} + + {:error, err} -> + Logger.error("Error while refreshing a group") + + Sentry.capture_message("Error while refreshing a group", + extra: %{group_url: group_url} + ) + + Logger.debug(inspect(err)) + {:error, err} + err -> Logger.error("Error while refreshing a group") - Logger.error(inspect(err)) + + Sentry.capture_message("Error while refreshing a group", + extra: %{group_url: group_url} + ) + + Logger.debug(inspect(err)) + err end end @@ -96,13 +118,11 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do end end - @spec refresh_all_external_groups :: any() + @spec refresh_all_external_groups :: :ok def refresh_all_external_groups do - Repo.transaction(fn -> - Actors.list_external_groups_for_stream() - |> Stream.map(&refresh_profile/1) - |> Stream.run() - end) + Actors.list_external_groups() + |> Enum.filter(&Actors.needs_update?/1) + |> Enum.each(&refresh_profile/1) end defp process_collection(%{"type" => type, "orderedItems" => items}, _on_behalf_of) @@ -113,17 +133,28 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do Logger.debug(inspect(items)) - Enum.each(items, &handling_element/1) + items + |> Enum.map(fn item -> Task.async(fn -> handling_element(item) end) end) + |> Task.await_many() + Logger.debug("Finished processing a collection") :ok end + # Lemmy uses an OrderedCollection with the items property + defp process_collection(%{"type" => type, "items" => items} = collection, on_behalf_of) + when type in ["OrderedCollection", "OrderedCollectionPage"] do + collection + |> Map.put("orderedItems", items) + |> process_collection(on_behalf_of) + end + defp process_collection(%{"type" => "OrderedCollection", "first" => first}, on_behalf_of) when is_map(first), do: process_collection(first, on_behalf_of) defp process_collection(%{"type" => "OrderedCollection", "first" => first}, on_behalf_of) - when is_bitstring(first) do + when is_binary(first) do Logger.debug("OrderedCollection has a first property pointing to an URI") with {:ok, data} <- Fetcher.fetch(first, on_behalf_of: on_behalf_of) do @@ -146,6 +177,11 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do Transmogrifier.handle_incoming(data) end + # If we're handling an announce activity + defp handling_element(%{"type" => "Announce"} = data) do + handling_element(get_in(data, ["object"])) + end + # If we're handling directly an object defp handling_element(data) when is_map(data) do object = get_in(data, ["object"]) diff --git a/lib/federation/activity_pub/relay.ex b/lib/federation/activity_pub/relay.ex index 13a8b2f12..8266d94f5 100644 --- a/lib/federation/activity_pub/relay.ex +++ b/lib/federation/activity_pub/relay.ex @@ -13,6 +13,7 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do alias Mobilizon.Federation.ActivityPub alias Mobilizon.Federation.ActivityPub.{Activity, Refresher, Transmogrifier} + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.WebFinger alias Mobilizon.GraphQL.API.Follows @@ -37,7 +38,8 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do def follow(address) do with {:ok, target_instance} <- fetch_actor(address), %Actor{} = local_actor <- get_actor(), - {:ok, %Actor{} = target_actor} <- ActivityPub.get_or_fetch_actor_by_url(target_instance), + {:ok, %Actor{} = target_actor} <- + ActivityPubActor.get_or_fetch_actor_by_url(target_instance), {:ok, activity, follow} <- Follows.follow(local_actor, target_actor) do Logger.info("Relay: followed instance #{target_instance}; id=#{activity.data["id"]}") {:ok, activity, follow} @@ -56,7 +58,8 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do def unfollow(address) do with {:ok, target_instance} <- fetch_actor(address), %Actor{} = local_actor <- get_actor(), - {:ok, %Actor{} = target_actor} <- ActivityPub.get_or_fetch_actor_by_url(target_instance), + {:ok, %Actor{} = target_actor} <- + ActivityPubActor.get_or_fetch_actor_by_url(target_instance), {:ok, activity, follow} <- Follows.unfollow(local_actor, target_actor) do Logger.info("Relay: unfollowed instance #{target_instance}: id=#{activity.data["id"]}") {:ok, activity, follow} @@ -73,7 +76,8 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do with {:ok, target_instance} <- fetch_actor(address), %Actor{} = local_actor <- get_actor(), - {:ok, %Actor{} = target_actor} <- ActivityPub.get_or_fetch_actor_by_url(target_instance), + {:ok, %Actor{} = target_actor} <- + ActivityPubActor.get_or_fetch_actor_by_url(target_instance), {:ok, activity, follow} <- Follows.accept(target_actor, local_actor) do {:ok, activity, follow} end @@ -84,7 +88,8 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do with {:ok, target_instance} <- fetch_actor(address), %Actor{} = local_actor <- get_actor(), - {:ok, %Actor{} = target_actor} <- ActivityPub.get_or_fetch_actor_by_url(target_instance), + {:ok, %Actor{} = target_actor} <- + ActivityPubActor.get_or_fetch_actor_by_url(target_instance), {:ok, activity, follow} <- Follows.reject(target_actor, local_actor) do {:ok, activity, follow} end @@ -94,7 +99,8 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do Logger.debug("We're trying to refresh a remote instance") with {:ok, target_instance} <- fetch_actor(address), - {:ok, %Actor{} = target_actor} <- ActivityPub.get_or_fetch_actor_by_url(target_instance) do + {:ok, %Actor{} = target_actor} <- + ActivityPubActor.get_or_fetch_actor_by_url(target_instance) do Refresher.refresh_profile(target_actor) end end @@ -126,7 +132,7 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do end end - defp fetch_object(object) when is_bitstring(object), do: {object, object} + defp fetch_object(object) when is_binary(object), do: {object, object} @spec fetch_actor(String.t()) :: {:ok, String.t()} | {:error, String.t()} # Dirty hack @@ -159,7 +165,7 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do @spec finger_actor(String.t()) :: {:ok, String.t()} | {:error, String.t()} defp finger_actor(nickname) do case WebFinger.finger(nickname) do - {:ok, %{"url" => url}} when not is_nil(url) -> + {:ok, url} when is_binary(url) -> {:ok, url} _e -> diff --git a/lib/federation/activity_pub/transmogrifier.ex b/lib/federation/activity_pub/transmogrifier.ex index 620c2e747..e527ac915 100644 --- a/lib/federation/activity_pub/transmogrifier.ex +++ b/lib/federation/activity_pub/transmogrifier.ex @@ -18,6 +18,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do alias Mobilizon.Federation.ActivityPub alias Mobilizon.Federation.ActivityPub.{Activity, Refresher, Relay, Utils} + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityPub.Types.Ownable alias Mobilizon.Federation.ActivityStream.{Converter, Convertible} alias Mobilizon.Tombstone @@ -110,19 +111,19 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do {:ok, activity, event} else {:existing_event, %Event{} = event} -> {:ok, nil, event} - {:error, _, _} -> :error - {:error, _} -> :error + _ -> :error end end def handle_incoming(%{ "type" => "Create", - "object" => %{"type" => "Group", "id" => group_url} = _object - }) do - Logger.info("Handle incoming to create a group") + "object" => %{"type" => type, "id" => actor_url} = _object + }) + when type in ["Group", "Person", "Actor"] do + Logger.info("Handle incoming to create an actor") - with {:ok, %Actor{} = group} <- ActivityPub.get_or_fetch_actor_by_url(group_url) do - {:ok, nil, group} + with {:ok, %Actor{} = actor} <- ActivityPubActor.get_or_fetch_actor_by_url(actor_url) do + {:ok, nil, actor} end end @@ -201,8 +202,8 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do def handle_incoming( %{"type" => "Follow", "object" => followed, "actor" => follower, "id" => id} = _data ) do - with {:ok, %Actor{} = followed} <- ActivityPub.get_or_fetch_actor_by_url(followed, true), - {:ok, %Actor{} = follower} <- ActivityPub.get_or_fetch_actor_by_url(follower), + with {:ok, %Actor{} = followed} <- ActivityPubActor.get_or_fetch_actor_by_url(followed, true), + {:ok, %Actor{} = follower} <- ActivityPubActor.get_or_fetch_actor_by_url(follower), {:ok, activity, object} <- ActivityPub.follow(follower, followed, id, false) do {:ok, activity, object} else @@ -221,7 +222,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do with {:existing_todo_list, nil} <- {:existing_todo_list, Todos.get_todo_list_by_url(object_url)}, - {:ok, %Actor{url: actor_url}} <- ActivityPub.get_or_fetch_actor_by_url(actor_url), + {:ok, %Actor{url: actor_url}} <- ActivityPubActor.get_or_fetch_actor_by_url(actor_url), object_data when is_map(object_data) <- object |> Converter.TodoList.as_to_model_data(), {:ok, %Activity{} = activity, %TodoList{} = todo_list} <- @@ -295,7 +296,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do } = data ) do with actor_url <- Utils.get_actor(data), - {:ok, %Actor{} = actor} <- ActivityPub.get_or_fetch_actor_by_url(actor_url), + {:ok, %Actor{} = actor} <- ActivityPubActor.get_or_fetch_actor_by_url(actor_url), {:object_not_found, {:ok, %Activity{} = activity, object}} <- {:object_not_found, do_handle_incoming_accept_following(accepted_object, actor) || @@ -328,7 +329,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do %{"type" => "Reject", "object" => rejected_object, "actor" => _actor, "id" => id} = data ) do with actor_url <- Utils.get_actor(data), - {:ok, %Actor{} = actor} <- ActivityPub.get_or_fetch_actor_by_url(actor_url), + {:ok, %Actor{} = actor} <- ActivityPubActor.get_or_fetch_actor_by_url(actor_url), {:object_not_found, {:ok, activity, object}} <- {:object_not_found, do_handle_incoming_reject_following(rejected_object, actor) || @@ -359,7 +360,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do ) do with actor_url <- Utils.get_actor(data), {:ok, %Actor{id: actor_id, suspended: false} = actor} <- - ActivityPub.get_or_fetch_actor_by_url(actor_url), + ActivityPubActor.get_or_fetch_actor_by_url(actor_url), :ok <- Logger.debug("Fetching contained object"), {:ok, entity} <- process_announce_data(object, actor), :ok <- eventually_create_share(object, entity, actor_id) do @@ -371,14 +372,16 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do end end - def handle_incoming(%{ - "type" => "Update", - "object" => %{"type" => object_type} = object, - "actor" => _actor_id - }) + def handle_incoming( + %{ + "type" => "Update", + "object" => %{"type" => object_type} = object, + "actor" => _actor_id + } = params + ) when object_type in ["Person", "Group", "Application", "Service", "Organization"] do with {:ok, %Actor{suspended: false} = old_actor} <- - ActivityPub.get_or_fetch_actor_by_url(object["id"]), + ActivityPubActor.get_or_fetch_actor_by_url(object["id"]), object_data <- object |> Converter.Actor.as_to_model_data(), {:ok, %Activity{} = activity, %Actor{} = new_actor} <- @@ -386,7 +389,11 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do {:ok, activity, new_actor} else e -> - Logger.error(inspect(e)) + Sentry.capture_message("Error while handling an Update activity", + extra: %{params: params} + ) + + Logger.debug(inspect(e)) :error end end @@ -397,7 +404,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do ) do with actor <- Utils.get_actor(update_data), {:ok, %Actor{url: actor_url, suspended: false} = actor} <- - ActivityPub.get_or_fetch_actor_by_url(actor), + ActivityPubActor.get_or_fetch_actor_by_url(actor), {:ok, %Event{} = old_event} <- object |> Utils.get_url() |> ActivityPub.fetch_object_from_url(), object_data <- Converter.Event.as_to_model_data(object), @@ -422,7 +429,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do with actor <- Utils.get_actor(update_data), {:ok, %Actor{url: actor_url, suspended: false}} <- - ActivityPub.get_or_fetch_actor_by_url(actor), + ActivityPubActor.get_or_fetch_actor_by_url(actor), {:origin_check, true} <- {:origin_check, Utils.origin_check?(actor_url, update_data)}, object_data <- Converter.Comment.as_to_model_data(object), {:ok, old_entity} <- object |> Utils.get_url() |> ActivityPub.fetch_object_from_url(), @@ -442,7 +449,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do ) do with actor <- Utils.get_actor(update_data), {:ok, %Actor{url: actor_url, suspended: false} = actor} <- - ActivityPub.get_or_fetch_actor_by_url(actor), + ActivityPubActor.get_or_fetch_actor_by_url(actor), {:ok, %Post{} = old_post} <- object |> Utils.get_url() |> ActivityPub.fetch_object_from_url(), object_data <- Converter.Post.as_to_model_data(object), @@ -470,7 +477,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do when type in ["ResourceCollection", "Document"] do with actor <- Utils.get_actor(update_data), {:ok, %Actor{url: actor_url, suspended: false}} <- - ActivityPub.get_or_fetch_actor_by_url(actor), + ActivityPubActor.get_or_fetch_actor_by_url(actor), {:ok, %Resource{} = old_resource} <- object |> Utils.get_url() |> ActivityPub.fetch_object_from_url(), object_data <- Converter.Resource.as_to_model_data(object), @@ -495,7 +502,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do with actor <- Utils.get_actor(update_data), {:ok, %Actor{url: actor_url, suspended: false} = actor} <- - ActivityPub.get_or_fetch_actor_by_url(actor), + ActivityPubActor.get_or_fetch_actor_by_url(actor), {:origin_check, true} <- {:origin_check, Utils.origin_check?(actor_url, update_data)}, object_data <- Converter.Member.as_to_model_data(object), {:ok, old_entity} <- object |> Utils.get_url() |> ActivityPub.fetch_object_from_url(), @@ -537,7 +544,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do } = data ) do with actor <- Utils.get_actor(data), - {:ok, %Actor{} = actor} <- ActivityPub.get_or_fetch_actor_by_url(actor), + {:ok, %Actor{} = actor} <- ActivityPubActor.get_or_fetch_actor_by_url(actor), {:ok, object} <- fetch_obj_helper_as_activity_streams(object_id), {:ok, activity, object} <- ActivityPub.unannounce(actor, object, id, cancelled_activity_id, false) do @@ -555,8 +562,9 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do "id" => id } = _data ) do - with {:ok, %Actor{domain: nil} = followed} <- ActivityPub.get_or_fetch_actor_by_url(followed), - {:ok, %Actor{} = follower} <- ActivityPub.get_or_fetch_actor_by_url(follower), + with {:ok, %Actor{domain: nil} = followed} <- + ActivityPubActor.get_or_fetch_actor_by_url(followed), + {:ok, %Actor{} = follower} <- ActivityPubActor.get_or_fetch_actor_by_url(follower), {:ok, activity, object} <- ActivityPub.unfollow(follower, followed, id, false) do {:ok, activity, object} else @@ -572,7 +580,8 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do %{"type" => "Delete", "object" => object, "actor" => _actor, "id" => _id} = data ) do with actor_url <- Utils.get_actor(data), - {:ok, %Actor{} = actor} <- ActivityPub.get_or_fetch_actor_by_url(actor_url), + {:actor, {:ok, %Actor{} = actor}} <- + {:actor, ActivityPubActor.get_or_fetch_actor_by_url(actor_url)}, object_id <- Utils.get_url(object), {:ok, object} <- is_group_object_gone(object_id), {:origin_check, true} <- @@ -586,8 +595,25 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do Logger.warn("Object origin check failed") :error + {:actor, {:error, "Could not fetch by AP id"}} -> + {:error, :unknown_actor} + + {:error, e} -> + Logger.debug(inspect(e)) + + # Sentry.capture_message("Error while handling a Delete activity", + # extra: %{data: data} + # ) + + :error + e -> Logger.error(inspect(e)) + + # Sentry.capture_message("Error while handling a Delete activity", + # extra: %{data: data} + # ) + :error end end @@ -598,7 +624,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do when type in ["ResourceCollection", "Document"] do with actor <- Utils.get_actor(data), {:ok, %Actor{url: actor_url, suspended: false} = actor} <- - ActivityPub.get_or_fetch_actor_by_url(actor), + ActivityPubActor.get_or_fetch_actor_by_url(actor), {:ok, %Resource{} = old_resource} <- object |> Utils.get_url() |> ActivityPub.fetch_object_from_url(), object_data <- Converter.Resource.as_to_model_data(object), @@ -610,7 +636,12 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do {:ok, activity, new_resource} else e -> - Logger.error(inspect(e)) + Logger.debug(inspect(e)) + + Sentry.capture_message("Error while handling an Move activity", + extra: %{data: data} + ) + :error end end @@ -625,7 +656,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do ) do with actor <- Utils.get_actor(data), {:ok, %Actor{url: _actor_url, suspended: false} = actor} <- - ActivityPub.get_or_fetch_actor_by_url(actor), + ActivityPubActor.get_or_fetch_actor_by_url(actor), object <- Utils.get_url(object), {:ok, object} <- ActivityPub.fetch_object_from_url(object), {:ok, activity, object} <- @@ -643,7 +674,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do def handle_incoming(%{"type" => "Leave", "object" => object, "actor" => actor} = data) do with actor <- Utils.get_actor(data), - {:ok, %Actor{} = actor} <- ActivityPub.get_or_fetch_actor_by_url(actor), + {:ok, %Actor{} = actor} <- ActivityPubActor.get_or_fetch_actor_by_url(actor), object <- Utils.get_url(object), {:ok, object} <- ActivityPub.fetch_object_from_url(object), {:ok, activity, object} <- ActivityPub.leave(object, actor, false) do @@ -673,10 +704,10 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do Logger.info("Handle incoming to invite someone") with {:ok, %Actor{} = actor} <- - data |> Utils.get_actor() |> ActivityPub.get_or_fetch_actor_by_url(), + data |> Utils.get_actor() |> ActivityPubActor.get_or_fetch_actor_by_url(), {:ok, object} <- object |> Utils.get_url() |> ActivityPub.fetch_object_from_url(), {:ok, %Actor{} = target} <- - target |> Utils.get_url() |> ActivityPub.get_or_fetch_actor_by_url(), + target |> Utils.get_url() |> ActivityPubActor.get_or_fetch_actor_by_url(), {:ok, activity, %Member{} = member} <- ActivityPub.invite(object, actor, target, false, %{url: id}) do {:ok, activity, member} @@ -689,10 +720,10 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do Logger.info("Handle incoming to remove a member from a group") with {:ok, %Actor{id: moderator_id} = moderator} <- - data |> Utils.get_actor() |> ActivityPub.get_or_fetch_actor_by_url(), + data |> Utils.get_actor() |> ActivityPubActor.get_or_fetch_actor_by_url(), {:ok, person_id} <- get_remove_object(object), {:ok, %Actor{type: :Group, id: group_id} = group} <- - origin |> Utils.get_url() |> ActivityPub.get_or_fetch_actor_by_url(), + origin |> Utils.get_url() |> ActivityPubActor.get_or_fetch_actor_by_url(), {:is_admin, {:ok, %Member{role: role}}} when role in [:moderator, :administrator, :creator] <- {:is_admin, Actors.get_member(moderator_id, group_id)}, @@ -741,6 +772,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do def handle_incoming(object) do Logger.info("Handing something with type #{object["type"]} not supported") Logger.debug(inspect(object)) + {:error, :not_supported} end diff --git a/lib/federation/activity_pub/types/actors.ex b/lib/federation/activity_pub/types/actors.ex index 66f7fd781..e0ac6d594 100644 --- a/lib/federation/activity_pub/types/actors.ex +++ b/lib/federation/activity_pub/types/actors.ex @@ -3,10 +3,11 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do alias Mobilizon.Actors alias Mobilizon.Actors.{Actor, Follower, Member} alias Mobilizon.Federation.ActivityPub - alias Mobilizon.Federation.ActivityPub.Audience + alias Mobilizon.Federation.ActivityPub.{Audience, Relay} alias Mobilizon.Federation.ActivityPub.Types.Entity alias Mobilizon.Federation.ActivityStream.Convertible alias Mobilizon.GraphQL.API.Utils, as: APIUtils + alias Mobilizon.Service.Activity.Group, as: GroupActivity alias Mobilizon.Service.Formatter.HTML alias Mobilizon.Service.Notifications.Scheduler alias Mobilizon.Web.Email.Follow, as: FollowMailer @@ -20,6 +21,11 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do def create(args, additional) do with args <- prepare_args_for_actor(args), {:ok, %Actor{} = actor} <- Actors.create_actor(args), + {:ok, _} <- + GroupActivity.insert_activity(actor, + subject: "group_created", + actor_id: args.creator_actor_id + ), actor_as_data <- Convertible.model_to_as(actor), audience <- %{"to" => ["https://www.w3.org/ns/activitystreams#Public"], "cc" => []}, create_data <- @@ -32,6 +38,12 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do @spec update(Actor.t(), map, map) :: {:ok, Actor.t(), Activity.t()} | any def update(%Actor{} = old_actor, args, additional) do with {:ok, %Actor{} = new_actor} <- Actors.update_actor(old_actor, args), + {:ok, _} <- + GroupActivity.insert_activity(new_actor, + subject: "group_updated", + old_group: old_actor, + updater_actor: Map.get(args, :updater_actor) + ), actor_as_data <- Convertible.model_to_as(new_actor), {:ok, true} <- Cachex.del(:activity_pub, "actor_#{new_actor.preferred_username}"), audience <- @@ -112,7 +124,11 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do |> Map.get(:metadata, %{}) |> Map.update(:message, nil, &String.trim(HTML.strip_tags(&1))) }), - Absinthe.Subscription.publish(Endpoint, actor, group_membership_changed: actor.id), + {:ok, _} <- + Mobilizon.Service.Activity.Member.insert_activity(member, subject: "member_joined"), + Absinthe.Subscription.publish(Endpoint, actor, + group_membership_changed: [Actor.preferred_username_and_domain(group), actor.id] + ), join_data <- %{ "type" => "Join", "id" => member.url, @@ -207,7 +223,10 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do %Follower{} = follower, follow_as_data ) do - unless follower.target_actor.manually_approves_followers do + %Actor{id: relay_id} = Relay.get_actor() + + unless follower.target_actor.manually_approves_followers or + follower.target_actor.id == relay_id do {:accept, ActivityPub.accept( :follow, diff --git a/lib/federation/activity_pub/types/comments.ex b/lib/federation/activity_pub/types/comments.ex index ee4c206b8..e7d1a3d3a 100644 --- a/lib/federation/activity_pub/types/comments.ex +++ b/lib/federation/activity_pub/types/comments.ex @@ -9,6 +9,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Comments do alias Mobilizon.Federation.ActivityStream.Converter.Utils, as: ConverterUtils alias Mobilizon.Federation.ActivityStream.Convertible alias Mobilizon.GraphQL.API.Utils, as: APIUtils + alias Mobilizon.Service.Activity.Comment, as: CommentActivity alias Mobilizon.Share alias Mobilizon.Tombstone alias Mobilizon.Web.Endpoint @@ -24,6 +25,10 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Comments do :ok <- make_sure_event_allows_commenting(args), {:ok, %Comment{discussion_id: discussion_id} = comment} <- Discussions.create_comment(args), + {:ok, _} <- + CommentActivity.insert_activity(comment, + subject: "comment_posted" + ), :ok <- maybe_publish_graphql_subscription(discussion_id), comment_as_data <- Convertible.model_to_as(comment), audience <- diff --git a/lib/federation/activity_pub/types/discussions.ex b/lib/federation/activity_pub/types/discussions.ex index 57eb77033..3f06baed1 100644 --- a/lib/federation/activity_pub/types/discussions.ex +++ b/lib/federation/activity_pub/types/discussions.ex @@ -7,6 +7,8 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Discussions do alias Mobilizon.Federation.ActivityPub.Audience alias Mobilizon.Federation.ActivityPub.Types.Entity alias Mobilizon.Federation.ActivityStream.Convertible + alias Mobilizon.GraphQL.API.Utils, as: APIUtils + alias Mobilizon.Service.Activity.Discussion, as: DiscussionActivity alias Mobilizon.Web.Endpoint import Mobilizon.Federation.ActivityPub.Utils, only: [make_create_data: 2, make_update_data: 2] require Logger @@ -16,9 +18,15 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Discussions do @impl Entity @spec create(map(), map()) :: {:ok, map()} def create(%{discussion_id: discussion_id} = args, additional) when not is_nil(discussion_id) do - with %Discussion{} = discussion <- Discussions.get_discussion(discussion_id), + with args <- prepare_args(args), + %Discussion{} = discussion <- Discussions.get_discussion(discussion_id), {:ok, %Discussion{last_comment_id: last_comment_id} = discussion} <- Discussions.reply_to_discussion(discussion, args), + {:ok, _} <- + DiscussionActivity.insert_activity(discussion, + subject: "discussion_replied", + actor_id: Map.get(args, :creator_id, args.actor_id) + ), %Comment{} = last_comment <- Discussions.get_comment_with_preload(last_comment_id), :ok <- maybe_publish_graphql_subscription(discussion), comment_as_data <- Convertible.model_to_as(last_comment), @@ -33,8 +41,11 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Discussions do @impl Entity @spec create(map(), map()) :: {:ok, map()} def create(args, additional) do - with {:ok, %Discussion{} = discussion} <- + with args <- prepare_args(args), + {:ok, %Discussion{} = discussion} <- Discussions.create_discussion(args), + {:ok, _} <- + DiscussionActivity.insert_activity(discussion, subject: "discussion_created"), discussion_as_data <- Convertible.model_to_as(discussion), audience <- Audience.calculate_to_and_cc_from_mentions(discussion), @@ -49,6 +60,11 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Discussions do def update(%Discussion{} = old_discussion, args, additional) do with {:ok, %Discussion{} = new_discussion} <- Discussions.update_discussion(old_discussion, args), + {:ok, _} <- + DiscussionActivity.insert_activity(new_discussion, + subject: "discussion_renamed", + old_discussion: old_discussion + ), {:ok, true} <- Cachex.del(:activity_pub, "discussion_#{new_discussion.slug}"), discussion_as_data <- Convertible.model_to_as(new_discussion), audience <- @@ -71,7 +87,12 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Discussions do _local, _additionnal ) do - with {:ok, _} <- Discussions.delete_discussion(discussion) do + with {:ok, _} <- Discussions.delete_discussion(discussion), + {:ok, _} <- + DiscussionActivity.insert_activity(discussion, + subject: "discussion_deleted", + moderator: actor + ) do # This is just fake activity_data = %{ "type" => "Delete", @@ -100,4 +121,19 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Discussions do :ok end + + defp prepare_args(args) do + {text, _mentions, _tags} = + APIUtils.make_content_html( + args |> Map.get(:text, "") |> String.trim(), + # Can't put additional tags on a comment + [], + "text/html" + ) + + args + # title might be nil + |> Map.update(:title, "", fn title -> String.trim(title || "") end) + |> Map.put(:text, text) + end end diff --git a/lib/federation/activity_pub/types/events.ex b/lib/federation/activity_pub/types/events.ex index 2cd0a9d5e..32e814296 100644 --- a/lib/federation/activity_pub/types/events.ex +++ b/lib/federation/activity_pub/types/events.ex @@ -10,6 +10,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Events do alias Mobilizon.Federation.ActivityStream.Converter.Utils, as: ConverterUtils alias Mobilizon.Federation.ActivityStream.Convertible alias Mobilizon.GraphQL.API.Utils, as: APIUtils + alias Mobilizon.Service.Activity.Event, as: EventActivity alias Mobilizon.Service.Formatter.HTML alias Mobilizon.Service.Notifications.Scheduler alias Mobilizon.Share @@ -24,6 +25,8 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Events do def create(args, additional) do with args <- prepare_args_for_event(args), {:ok, %Event{} = event} <- EventsManager.create_event(args), + {:ok, _} <- + EventActivity.insert_activity(event, subject: "event_created"), event_as_data <- Convertible.model_to_as(event), audience <- Audience.calculate_to_and_cc_from_mentions(event), @@ -38,6 +41,8 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Events do def update(%Event{} = old_event, args, additional) do with args <- prepare_args_for_event(args), {:ok, %Event{} = new_event} <- EventsManager.update_event(old_event, args), + {:ok, _} <- + EventActivity.insert_activity(new_event, subject: "event_updated"), {:ok, true} <- Cachex.del(:activity_pub, "event_#{new_event.uuid}"), event_as_data <- Convertible.model_to_as(new_event), audience <- @@ -66,6 +71,8 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Events do with audience <- Audience.calculate_to_and_cc_from_mentions(event), {:ok, %Event{} = event} <- EventsManager.delete_event(event), + {:ok, _} <- + EventActivity.insert_activity(event, subject: "event_deleted"), {:ok, true} <- Cachex.del(:activity_pub, "event_#{event.uuid}"), {:ok, %Tombstone{} = _tombstone} <- Tombstone.create_tombstone(%{uri: event.url, actor_id: actor.id}) do diff --git a/lib/federation/activity_pub/types/members.ex b/lib/federation/activity_pub/types/members.ex index cb1c7ae97..8c55fa72a 100644 --- a/lib/federation/activity_pub/types/members.ex +++ b/lib/federation/activity_pub/types/members.ex @@ -4,13 +4,20 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Members do alias Mobilizon.Actors.{Actor, Member} alias Mobilizon.Federation.ActivityPub alias Mobilizon.Federation.ActivityStream.Convertible + alias Mobilizon.Service.Activity.Member, as: MemberActivity + alias Mobilizon.Web.Endpoint require Logger import Mobilizon.Federation.ActivityPub.Utils, only: [make_update_data: 2] def update( - %Member{parent: %Actor{id: group_id}, id: member_id, role: current_role} = member, + %Member{ + parent: %Actor{id: group_id} = group, + id: member_id, + role: current_role, + actor: %Actor{id: actor_id} = actor + } = old_member, %{role: updated_role} = args, - %{moderator: %Actor{url: moderator_url, id: moderator_id}} = additional + %{moderator: %Actor{url: moderator_url, id: moderator_id} = moderator} = additional ) do with additional <- Map.delete(additional, :moderator), {:has_rights_to_update_role, {:ok, %Member{role: moderator_role}}} @@ -19,7 +26,16 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Members do {:is_only_admin, false} <- {:is_only_admin, check_admins_left(member_id, group_id, current_role, updated_role)}, {:ok, %Member{} = member} <- - Actors.update_member(member, args), + Actors.update_member(old_member, args), + {:ok, _} <- + MemberActivity.insert_activity(member, + old_member: old_member, + moderator: moderator, + subject: "member_updated" + ), + Absinthe.Subscription.publish(Endpoint, actor, + group_membership_changed: [Actor.preferred_username_and_domain(group), actor_id] + ), {:ok, true} <- Cachex.del(:activity_pub, "member_#{member_id}"), member_as_data <- Convertible.model_to_as(member), diff --git a/lib/federation/activity_pub/types/posts.ex b/lib/federation/activity_pub/types/posts.ex index 22b145a66..8421f70d9 100644 --- a/lib/federation/activity_pub/types/posts.ex +++ b/lib/federation/activity_pub/types/posts.ex @@ -7,6 +7,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Posts do alias Mobilizon.Federation.ActivityStream.Converter.Utils, as: ConverterUtils alias Mobilizon.Federation.ActivityStream.Convertible alias Mobilizon.Posts.Post + alias Mobilizon.Service.Activity.Post, as: PostsActivity require Logger import Mobilizon.Federation.ActivityPub.Utils, only: [make_create_data: 2, make_update_data: 2] @@ -19,13 +20,12 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Posts do with args <- Map.update(args, :tags, [], &ConverterUtils.fetch_tags/1), {:ok, %Post{attributed_to_id: group_id, author_id: creator_id} = post} <- Posts.create_post(args), + {:ok, _} <- PostsActivity.insert_activity(post, subject: "post_created"), {:ok, %Actor{} = group} <- Actors.get_group_by_actor_id(group_id), %Actor{} = creator <- Actors.get_actor(creator_id), post_as_data <- - Convertible.model_to_as(%{post | attributed_to: group, author: creator}), - audience <- - Audience.calculate_to_and_cc_from_mentions(post) do - create_data = make_create_data(post_as_data, Map.merge(audience, additional)) + Convertible.model_to_as(%{post | attributed_to: group, author: creator}) do + create_data = make_create_data(post_as_data, additional) {:ok, post, create_data} else @@ -40,6 +40,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Posts do with args <- Map.update(args, :tags, [], &ConverterUtils.fetch_tags/1), {:ok, %Post{attributed_to_id: group_id, author_id: creator_id} = post} <- Posts.update_post(post, args), + {:ok, _} <- PostsActivity.insert_activity(post, subject: "post_updated"), {:ok, true} <- Cachex.del(:activity_pub, "post_#{post.slug}"), {:ok, %Actor{} = group} <- Actors.get_group_by_actor_id(group_id), %Actor{} = creator <- Actors.get_actor(creator_id), @@ -76,6 +77,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Posts do } with {:ok, %Post{} = post} <- Posts.delete_post(post), + {:ok, _} <- PostsActivity.insert_activity(post, subject: "post_deleted"), {:ok, true} <- Cachex.del(:activity_pub, "post_#{post.slug}"), {:ok, %Tombstone{} = _tombstone} <- Tombstone.create_tombstone(%{uri: post.url, actor_id: actor.id}) do diff --git a/lib/federation/activity_pub/types/resources.ex b/lib/federation/activity_pub/types/resources.ex index c57afcb86..61157afc6 100644 --- a/lib/federation/activity_pub/types/resources.ex +++ b/lib/federation/activity_pub/types/resources.ex @@ -5,6 +5,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Resources do alias Mobilizon.Federation.ActivityPub.Types.Entity alias Mobilizon.Federation.ActivityStream.Convertible alias Mobilizon.Resources.Resource + alias Mobilizon.Service.Activity.Resource, as: ResourceActivity alias Mobilizon.Service.RichMedia.Parser require Logger @@ -33,6 +34,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Resources do with {:ok, %Resource{actor_id: group_id, creator_id: creator_id, parent_id: parent_id} = resource} <- Resources.create_resource(args), + {:ok, _} <- ResourceActivity.insert_activity(resource, subject: "resource_created"), {:ok, %Actor{} = group} <- Actors.get_group_by_actor_id(group_id), %Actor{url: creator_url} = creator <- Actors.get_actor(creator_id), resource_as_data <- @@ -63,7 +65,12 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Resources do end @impl Entity - def update(%Resource{} = old_resource, %{parent_id: _parent_id} = args, additional) do + def update( + %Resource{parent_id: old_parent_id} = old_resource, + %{parent_id: parent_id} = args, + additional + ) + when old_parent_id != parent_id do move(old_resource, args, additional) end @@ -71,6 +78,11 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Resources do def update(%Resource{} = old_resource, %{title: title} = _args, additional) do with {:ok, %Resource{actor_id: group_id, creator_id: creator_id} = resource} <- Resources.update_resource(old_resource, %{title: title}), + {:ok, _} <- + ResourceActivity.insert_activity(resource, + subject: "resource_renamed", + old_resource: old_resource + ), {:ok, %Actor{} = group} <- Actors.get_group_by_actor_id(group_id), %Actor{url: creator_url} <- Actors.get_actor(creator_id), resource_as_data <- @@ -100,6 +112,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Resources do %Resource{actor_id: group_id, creator_id: creator_id, parent_id: new_parent_id} = resource} <- Resources.update_resource(old_resource, args), + {:ok, _} <- ResourceActivity.insert_activity(resource, subject: "resource_moved"), old_parent <- Resources.get_resource(old_parent_id), new_parent <- Resources.get_resource(new_parent_id), {:ok, %Actor{} = group} <- Actors.get_group_by_actor_id(group_id), @@ -146,6 +159,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Resources do } with {:ok, _resource} <- Resources.delete_resource(resource), + {:ok, _} <- ResourceActivity.insert_activity(resource, subject: "resource_deleted"), {:ok, true} <- Cachex.del(:activity_pub, "resource_#{resource.id}") do {:ok, activity_data, actor, resource} end diff --git a/lib/federation/activity_pub/utils.ex b/lib/federation/activity_pub/utils.ex index 6d39f3034..01ad1abc6 100644 --- a/lib/federation/activity_pub/utils.ex +++ b/lib/federation/activity_pub/utils.ex @@ -14,6 +14,7 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do alias Mobilizon.Federation.ActivityPub alias Mobilizon.Federation.ActivityPub.{Activity, Federator, Relay} + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityPub.Types.Ownable alias Mobilizon.Federation.ActivityStream.Converter alias Mobilizon.Federation.HTTPSignatures @@ -26,7 +27,7 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do # Some implementations send the actor URI as the actor field, others send the entire actor object, # so figure out what the actor's URI is based on what we have. def get_url(%{"id" => id}), do: id - def get_url(id) when is_bitstring(id), do: id + def get_url(id) when is_binary(id), do: id def get_url(ids) when is_list(ids), do: get_url(hd(ids)) def get_url(_), do: nil @@ -175,7 +176,7 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do @spec remote_actors(list(String.t())) :: list(Actor.t()) def remote_actors(recipients) do recipients - |> Enum.map(fn url -> ActivityPub.get_or_fetch_actor_by_url(url) end) + |> Enum.map(fn url -> ActivityPubActor.get_or_fetch_actor_by_url(url) end) |> Enum.map(fn {status, actor} -> case status do :ok -> @@ -223,7 +224,7 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do end end - def get_actor(%{"actor" => %{"id" => id}}) when is_bitstring(id) do + def get_actor(%{"actor" => %{"id" => id}}) when is_binary(id) do id end @@ -259,7 +260,9 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do are_same_origin?(id, actor) end - def origin_check?(_id, %{"type" => type} = _params) when type in ["Actor", "Group"], do: true + def origin_check?(id, %{"type" => type, "id" => actor_id} = _params) + when type in ["Actor", "Person", "Group"], + do: id == actor_id def origin_check?(_id, %{"actor" => nil} = _args), do: false @@ -421,7 +424,13 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do ["https://www.w3.org/ns/activitystreams#Public"]} else if actor_type == :Group do - {[actor.followers_url, actor.members_url], []} + to = + (object["to"] || []) + |> MapSet.new() + |> MapSet.intersection(MapSet.new([actor.followers_url, actor.members_url])) + |> MapSet.to_list() + + {to, []} else {[actor.followers_url], []} end @@ -695,4 +704,42 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do true end end + + @spec label_in_collection?(any(), any()) :: boolean() + defp label_in_collection?(url, coll) when is_binary(coll), do: url == coll + defp label_in_collection?(url, coll) when is_list(coll), do: url in coll + defp label_in_collection?(_, _), do: false + + @spec label_in_message?(String.t(), map()) :: boolean() + def label_in_message?(label, params), + do: + [params["to"], params["cc"], params["bto"], params["bcc"]] + |> Enum.any?(&label_in_collection?(label, &1)) + + @spec unaddressed_message?(map()) :: boolean() + def unaddressed_message?(params), + do: + [params["to"], params["cc"], params["bto"], params["bcc"]] + |> Enum.all?(&is_nil(&1)) + + @spec recipient_in_message(Actor.t(), Actor.t(), map()) :: boolean() + def recipient_in_message(%Actor{url: url} = _recipient, %Actor{} = _actor, params), + do: label_in_message?(url, params) || unaddressed_message?(params) + + defp extract_list(target) when is_binary(target), do: [target] + defp extract_list(lst) when is_list(lst), do: lst + defp extract_list(_), do: [] + + def maybe_splice_recipient(url, params) do + need_splice? = + !label_in_collection?(url, params["to"]) && + !label_in_collection?(url, params["cc"]) + + if need_splice? do + cc_list = extract_list(params["cc"]) + Map.put(params, "cc", [url | cc_list]) + else + params + end + end end diff --git a/lib/federation/activity_stream/converter/discussion.ex b/lib/federation/activity_stream/converter/discussion.ex index 819b0a2da..2029923d6 100644 --- a/lib/federation/activity_stream/converter/discussion.ex +++ b/lib/federation/activity_stream/converter/discussion.ex @@ -8,7 +8,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Discussion do alias Mobilizon.Actors.Actor alias Mobilizon.Discussions.Discussion - alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityStream.{Converter, Convertible} alias Mobilizon.Federation.ActivityStream.Converter.Discussion, as: DiscussionConverter alias Mobilizon.Storage.Repo @@ -31,7 +31,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Discussion do %{ "type" => "Note", - "to" => [discussion.actor.followers_url], + "to" => [discussion.actor.members_url], "cc" => [], "name" => discussion.title, "content" => discussion.last_comment.text, @@ -49,10 +49,10 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Discussion do def as_to_model_data(%{"type" => "Note", "name" => name} = object) when not is_nil(name) do with creator_url <- Map.get(object, "actor"), {:ok, %Actor{id: creator_id, suspended: false}} <- - ActivityPub.get_or_fetch_actor_by_url(creator_url), + ActivityPubActor.get_or_fetch_actor_by_url(creator_url), actor_url <- Map.get(object, "attributedTo"), {:ok, %Actor{id: actor_id, suspended: false}} <- - ActivityPub.get_or_fetch_actor_by_url(actor_url) do + ActivityPubActor.get_or_fetch_actor_by_url(actor_url) do %{ title: name, actor_id: actor_id, diff --git a/lib/federation/activity_stream/converter/event.ex b/lib/federation/activity_stream/converter/event.ex index a45200b5a..d2e932358 100644 --- a/lib/federation/activity_stream/converter/event.ex +++ b/lib/federation/activity_stream/converter/event.ex @@ -70,7 +70,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Event do status: object |> Map.get("ical:status", "CONFIRMED") |> String.downcase(), online_address: object |> Map.get("attachment", []) |> get_online_address(), phone_address: object["phoneAddress"], - draft: false, + draft: object["draft"] == true, url: object["id"], uuid: object["uuid"], tags: tags, @@ -119,7 +119,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Event do "commentsEnabled" => event.options.comment_moderation == :allow_all, "anonymousParticipationEnabled" => event.options.anonymous_participation, "attachment" => [], - # "draft" => event.draft, + "draft" => event.draft, "ical:status" => event.status |> to_string |> String.upcase(), "id" => event.url, "url" => event.url @@ -155,7 +155,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Event do end @spec get_address(map | binary | nil) :: integer | nil - defp get_address(address_url) when is_bitstring(address_url) do + defp get_address(address_url) when is_binary(address_url) do get_address(%{"id" => address_url}) end diff --git a/lib/federation/activity_stream/converter/flag.ex b/lib/federation/activity_stream/converter/flag.ex index 975b78a84..290551e02 100644 --- a/lib/federation/activity_stream/converter/flag.ex +++ b/lib/federation/activity_stream/converter/flag.ex @@ -14,7 +14,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Flag do alias Mobilizon.Events.Event alias Mobilizon.Reports.Report - alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityPub.Relay alias Mobilizon.Federation.ActivityStream.{Converter, Convertible} @@ -65,10 +65,11 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Flag do @spec as_to_model(map) :: map def as_to_model(%{"object" => objects} = object) do - with {:ok, %Actor{} = reporter} <- ActivityPub.get_or_fetch_actor_by_url(object["actor"]), + with {:ok, %Actor{} = reporter} <- + ActivityPubActor.get_or_fetch_actor_by_url(object["actor"]), %Actor{} = reported <- Enum.reduce_while(objects, nil, fn url, _ -> - case ActivityPub.get_or_fetch_actor_by_url(url) do + case ActivityPubActor.get_or_fetch_actor_by_url(url) do {:ok, %Actor{} = actor} -> {:halt, actor} diff --git a/lib/federation/activity_stream/converter/media.ex b/lib/federation/activity_stream/converter/media.ex index 40ddb90b4..0f1b350e2 100644 --- a/lib/federation/activity_stream/converter/media.ex +++ b/lib/federation/activity_stream/converter/media.ex @@ -38,7 +38,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Media do %{"type" => "Document", "url" => media_url, "name" => name}, actor_id ) - when is_bitstring(media_url) do + when is_binary(media_url) do with {:ok, %{body: body}} <- Tesla.get(media_url, opts: @http_options), {:ok, %{name: name, url: url, content_type: content_type, size: size}} <- Upload.store(%{body: body, name: name}), diff --git a/lib/federation/activity_stream/converter/member.ex b/lib/federation/activity_stream/converter/member.ex index 0d55e8ef1..be4db50a5 100644 --- a/lib/federation/activity_stream/converter/member.ex +++ b/lib/federation/activity_stream/converter/member.ex @@ -8,7 +8,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Member do alias Mobilizon.Actors.Actor alias Mobilizon.Actors.Member, as: MemberModel - alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityPub.Utils alias Mobilizon.Federation.ActivityStream.Convertible @@ -53,5 +53,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Member do @spec get_actor(String.t() | map() | nil) :: {:ok, Actor.t()} | {:error, String.t()} defp get_actor(nil), do: {:error, "nil property found for actor data"} - defp get_actor(actor), do: actor |> Utils.get_url() |> ActivityPub.get_or_fetch_actor_by_url() + + defp get_actor(actor), + do: actor |> Utils.get_url() |> ActivityPubActor.get_or_fetch_actor_by_url() end diff --git a/lib/federation/activity_stream/converter/post.ex b/lib/federation/activity_stream/converter/post.ex index 45c7ad5d9..f8d23c7ce 100644 --- a/lib/federation/activity_stream/converter/post.ex +++ b/lib/federation/activity_stream/converter/post.ex @@ -6,8 +6,8 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Post do internal one, and back. """ alias Mobilizon.Actors.Actor - alias Mobilizon.Federation.ActivityPub - alias Mobilizon.Federation.ActivityPub.Utils + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor + alias Mobilizon.Federation.ActivityPub.{Audience, Utils} alias Mobilizon.Federation.ActivityStream.{Converter, Convertible} alias Mobilizon.Federation.ActivityStream.Converter.Media, as: MediaConverter alias Mobilizon.Posts.Post @@ -36,26 +36,25 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Post do def model_to_as( %Post{ author: %Actor{url: actor_url}, - attributed_to: %Actor{url: creator_url, followers_url: followers_url} + attributed_to: %Actor{ + url: creator_url + } } = post ) do - to = - if post.visibility == :public, - do: ["https://www.w3.org/ns/activitystreams#Public"], - else: [followers_url] + audience = Audience.calculate_to_and_cc_from_mentions(post) %{ "type" => "Article", - "to" => to, - "cc" => [], "actor" => actor_url, "id" => post.url, "name" => post.title, "content" => post.body, "attributedTo" => creator_url, "published" => (post.publish_at || post.inserted_at) |> to_date(), - "attachment" => [] + "attachment" => [], + "draft" => post.draft } + |> Map.merge(audience) |> maybe_add_post_picture(post) |> maybe_add_inline_media(post) end @@ -81,7 +80,8 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Post do local: false, publish_at: object["published"], picture_id: picture_id, - medias: medias + medias: medias, + draft: object["draft"] == true } else {:error, err} -> {:error, err} @@ -91,8 +91,11 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Post do @spec get_actor(String.t() | map() | nil) :: {:ok, Actor.t()} | {:error, String.t()} defp get_actor(nil), do: {:error, "nil property found for actor data"} - defp get_actor(actor), do: actor |> Utils.get_url() |> ActivityPub.get_or_fetch_actor_by_url() + defp get_actor(actor), + do: actor |> Utils.get_url() |> ActivityPubActor.get_or_fetch_actor_by_url() + + defp to_date(nil), do: nil defp to_date(%DateTime{} = date), do: DateTime.to_iso8601(date) defp to_date(%NaiveDateTime{} = date), do: NaiveDateTime.to_iso8601(date) diff --git a/lib/federation/activity_stream/converter/resource.ex b/lib/federation/activity_stream/converter/resource.ex index 7c045f256..0472ca1b0 100644 --- a/lib/federation/activity_stream/converter/resource.ex +++ b/lib/federation/activity_stream/converter/resource.ex @@ -7,6 +7,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Resource do """ alias Mobilizon.Actors.Actor alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityPub.Utils alias Mobilizon.Federation.ActivityStream.{Converter, Convertible} alias Mobilizon.Resources @@ -88,7 +89,9 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Resource do @spec get_actor(String.t() | map() | nil) :: {:ok, Actor.t()} | {:error, String.t()} defp get_actor(nil), do: {:error, "nil property found for actor data"} - defp get_actor(actor), do: actor |> Utils.get_url() |> ActivityPub.get_or_fetch_actor_by_url() + + defp get_actor(actor), + do: actor |> Utils.get_url() |> ActivityPubActor.get_or_fetch_actor_by_url() defp get_context(%Resource{parent_id: nil, actor: %Actor{resources_url: resources_url}}), do: resources_url diff --git a/lib/federation/activity_stream/converter/todo.ex b/lib/federation/activity_stream/converter/todo.ex index fad2d8a53..fdd6f38c8 100644 --- a/lib/federation/activity_stream/converter/todo.ex +++ b/lib/federation/activity_stream/converter/todo.ex @@ -7,6 +7,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Todo do """ alias Mobilizon.Actors.Actor alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityStream.{Converter, Convertible} alias Mobilizon.Todos alias Mobilizon.Todos.{Todo, TodoList} @@ -51,7 +52,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Todo do %{"type" => "Todo", "actor" => actor_url, "todoList" => todo_list_url} = object ) do with {:ok, %Actor{id: creator_id} = _creator} <- - ActivityPub.get_or_fetch_actor_by_url(actor_url), + ActivityPubActor.get_or_fetch_actor_by_url(actor_url), {:todo_list, %TodoList{id: todo_list_id}} <- {:todo_list, Todos.get_todo_list_by_url(todo_list_url)} do %{ diff --git a/lib/federation/activity_stream/converter/todo_list.ex b/lib/federation/activity_stream/converter/todo_list.ex index 657e97df3..76ad46fc7 100644 --- a/lib/federation/activity_stream/converter/todo_list.ex +++ b/lib/federation/activity_stream/converter/todo_list.ex @@ -6,7 +6,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.TodoList do internal one, and back. """ alias Mobilizon.Actors.Actor - alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityStream.{Converter, Convertible} alias Mobilizon.Todos.TodoList @@ -39,7 +39,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.TodoList do @impl Converter @spec as_to_model_data(map) :: {:ok, map} | {:error, any()} def as_to_model_data(%{"type" => "TodoList", "actor" => actor_url} = object) do - case ActivityPub.get_or_fetch_actor_by_url(actor_url) do + case ActivityPubActor.get_or_fetch_actor_by_url(actor_url) do {:ok, %Actor{type: :Group, id: group_id} = _group} -> %{ title: object["name"], diff --git a/lib/federation/activity_stream/converter/utils.ex b/lib/federation/activity_stream/converter/utils.ex index beb08fe03..a78456bd2 100644 --- a/lib/federation/activity_stream/converter/utils.ex +++ b/lib/federation/activity_stream/converter/utils.ex @@ -10,7 +10,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Utils do alias Mobilizon.Mention alias Mobilizon.Storage.Repo - alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityStream.Converter.Media, as: MediaConverter alias Mobilizon.Web.Endpoint @@ -94,7 +94,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Utils do end end - defp fetch_tag(tag) when is_bitstring(tag), do: [tag_without_hash(tag)] + defp fetch_tag(tag) when is_binary(tag), do: [tag_without_hash(tag)] defp tag_without_hash("#" <> tag_title), do: tag_title defp tag_without_hash(tag_title), do: tag_title @@ -114,7 +114,8 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Utils do @spec create_mention(map(), list()) :: list() defp create_mention(mention, acc) when is_map(mention) do with true <- mention["type"] == "Mention", - {:ok, %Actor{id: actor_id}} <- ActivityPub.get_or_fetch_actor_by_url(mention["href"]) do + {:ok, %Actor{id: actor_id}} <- + ActivityPubActor.get_or_fetch_actor_by_url(mention["href"]) do acc ++ [%{actor_id: actor_id}] else _err -> @@ -169,7 +170,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Utils do @spec fetch_actor(String.t()) :: Actor.t() defp fetch_actor(actor_url) do with {:ok, %Actor{suspended: false} = actor} <- - ActivityPub.get_or_fetch_actor_by_url(actor_url) do + ActivityPubActor.get_or_fetch_actor_by_url(actor_url) do actor end end diff --git a/lib/federation/http_signatures/signature.ex b/lib/federation/http_signatures/signature.ex index bab2b14d7..ff703a3ed 100644 --- a/lib/federation/http_signatures/signature.ex +++ b/lib/federation/http_signatures/signature.ex @@ -12,7 +12,7 @@ defmodule Mobilizon.Federation.HTTPSignatures.Signature do alias Mobilizon.Actors.Actor - alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor require Logger @@ -50,9 +50,10 @@ defmodule Mobilizon.Federation.HTTPSignatures.Signature do # Gets a public key for a given ActivityPub actor ID (url). @spec get_public_key_for_url(String.t()) :: - {:ok, String.t()} | {:error, :actor_fetch_error | :pem_decode_error} + {:ok, String.t()} + | {:error, :actor_fetch_error | :pem_decode_error | :actor_not_fetchable} defp get_public_key_for_url(url) do - with {:ok, %Actor{keys: keys}} <- ActivityPub.get_or_fetch_actor_by_url(url), + with {:ok, %Actor{keys: keys}} <- ActivityPubActor.get_or_fetch_actor_by_url(url), {:ok, public_key} <- prepare_public_key(keys) do {:ok, public_key} else @@ -61,8 +62,16 @@ defmodule Mobilizon.Federation.HTTPSignatures.Signature do {:error, :pem_decode_error} - _ -> + {:error, "Could not fetch by AP id"} -> + {:error, :actor_not_fetchable} + + err -> + Sentry.capture_message("Unable to fetch actor, so no keys for you", + extra: %{url: url} + ) + Logger.error("Unable to fetch actor, so no keys for you") + Logger.error(inspect(err)) {:error, :actor_fetch_error} end @@ -74,9 +83,6 @@ defmodule Mobilizon.Federation.HTTPSignatures.Signature do :ok <- Logger.debug("Fetching public key for #{actor_id}"), {:ok, public_key} <- get_public_key_for_url(actor_id) do {:ok, public_key} - else - e -> - {:error, e} end end @@ -84,12 +90,9 @@ defmodule Mobilizon.Federation.HTTPSignatures.Signature do with %{"keyId" => kid} <- HTTPSignatures.signature_for_conn(conn), actor_id <- key_id_to_actor_url(kid), :ok <- Logger.debug("Refetching public key for #{actor_id}"), - {:ok, _actor} <- ActivityPub.make_actor_from_url(actor_id), + {:ok, _actor} <- ActivityPubActor.make_actor_from_url(actor_id), {:ok, public_key} <- get_public_key_for_url(actor_id) do {:ok, public_key} - else - e -> - {:error, e} end end diff --git a/lib/federation/web_finger/web_finger.ex b/lib/federation/web_finger/web_finger.ex index c0b44e6c9..409f67b8f 100644 --- a/lib/federation/web_finger/web_finger.ex +++ b/lib/federation/web_finger/web_finger.ex @@ -10,28 +10,39 @@ defmodule Mobilizon.Federation.WebFinger do alias Mobilizon.Actors alias Mobilizon.Actors.Actor - alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.WebFinger.XmlBuilder - alias Mobilizon.Service.HTTP.WebfingerClient + alias Mobilizon.Service.HTTP.{HostMetaClient, WebfingerClient} alias Mobilizon.Web.Endpoint alias Mobilizon.Web.Router.Helpers, as: Routes require Jason require Logger + import SweetXml def host_meta do base_url = Endpoint.url() + %URI{host: host} = URI.parse(base_url) { :XRD, - %{xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0"}, - { - :Link, - %{ - rel: "lrdd", - type: "application/xrd+xml", - template: "#{base_url}/.well-known/webfinger?resource={uri}" + %{ + xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0", + "xmlns:hm": "http://host-meta.net/ns/1.0" + }, + [ + { + :"hm:Host", + host + }, + { + :Link, + %{ + rel: "lrdd", + type: "application/jrd+json", + template: "#{base_url}/.well-known/webfinger?resource={uri}" + } } - } + ] } |> XmlBuilder.to_doc() end @@ -45,7 +56,7 @@ defmodule Mobilizon.Federation.WebFinger do {:ok, represent_actor(actor, "JSON")} else _e -> - case ActivityPub.get_or_fetch_actor_by_url(resource) do + case ActivityPubActor.get_or_fetch_actor_by_url(resource) do {:ok, %Actor{} = actor} when not is_nil(actor) -> {:ok, represent_actor(actor, "JSON")} @@ -56,29 +67,116 @@ defmodule Mobilizon.Federation.WebFinger do end @spec represent_actor(Actor.t()) :: struct() - def represent_actor(actor), do: represent_actor(actor, "JSON") + def represent_actor(%Actor{} = actor), do: represent_actor(actor, "JSON") @spec represent_actor(Actor.t(), String.t()) :: struct() - def represent_actor(actor, "JSON") do - %{ - "subject" => "acct:#{actor.preferred_username}@#{Endpoint.host()}", - "aliases" => [actor.url], - "links" => [ + def represent_actor(%Actor{} = actor, "JSON") do + links = + [ %{"rel" => "self", "type" => "application/activity+json", "href" => actor.url}, - %{ - "rel" => "https://webfinger.net/rel/profile-page/", - "type" => "text/html", - "href" => actor.url - }, %{ "rel" => "http://ostatus.org/schema/1.0/subscribe", "template" => "#{Routes.page_url(Endpoint, :interact, uri: nil)}{uri}" } ] + |> maybe_add_avatar(actor) + |> maybe_add_profile_page(actor) + + %{ + "subject" => "acct:#{actor.preferred_username}@#{Endpoint.host()}", + "aliases" => [actor.url], + "links" => links } end - defp webfinger_from_json(doc) do + defp maybe_add_avatar(data, %Actor{avatar: avatar}) when not is_nil(avatar) do + data ++ + [ + %{ + "rel" => "http://webfinger.net/rel/avatar", + "type" => avatar.content_type, + "href" => avatar.url + } + ] + end + + defp maybe_add_avatar(data, _actor), do: data + + defp maybe_add_profile_page(data, %Actor{type: :Group, url: url}) do + data ++ + [ + %{ + "rel" => "http://webfinger.net/rel/profile-page/", + "type" => "text/html", + "href" => url + } + ] + end + + defp maybe_add_profile_page(data, _actor), do: data + + @doc """ + Finger an actor to retreive it's ActivityPub ID/URL + + Fetches the Extensible Resource Descriptor endpoint `/.well-known/host-meta` to find the Webfinger endpoint (usually `/.well-known/webfinger?resource=`) with `find_webfinger_endpoint/1` and then performs a Webfinger query to get the ActivityPub ID associated to an actor. + """ + @spec finger(String.t()) :: {:ok, String.t()} | {:error, atom()} + def finger(actor) do + actor = String.trim_leading(actor, "@") + + with address when is_binary(address) <- apply_webfinger_endpoint(actor), + false <- address_invalid(address), + {:ok, %{body: body, status: code}} when code in 200..299 <- + WebfingerClient.get(address), + {:ok, %{"url" => url}} <- webfinger_from_json(body) do + {:ok, url} + else + e -> + Logger.debug("Couldn't finger #{actor}") + Logger.debug(inspect(e)) + {:error, e} + end + end + + @doc """ + Fetches the Extensible Resource Descriptor endpoint `/.well-known/host-meta` to find the Webfinger endpoint (usually `/.well-known/webfinger?resource=`) + """ + @spec find_webfinger_endpoint(String.t()) :: String.t() + def find_webfinger_endpoint(domain) when is_binary(domain) do + with {:ok, %{body: body}} <- fetch_document("http://#{domain}/.well-known/host-meta"), + link_template <- find_link_from_template(body) do + {:ok, link_template} + end + end + + @spec apply_webfinger_endpoint(String.t()) :: String.t() | {:error, :host_not_found} + defp apply_webfinger_endpoint(actor) do + with {:ok, domain} <- domain_from_federated_actor(actor) do + case find_webfinger_endpoint(domain) do + {:ok, link_template} -> + String.replace(link_template, "{uri}", "acct:#{actor}") + + _ -> + "http://#{domain}/.well-known/webfinger?resource=acct:#{actor}" + end + end + end + + @spec domain_from_federated_actor(String.t()) :: {:ok, String.t()} | {:error, :host_not_found} + defp domain_from_federated_actor(actor) do + case String.split(actor, "@") do + [_name, domain] -> + {:ok, domain} + + _e -> + host = URI.parse(actor).host + if is_nil(host), do: {:error, :host_not_found}, else: {:ok, host} + end + end + + @spec webfinger_from_json(map() | String.t()) :: + {:ok, map()} | {:error, :webfinger_information_not_json} + defp webfinger_from_json(doc) when is_map(doc) do data = Enum.reduce(doc["links"], %{"subject" => doc["subject"]}, fn link, data -> case {link["type"], link["rel"]} do @@ -97,31 +195,26 @@ defmodule Mobilizon.Federation.WebFinger do {:ok, data} end - def finger(actor) do - actor = String.trim_leading(actor, "@") + defp webfinger_from_json(_doc), do: {:error, :webfinger_information_not_json} - domain = - case String.split(actor, "@") do - [_name, domain] -> - domain + @spec find_link_from_template(String.t()) :: String.t() | {:error, :link_not_found} + defp find_link_from_template(doc) do + with res when res in [nil, ""] <- + xpath(doc, ~x"//Link[@rel=\"lrdd\"][@type=\"application/json\"]/@template"s), + res when res in [nil, ""] <- xpath(doc, ~x"//Link[@rel=\"lrdd\"]/@template"s), + do: {:error, :link_not_found} + end - _e -> - URI.parse(actor).host - end + @spec fetch_document(String.t()) :: Tesla.Env.result() + defp fetch_document(endpoint) do + with {:error, err} <- HostMetaClient.get(endpoint), do: {:error, err} + end - address = "http://#{domain}/.well-known/webfinger?resource=acct:#{actor}" - - Logger.debug(inspect(address)) - - with false <- is_nil(domain), - {:ok, %{body: body, status: code}} when code in 200..299 <- - WebfingerClient.get(address) do - webfinger_from_json(body) - else - e -> - Logger.debug(fn -> "Couldn't finger #{actor}" end) - Logger.debug(fn -> inspect(e) end) - {:error, e} + @spec address_invalid(String.t()) :: false | {:error, :invalid_address} + defp address_invalid(address) do + with %URI{host: host, scheme: scheme} <- URI.parse(address), + true <- is_nil(host) or is_nil(scheme) do + {:error, :invalid_address} end end end diff --git a/lib/graphql/api/search.ex b/lib/graphql/api/search.ex index f0f1ec83c..090eccf1d 100644 --- a/lib/graphql/api/search.ex +++ b/lib/graphql/api/search.ex @@ -10,6 +10,7 @@ defmodule Mobilizon.GraphQL.API.Search do alias Mobilizon.Storage.Page alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor require Logger @@ -45,7 +46,7 @@ defmodule Mobilizon.GraphQL.API.Search do actor_type: [result_type], radius: Map.get(args, :radius), location: Map.get(args, :location), - minimum_visibility: :public + minimum_visibility: Map.get(args, :minimum_visibility, :public) ], page, limit @@ -92,7 +93,7 @@ defmodule Mobilizon.GraphQL.API.Search do # If the search string is an username @spec process_from_username(String.t()) :: Page.t() defp process_from_username(search) do - case ActivityPub.find_or_make_actor_from_nickname(search) do + case ActivityPubActor.find_or_make_actor_from_nickname(search) do {:ok, actor} -> %Page{total: 1, elements: [actor]} diff --git a/lib/graphql/error.ex b/lib/graphql/error.ex index 6d5def169..653a09051 100644 --- a/lib/graphql/error.ex +++ b/lib/graphql/error.ex @@ -89,6 +89,7 @@ defmodule Mobilizon.GraphQL.Error do defp metadata(:event_not_found), do: {404, dgettext("errors", "Event not found")} defp metadata(:group_not_found), do: {404, dgettext("errors", "Group not found")} defp metadata(:resource_not_found), do: {404, dgettext("errors", "Resource not found")} + defp metadata(:discussion_not_found), do: {404, dgettext("errors", "Discussion not found")} defp metadata(:unknown), do: {500, dgettext("errors", "Something went wrong")} defp metadata(code) do diff --git a/lib/graphql/resolvers/activity.ex b/lib/graphql/resolvers/activity.ex new file mode 100644 index 000000000..c350c0b07 --- /dev/null +++ b/lib/graphql/resolvers/activity.ex @@ -0,0 +1,95 @@ +defmodule Mobilizon.GraphQL.Resolvers.Activity do + @moduledoc """ + Handles the activity-related GraphQL calls. + """ + + import Mobilizon.Users.Guards + alias Mobilizon.{Activities, Actors, Discussions, Events, Posts, Resources, Users} + alias Mobilizon.Activities.Activity + alias Mobilizon.Actors.Actor + alias Mobilizon.Events.Event + alias Mobilizon.Storage.Page + alias Mobilizon.Users.User + + require Logger + + def group_activity(%Actor{type: :Group, id: group_id}, %{page: page, limit: limit} = args, %{ + context: %{current_user: %User{role: role} = user} + }) do + with {:actor, %Actor{id: actor_id} = _actor} <- {:actor, Users.get_actor_for_user(user)}, + {:member, true} <- {:member, Actors.is_member?(actor_id, group_id) or is_moderator(role)} do + %Page{total: total, elements: elements} = + Activities.list_group_activities_for_member( + group_id, + actor_id, + [type: Map.get(args, :type), author: Map.get(args, :author)], + page, + limit + ) + + elements = + Enum.map(elements, fn %Activity{} = activity -> + activity + |> Map.update(:subject_params, %{}, &transform_params/1) + |> Map.put(:object, get_object(activity)) + end) + + {:ok, %Page{total: total, elements: elements}} + else + {:member, false} -> + {:error, :unauthorized} + end + end + + def group_activity(_, _, _) do + {:error, :unauthenticated} + end + + defp get_object(%Activity{object_type: object_type, object_id: object_id}) do + get_object(object_type, object_id) + end + + defp get_object(_, nil), do: nil + + defp get_object(:event, event_id) do + case Events.get_event(event_id) do + {:ok, %Event{} = event} -> event + _ -> nil + end + end + + defp get_object(:post, post_id) do + Posts.get_post(post_id) + end + + defp get_object(:member, member_id) do + Actors.get_member(member_id) + end + + defp get_object(:resource, resource_id) do + Resources.get_resource(resource_id) + end + + defp get_object(:discussion, discussion_id) do + Discussions.get_discussion(discussion_id) + end + + defp get_object(:group, group_id) do + Actors.get_actor(group_id) + end + + defp get_object(:comment, comment_id) do + Discussions.get_comment(comment_id) + end + + @spec transform_params(map()) :: list() + defp transform_params(params) do + Enum.map(params, fn {key, value} -> %{key: key, value: transform_value(value)} end) + end + + defp transform_value(value) when is_list(value) do + Enum.join(value, ",") + end + + defp transform_value(value), do: value +end diff --git a/lib/graphql/resolvers/address.ex b/lib/graphql/resolvers/address.ex index f2d5fc402..a2476a8dd 100644 --- a/lib/graphql/resolvers/address.ex +++ b/lib/graphql/resolvers/address.ex @@ -14,7 +14,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Address do @spec search(map, map, map) :: {:ok, [Address.t()]} def search( _parent, - %{query: query, locale: locale, page: _page, limit: _limit}, + %{query: query, locale: locale, page: _page, limit: _limit} = args, %{context: %{ip: ip}} ) do geolix = Geolix.lookup(ip) @@ -25,7 +25,12 @@ defmodule Mobilizon.GraphQL.Resolvers.Address do _ -> nil end - addresses = Geospatial.service().search(query, lang: locale, country_code: country_code) + addresses = + Geospatial.service().search(query, + lang: locale, + country_code: country_code, + type: Map.get(args, :type) + ) {:ok, addresses} end diff --git a/lib/graphql/resolvers/admin.ex b/lib/graphql/resolvers/admin.ex index b8485d0ae..42d3cd061 100644 --- a/lib/graphql/resolvers/admin.ex +++ b/lib/graphql/resolvers/admin.ex @@ -27,7 +27,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do %{context: %{current_user: %User{role: role}}} ) when is_moderator(role) do - with action_logs <- Mobilizon.Admin.list_action_logs(page, limit) do + with %Page{elements: action_logs, total: total} <- + Mobilizon.Admin.list_action_logs(page, limit) do action_logs = action_logs |> Enum.map(fn %ActionLog{ @@ -44,7 +45,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do end) |> Enum.filter(& &1) - {:ok, action_logs} + {:ok, %Page{elements: action_logs, total: total}} end end @@ -321,7 +322,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do {:ok, _activity, follow} -> {:ok, follow} - {:error, {:error, err}} when is_bitstring(err) -> + {:error, {:error, err}} when is_binary(err) -> {:error, err} end end @@ -336,7 +337,10 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do {:ok, _activity, follow} -> {:ok, follow} - {:error, {:error, err}} when is_bitstring(err) -> + {:error, {:error, err}} when is_binary(err) -> + {:error, err} + + {:error, err} when is_binary(err) -> {:error, err} end end @@ -351,7 +355,10 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do {:ok, _activity, follow} -> {:ok, follow} - {:error, {:error, err}} when is_bitstring(err) -> + {:error, {:error, err}} when is_binary(err) -> + {:error, err} + + {:error, err} when is_binary(err) -> {:error, err} end end diff --git a/lib/graphql/resolvers/comment.ex b/lib/graphql/resolvers/comment.ex index ef9899dd4..0e2998bb6 100644 --- a/lib/graphql/resolvers/comment.ex +++ b/lib/graphql/resolvers/comment.ex @@ -42,6 +42,9 @@ defmodule Mobilizon.GraphQL.Resolvers.Comment do Comments.create_comment(args) do {:ok, comment} else + {:error, err} -> + {:error, err} + {:allowed, false} -> {:error, :unauthorized} end diff --git a/lib/graphql/resolvers/config.ex b/lib/graphql/resolvers/config.ex index a1b8c3e8c..ad25b8bbd 100644 --- a/lib/graphql/resolvers/config.ex +++ b/lib/graphql/resolvers/config.ex @@ -126,7 +126,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Config do timezones: Tzdata.zone_list(), features: %{ groups: Config.instance_group_feature_enabled?(), - event_creation: Config.instance_event_creation_enabled?() + event_creation: Config.instance_event_creation_enabled?(), + koena_connect: Config.get([:instance, :koena_connect_link], false) }, rules: Config.instance_rules(), version: Config.instance_version(), @@ -134,6 +135,14 @@ defmodule Mobilizon.GraphQL.Resolvers.Config do auth: %{ ldap: Config.ldap_enabled?(), oauth_providers: Config.oauth_consumer_strategies() + }, + upload_limits: %{ + default: Config.get([:instance, :upload_limit]), + avatar: Config.get([:instance, :avatar_upload_limit]), + banner: Config.get([:instance, :banner_upload_limit]) + }, + instance_feeds: %{ + enabled: Config.get([:instance, :enable_instance_feeds]) } } end diff --git a/lib/graphql/resolvers/discussion.ex b/lib/graphql/resolvers/discussion.ex index bf49da5ac..73b9405ac 100644 --- a/lib/graphql/resolvers/discussion.ex +++ b/lib/graphql/resolvers/discussion.ex @@ -60,6 +60,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Discussion do {:ok, discussion} else nil -> {:error, dgettext("errors", "Discussion not found")} + {:member, false} -> {:error, :unauthorized} end end @@ -104,11 +105,16 @@ defmodule Mobilizon.GraphQL.Resolvers.Discussion do }) do {:ok, discussion} else + {:error, type, err, _} when type in [:discussion, :comment] -> + {:error, err} + {:member, false} -> {:error, :unauthorized} end end + def create_discussion(_, _, _), do: {:error, :unauthenticated} + def reply_to_discussion( _parent, %{text: text, discussion_id: discussion_id}, @@ -141,9 +147,14 @@ defmodule Mobilizon.GraphQL.Resolvers.Discussion do origin_comment_id || previous_in_reply_to_comment_id || last_comment_id }) do {:ok, discussion} + else + {:no_discussion, _} -> + {:error, :discussion_not_found} end end + def reply_to_discussion(_, _, _), do: {:error, :unauthenticated} + @spec update_discussion(map(), map(), map()) :: {:ok, Discussion.t()} def update_discussion( _parent, @@ -166,9 +177,14 @@ defmodule Mobilizon.GraphQL.Resolvers.Discussion do } ) do {:ok, discussion} + else + {:member, false} -> + {:error, :unauthorized} end end + def update_discussion(_, _, _), do: {:error, :unauthenticated} + def delete_discussion(_parent, %{discussion_id: discussion_id}, %{ context: %{ current_user: %User{} = user @@ -186,8 +202,9 @@ defmodule Mobilizon.GraphQL.Resolvers.Discussion do {:error, dgettext("errors", "No discussion with ID %{id}", id: discussion_id)} {:member, _} -> - {:error, - dgettext("errors", "You are not a member of the group the discussion belongs to")} + {:error, :unauthorized} end end + + def delete_discussion(_, _, _), do: {:error, :unauthenticated} end diff --git a/lib/graphql/resolvers/event.ex b/lib/graphql/resolvers/event.ex index ecca7cfd2..3e5de2779 100644 --- a/lib/graphql/resolvers/event.ex +++ b/lib/graphql/resolvers/event.ex @@ -59,9 +59,13 @@ defmodule Mobilizon.GraphQL.Resolvers.Event do end end - def list_events(_parent, %{page: page, limit: limit}, _resolution) + def list_events( + _parent, + %{page: page, limit: limit, order_by: order_by, direction: direction}, + _resolution + ) when limit < @event_max_limit do - {:ok, Events.list_events(page, limit)} + {:ok, Events.list_events(page, limit, order_by, direction)} end def list_events(_parent, %{page: _page, limit: _limit}, _resolution) do @@ -138,7 +142,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Event do else {:actor_approve_permission, _} -> {:error, - dgettext("errors", "Provided moderator profile doesn't have permission on this event")} + dgettext("errors", "Provided profile doesn't have moderator permissions on this event")} end end diff --git a/lib/graphql/resolvers/feed_token.ex b/lib/graphql/resolvers/feed_token.ex index ed545ed3a..196da066c 100644 --- a/lib/graphql/resolvers/feed_token.ex +++ b/lib/graphql/resolvers/feed_token.ex @@ -22,7 +22,7 @@ defmodule Mobilizon.GraphQL.Resolvers.FeedToken do ) do with {:is_owned, %Actor{}} <- User.owns_actor(user, actor_id), {:ok, feed_token} <- Events.create_feed_token(%{user_id: id, actor_id: actor_id}) do - {:ok, feed_token} + {:ok, to_short_uuid(feed_token)} else {:is_owned, nil} -> {:error, dgettext("errors", "Profile is not owned by authenticated user")} @@ -32,7 +32,7 @@ defmodule Mobilizon.GraphQL.Resolvers.FeedToken do @spec create_feed_token(any, map, map) :: {:ok, FeedToken.t()} def create_feed_token(_parent, %{}, %{context: %{current_user: %User{id: id}}}) do with {:ok, feed_token} <- Events.create_feed_token(%{user_id: id}) do - {:ok, feed_token} + {:ok, to_short_uuid(feed_token)} end end @@ -50,7 +50,8 @@ defmodule Mobilizon.GraphQL.Resolvers.FeedToken do %{token: token}, %{context: %{current_user: %User{id: id} = _user}} ) do - with {:ok, token} <- Ecto.UUID.cast(token), + with {:ok, token} <- ShortUUID.decode(token), + {:ok, token} <- Ecto.UUID.cast(token), {:no_token, %FeedToken{actor: actor, user: %User{} = user} = feed_token} <- {:no_token, Events.get_feed_token(token)}, {:token_from_user, true} <- {:token_from_user, id == user.id}, @@ -65,6 +66,9 @@ defmodule Mobilizon.GraphQL.Resolvers.FeedToken do :error -> {:error, dgettext("errors", "Token is not a valid UUID")} + {:error, "Invalid input"} -> + {:error, dgettext("errors", "Token is not a valid UUID")} + {:no_token, _} -> {:error, dgettext("errors", "Token does not exist")} @@ -77,4 +81,8 @@ defmodule Mobilizon.GraphQL.Resolvers.FeedToken do def delete_feed_token(_parent, _args, %{}) do {:error, dgettext("errors", "You are not allowed to delete a feed token if not connected")} end + + defp to_short_uuid(%FeedToken{token: token} = feed_token) do + %FeedToken{feed_token | token: ShortUUID.encode!(token)} + end end diff --git a/lib/graphql/resolvers/group.ex b/lib/graphql/resolvers/group.ex index 6c5ffe5cb..e5ed6a2f3 100644 --- a/lib/graphql/resolvers/group.ex +++ b/lib/graphql/resolvers/group.ex @@ -7,6 +7,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do alias Mobilizon.{Actors, Events, Users} alias Mobilizon.Actors.{Actor, Member} alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.GraphQL.API alias Mobilizon.Users.User alias Mobilizon.Web.Upload @@ -26,8 +27,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do } } ) do - with {:group, {:ok, %Actor{id: group_id} = group}} <- - {:group, ActivityPub.find_or_make_group_from_nickname(name)}, + with {:group, {:ok, %Actor{id: group_id, suspended: false} = group}} <- + {:group, ActivityPubActor.find_or_make_group_from_nickname(name)}, {:actor, %Actor{id: actor_id} = _actor} <- {:actor, Users.get_actor_for_user(user)}, {:member, true} <- {:member, Actors.is_member?(actor_id, group_id)} do {:ok, group} @@ -44,7 +45,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do end def find_group(_parent, %{preferred_username: name}, _resolution) do - with {:ok, actor} <- ActivityPub.find_or_make_group_from_nickname(name), + with {:ok, %Actor{suspended: false} = actor} <- + ActivityPubActor.find_or_make_group_from_nickname(name), %Actor{} = actor <- restrict_fields_for_non_member_request(actor) do {:ok, actor} else @@ -96,7 +98,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do # TODO Move me to somewhere cleaner defp save_attached_pictures(args) do Enum.reduce([:avatar, :banner], args, fn key, args -> - if Map.has_key?(args, key) && !is_nil(args[key][:media]) do + if is_map(args) && Map.has_key?(args, key) && !is_nil(args[key][:media]) do pic = args[key][:media] with {:ok, %{name: name, url: url, content_type: content_type, size: _size}} <- @@ -122,14 +124,17 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do } ) do with %Actor{id: creator_actor_id} = creator_actor <- Users.get_actor_for_user(user), - args <- Map.update(args, :preferred_username, "", &String.downcase/1), - args <- Map.put(args, :creator_actor, creator_actor), - args <- Map.put(args, :creator_actor_id, creator_actor_id), - args <- save_attached_pictures(args), + args when is_map(args) <- Map.update(args, :preferred_username, "", &String.downcase/1), + args when is_map(args) <- Map.put(args, :creator_actor, creator_actor), + args when is_map(args) <- Map.put(args, :creator_actor_id, creator_actor_id), + {:picture, args} when is_map(args) <- {:picture, save_attached_pictures(args)}, {:ok, _activity, %Actor{type: :Group} = group} <- API.Groups.create_group(args) do {:ok, group} else + {:picture, {:error, :file_too_large}} -> + {:error, dgettext("errors", "The provided picture is too heavy")} + {:error, err} when is_binary(err) -> {:error, err} end @@ -154,12 +159,15 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do with %Actor{} = updater_actor <- Users.get_actor_for_user(user), {:administrator, true} <- {:administrator, Actors.is_administrator?(updater_actor.id, group_id)}, - args <- Map.put(args, :updater_actor, updater_actor), - args <- save_attached_pictures(args), + args when is_map(args) <- Map.put(args, :updater_actor, updater_actor), + {:picture, args} when is_map(args) <- {:picture, save_attached_pictures(args)}, {:ok, _activity, %Actor{type: :Group} = group} <- API.Groups.update_group(args) do {:ok, group} else + {:picture, {:error, :file_too_large}} -> + {:error, dgettext("errors", "The provided picture is too heavy")} + {:error, err} when is_binary(err) -> {:error, err} diff --git a/lib/graphql/resolvers/member.ex b/lib/graphql/resolvers/member.ex index 3e20194a9..44b9caed4 100644 --- a/lib/graphql/resolvers/member.ex +++ b/lib/graphql/resolvers/member.ex @@ -7,7 +7,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do alias Mobilizon.{Actors, Users} alias Mobilizon.Actors.{Actor, Member} alias Mobilizon.Federation.ActivityPub - alias Mobilizon.Federation.ActivityPub.Refresher + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Storage.Page alias Mobilizon.Users.User import Mobilizon.Web.Gettext @@ -70,7 +70,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do target_actor_username |> String.trim() |> String.trim_leading("@"), {:target_actor_username, {:ok, %Actor{id: target_actor_id} = target_actor}} <- {:target_actor_username, - ActivityPub.find_or_make_actor_from_nickname(target_actor_username)}, + ActivityPubActor.find_or_make_actor_from_nickname(target_actor_username)}, {:existant, true} <- {:existant, check_member_not_existant_or_rejected(target_actor_id, group.id)}, {:ok, _activity, %Member{} = member} <- ActivityPub.invite(group, actor, target_actor) do @@ -99,7 +99,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do def accept_invitation(_parent, %{id: member_id}, %{context: %{current_user: %User{} = user}}) do with %Actor{id: actor_id} <- Users.get_actor_for_user(user), - %Member{actor: %Actor{id: member_actor_id} = actor} = member <- + %Member{actor: %Actor{id: member_actor_id}} = member <- Actors.get_member(member_id), {:is_same_actor, true} <- {:is_same_actor, member_actor_id === actor_id}, {:ok, _activity, %Member{} = member} <- @@ -108,8 +108,6 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do member, true ) do - # Launch an async task to refresh the group profile, fetch resources, discussions, members - Refresher.fetch_group(member.parent.url, actor) {:ok, member} else {:is_same_actor, false} -> diff --git a/lib/graphql/resolvers/participant.ex b/lib/graphql/resolvers/participant.ex index e41137597..d09259eb4 100644 --- a/lib/graphql/resolvers/participant.ex +++ b/lib/graphql/resolvers/participant.ex @@ -70,7 +70,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Participant do participant, Map.get(args, :locale, "en") ) - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() end {:ok, participant} @@ -231,7 +231,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Participant do {:actor_approve_permission, _} -> {:error, - dgettext("errors", "Provided moderator profile doesn't have permission on this event")} + dgettext("errors", "Provided profile doesn't have moderator permissions on this event")} {:same_role, true} -> {:error, dgettext("errors", "Participant already has role %{role}", role: new_role)} @@ -264,7 +264,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Participant do @spec valid_email?(String.t() | nil) :: boolean defp valid_email?(email) when is_nil(email), do: false - defp valid_email?(email) when is_bitstring(email) do + defp valid_email?(email) when is_binary(email) do email |> String.trim() |> Checker.valid?() diff --git a/lib/graphql/resolvers/person.ex b/lib/graphql/resolvers/person.ex index abf032fdc..06b898531 100644 --- a/lib/graphql/resolvers/person.ex +++ b/lib/graphql/resolvers/person.ex @@ -6,13 +6,14 @@ defmodule Mobilizon.GraphQL.Resolvers.Person do import Mobilizon.Users.Guards alias Mobilizon.{Actors, Events, Users} - alias Mobilizon.Actors.Actor + alias Mobilizon.Actors.{Actor, Member} alias Mobilizon.Events.Participant - alias Mobilizon.Storage.Page + alias Mobilizon.Storage.{Page, Repo} alias Mobilizon.Users.User import Mobilizon.Web.Gettext alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor require Logger alias Mobilizon.Web.Upload @@ -39,7 +40,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Person do context: %{current_user: %User{} = user} }) do with {:ok, %Actor{id: actor_id} = actor} <- - ActivityPub.find_or_make_actor_from_nickname(preferred_username), + ActivityPubActor.find_or_make_actor_from_nickname(preferred_username), {:own, {:is_owned, _}} <- {:own, User.owns_actor(user, actor_id)} do {:ok, actor} else @@ -124,6 +125,9 @@ defmodule Mobilizon.GraphQL.Resolvers.Person do {:ok, %Actor{} = new_person} <- Actors.new_person(args) do {:ok, new_person} else + {:error, err} -> + {:error, err} + {:picture, {:error, :file_too_large}} -> {:error, dgettext("errors", "The provided picture is too heavy")} end @@ -222,9 +226,9 @@ defmodule Mobilizon.GraphQL.Resolvers.Person do end defp save_picture(media, key) do - with {:ok, %{name: name, url: url, content_type: content_type, size: _size}} <- + with {:ok, %{name: name, url: url, content_type: content_type, size: size}} <- Upload.store(media.file, type: key, description: media.alt) do - %{"name" => name, "url" => url, "mediaType" => content_type} + %{"name" => name, "url" => url, "content_type" => content_type, "size" => size} end end @@ -232,7 +236,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Person do This function is used to register a person afterwards the user has been created (but not activated) """ def register_person(_parent, args, _resolution) do - with {:ok, %User{} = user} <- Users.get_user_by_email(args.email), + # When registering, email is assumed confirmed (unlike changing email) + with {:ok, %User{} = user} <- Users.get_user_by_email(args.email, unconfirmed: false), user_actor <- Users.get_actor_for_user(user), no_actor <- is_nil(user_actor), {:no_actor, true} <- {:no_actor, no_actor}, @@ -306,10 +311,36 @@ defmodule Mobilizon.GraphQL.Resolvers.Person do @doc """ Returns the list of events this person is going to """ - def person_memberships(%Actor{id: actor_id}, _args, %{context: %{current_user: user}}) do + @spec person_memberships(Actor.t(), map(), map()) :: {:ok, Page.t()} | {:error, String.t()} + def person_memberships(%Actor{id: actor_id}, %{group: group}, %{ + context: %{current_user: user} + }) do + with {:is_owned, %Actor{id: actor_id}} <- User.owns_actor(user, actor_id), + {:group, %Actor{id: group_id}} <- {:group, Actors.get_actor_by_name(group, :Group)}, + {:ok, %Member{} = membership} <- Actors.get_member(actor_id, group_id), + memberships <- %Page{ + total: 1, + elements: [Repo.preload(membership, [:actor, :parent, :invited_by])] + } do + {:ok, memberships} + else + {:error, :member_not_found} -> + {:ok, %Page{total: 0, elements: []}} + + {:group, nil} -> + {:error, :group_not_found} + + {:is_owned, nil} -> + {:error, dgettext("errors", "Profile is not owned by authenticated user")} + end + end + + def person_memberships(%Actor{id: actor_id}, %{page: page, limit: limit}, %{ + context: %{current_user: user} + }) do with {:is_owned, %Actor{} = actor} <- User.owns_actor(user, actor_id), - participations <- Actors.list_members_for_actor(actor) do - {:ok, participations} + memberships <- Actors.list_members_for_actor(actor, page, limit) do + {:ok, memberships} else {:is_owned, nil} -> {:error, dgettext("errors", "Profile is not owned by authenticated user")} @@ -341,9 +372,13 @@ defmodule Mobilizon.GraphQL.Resolvers.Person do context: %{current_user: %User{id: user_id, role: role}} } ) do - with true <- actor_user_id == user_id or is_moderator(role), + with {:can_get_events, true} <- + {:can_get_events, actor_user_id == user_id or is_moderator(role)}, %Page{} = page <- Events.list_organized_events_for_actor(actor, page, limit) do {:ok, page} + else + {:can_get_events, false} -> + {:error, :unauthorized} end end diff --git a/lib/graphql/resolvers/resource.ex b/lib/graphql/resolvers/resource.ex index 16e5040b7..13b43ba84 100644 --- a/lib/graphql/resolvers/resource.ex +++ b/lib/graphql/resolvers/resource.ex @@ -118,6 +118,9 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do ) do {:ok, resource} else + {:error, _} -> + {:error, dgettext("errors", "Error while creating resource")} + {:own_check, _} -> {:error, dgettext("errors", "Parent resource doesn't belong to this group")} @@ -201,8 +204,12 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do {:ok, data} when is_map(data) -> {:ok, struct(Metadata, data)} - {:error, _err} -> + {:error, :invalid_parsed_data} -> + {:error, dgettext("errors", "Unable to fetch resource details from this URL.")} + + {:error, err} -> Logger.warn("Error while fetching preview from #{inspect(resource_url)}") + Logger.debug(inspect(err)) {:error, :unknown_resource} end end diff --git a/lib/graphql/resolvers/search.ex b/lib/graphql/resolvers/search.ex index b9a5b0b80..9d3a68ffb 100644 --- a/lib/graphql/resolvers/search.ex +++ b/lib/graphql/resolvers/search.ex @@ -9,7 +9,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Search do Search persons """ def search_persons(_parent, %{page: page, limit: limit} = args, _resolution) do - Search.search_actors(args, page, limit, :Person) + Search.search_actors(Map.put(args, :minimum_visibility, :private), page, limit, :Person) end @doc """ diff --git a/lib/graphql/resolvers/user.ex b/lib/graphql/resolvers/user.ex index 79f512917..82a4dde34 100644 --- a/lib/graphql/resolvers/user.ex +++ b/lib/graphql/resolvers/user.ex @@ -7,7 +7,6 @@ defmodule Mobilizon.GraphQL.Resolvers.User do alias Mobilizon.{Actors, Admin, Config, Events, Users} alias Mobilizon.Actors.Actor - alias Mobilizon.Crypto alias Mobilizon.Federation.ActivityPub alias Mobilizon.Federation.ActivityPub.Relay alias Mobilizon.Service.Auth.Authenticator @@ -19,8 +18,6 @@ defmodule Mobilizon.GraphQL.Resolvers.User do require Logger - @confirmation_token_length 30 - @doc """ Find an user by its ID """ @@ -117,8 +114,9 @@ defmodule Mobilizon.GraphQL.Resolvers.User do @spec create_user(any, map, any) :: tuple def create_user(_parent, args, _resolution) do with :registration_ok <- check_registration_config(args), - {:ok, %User{} = user} <- Users.register(args) do - Email.User.send_confirmation_email(user, Map.get(args, :locale, "en")) + {:ok, %User{} = user} <- Users.register(args), + %Bamboo.Email{} <- + Email.User.send_confirmation_email(user, Map.get(args, :locale, "en")) do {:ok, user} else :registration_closed -> @@ -182,11 +180,11 @@ defmodule Mobilizon.GraphQL.Resolvers.User do @doc """ Send the confirmation email again. - We only do this to accounts unconfirmed + We only do this to accounts not activated """ def resend_confirmation_email(_parent, args, _resolution) do with {:ok, %User{locale: locale} = user} <- - Users.get_user_by_email(Map.get(args, :email), false), + Users.get_user_by_email(Map.get(args, :email), activated: false, unconfirmed: false), {:ok, email} <- Email.User.resend_confirmation_email(user, Map.get(args, :locale, locale)) do {:ok, email} @@ -204,10 +202,11 @@ defmodule Mobilizon.GraphQL.Resolvers.User do """ def send_reset_password(_parent, args, _resolution) do with email <- Map.get(args, :email), - {:ok, %User{locale: locale} = user} <- Users.get_user_by_email(email, true), + {:ok, %User{locale: locale} = user} <- + Users.get_user_by_email(email, activated: true, unconfirmed: false), {:can_reset_password, true} <- {:can_reset_password, Authenticator.can_reset_password?(user)}, - {:ok, %Bamboo.Email{} = _email_html} <- + {:ok, %Bamboo.Email{}} <- Email.User.send_password_reset_email(user, Map.get(args, :locale, locale)) do {:ok, email} else @@ -255,6 +254,8 @@ defmodule Mobilizon.GraphQL.Resolvers.User do end end + def change_default_actor(_parent, _args, _resolution), do: {:error, :unauthenticated} + @doc """ Returns the list of events for all of this user's identities are going to """ @@ -354,21 +355,14 @@ defmodule Mobilizon.GraphQL.Resolvers.User do {:current_password, Authenticator.login(user.email, password)}, {:same_email, false} <- {:same_email, new_email == old_email}, {:email_valid, true} <- {:email_valid, Email.Checker.valid?(new_email)}, - {:ok, %User{} = user} <- - user - |> User.changeset(%{ - unconfirmed_email: new_email, - confirmation_token: Crypto.random_string(@confirmation_token_length), - confirmation_sent_at: DateTime.utc_now() |> DateTime.truncate(:second) - }) - |> Repo.update() do + {:ok, %User{} = user} <- Users.update_user_email(user, new_email) do user |> Email.User.send_email_reset_old_email() - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() user |> Email.User.send_email_reset_new_email() - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() {:ok, user} else @@ -388,17 +382,12 @@ defmodule Mobilizon.GraphQL.Resolvers.User do end def validate_email(_parent, %{token: token}, _resolution) do - with %User{} = user <- Users.get_user_by_activation_token(token), - {:ok, %User{} = user} <- - user - |> User.changeset(%{ - email: user.unconfirmed_email, - unconfirmed_email: nil, - confirmation_token: nil, - confirmation_sent_at: nil - }) - |> Repo.update() do + with {:get, %User{} = user} <- {:get, Users.get_user_by_activation_token(token)}, + {:ok, %User{} = user} <- Users.validate_email(user) do {:ok, user} + else + {:get, nil} -> + {:error, dgettext("errors", "Invalid activation token")} end end diff --git a/lib/graphql/schema.ex b/lib/graphql/schema.ex index ceca7131b..39ea5b392 100644 --- a/lib/graphql/schema.ex +++ b/lib/graphql/schema.ex @@ -29,6 +29,7 @@ defmodule Mobilizon.GraphQL.Schema do import_types(Schema.Custom.UUID) import_types(Schema.Custom.Point) + import_types(Schema.ActivityType) import_types(Schema.UserType) import_types(Schema.MediaType) import_types(Schema.ActorInterface) diff --git a/lib/graphql/schema/activity.ex b/lib/graphql/schema/activity.ex new file mode 100644 index 000000000..f43ec75f7 --- /dev/null +++ b/lib/graphql/schema/activity.ex @@ -0,0 +1,86 @@ +defmodule Mobilizon.GraphQL.Schema.ActivityType do + @moduledoc """ + Schema representation for Activity + """ + use Absinthe.Schema.Notation + + alias Mobilizon.Actors.{Actor, Member} + alias Mobilizon.Discussions.{Comment, Discussion} + alias Mobilizon.Events.Event + alias Mobilizon.Posts.Post + alias Mobilizon.Resources.Resource + + enum :activity_type do + value(:event, description: "Activities concerning events") + value(:post, description: "Activities concerning posts") + value(:discussion, description: "Activities concerning discussions") + value(:resource, description: "Activities concerning resources") + value(:group, description: "Activities concerning group settings") + value(:member, description: "Activities concerning members") + end + + enum :activity_author do + value(:self, description: "Activities created by the current actor") + value(:by, description: "Activities created by others") + end + + object :activity_param_item do + field(:key, :string) + field(:value, :string) + end + + interface :activity_object do + field(:id, :id) + + resolve_type(fn + %Event{}, _ -> + :event + + %Post{}, _ -> + :post + + %Actor{type: "Group"}, _ -> + :group + + %Member{}, _ -> + :member + + %Resource{}, _ -> + :resource + + %Discussion{}, _ -> + :discussion + + %Comment{}, _ -> + :comment + + %Actor{type: :Group}, _ -> + :group + + _, _ -> + nil + end) + end + + @desc """ + A paginated list of activity items + """ + object :paginated_activity_list do + field(:elements, list_of(:activity), description: "A list of activities") + field(:total, :integer, description: "The total number of elements in the list") + end + + object :activity do + field(:id, :id, description: "The activity item ID") + field(:inserted_at, :datetime, description: "When was the activity inserted") + field(:priority, :integer) + field(:type, :activity_type) + field(:subject, :string) + field(:subject_params, list_of(:activity_param_item)) + field(:message, :string) + field(:message_params, list_of(:activity_param_item)) + field(:object, :activity_object) + field(:author, :actor) + field(:group, :group) + end +end diff --git a/lib/graphql/schema/actors/group.ex b/lib/graphql/schema/actors/group.ex index 90588e996..58b1c5be9 100644 --- a/lib/graphql/schema/actors/group.ex +++ b/lib/graphql/schema/actors/group.ex @@ -10,6 +10,7 @@ defmodule Mobilizon.GraphQL.Schema.Actors.GroupType do alias Mobilizon.Addresses alias Mobilizon.GraphQL.Resolvers.{ + Activity, Discussion, Followers, Group, @@ -28,7 +29,7 @@ defmodule Mobilizon.GraphQL.Schema.Actors.GroupType do Represents a group of actors """ object :group do - interfaces([:actor, :interactable]) + interfaces([:actor, :interactable, :activity_object, :action_log_object]) field(:id, :id, description: "Internal ID for this group") field(:url, :string, description: "The ActivityPub actor's URL") @@ -142,6 +143,20 @@ defmodule Mobilizon.GraphQL.Schema.Actors.GroupType do resolve(&Followers.find_followers_for_group/3) description("A paginated list of the followers this group has") end + + field :activity, :paginated_activity_list do + arg(:page, :integer, + default_value: 1, + description: "The page in the paginated activity items list" + ) + + arg(:limit, :integer, default_value: 10, description: "The limit of activity items per page") + + arg(:type, :activity_type, description: "Filter by type of activity") + arg(:author, :activity_author, description: "Filter by activity author") + resolve(&Activity.group_activity/3) + description("The group activity") + end end @desc """ diff --git a/lib/graphql/schema/actors/member.ex b/lib/graphql/schema/actors/member.ex index 5d68f9852..d4b124e3d 100644 --- a/lib/graphql/schema/actors/member.ex +++ b/lib/graphql/schema/actors/member.ex @@ -10,6 +10,7 @@ defmodule Mobilizon.GraphQL.Schema.Actors.MemberType do Represents a member of a group """ object :member do + interfaces([:activity_object]) field(:id, :id, description: "The member's ID") field(:parent, :group, description: "Of which the profile is member") field(:actor, :person, description: "Which profile is member of") diff --git a/lib/graphql/schema/actors/person.ex b/lib/graphql/schema/actors/person.ex index 1ed2ce262..42743316f 100644 --- a/lib/graphql/schema/actors/person.ex +++ b/lib/graphql/schema/actors/person.ex @@ -4,7 +4,7 @@ defmodule Mobilizon.GraphQL.Schema.Actors.PersonType do """ use Absinthe.Schema.Notation - import Absinthe.Resolution.Helpers, only: [dataloader: 1] + import Absinthe.Resolution.Helpers, only: [dataloader: 2] alias Mobilizon.Events alias Mobilizon.GraphQL.Resolvers.{Media, Person} @@ -53,7 +53,13 @@ defmodule Mobilizon.GraphQL.Schema.Actors.PersonType do ) field(:feed_tokens, list_of(:feed_token), - resolve: dataloader(Events), + resolve: + dataloader( + Events, + callback: fn feed_tokens, _parent, _args -> + {:ok, Enum.map(feed_tokens, &Map.put(&1, :token, ShortUUID.encode!(&1.token)))} + end + ), description: "A list of the feed tokens for this person" ) @@ -70,7 +76,7 @@ defmodule Mobilizon.GraphQL.Schema.Actors.PersonType do field(:participations, :paginated_participant_list, description: "The list of events this person goes to" ) do - arg(:event_id, :id) + arg(:event_id, :id, description: "Filter by event ID") arg(:page, :integer, default_value: 1, @@ -86,6 +92,14 @@ defmodule Mobilizon.GraphQL.Schema.Actors.PersonType do field(:memberships, :paginated_member_list, description: "The list of group this person is member of" ) do + arg(:group, :string, description: "Filter by group federated username") + + arg(:page, :integer, + default_value: 1, + description: "The page in the paginated memberships list" + ) + + arg(:limit, :integer, default_value: 10, description: "The limit of memberships per page") resolve(&Person.person_memberships/3) end end @@ -225,9 +239,10 @@ defmodule Mobilizon.GraphQL.Schema.Actors.PersonType do @desc "Notify when a person's membership's status changed for a group" field :group_membership_changed, :person do arg(:person_id, non_null(:id), description: "The person's ID") + arg(:group, non_null(:string), description: "The group's federated username") config(fn args, _ -> - {:ok, topic: args.person_id} + {:ok, topic: [args.group, args.person_id]} end) end end diff --git a/lib/graphql/schema/address.ex b/lib/graphql/schema/address.ex index aba803ee6..bb1c1f622 100644 --- a/lib/graphql/schema/address.ex +++ b/lib/graphql/schema/address.ex @@ -56,6 +56,15 @@ defmodule Mobilizon.GraphQL.Schema.AddressType do field(:origin_id, :string, description: "The address's original ID from the provider") end + @desc """ + A list of possible values for the type option to search an address. + + Results may vary depending on the geocoding provider. + """ + enum :address_search_type do + value(:administrative, description: "Administrative results (cities, regions,...)") + end + object :address_queries do @desc "Search for an address" field :search_address, type: list_of(:address) do @@ -73,6 +82,8 @@ defmodule Mobilizon.GraphQL.Schema.AddressType do arg(:limit, :integer, default_value: 10, description: "The limit of search results per page") + arg(:type, :address_search_type, description: "Filter by type of results") + resolve(&Address.search/3) end diff --git a/lib/graphql/schema/admin.ex b/lib/graphql/schema/admin.ex index 22689f322..057548d84 100644 --- a/lib/graphql/schema/admin.ex +++ b/lib/graphql/schema/admin.ex @@ -22,6 +22,14 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do field(:inserted_at, :datetime, description: "The time when the action was performed") end + @desc """ + A paginated list of action logs + """ + object :paginated_action_log_list do + field(:elements, list_of(:action_log), description: "A list of action logs") + field(:total, :integer, description: "The total number of action logs in the list") + end + @desc """ The different types of action log actions """ @@ -62,6 +70,9 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do %User{}, _ -> :user + %Actor{type: "Group"}, _ -> + :group + _, _ -> nil end) @@ -144,7 +155,7 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do object :admin_queries do @desc "Get the list of action logs" - field :action_logs, type: list_of(:action_log) do + field :action_logs, type: :paginated_action_log_list do arg(:page, :integer, default_value: 1) arg(:limit, :integer, default_value: 10) resolve(&Admin.list_action_logs/3) diff --git a/lib/graphql/schema/config.ex b/lib/graphql/schema/config.ex index a2d9d02ab..d33cca9f0 100644 --- a/lib/graphql/schema/config.ex +++ b/lib/graphql/schema/config.ex @@ -33,6 +33,8 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do description: "The instance's enabled resource providers" ) + field(:upload_limits, :upload_limits, description: "The configuration for upload limits") + field(:timezones, list_of(:string), description: "The instance's available timezones") field(:features, :features, description: "The instance's features") field(:version, :string, description: "The instance's version") @@ -61,6 +63,7 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do field(:rules, :string, description: "The instance's rules") field(:auth, :auth, description: "The instance auth methods") + field(:instance_feeds, :instance_feeds, description: "The instance's feed settings") end @desc """ @@ -265,6 +268,8 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do field(:event_creation, :boolean, description: "Whether event creation is allowed on this instance" ) + + field(:koena_connect, :boolean, description: "Activate link to Koena Connect") end @desc """ @@ -283,6 +288,19 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do field(:label, :string, description: "The label for the auth provider") end + @desc """ + An upload limits configuration + """ + object :upload_limits do + field(:default, :integer, description: "The default limitation, in bytes") + field(:avatar, :integer, description: "The avatar limitation, in bytes") + field(:banner, :integer, description: "The banner limitation, in bytes") + end + + object :instance_feeds do + field(:enabled, :boolean, description: "Whether the instance-wide feeds are enabled") + end + object :config_queries do @desc "Get the instance config" field :config, :config do diff --git a/lib/graphql/schema/discussions/comment.ex b/lib/graphql/schema/discussions/comment.ex index c22d1d021..779b8e1d1 100644 --- a/lib/graphql/schema/discussions/comment.ex +++ b/lib/graphql/schema/discussions/comment.ex @@ -6,12 +6,12 @@ defmodule Mobilizon.GraphQL.Schema.Discussions.CommentType do import Absinthe.Resolution.Helpers, only: [dataloader: 1] - alias Mobilizon.{Actors, Discussions} + alias Mobilizon.{Actors, Discussions, Events} alias Mobilizon.GraphQL.Resolvers.Comment @desc "A comment" object :comment do - interfaces([:action_log_object]) + interfaces([:action_log_object, :activity_object]) field(:id, :id, description: "Internal ID for this comment") field(:uuid, :uuid, description: "An UUID for this comment") field(:url, :string, description: "Comment URL") diff --git a/lib/graphql/schema/discussions/discussion.ex b/lib/graphql/schema/discussions/discussion.ex index 8312b4c6b..849d6e4c5 100644 --- a/lib/graphql/schema/discussions/discussion.ex +++ b/lib/graphql/schema/discussions/discussion.ex @@ -11,6 +11,7 @@ defmodule Mobilizon.GraphQL.Schema.Discussions.DiscussionType do @desc "A discussion" object :discussion do + interfaces([:activity_object]) field(:id, :id, description: "Internal ID for this discussion") field(:title, :string, description: "The title for this discussion") field(:slug, :string, description: "The slug for the discussion") diff --git a/lib/graphql/schema/event.ex b/lib/graphql/schema/event.ex index b10a3b2ca..cf42ff663 100644 --- a/lib/graphql/schema/event.ex +++ b/lib/graphql/schema/event.ex @@ -17,7 +17,7 @@ defmodule Mobilizon.GraphQL.Schema.EventType do @desc "An event" object :event do - interfaces([:action_log_object, :interactable]) + interfaces([:action_log_object, :interactable, :activity_object]) field(:id, :id, description: "Internal ID for this event") field(:uuid, :uuid, description: "The Event UUID") field(:url, :string, description: "The ActivityPub Event URL") @@ -101,7 +101,7 @@ defmodule Mobilizon.GraphQL.Schema.EventType do # field(:sessions, list_of(:session)) field(:updated_at, :datetime, description: "When the event was last updated") - field(:created_at, :datetime, description: "When the event was created") + field(:inserted_at, :datetime, description: "When the event was created") field(:options, :event_options, description: "The event options") end @@ -297,11 +297,29 @@ defmodule Mobilizon.GraphQL.Schema.EventType do field(:id, :string, description: "The Contact Actor ID") end + @desc "Available event sort fields" + enum :event_order_by do + value(:begins_on, description: "Sort by the date the event starts") + value(:inserted_at, description: "Sort by the date the event was created") + value(:updated_at, description: "Sort by the date the event was updated") + end + object :event_queries do @desc "Get all events" field :events, :paginated_event_list do arg(:page, :integer, default_value: 1, description: "The page in the paginated event list") arg(:limit, :integer, default_value: 10, description: "The limit of events per page") + + arg(:order_by, :event_order_by, + default_value: :begins_on, + description: "Order the list of events by field" + ) + + arg(:direction, :sort_direction, + default_value: :asc, + description: "Direction for the sort" + ) + resolve(&Event.list_events/3) end diff --git a/lib/graphql/schema/events/feed_token.ex b/lib/graphql/schema/events/feed_token.ex index 44ea96289..c50880574 100644 --- a/lib/graphql/schema/events/feed_token.ex +++ b/lib/graphql/schema/events/feed_token.ex @@ -31,7 +31,7 @@ defmodule Mobilizon.GraphQL.Schema.Events.FeedTokenType do description: "The actor that participates to the event" ) - field(:token, :string, description: "The role of this actor at this event") + field(:token, :string, description: "A ShortUUID private token") end @desc "Represents a deleted feed_token" diff --git a/lib/graphql/schema/post.ex b/lib/graphql/schema/post.ex index 6df271fbd..8c0d62030 100644 --- a/lib/graphql/schema/post.ex +++ b/lib/graphql/schema/post.ex @@ -7,6 +7,7 @@ defmodule Mobilizon.GraphQL.Schema.PostType do @desc "A post" object :post do + interfaces([:activity_object]) field(:id, :id, description: "The post's ID") field(:title, :string, description: "The post's title") field(:slug, :string, description: "The post's slug") diff --git a/lib/graphql/schema/resource.ex b/lib/graphql/schema/resource.ex index 320c3fce5..8408da2d4 100644 --- a/lib/graphql/schema/resource.ex +++ b/lib/graphql/schema/resource.ex @@ -9,6 +9,7 @@ defmodule Mobilizon.GraphQL.Schema.ResourceType do @desc "A resource" object :resource do + interfaces([:activity_object]) field(:id, :id, description: "The resource's ID") field(:title, :string, description: "The resource's title") field(:summary, :string, description: "The resource's summary") diff --git a/lib/graphql/schema/user.ex b/lib/graphql/schema/user.ex index 10ad416ca..e8236c897 100644 --- a/lib/graphql/schema/user.ex +++ b/lib/graphql/schema/user.ex @@ -4,7 +4,7 @@ defmodule Mobilizon.GraphQL.Schema.UserType do """ use Absinthe.Schema.Notation - import Absinthe.Resolution.Helpers, only: [dataloader: 1] + import Absinthe.Resolution.Helpers, only: [dataloader: 2] alias Mobilizon.Events alias Mobilizon.GraphQL.Resolvers.{Media, User} @@ -43,7 +43,13 @@ defmodule Mobilizon.GraphQL.Schema.UserType do ) field(:feed_tokens, list_of(:feed_token), - resolve: dataloader(Events), + resolve: + dataloader( + Events, + callback: fn feed_tokens, _parent, _args -> + {:ok, Enum.map(feed_tokens, &Map.put(&1, :token, ShortUUID.encode!(&1.token)))} + end + ), description: "A list of the feed tokens for this user" ) @@ -177,6 +183,10 @@ defmodule Mobilizon.GraphQL.Schema.UserType do description: "When does the user receives a notification about a new pending membership in one of the group they're admin for" ) + + field(:location, :location, + description: "The user's preferred location, where they want to be suggested events" + ) end @desc "The list of values the for pending notification settings" @@ -199,6 +209,25 @@ defmodule Mobilizon.GraphQL.Schema.UserType do ) end + object :location do + field(:range, :integer, description: "The range in kilometers the user wants to see events") + + field(:geohash, :string, description: "A geohash representing the user's preferred location") + + field(:name, :string, description: "A string describing the user's preferred location") + end + + @desc """ + The set of parameters needed to input a location + """ + input_object :location_input do + field(:range, :integer, description: "The range in kilometers the user wants to see events") + + field(:geohash, :string, description: "A geohash representing the user's preferred location") + + field(:name, :string, description: "A string describing the user's preferred location") + end + object :user_queries do @desc "Get an user" field :user, :user do @@ -343,6 +372,10 @@ defmodule Mobilizon.GraphQL.Schema.UserType do "When does the user receives a notification about a new pending membership in one of the group they're admin for" ) + arg(:location, :location_input, + description: "A geohash of the user's preferred location, where they want to see events" + ) + resolve(&User.set_user_setting/3) end diff --git a/lib/mix/tasks/mobilizon/actors/refresh.ex b/lib/mix/tasks/mobilizon/actors/refresh.ex index 44bca92e7..893af5f2b 100644 --- a/lib/mix/tasks/mobilizon/actors/refresh.ex +++ b/lib/mix/tasks/mobilizon/actors/refresh.ex @@ -4,7 +4,7 @@ defmodule Mix.Tasks.Mobilizon.Actors.Refresh do """ use Mix.Task alias Mobilizon.Actors.Actor - alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Storage.Repo import Ecto.Query import Mix.Tasks.Mobilizon.Common @@ -65,7 +65,7 @@ defmodule Mix.Tasks.Mobilizon.Actors.Refresh do def run([preferred_username]) do start_mobilizon() - case ActivityPub.make_actor_from_nickname(preferred_username) do + case ActivityPubActor.make_actor_from_nickname(preferred_username) do {:ok, %Actor{}} -> shell_info(""" Actor #{preferred_username} refreshed @@ -89,7 +89,7 @@ defmodule Mix.Tasks.Mobilizon.Actors.Refresh do @spec make_actor(String.t(), boolean()) :: any() defp make_actor(username, verbose) do - ActivityPub.make_actor_from_nickname(username) + ActivityPubActor.make_actor_from_nickname(username) rescue _ -> if verbose do diff --git a/lib/mix/tasks/mobilizon/common.ex b/lib/mix/tasks/mobilizon/common.ex index 5fdb6af41..5c441b3ae 100644 --- a/lib/mix/tasks/mobilizon/common.ex +++ b/lib/mix/tasks/mobilizon/common.ex @@ -9,6 +9,7 @@ defmodule Mix.Tasks.Mobilizon.Common do """ def start_mobilizon do + if mix_task?(), do: Mix.Task.run("app.config") Application.put_env(:phoenix, :serve_endpoints, false, persistent: true) {:ok, _} = Application.ensure_all_started(:mobilizon) @@ -64,6 +65,8 @@ defmodule Mix.Tasks.Mobilizon.Common do @doc "Performs a safe check whether `Mix.shell/0` is available (does not raise if Mix is not loaded)" def mix_shell?, do: :erlang.function_exported(Mix, :shell, 0) + def mix_task?, do: :erlang.function_exported(Mix.Task, :run, 1) + def escape_sh_path(path) do ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(') end diff --git a/lib/mix/tasks/mobilizon/create_bot.ex b/lib/mix/tasks/mobilizon/create_bot.ex index 2aea6166b..a01d0f592 100644 --- a/lib/mix/tasks/mobilizon/create_bot.ex +++ b/lib/mix/tasks/mobilizon/create_bot.ex @@ -16,7 +16,7 @@ defmodule Mix.Tasks.Mobilizon.CreateBot do def run([email, name, summary, type, url]) do start_mobilizon() - with {:ok, %User{} = user} <- Users.get_user_by_email(email, true), + with {:ok, %User{} = user} <- Users.get_user_by_email(email, activated: true), actor <- Actors.register_bot(%{name: name, summary: summary}), {:ok, %Bot{} = bot} <- Actors.create_bot(%{ diff --git a/lib/mix/tasks/mobilizon/instance.ex b/lib/mix/tasks/mobilizon/instance.ex index 7cb4da48d..dcb4e552e 100644 --- a/lib/mix/tasks/mobilizon/instance.ex +++ b/lib/mix/tasks/mobilizon/instance.ex @@ -41,6 +41,7 @@ defmodule Mix.Tasks.Mobilizon.Instance do options, strict: [ force: :boolean, + source: :boolean, output: :string, output_psql: :string, domain: :string, @@ -55,18 +56,20 @@ defmodule Mix.Tasks.Mobilizon.Instance do ], aliases: [ o: :output, - f: :force + f: :force, + s: :source ] ) paths = [config_path, psql_path] = [ - Keyword.get(options, :output, "config/prod.secret.exs"), + Keyword.get(options, :output, "config/runtime.exs"), Keyword.get(options, :output_psql, "setup_db.psql") ] will_overwrite = Enum.filter(paths, &File.exists?/1) proceed? = Enum.empty?(will_overwrite) or Keyword.get(options, :force, false) + source_install? = Keyword.get(options, :source, false) if proceed? do [domain, port | _] = @@ -146,10 +149,10 @@ defmodule Mix.Tasks.Mobilizon.Instance do database_port: Keyword.get(options, :dbport, 5432), database_username: dbuser, database_password: dbpass, - version: Mobilizon.Mixfile.project() |> Keyword.get(:version), instance_secret: instance_secret, auth_secret: auth_secret, - listen_port: listen_port + listen_port: listen_port, + release: source_install? == false ) result_psql = @@ -160,22 +163,22 @@ defmodule Mix.Tasks.Mobilizon.Instance do database_password: dbpass ) - shell_info("Writing config to #{config_path}.") - - File.write(config_path, result_config) - shell_info("Writing #{psql_path}.") - File.write(psql_path, result_psql) - - shell_info( - "\n" <> - """ - To get started: - 1. Check the contents of the generated files. - 2. Run `sudo -u postgres psql -f #{escape_sh_path(psql_path)} && rm #{ - escape_sh_path(psql_path) - }`. - """ - ) + with :ok <- write_config(config_path, result_config), + :ok <- write_psql(psql_path, result_psql) do + shell_info( + "\n" <> + """ + To get started: + 1. Check the contents of the generated files. + 2. Run `sudo -u postgres psql -f #{escape_sh_path(psql_path)} && rm #{ + escape_sh_path(psql_path) + }`. + """ + ) + else + {:error, err} -> exit(err) + _ -> exit(:unknown_error) + end else shell_error( "The task would have overwritten the following files:\n" <> @@ -184,4 +187,36 @@ defmodule Mix.Tasks.Mobilizon.Instance do ) end end + + defp write_config(config_path, result_config) do + shell_info("Writing config to #{config_path}.") + + case File.write(config_path, result_config) do + :ok -> + :ok + + {:error, err} -> + shell_error( + "\nERROR: Unable to write config file to #{config_path}. Make sure you have permissions on the destination and that the parent path exists.\n" + ) + + {:error, err} + end + end + + defp write_psql(psql_path, result_psql) do + shell_info("Writing #{psql_path}.") + + case File.write(psql_path, result_psql) do + :ok -> + :ok + + {:error, err} -> + shell_error( + "\nERROR: Unable to write psql file to #{psql_path}. Make sure you have permissions on the destination and that the parent path exists.\n" + ) + + {:error, err} + end + end end diff --git a/lib/mix/tasks/mobilizon/relay/follow.ex b/lib/mix/tasks/mobilizon/relay/follow.ex index 43c29f456..db3f17d5c 100644 --- a/lib/mix/tasks/mobilizon/relay/follow.ex +++ b/lib/mix/tasks/mobilizon/relay/follow.ex @@ -16,9 +16,10 @@ defmodule Mix.Tasks.Mobilizon.Relay.Follow do {:ok, _activity, _follow} -> # put this task to sleep to allow the genserver to push out the messages :timer.sleep(500) + shell_info("Requested to follow #{target}") {:error, e} -> - IO.puts(:stderr, "Error while following #{target}: #{inspect(e)}") + shell_error("Error while following #{target}: #{inspect(e)}") end end diff --git a/lib/mix/tasks/mobilizon/relay/unfollow.ex b/lib/mix/tasks/mobilizon/relay/unfollow.ex index c368c3fb5..697f16fb6 100644 --- a/lib/mix/tasks/mobilizon/relay/unfollow.ex +++ b/lib/mix/tasks/mobilizon/relay/unfollow.ex @@ -16,9 +16,10 @@ defmodule Mix.Tasks.Mobilizon.Relay.Unfollow do {:ok, _activity, _follow} -> # put this task to sleep to allow the genserver to push out the messages :timer.sleep(500) + shell_info("Unfollowed #{target}") {:error, e} -> - IO.puts(:stderr, "Error while unfollowing #{target}: #{inspect(e)}") + shell_error("Error while unfollowing #{target}: #{inspect(e)}") end end diff --git a/lib/mix/tasks/mobilizon/users/modify.ex b/lib/mix/tasks/mobilizon/users/modify.ex index dd8a4181c..e49e8e1e7 100644 --- a/lib/mix/tasks/mobilizon/users/modify.ex +++ b/lib/mix/tasks/mobilizon/users/modify.ex @@ -40,7 +40,7 @@ defmodule Mix.Tasks.Mobilizon.Users.Modify do with {:ok, %User{} = user} <- Users.get_user_by_email(email), attrs <- %{}, role <- calculate_role(admin?, moderator?, user?), - attrs <- process_new_value(attrs, :mail, new_email, user.email), + attrs <- process_new_value(attrs, :email, new_email, user.email), attrs <- process_new_value(attrs, :role, role, user.role), attrs <- if(disable? && !is_nil(user.confirmed_at), @@ -58,7 +58,11 @@ defmodule Mix.Tasks.Mobilizon.Users.Modify do An user has been modified with the following information: - email: #{user.email} - Role: #{user.role} - - Activated: #{if user.confirmed_at, do: user.confirmed_at, else: "False"} + - account status: #{ + if user.confirmed_at, + do: "activated on #{DateTime.to_string(user.confirmed_at)} (UTC)", + else: "disabled" + } """) else {:makes_changes, false} -> diff --git a/lib/mix/tasks/mobilizon/users/show.ex b/lib/mix/tasks/mobilizon/users/show.ex index 3c33aaf52..6651eb986 100644 --- a/lib/mix/tasks/mobilizon/users/show.ex +++ b/lib/mix/tasks/mobilizon/users/show.ex @@ -19,8 +19,11 @@ defmodule Mix.Tasks.Mobilizon.Users.Show do actors <- Users.get_actors_for_user(user) do shell_info(""" Informations for the user #{user.email}: - - Activated: #{user.confirmed_at} - - Disabled: #{user.disabled} + - account status: #{ + if user.confirmed_at, + do: "Activated on #{DateTime.to_string(user.confirmed_at)} (UTC)", + else: "disabled" + } - Role: #{user.role} #{display_actors(actors)} """) diff --git a/lib/mobilizon.ex b/lib/mobilizon.ex index a1ca09962..c754964ac 100644 --- a/lib/mobilizon.ex +++ b/lib/mobilizon.ex @@ -16,7 +16,7 @@ defmodule Mobilizon do alias Mobilizon.{Config, Storage, Web} alias Mobilizon.Federation.ActivityPub - alias Mobilizon.Service.ErrorPage + alias Mobilizon.Service.{ErrorPage, ErrorReporter} alias Mobilizon.Service.Export.{Feed, ICalendar} @name Mix.Project.config()[:name] @@ -66,6 +66,16 @@ defmodule Mobilizon do ] ++ task_children(@env) + Logger.add_backend(Sentry.LoggerBackend) + :ok = Oban.Telemetry.attach_default_logger() + + :telemetry.attach_many( + "oban-errors", + [[:oban, :job, :exception], [:oban, :circuit, :trip]], + &ErrorReporter.handle_event/4, + %{} + ) + Supervisor.start_link(children, strategy: :one_for_one, name: Mobilizon.Supervisor) end diff --git a/lib/mobilizon/activities/activities.ex b/lib/mobilizon/activities/activities.ex new file mode 100644 index 000000000..491a2f103 --- /dev/null +++ b/lib/mobilizon/activities/activities.ex @@ -0,0 +1,179 @@ +defmodule Mobilizon.Activities do + @moduledoc """ + The Activities context. + """ + + import Ecto.Query, warn: false + import EctoEnum + alias Mobilizon.Activities.Activity + alias Mobilizon.Actors.Member + alias Mobilizon.Storage.{Page, Repo} + + defenum(Priority, + very_low: 10, + low: 20, + medium: 30, + high: 40, + very_high: 50 + ) + + @activity_types ["event", "post", "discussion", "resource", "group", "member"] + @event_activity_subjects ["event_created", "event_updated", "event_deleted", "comment_posted"] + @post_activity_subjects ["post_created", "post_updated", "post_deleted"] + @discussion_activity_subjects [ + "discussion_created", + "discussion_replied", + "discussion_renamed", + "discussion_archived", + "discussion_deleted" + ] + @resource_activity_subjects [ + "resource_created", + "resource_renamed", + "resource_moved", + "resource_deleted" + ] + @member_activity_subjects [ + "member_request", + "member_invited", + "member_accepted_invitation", + "member_rejected_invitation", + "member_added", + "member_joined", + "member_approved", + "member_updated", + "member_removed", + "member_quit" + ] + @settings_activity_subjects ["group_created", "group_updated"] + + @subjects @event_activity_subjects ++ + @post_activity_subjects ++ + @discussion_activity_subjects ++ + @resource_activity_subjects ++ + @member_activity_subjects ++ @settings_activity_subjects + + @object_type ["event", "actor", "post", "discussion", "resource", "member", "group", "comment"] + + defenum(Type, @activity_types) + defenum(Subject, @subjects) + defenum(ObjectType, @object_type) + + @doc """ + Returns the list of activities. + + ## Examples + + iex> list_activities() + [%Activity{}, ...] + + """ + def list_activities do + Repo.all(Activity) + end + + @spec list_group_activities_for_member( + integer() | String.t(), + integer() | String.t(), + Keyword.t(), + integer() | nil, + integer() | nil + ) :: Page.t() + def list_group_activities_for_member( + group_id, + actor_asking_id, + filters \\ [], + page \\ nil, + limit \\ nil + ) do + Activity + |> where([a], a.group_id == ^group_id) + |> join(:inner, [a], m in Member, + on: m.parent_id == a.group_id and m.actor_id == ^actor_asking_id + ) + |> where([a, m], a.inserted_at >= m.member_since) + |> filter_object_type(Keyword.get(filters, :type)) + |> filter_author(Keyword.get(filters, :author), actor_asking_id) + |> order_by(desc: :inserted_at) + |> preload([:author, :group]) + |> Page.build_page(page, limit) + end + + @spec list_group_activities( + integer() | String.t(), + Keyword.t(), + integer() | nil, + integer() | nil + ) :: Page.t() + def list_group_activities( + group_id, + filters \\ [], + page \\ nil, + limit \\ nil + ) do + Activity + |> where([a], a.group_id == ^group_id) + |> filter_object_type(Keyword.get(filters, :type)) + |> order_by(desc: :inserted_at) + |> preload([:author, :group]) + |> Page.build_page(page, limit) + end + + @doc """ + Gets a single activity. + + Raises `Ecto.NoResultsError` if the Activity does not exist. + + ## Examples + + iex> get_activity!(123) + %Activity{} + + iex> get_activity!(456) + ** (Ecto.NoResultsError) + + """ + def get_activity!(id), do: Repo.get!(Activity, id) + + @doc """ + Creates a activity. + + ## Examples + + iex> create_activity(%{field: value}) + {:ok, %Activity{}} + + iex> create_activity(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_activity(attrs \\ %{}) do + %Activity{} + |> Activity.changeset(attrs) + |> Repo.insert() + end + + def object_types, do: @object_type + + def subjects, do: @subjects + + def activity_types, do: @activity_types + + @spec filter_object_type(Query.t(), atom() | nil) :: Query.t() + defp filter_object_type(query, nil), do: query + + defp filter_object_type(query, type) do + where(query, [q], q.type == ^type) + end + + @spec filter_author(Query.t(), atom() | nil, integer() | String.t()) :: Query.t() + defp filter_author(query, nil, _), do: query + + defp filter_author(query, :self, actor_asking_id) do + where(query, [q], q.author_id == ^actor_asking_id) + end + + defp filter_author(query, :by, actor_asking_id) do + where(query, [q], q.author_id != ^actor_asking_id) + end +end diff --git a/lib/mobilizon/activities/activity.ex b/lib/mobilizon/activities/activity.ex new file mode 100644 index 000000000..08698d2eb --- /dev/null +++ b/lib/mobilizon/activities/activity.ex @@ -0,0 +1,77 @@ +defmodule Mobilizon.Activities.Activity do + @moduledoc """ + Any activity for users + """ + + use Ecto.Schema + import Ecto.Changeset + alias Mobilizon.Activities.{ObjectType, Priority, Subject, Type} + alias Mobilizon.Actors.Actor + + @required_attrs [:type, :subject, :author_id, :group_id, :inserted_at] + @optional_attrs [ + :priority, + :subject_params, + :message, + :message_params, + :object_type, + :object_id + ] + @attrs @required_attrs ++ @optional_attrs + + @type t :: %__MODULE__{ + priority: Priority.t(), + type: Type.t(), + subject: Subject.t(), + subject_params: map(), + message: String.t(), + message_params: map(), + object_type: ObjectType.t(), + object_id: String.t(), + author: Actor.t(), + group: Actor.t() + } + + schema "activities" do + field(:priority, Priority, default: :medium) + field(:type, Type) + field(:subject, Subject) + field(:subject_params, :map, default: %{}) + field(:message, :string) + field(:message_params, :map, default: %{}) + field(:object_type, ObjectType) + field(:object_id, :string) + field(:inserted_at, :utc_datetime) + belongs_to(:author, Actor) + belongs_to(:group, Actor) + end + + @doc false + def changeset(activity, attrs) do + activity + |> cast(attrs, @attrs) + |> validate_required(@required_attrs) + |> stringify_params(:subject_params) + |> stringify_params(:message_params) + end + + defp stringify_params(changeset, attr) do + stringified_params = + changeset + |> get_change(attr, %{}) + |> Enum.map(fn {key, value} -> {key, stringify_struct(value)} end) + |> Map.new() + + put_change(changeset, attr, stringified_params) + end + + defp stringify_struct(%_{} = struct) do + association_fields = struct.__struct__.__schema__(:associations) + + struct + |> Map.from_struct() + |> Map.drop(association_fields ++ [:__meta__]) + end + + defp stringify_struct(smth), do: smth +end diff --git a/lib/mobilizon/actors/actors.ex b/lib/mobilizon/actors/actors.ex index 306ac56a2..41543270f 100644 --- a/lib/mobilizon/actors/actors.ex +++ b/lib/mobilizon/actors/actors.ex @@ -66,6 +66,7 @@ defmodule Mobilizon.Actors do Gets a single actor. """ @spec get_actor(integer | String.t()) :: Actor.t() | nil + def get_actor(nil), do: nil def get_actor(id), do: Repo.get(Actor, id) @doc """ @@ -155,7 +156,7 @@ defmodule Mobilizon.Actors do query |> filter_by_type(type) - |> filter_by_name(String.split(name, "@")) + |> filter_by_name(name |> String.trim() |> String.trim_leading("@") |> String.split("@")) |> Repo.one() end @@ -332,28 +333,33 @@ defmodule Mobilizon.Actors do |> Multi.run(:remove_avatar, fn _, _ -> remove_avatar(actor) end) multi = - if type == :Group do - multi - |> Multi.run(:delete_remote_members, fn _, _ -> - delete_group_elements(actor, :remote_members) - end) - |> Multi.run(:delete_group_organized_events, fn _, _ -> - delete_group_elements(actor, :events) - end) - |> Multi.run(:delete_group_posts, fn _, _ -> - delete_group_elements(actor, :posts) - end) - |> Multi.run(:delete_group_resources, fn _, _ -> - delete_group_elements(actor, :resources) - end) - |> Multi.run(:delete_group_todo_lists, fn _, _ -> - delete_group_elements(actor, :todo_lists) - end) - |> Multi.run(:delete_group_discussions, fn _, _ -> - delete_group_elements(actor, :discussions) - end) - else - multi + case type do + :Group -> + multi + |> Multi.run(:delete_remote_members, fn _, _ -> + delete_group_elements(actor, :remote_members) + end) + |> Multi.run(:delete_group_organized_events, fn _, _ -> + delete_group_elements(actor, :events) + end) + |> Multi.run(:delete_group_posts, fn _, _ -> + delete_group_elements(actor, :posts) + end) + |> Multi.run(:delete_group_resources, fn _, _ -> + delete_group_elements(actor, :resources) + end) + |> Multi.run(:delete_group_todo_lists, fn _, _ -> + delete_group_elements(actor, :todo_lists) + end) + |> Multi.run(:delete_group_discussions, fn _, _ -> + delete_group_elements(actor, :discussions) + end) + + :Person -> + # When deleting a profile, reset default_actor_id + Multi.run(multi, :reset_default_actor_id, fn _, _ -> + reset_default_actor_id(actor) + end) end multi = @@ -373,12 +379,22 @@ defmodule Mobilizon.Actors do {:error, remove, error, _} when remove in [:remove_banner, :remove_avatar] -> Logger.error("Error while deleting actor's banner or avatar") - Logger.error(inspect(error, pretty: true)) + + Sentry.capture_message("Error while deleting actor's banner or avatar", + extra: %{err: error} + ) + + Logger.debug(inspect(error, pretty: true)) {:error, error} err -> Logger.error("Unknown error while deleting actor") - Logger.error(inspect(err, pretty: true)) + + Sentry.capture_message("Error while deleting actor's banner or avatar", + extra: %{err: err} + ) + + Logger.debug(inspect(err, pretty: true)) {:error, err} end end @@ -484,6 +500,10 @@ defmodule Mobilizon.Actors do defp filter_suspended(query, true), do: where(query, [a], a.suspended) defp filter_suspended(query, false), do: where(query, [a], not a.suspended) + @spec filter_out_anonymous_actor_id(Ecto.Query.t(), integer() | String.t()) :: Ecto.Query.t() + defp filter_out_anonymous_actor_id(query, anonymous_actor_id), + do: where(query, [a], a.id != ^anonymous_actor_id) + @doc """ Returns the list of local actors by their username. """ @@ -511,12 +531,15 @@ defmodule Mobilizon.Actors do page \\ nil, limit \\ nil ) do + anonymous_actor_id = Mobilizon.Config.anonymous_actor_id() + Actor |> actor_by_username_or_name_query(term) |> actors_for_location(Keyword.get(options, :location), Keyword.get(options, :radius)) |> filter_by_types(Keyword.get(options, :actor_type, :Group)) |> filter_by_minimum_visibility(Keyword.get(options, :minimum_visibility, :public)) |> filter_suspended(false) + |> filter_out_anonymous_actor_id(anonymous_actor_id) |> Page.build_page(page, limit) end @@ -651,10 +674,11 @@ defmodule Mobilizon.Actors do @doc """ Lists the groups. """ - @spec list_groups_for_stream :: Enum.t() - def list_external_groups_for_stream do + @spec list_external_groups(non_neg_integer()) :: list(Actor.t()) + def list_external_groups(limit \\ 100) when limit > 0 do external_groups_query() - |> Repo.stream() + |> limit(^limit) + |> Repo.all() end @doc """ @@ -860,7 +884,7 @@ defmodule Mobilizon.Actors do end @doc """ - Returns the list of members for a group. + Returns a paginated list of members for a group. """ @spec list_members_for_group(Actor.t(), list(atom()), integer | nil, integer | nil) :: Page.t() def list_members_for_group( @@ -882,6 +906,13 @@ defmodule Mobilizon.Actors do |> Repo.all() end + @spec list_internal_actors_members_for_group(Actor.t(), list()) :: list(Actor.t()) + def list_internal_actors_members_for_group(%Actor{id: group_id, type: :Group}, roles \\ []) do + group_id + |> group_internal_member_actor_query(roles) + |> Repo.all() + end + @doc """ Returns a paginated list of administrator members for a group. """ @@ -1274,11 +1305,13 @@ defmodule Mobilizon.Actors do @doc """ Whether the actor needs to be updated. - Local actors obviously don't need to be updated + Local actors obviously don't need to be updated, neither do suspended ones """ @spec needs_update?(Actor.t()) :: boolean def needs_update?(%Actor{domain: nil}), do: false + def needs_update?(%Actor{suspended: true}), do: false + def needs_update?(%Actor{last_refreshed_at: nil, domain: domain}) when not is_nil(domain), do: true @@ -1512,6 +1545,16 @@ defmodule Mobilizon.Actors do |> select([m, _a], m) end + @spec group_internal_member_actor_query(integer(), list()) :: Ecto.Query.t() + defp group_internal_member_actor_query(group_id, role) do + Member + |> where([m], m.parent_id == ^group_id) + |> filter_member_role(role) + |> join(:inner, [m], a in Actor, on: m.actor_id == a.id) + |> where([_m, a], is_nil(a.domain)) + |> select([_m, a], a) + end + @spec group_internal_member_query(integer()) :: Ecto.Query.t() defp group_internal_member_query(group_id) do Member @@ -1523,13 +1566,13 @@ defmodule Mobilizon.Actors do end @spec filter_member_role(Ecto.Query.t(), list(atom()) | atom()) :: Ecto.Query.t() - def filter_member_role(query, []), do: query + defp filter_member_role(query, []), do: query - def filter_member_role(query, roles) when is_list(roles) do + defp filter_member_role(query, roles) when is_list(roles) do where(query, [m], m.role in ^roles) end - def filter_member_role(query, role) when is_atom(role) do + defp filter_member_role(query, role) when is_atom(role) do from(m in query, where: m.role == ^role) end @@ -1794,6 +1837,24 @@ defmodule Mobilizon.Actors do end end + @spec reset_default_actor_id(Actor.t()) :: {:ok, User.t()} | {:error, :user_not_found} + defp reset_default_actor_id(%Actor{type: :Person, user: %User{id: user_id} = user, id: actor_id}) do + Logger.debug("reset_default_actor_id") + + new_actor_id = + user + |> Users.get_actors_for_user() + |> Enum.map(& &1.id) + |> Enum.find(&(&1 !== actor_id)) + + {:ok, Users.update_user_default_actor(user_id, new_actor_id)} + rescue + _e in Ecto.NoResultsError -> + {:error, :user_not_found} + end + + defp reset_default_actor_id(%Actor{type: :Person, user: nil}), do: {:ok, nil} + defp accumulate_paginated_elements( %Actor{} = actor, method, diff --git a/lib/mobilizon/actors/bot.ex b/lib/mobilizon/actors/bot.ex index 8312f44b7..7946ec14f 100644 --- a/lib/mobilizon/actors/bot.ex +++ b/lib/mobilizon/actors/bot.ex @@ -23,7 +23,7 @@ defmodule Mobilizon.Actors.Bot do schema "bots" do field(:source, :string) - field(:type, :string, default: :ics) + field(:type, :string, default: "ics") belongs_to(:actor, Actor) belongs_to(:user, User) diff --git a/lib/mobilizon/actors/member.ex b/lib/mobilizon/actors/member.ex index 23505462c..e2481b0fc 100644 --- a/lib/mobilizon/actors/member.ex +++ b/lib/mobilizon/actors/member.ex @@ -25,6 +25,7 @@ defmodule Mobilizon.Actors.Member do schema "members" do field(:role, MemberRole, default: :member) field(:url, :string) + field(:member_since, :utc_datetime) embeds_one :metadata, Metadata, on_replace: :delete do # TODO : Use this space to put notes when someone is invited / requested to join @@ -64,6 +65,7 @@ defmodule Mobilizon.Actors.Member do |> cast(attrs, @attrs) |> cast_embed(:metadata, with: &metadata_changeset/2) |> ensure_url() + |> update_member_since() |> validate_required(@required_attrs) # On both parent_id and actor_id |> unique_constraint(:parent_id, name: :members_actor_parent_unique_index) @@ -98,4 +100,29 @@ defmodule Mobilizon.Actors.Member do |> put_change(:id, uuid) |> put_change(:url, "#{Endpoint.url()}/member/#{uuid}") end + + @spec update_member_since(Ecto.Changeset.t()) :: Ecto.Changeset.t() + defp update_member_since(%Ecto.Changeset{data: data} = changeset) do + new_role = get_change(changeset, :role) + + cond do + new_role in [ + :member, + :moderator, + :administrator, + :creator + ] -> + put_change( + changeset, + :member_since, + DateTime.truncate(data.member_since || DateTime.utc_now(), :second) + ) + + new_role in [:invited, :not_approved, :rejected] -> + put_change(changeset, :member_since, nil) + + true -> + changeset + end + end end diff --git a/lib/mobilizon/addresses/address.ex b/lib/mobilizon/addresses/address.ex index 5706748a6..7485ee7a9 100644 --- a/lib/mobilizon/addresses/address.ex +++ b/lib/mobilizon/addresses/address.ex @@ -63,6 +63,7 @@ defmodule Mobilizon.Addresses.Address do |> cast(attrs, @attrs) |> set_url() |> validate_required(@required_attrs) + |> unique_constraint(:url, name: :addresses_url_index) end @spec set_url(Ecto.Changeset.t()) :: Ecto.Changeset.t() @@ -83,8 +84,10 @@ defmodule Mobilizon.Addresses.Address do def representation(nil), do: nil def representation(%__MODULE__{} = address) do - "#{address.street} #{address.postal_code} #{address.locality} #{address.region} #{ - address.country - }" + String.trim( + "#{address.street} #{address.postal_code} #{address.locality} #{address.region} #{ + address.country + }" + ) end end diff --git a/lib/mobilizon/admin/admin.ex b/lib/mobilizon/admin/admin.ex index 66bcc6c5b..21cb7cf1a 100644 --- a/lib/mobilizon/admin/admin.ex +++ b/lib/mobilizon/admin/admin.ex @@ -36,11 +36,10 @@ defmodule Mobilizon.Admin do @doc """ Returns the list of action logs. """ - @spec list_action_logs(integer | nil, integer | nil) :: [ActionLog.t()] + @spec list_action_logs(integer | nil, integer | nil) :: Page.t() def list_action_logs(page \\ nil, limit \\ nil) do list_action_logs_query() - |> Page.paginate(page, limit) - |> Repo.all() + |> Page.build_page(page, limit) end @doc """ @@ -78,7 +77,7 @@ defmodule Mobilizon.Admin do defp stringify_struct(struct), do: struct def get_admin_setting_value(group, name, fallback \\ nil) - when is_bitstring(group) and is_bitstring(name) do + when is_binary(group) and is_binary(name) do case Repo.get_by(Setting, group: group, name: name) do nil -> fallback diff --git a/lib/mobilizon/discussions/comment.ex b/lib/mobilizon/discussions/comment.ex index bfa0cf6a1..8ec1bd75a 100644 --- a/lib/mobilizon/discussions/comment.ex +++ b/lib/mobilizon/discussions/comment.ex @@ -126,6 +126,7 @@ defmodule Mobilizon.Discussions.Comment do |> put_assoc(:media, Map.get(attrs, :media, [])) |> put_tags(attrs) |> put_mentions(attrs) + |> unique_constraint(:url, name: :comments_url_index) end @spec maybe_generate_uuid(Ecto.Changeset.t()) :: Ecto.Changeset.t() diff --git a/lib/mobilizon/discussions/discussion.ex b/lib/mobilizon/discussions/discussion.ex index 8e06b3294..99ac93795 100644 --- a/lib/mobilizon/discussions/discussion.ex +++ b/lib/mobilizon/discussions/discussion.ex @@ -28,6 +28,7 @@ defmodule Mobilizon.Discussions.Discussion do alias Mobilizon.Discussions.Discussion.TitleSlug alias Mobilizon.Web.Endpoint alias Mobilizon.Web.Router.Helpers, as: Routes + import Mobilizon.Web.Gettext, only: [dgettext: 2] @type t :: %__MODULE__{ creator: Actor.t(), @@ -63,7 +64,7 @@ defmodule Mobilizon.Discussions.Discussion do discussion |> cast(attrs, @attrs) |> maybe_generate_id() - |> validate_required([:title, :id]) + |> validate_required([:title, :id], message: dgettext("errors", "can't be blank")) |> TitleSlug.maybe_generate_slug() |> TitleSlug.unique_constraint() |> maybe_generate_url() diff --git a/lib/mobilizon/discussions/discussions.ex b/lib/mobilizon/discussions/discussions.ex index fac154fc9..e951d4604 100644 --- a/lib/mobilizon/discussions/discussions.ex +++ b/lib/mobilizon/discussions/discussions.ex @@ -329,7 +329,7 @@ defmodule Mobilizon.Discussions do @doc """ Get a discussion by it's ID """ - @spec get_discussion(String.t() | integer()) :: Discussion.t() + @spec get_discussion(String.t() | integer()) :: Discussion.t() | nil def get_discussion(discussion_id) do Discussion |> Repo.get(discussion_id) @@ -399,7 +399,8 @@ defmodule Mobilizon.Discussions do } -> Changeset.change(comment, %{discussion_id: discussion_id, url: discussion_url}) end) - |> Repo.transaction() do + |> Repo.transaction(), + %Discussion{} = discussion <- Repo.preload(discussion, @discussion_preloads) do {:ok, discussion} end end @@ -427,8 +428,9 @@ defmodule Mobilizon.Discussions do %{last_comment_id: comment_id} ) end) - |> Repo.transaction() do - # Discussion is not updated + |> Repo.transaction(), + # Discussion is not updated + %Comment{} = comment <- Repo.preload(comment, @comment_preloads) do {:ok, Map.put(discussion, :last_comment, comment)} end end diff --git a/lib/mobilizon/events/events.ex b/lib/mobilizon/events/events.ex index 6adfd0d84..35271d836 100644 --- a/lib/mobilizon/events/events.ex +++ b/lib/mobilizon/events/events.ex @@ -522,7 +522,7 @@ defmodule Mobilizon.Events do |> filter_local_or_from_followed_instances_events() |> filter_public_visibility() |> event_order_begins_on_asc() - |> Page.build_page(page, limit) + |> Page.build_page(page, limit, :begins_on) end @doc """ @@ -1342,12 +1342,12 @@ defmodule Mobilizon.Events do @spec events_for_search_query(String.t()) :: Ecto.Query.t() defp events_for_search_query("") do Event - |> distinct([e], e.id) + |> distinct([e], asc: e.begins_on, asc: e.id) end defp events_for_search_query(search_string) do from(event in Event, - distinct: event.id, + distinct: [asc: event.begins_on, asc: event.id], join: id_and_rank in matching_event_ids_and_ranks(search_string), on: id_and_rank.id == event.id ) diff --git a/lib/mobilizon/events/tag.ex b/lib/mobilizon/events/tag.ex index 3a2488e1e..b4fc428eb 100644 --- a/lib/mobilizon/events/tag.ex +++ b/lib/mobilizon/events/tag.ex @@ -36,7 +36,7 @@ defmodule Mobilizon.Events.Tag do |> TitleSlug.maybe_generate_slug() |> validate_required(@required_attrs) |> TitleSlug.unique_constraint() - |> validate_length(:title, min: 2, max: 20) - |> validate_length(:slug, min: 2, max: 20) + |> validate_length(:title, min: 2, max: 40) + |> validate_length(:slug, min: 2, max: 40) end end diff --git a/lib/mobilizon/posts/post.ex b/lib/mobilizon/posts/post.ex index 3642fe453..adf955989 100644 --- a/lib/mobilizon/posts/post.ex +++ b/lib/mobilizon/posts/post.ex @@ -138,11 +138,12 @@ defmodule Mobilizon.Posts.Post do defp process_tag(tag), do: Tag.changeset(%Tag{}, tag) defp maybe_put_publish_date(%Changeset{} = changeset) do - publish_at = + default_publish_at = if get_field(changeset, :draft, true) == false, do: DateTime.utc_now() |> DateTime.truncate(:second), else: nil + publish_at = get_change(changeset, :publish_at, default_publish_at) put_change(changeset, :publish_at, publish_at) end diff --git a/lib/mobilizon/posts/posts.ex b/lib/mobilizon/posts/posts.ex index ac292806b..e967e1ee7 100644 --- a/lib/mobilizon/posts/posts.ex +++ b/lib/mobilizon/posts/posts.ex @@ -10,7 +10,7 @@ defmodule Mobilizon.Posts do import Ecto.Query require Logger - @post_preloads [:author, :attributed_to, :picture, :media] + @post_preloads [:author, :attributed_to, :picture, :media, :tags] import EctoEnum @@ -21,6 +21,14 @@ defmodule Mobilizon.Posts do :private ]) + def list_public_local_posts(page \\ nil, limit \\ nil) do + Post + |> filter_public() + |> filter_local() + |> preload_post_associations() + |> Page.build_page(page, limit) + end + @spec list_posts_for_stream :: Enum.t() def list_posts_for_stream do Post @@ -141,10 +149,20 @@ defmodule Mobilizon.Posts do where(query, [p], p.visibility == ^:public and not p.draft) end + @spec filter_local(Ecto.Query.t()) :: Ecto.Query.t() + defp filter_local(query) do + where(query, [q], q.local == true) + end + defp do_get_posts_for_group(group_id) do Post |> where(attributed_to_id: ^group_id) |> order_by(desc: :inserted_at) - |> preload([p], [:author, :attributed_to, :picture, :media, :tags]) + |> preload_post_associations() + end + + @spec preload_post_associations(Ecto.Query.t(), list()) :: Ecto.Query.t() + defp preload_post_associations(query, associations \\ @post_preloads) do + preload(query, ^associations) end end diff --git a/lib/mobilizon/resources/resources.ex b/lib/mobilizon/resources/resources.ex index b4cb43ae2..c647c8d4d 100644 --- a/lib/mobilizon/resources/resources.ex +++ b/lib/mobilizon/resources/resources.ex @@ -115,7 +115,10 @@ defmodule Mobilizon.Resources do Multi.new() |> do_find_parent_path(Map.get(attrs, :parent_id)) |> Multi.insert(:insert, fn %{find_parent_path: path} -> - Resource.changeset(%Resource{}, Map.put(attrs, :path, "#{path}/#{attrs.title}")) + Resource.changeset( + %Resource{}, + Map.put(attrs, :path, "#{path}/#{String.replace(attrs.title, "/", "")}") + ) end) |> Repo.transaction() |> case do @@ -142,7 +145,11 @@ defmodule Mobilizon.Resources do |> update_children(resource, attrs) |> Multi.update(:update, fn %{find_parent_path: path} -> title = Map.get(attrs, :title, old_title) - Resource.changeset(resource, Map.put(attrs, :path, "#{path}/#{title}")) + + Resource.changeset( + resource, + Map.put(attrs, :path, "#{path}/#{String.replace(title, "/", "")}") + ) end) |> Repo.transaction() |> case do diff --git a/lib/mobilizon/storage/repo.ex b/lib/mobilizon/storage/repo.ex index 8cdde1a45..3b209a3cc 100644 --- a/lib/mobilizon/storage/repo.ex +++ b/lib/mobilizon/storage/repo.ex @@ -11,6 +11,6 @@ defmodule Mobilizon.Storage.Repo do Dynamically loads the repository url from the DATABASE_URL environment variable. """ def init(_, opts) do - {:ok, Keyword.put(opts, :url, System.get_env("DATABASE_URL"))} + {:ok, opts} end end diff --git a/lib/mobilizon/users/setting.ex b/lib/mobilizon/users/setting.ex index 9d20f5d39..38d762818 100644 --- a/lib/mobilizon/users/setting.ex +++ b/lib/mobilizon/users/setting.ex @@ -30,6 +30,8 @@ defmodule Mobilizon.Users.Setting do @attrs @required_attrs ++ @optional_attrs + @location_attrs [:name, :range, :geohash] + @primary_key {:user_id, :id, autogenerate: false} schema "user_settings" do field(:timezone, :string) @@ -45,6 +47,12 @@ defmodule Mobilizon.Users.Setting do default: :one_day ) + embeds_one :location, Location, on_replace: :update, primary_key: false do + field(:name, :string) + field(:range, :integer) + field(:geohash, :string) + end + belongs_to(:user, User, primary_key: true, type: :id, foreign_key: :id, define_field: false) timestamps() @@ -54,6 +62,12 @@ defmodule Mobilizon.Users.Setting do def changeset(setting, attrs) do setting |> cast(attrs, @attrs) + |> cast_embed(:location, with: &location_changeset/2) |> validate_required(@required_attrs) end + + def location_changeset(schema, params) do + schema + |> cast(params, @location_attrs) + end end diff --git a/lib/mobilizon/users/users.ex b/lib/mobilizon/users/users.ex index 74f15b543..b9d5ce779 100644 --- a/lib/mobilizon/users/users.ex +++ b/lib/mobilizon/users/users.ex @@ -10,7 +10,7 @@ defmodule Mobilizon.Users do alias Ecto.Multi alias Mobilizon.Actors.Actor - alias Mobilizon.Events + alias Mobilizon.{Crypto, Events} alias Mobilizon.Events.FeedToken alias Mobilizon.Storage.{Page, Repo} alias Mobilizon.Users.{Setting, User} @@ -19,6 +19,8 @@ defmodule Mobilizon.Users do defenum(NotificationPendingNotificationDelay, none: 0, direct: 1, one_hour: 5, one_day: 10) + @confirmation_token_length 30 + @doc """ Registers an user. """ @@ -66,10 +68,12 @@ defmodule Mobilizon.Users do @doc """ Gets an user by its email. """ - @spec get_user_by_email(String.t(), boolean | nil) :: + @spec get_user_by_email(String.t(), Keyword.t()) :: {:ok, User.t()} | {:error, :user_not_found} - def get_user_by_email(email, activated \\ nil) do - query = user_by_email_query(email, activated) + def get_user_by_email(email, options \\ []) do + activated = Keyword.get(options, :activated, nil) + unconfirmed = Keyword.get(options, :unconfirmed, true) + query = user_by_email_query(email, activated, unconfirmed) case Repo.one(query) do nil -> @@ -83,10 +87,13 @@ defmodule Mobilizon.Users do @doc """ Gets an user by its email. """ - @spec get_user_by_email!(String.t(), boolean | nil) :: User.t() - def get_user_by_email!(email, activated \\ nil) do + @spec get_user_by_email!(String.t(), Keyword.t()) :: User.t() + def get_user_by_email!(email, options \\ []) do + activated = Keyword.get(options, :activated, nil) + unconfirmed = Keyword.get(options, :unconfirmed, true) + email - |> user_by_email_query(activated) + |> user_by_email_query(activated, unconfirmed) |> Repo.one!() end @@ -123,6 +130,29 @@ defmodule Mobilizon.Users do end end + @spec update_user_email(User.t(), String.t()) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} + def update_user_email(%User{} = user, new_email) do + user + |> User.changeset(%{ + unconfirmed_email: new_email, + confirmation_token: Crypto.random_string(@confirmation_token_length), + confirmation_sent_at: DateTime.utc_now() |> DateTime.truncate(:second) + }) + |> Repo.update() + end + + @spec validate_email(User.t()) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} + def validate_email(%User{} = user) do + user + |> User.changeset(%{ + email: user.unconfirmed_email, + unconfirmed_email: nil, + confirmation_token: nil, + confirmation_sent_at: nil + }) + |> Repo.update() + end + @delete_user_default_options [reserve_email: true] @doc """ @@ -375,29 +405,26 @@ defmodule Mobilizon.Users do Setting.changeset(setting, %{}) end - @spec user_by_email_query(String.t(), boolean | nil) :: Ecto.Query.t() - defp user_by_email_query(email, nil) do - from(u in User, - where: u.email == ^email or u.unconfirmed_email == ^email, - preload: :default_actor - ) + @spec user_by_email_query(String.t(), boolean | nil, boolean()) :: Ecto.Query.t() + defp user_by_email_query(email, activated, unconfirmed) do + User + |> where([u], u.email == ^email) + |> include_unconfirmed(unconfirmed, email) + |> filter_activated(activated) + |> preload([:default_actor]) end - defp user_by_email_query(email, true) do - from( - u in User, - where: u.email == ^email and not is_nil(u.confirmed_at) and not u.disabled, - preload: :default_actor - ) - end + defp include_unconfirmed(query, false, _email), do: query - defp user_by_email_query(email, false) do - from( - u in User, - where: (u.email == ^email or u.unconfirmed_email == ^email) and is_nil(u.confirmed_at), - preload: :default_actor - ) - end + defp include_unconfirmed(query, true, email), + do: or_where(query, [u], u.unconfirmed_email == ^email) + + defp filter_activated(query, nil), do: query + + defp filter_activated(query, true), + do: where(query, [u], not is_nil(u.confirmed_at) and not u.disabled) + + defp filter_activated(query, false), do: where(query, [u], is_nil(u.confirmed_at)) @spec user_by_activation_token_query(String.t()) :: Ecto.Query.t() defp user_by_activation_token_query(token) do diff --git a/lib/service/activity/activity.ex b/lib/service/activity/activity.ex new file mode 100644 index 000000000..2632a01db --- /dev/null +++ b/lib/service/activity/activity.ex @@ -0,0 +1,7 @@ +defmodule Mobilizon.Service.Activity do + @moduledoc """ + Behavior for Activity creators + """ + + @callback insert_activity(entity :: struct(), options :: map()) :: {:ok, Oban.Job.t()} +end diff --git a/lib/service/activity/comment.ex b/lib/service/activity/comment.ex new file mode 100644 index 000000000..0b3ebcd31 --- /dev/null +++ b/lib/service/activity/comment.ex @@ -0,0 +1,51 @@ +defmodule Mobilizon.Service.Activity.Comment do + @moduledoc """ + Insert a comment activity + """ + alias Mobilizon.{Actors, Events} + alias Mobilizon.Actors.Actor + alias Mobilizon.Discussions.Comment + alias Mobilizon.Events.Event + alias Mobilizon.Service.Activity + alias Mobilizon.Service.Workers.ActivityBuilder + + @behaviour Activity + + @impl Activity + def insert_activity(comment, options \\ []) + + def insert_activity( + %Comment{ + actor_id: actor_id, + event_id: event_id, + in_reply_to_comment_id: in_reply_to_comment_id + } = comment, + options + ) + when not is_nil(actor_id) and not is_nil(event_id) do + with {:ok, %Event{attributed_to: %Actor{type: :Group} = group} = event} <- + Events.get_event_with_preload(event_id), + %Actor{id: actor_id} <- Actors.get_actor(actor_id), + subject <- Keyword.fetch!(options, :subject) do + ActivityBuilder.enqueue(:build_activity, %{ + "type" => "event", + "subject" => subject, + "subject_params" => %{ + event_title: event.title, + event_uuid: event.uuid, + comment_reply_to: !is_nil(in_reply_to_comment_id) + }, + "group_id" => group.id, + "author_id" => actor_id, + "object_type" => "comment", + "object_id" => to_string(comment.id), + "inserted_at" => DateTime.utc_now() + }) + else + # Event not from group + {:ok, %Event{}} -> {:ok, nil} + end + end + + def insert_activity(_, _), do: {:ok, nil} +end diff --git a/lib/service/activity/discussion.ex b/lib/service/activity/discussion.ex new file mode 100644 index 000000000..3b2c993cc --- /dev/null +++ b/lib/service/activity/discussion.ex @@ -0,0 +1,51 @@ +defmodule Mobilizon.Service.Activity.Discussion do + @moduledoc """ + Insert a discussion activity + """ + alias Mobilizon.Actors + alias Mobilizon.Discussions.Discussion + alias Mobilizon.Service.Activity + alias Mobilizon.Service.Workers.ActivityBuilder + + @behaviour Activity + + @impl Activity + def insert_activity(discussion, options \\ []) + + def insert_activity( + %Discussion{creator_id: creator_id, actor_id: actor_id} = discussion, + options + ) + when not is_nil(creator_id) do + creator = Actors.get_actor(creator_id) + group = Actors.get_actor(actor_id) + subject = Keyword.fetch!(options, :subject) + author = Keyword.get(options, :moderator, creator) + author_id = Keyword.get(options, :actor_id, author.id) + old_discussion = Keyword.get(options, :old_discussion) + + ActivityBuilder.enqueue(:build_activity, %{ + "type" => "discussion", + "subject" => subject, + "subject_params" => subject_params(discussion, subject, old_discussion), + "group_id" => group.id, + "author_id" => author_id, + "object_type" => "discussion", + "object_id" => if(subject != "discussion_deleted", do: to_string(discussion.id), else: nil), + "inserted_at" => DateTime.utc_now() + }) + end + + def insert_activity(_, _), do: {:ok, nil} + + @spec subject_params(Discussion.t(), String.t() | nil, Discussion.t() | nil) :: map() + defp subject_params(%Discussion{} = discussion, "discussion_renamed", old_discussion) do + discussion + |> subject_params(nil, nil) + |> Map.put(:old_discussion_title, old_discussion.title) + end + + defp subject_params(%Discussion{} = discussion, _, _) do + %{discussion_slug: discussion.slug, discussion_title: discussion.title} + end +end diff --git a/lib/service/activity/event.ex b/lib/service/activity/event.ex new file mode 100644 index 000000000..55b63d382 --- /dev/null +++ b/lib/service/activity/event.ex @@ -0,0 +1,39 @@ +defmodule Mobilizon.Service.Activity.Event do + @moduledoc """ + Insert an event activity + """ + alias Mobilizon.Actors + alias Mobilizon.Events.Event + alias Mobilizon.Service.Activity + alias Mobilizon.Service.Workers.ActivityBuilder + + @behaviour Activity + + @impl Activity + def insert_activity(event, options \\ []) + + def insert_activity( + %Event{attributed_to_id: attributed_to_id, organizer_actor_id: organizer_actor_id} = + event, + options + ) + when not is_nil(attributed_to_id) do + actor = Actors.get_actor(organizer_actor_id) + group = Actors.get_actor(attributed_to_id) + subject = Keyword.fetch!(options, :subject) + + ActivityBuilder.enqueue(:build_activity, %{ + "type" => "event", + "subject" => subject, + "subject_params" => %{event_uuid: event.uuid, event_title: event.title}, + "group_id" => group.id, + "author_id" => actor.id, + "object_type" => "event", + "object_id" => if(subject != "event_deleted", do: to_string(event.id), else: nil), + "inserted_at" => DateTime.utc_now() + }) + end + + @impl Activity + def insert_activity(_, _), do: {:ok, nil} +end diff --git a/lib/service/activity/group.ex b/lib/service/activity/group.ex new file mode 100644 index 000000000..3adfb191a --- /dev/null +++ b/lib/service/activity/group.ex @@ -0,0 +1,150 @@ +defmodule Mobilizon.Service.Activity.Group do + @moduledoc """ + Insert a group setting activity + """ + alias Mobilizon.Actors + alias Mobilizon.Actors.Actor + alias Mobilizon.Service.Activity + alias Mobilizon.Service.Workers.ActivityBuilder + + @behaviour Activity + + @impl Activity + def insert_activity(group, options \\ []) + + def insert_activity( + %Actor{type: :Group, id: group_id}, + options + ) do + with %Actor{type: :Group} = group <- Actors.get_actor(group_id), + subject when not is_nil(subject) <- Keyword.get(options, :subject), + actor_id <- Keyword.get(options, :actor_id), + default_updater_actor <- Actors.get_actor(actor_id), + %Actor{id: actor_id} <- + Keyword.get(options, :updater_actor, default_updater_actor), + old_group <- Keyword.get(options, :old_group) do + ActivityBuilder.enqueue(:build_activity, %{ + "type" => "group", + "subject" => subject, + "subject_params" => subject_params(group, subject, old_group), + "group_id" => group.id, + "author_id" => actor_id, + "object_type" => "group", + "object_id" => to_string(group.id), + "inserted_at" => DateTime.utc_now() + }) + else + _ -> {:ok, nil} + end + end + + def insert_activity(_, _), do: {:ok, nil} + + @spec subject_params(Actor.t(), String.t() | nil, Actor.t() | nil) :: map() + defp subject_params(%Actor{} = group, "group_updated", %Actor{} = old_group) do + group + |> subject_params(nil, nil) + |> maybe_put_old_name_if_updated(old_group.name, group.name) + |> maybe_put_summary_change_if_updated(old_group.summary, group.summary) + |> maybe_put_old_visibility_if_updated(old_group.visibility, group.visibility) + |> maybe_put_old_openness_if_updated(old_group.openness, group.openness) + |> maybe_put_address_change_if_updated( + old_group.physical_address_id, + group.physical_address_id + ) + |> maybe_put_avatar_change_if_updated( + old_group.avatar, + group.avatar + ) + |> maybe_put_banner_change_if_updated( + old_group.banner, + group.banner + ) + |> maybe_put_manually_approves_followers_change_if_updated( + old_group.manually_approves_followers, + group.manually_approves_followers + ) + end + + defp subject_params( + %Actor{preferred_username: preferred_username, domain: domain, name: name}, + _, + _ + ) do + %{ + group_preferred_username: preferred_username, + group_name: name, + group_domain: domain, + group_changes: [] + } + end + + @spec maybe_put_old_name_if_updated(map(), String.t(), String.t()) :: map() + defp maybe_put_old_name_if_updated(params, old_group_name, new_group_name) + when old_group_name != new_group_name do + params + |> Map.update(:group_changes, [], fn changes -> changes ++ [:name] end) + |> Map.put(:old_group_name, old_group_name) + end + + defp maybe_put_old_name_if_updated(params, _, _), do: params + + defp maybe_put_summary_change_if_updated(params, old_summary, new_summary) + when old_summary != new_summary do + Map.update(params, :group_changes, [], fn changes -> changes ++ [:summary] end) + end + + defp maybe_put_summary_change_if_updated(params, _, _), do: params + + defp maybe_put_old_visibility_if_updated(params, old_group_visibility, new_group_visibility) + when old_group_visibility != new_group_visibility do + params + |> Map.update(:group_changes, [], fn changes -> changes ++ [:visibility] end) + |> Map.put(:old_group_visibility, old_group_visibility) + end + + defp maybe_put_old_visibility_if_updated(params, _, _), do: params + + defp maybe_put_old_openness_if_updated(params, old_group_openness, new_group_openness) + when old_group_openness != new_group_openness do + params + |> Map.update(:group_changes, [], fn changes -> changes ++ [:openness] end) + |> Map.put(:old_group_openness, old_group_openness) + end + + defp maybe_put_old_openness_if_updated(params, _, _), do: params + + defp maybe_put_address_change_if_updated(params, old_address_id, new_address_id) + when old_address_id != new_address_id do + Map.update(params, :group_changes, [], fn changes -> changes ++ [:address] end) + end + + defp maybe_put_address_change_if_updated(params, _, _), do: params + + defp maybe_put_avatar_change_if_updated(params, old_avatar, new_avatar) + when old_avatar != new_avatar do + Map.update(params, :group_changes, [], fn changes -> changes ++ [:avatar] end) + end + + defp maybe_put_avatar_change_if_updated(params, _, _), do: params + + defp maybe_put_banner_change_if_updated(params, old_banner, new_banner) + when old_banner != new_banner do + Map.update(params, :group_changes, [], fn changes -> changes ++ [:banner] end) + end + + defp maybe_put_banner_change_if_updated(params, _, _), do: params + + defp maybe_put_manually_approves_followers_change_if_updated( + params, + old_group_manually_approves_followers, + new_group_manually_approves_followers + ) + when old_group_manually_approves_followers != new_group_manually_approves_followers do + params + |> Map.update(:group_changes, [], fn changes -> changes ++ [:manually_approves_followers] end) + |> Map.put(:old_group_manually_approves_followers, old_group_manually_approves_followers) + end + + defp maybe_put_manually_approves_followers_change_if_updated(params, _, _), do: params +end diff --git a/lib/service/activity/member.ex b/lib/service/activity/member.ex new file mode 100644 index 000000000..222557928 --- /dev/null +++ b/lib/service/activity/member.ex @@ -0,0 +1,97 @@ +defmodule Mobilizon.Service.Activity.Member do + @moduledoc """ + Insert a member activity + """ + alias Mobilizon.Actors + alias Mobilizon.Actors.{Actor, Member} + alias Mobilizon.Service.Activity + alias Mobilizon.Service.Workers.ActivityBuilder + + @behaviour Activity + + @impl Activity + def insert_activity(member, options \\ []) + + def insert_activity( + %Member{parent_id: parent_id, id: member_id} = new_member, + options + ) do + subject = Keyword.get(options, :subject) + + with author_id <- get_author(new_member, options), + object_id <- if(subject == "member_removed", do: nil, else: to_string(member_id)) do + ActivityBuilder.enqueue(:build_activity, %{ + "type" => "member", + "subject" => subject, + "subject_params" => get_subject_params(new_member, options), + "group_id" => parent_id, + "author_id" => author_id, + "object_type" => "member", + "object_id" => object_id, + "inserted_at" => DateTime.utc_now() + }) + end + end + + def insert_activity(_, _), do: {:ok, nil} + + @spec get_author(Member.t(), Member.t() | nil) :: String.t() | integer() + defp get_author(%Member{actor_id: actor_id}, options) do + moderator = Keyword.get(options, :moderator) + + if is_nil(moderator) do + actor_id + else + moderator.id + end + end + + @spec get_subject_params(Member.t(), Keyword.t()) :: map() + defp get_subject_params(%Member{actor: actor, role: role, id: member_id}, options) do + # We may need to preload the member to make sure the actor exists + actor = + case actor do + %Actor{} = actor -> + actor + + _ -> + case Actors.get_member(member_id) do + %Member{actor: actor} -> actor + _ -> nil + end + end + + moderator = Keyword.get(options, :moderator) + old_member = Keyword.get(options, :old_member) + + subject_params = %{ + member_role: String.upcase(to_string(role)) + } + + subject_params = + if(is_nil(actor), + do: subject_params, + else: + Map.put( + subject_params, + :member_preferred_username, + Actor.preferred_username_and_domain(actor) + ) + ) + + subject_params = + if(is_nil(old_member), + do: subject_params, + else: Map.put(subject_params, :old_role, String.upcase(to_string(old_member.role))) + ) + + if is_nil(moderator), + do: subject_params, + else: + Map.put( + subject_params, + :moderator_preferred_username, + Actor.preferred_username_and_domain(moderator) + ) + end +end diff --git a/lib/service/activity/posts.ex b/lib/service/activity/posts.ex new file mode 100644 index 000000000..bd8a4553b --- /dev/null +++ b/lib/service/activity/posts.ex @@ -0,0 +1,37 @@ +defmodule Mobilizon.Service.Activity.Post do + @moduledoc """ + Insert an post activity + """ + alias Mobilizon.Actors + alias Mobilizon.Posts.Post + alias Mobilizon.Service.Activity + alias Mobilizon.Service.Workers.ActivityBuilder + + @behaviour Activity + + @impl Activity + def insert_activity(post, options \\ []) + + def insert_activity( + %Post{attributed_to_id: attributed_to_id, author_id: author_id} = post, + options + ) + when not is_nil(attributed_to_id) do + author = Actors.get_actor(author_id) + group = Actors.get_actor(attributed_to_id) + subject = Keyword.fetch!(options, :subject) + + ActivityBuilder.enqueue(:build_activity, %{ + "type" => "post", + "subject" => subject, + "subject_params" => %{post_slug: post.slug, post_title: post.title}, + "group_id" => group.id, + "author_id" => author.id, + "object_type" => "post", + "object_id" => if(subject != "post_deleted", do: to_string(post.id), else: nil), + "inserted_at" => DateTime.utc_now() + }) + end + + def insert_activity(_, _), do: {:ok, nil} +end diff --git a/lib/service/activity/resource.ex b/lib/service/activity/resource.ex new file mode 100644 index 000000000..4eec72eb3 --- /dev/null +++ b/lib/service/activity/resource.ex @@ -0,0 +1,50 @@ +defmodule Mobilizon.Service.Activity.Resource do + @moduledoc """ + Insert an resource activity + """ + alias Mobilizon.Actors + alias Mobilizon.Resources.Resource + alias Mobilizon.Service.Activity + alias Mobilizon.Service.Workers.ActivityBuilder + + @behaviour Activity + + @impl Activity + def insert_activity(resource, options \\ []) + + def insert_activity( + %Resource{actor_id: actor_id, creator_id: creator_id} = resource, + options + ) + when not is_nil(actor_id) do + actor = Actors.get_actor(creator_id) + group = Actors.get_actor(actor_id) + subject = Keyword.fetch!(options, :subject) + old_resource = Keyword.get(options, :old_resource) + + ActivityBuilder.enqueue(:build_activity, %{ + "type" => "resource", + "subject" => subject, + "subject_params" => subject_params(resource, subject, old_resource), + "group_id" => group.id, + "author_id" => actor.id, + "object_type" => "resource", + "object_id" => if(subject != "resource_deleted", do: to_string(resource.id), else: nil), + "inserted_at" => DateTime.utc_now() + }) + end + + @impl Activity + def insert_activity(_, _), do: {:ok, nil} + + @spec subject_params(Resource.t(), String.t() | nil, Resource.t() | nil) :: map() + defp subject_params(%Resource{} = resource, "resource_renamed", old_resource) do + resource + |> subject_params(nil, nil) + |> Map.put(:old_resource_title, old_resource.title) + end + + defp subject_params(%Resource{path: path, title: title}, _, _) do + %{resource_path: path, resource_title: title} + end +end diff --git a/lib/service/auth/authenticator.ex b/lib/service/auth/authenticator.ex index 15b8cec25..822e67338 100644 --- a/lib/service/auth/authenticator.ex +++ b/lib/service/auth/authenticator.ex @@ -86,7 +86,7 @@ defmodule Mobilizon.Service.Auth.Authenticator do def fetch_user(nil), do: {:error, :user_not_found} def fetch_user(email) when not is_nil(email) do - with {:ok, %User{} = user} <- Users.get_user_by_email(email, true) do + with {:ok, %User{} = user} <- Users.get_user_by_email(email, activated: true) do user end end diff --git a/lib/service/clean_old_activity.ex b/lib/service/clean_old_activity.ex new file mode 100644 index 000000000..8801eee5f --- /dev/null +++ b/lib/service/clean_old_activity.ex @@ -0,0 +1,64 @@ +defmodule Mobilizon.Service.CleanOldActivity do + @moduledoc """ + Service to clean old activities + """ + + alias Mobilizon.Activities.Activity + alias Mobilizon.Actors.Actor + alias Mobilizon.Config + alias Mobilizon.Storage.Repo + import Ecto.Query + + @doc """ + Clean old activities + + Remove activities that are older than a certain period + + Options: + * `grace_period` how old in hours can the media be before it's taken into account for deletion + * `dry_run` just return the media that would have been deleted, don't actually delete it + """ + @spec clean(Keyword.t()) :: {:ok, list(Media.t())} | {:error, String.t()} + def clean(opts \\ []) do + {query, nb_actors} = find_activities(opts) + + if Keyword.get(opts, :dry_run, false) do + nb_activities = Repo.aggregate(query, :count) + {:ok, actors: nb_actors, activities: nb_activities} + else + {nb_activities, _} = Repo.delete_all(query) + {:ok, actors: nb_actors, activities: nb_activities} + end + end + + @spec find_activities(Keyword.t()) :: {Ecto.Query.t(), list()} + defp find_activities(opts) do + grace_period = + Keyword.get(opts, :grace_period, Config.get([:instance, :activity_expire_days], 365)) + + expiration_date = DateTime.add(DateTime.utc_now(), grace_period * -3600) + + activities_to_keep = + Keyword.get( + opts, + :activity_keep_number, + Config.get([:instance, :activity_keep_number], 100) + ) + + actor_ids = + Actor + |> where(type: :Group) + |> join(:inner, [ac], a in Activity, on: a.group_id == ac.id) + |> group_by([ac], ac.id) + |> having([_ac, a], count(a.id) > ^activities_to_keep) + |> select([ac], ac.id) + |> Repo.all() + + query = + Activity + |> where([a], a.inserted_at < ^expiration_date) + |> where([a], a.group_id in ^actor_ids) + + {query, length(actor_ids)} + end +end diff --git a/lib/service/error_reporter.ex b/lib/service/error_reporter.ex new file mode 100644 index 000000000..46900d945 --- /dev/null +++ b/lib/service/error_reporter.ex @@ -0,0 +1,17 @@ +defmodule Mobilizon.Service.ErrorReporter do + @moduledoc """ + Module to delegate all exceptions to Sentry + """ + def handle_event([:oban, :job, :exception], measure, %{job: job} = meta, _) do + extra = + job + |> Map.take([:id, :args, :meta, :queue, :worker]) + |> Map.merge(measure) + + Sentry.capture_exception(meta.error, stacktrace: meta.stacktrace, extra: extra) + end + + def handle_event([:oban, :circuit, :trip], _measure, meta, _) do + Sentry.capture_exception(meta.error, stacktrace: meta.stacktrace, extra: meta) + end +end diff --git a/lib/service/export/common.ex b/lib/service/export/common.ex new file mode 100644 index 000000000..dd3e53903 --- /dev/null +++ b/lib/service/export/common.ex @@ -0,0 +1,78 @@ +defmodule Mobilizon.Service.Export.Common do + @moduledoc """ + Common tools for exportation + """ + + alias Mobilizon.{Actors, Events, Posts, Users} + alias Mobilizon.Actors.Actor + alias Mobilizon.Events.{Event, FeedToken} + alias Mobilizon.Storage.Page + alias Mobilizon.Users.User + + @spec fetch_actor_event_feed(String.t()) :: String.t() + def fetch_actor_event_feed(name) do + with %Actor{} = actor <- Actors.get_actor_by_name(name), + {:visibility, true} <- {:visibility, Actor.is_public_visibility?(actor)}, + %Page{elements: events} <- Events.list_public_events_for_actor(actor), + %Page{elements: posts} <- Posts.get_public_posts_for_group(actor) do + {:ok, actor, events, posts} + else + err -> + {:error, err} + end + end + + # Only events, not posts + @spec fetch_events_from_token(String.t()) :: String.t() + def fetch_events_from_token(token) do + with {:ok, uuid} <- ShortUUID.decode(token), + {:ok, _uuid} <- Ecto.UUID.cast(uuid), + %FeedToken{actor: actor, user: %User{} = user} <- Events.get_feed_token(uuid) do + case actor do + %Actor{} = actor -> + %{ + type: :actor, + actor: actor, + events: fetch_actor_private_events(actor), + user: user, + token: token + } + + nil -> + with actors <- Users.get_actors_for_user(user), + events <- + actors + |> Enum.map(&fetch_actor_private_events/1) + |> Enum.concat() do + %{type: :user, events: events, user: user, token: token, actor: nil} + end + end + end + end + + @spec fetch_instance_public_content :: {:ok, list(Event.t()), list(Post.t())} + def fetch_instance_public_content do + with %Page{elements: events} <- Events.list_public_local_events(), + %Page{elements: posts} <- Posts.list_public_local_posts() do + {:ok, events, posts} + end + end + + @spec fetch_actor_private_events(Actor.t()) :: list(Event.t()) + def fetch_actor_private_events(%Actor{} = actor) do + actor |> fetch_identity_participations() |> participations_to_events() + end + + @spec fetch_identity_participations(Actor.t()) :: Page.t() + defp fetch_identity_participations(%Actor{} = actor) do + with %Page{} = page <- Events.list_event_participations_for_actor(actor) do + page + end + end + + defp participations_to_events(%Page{elements: participations}) do + participations + |> Enum.map(& &1.event_id) + |> Enum.map(&Events.get_event_with_preload!/1) + end +end diff --git a/lib/service/export/feed.ex b/lib/service/export/feed.ex index de5f23987..30a76b37e 100644 --- a/lib/service/export/feed.ex +++ b/lib/service/export/feed.ex @@ -7,11 +7,11 @@ defmodule Mobilizon.Service.Export.Feed do alias Atomex.{Entry, Feed} - alias Mobilizon.{Actors, Config, Events, Posts, Users} alias Mobilizon.Actors.Actor - alias Mobilizon.Events.{Event, FeedToken} + alias Mobilizon.Config + alias Mobilizon.Events.Event alias Mobilizon.Posts.Post - alias Mobilizon.Storage.Page + alias Mobilizon.Service.Export.Common alias Mobilizon.Users.User alias Mobilizon.Web.Endpoint @@ -43,14 +43,57 @@ defmodule Mobilizon.Service.Export.Feed do end end + def create_cache("instance") do + case fetch_instance_feed() do + {:ok, res} -> + {:commit, res} + + err -> + {:ignore, err} + end + end + + @spec fetch_instance_feed :: {:ok, String.t()} + defp fetch_instance_feed do + case Common.fetch_instance_public_content() do + {:ok, events, posts} -> + {:ok, build_instance_feed(events, posts)} + + err -> + {:error, err} + end + end + + # Build an atom feed from the whole instance and its public events and posts + @spec build_instance_feed(list(), list()) :: String.t() + defp build_instance_feed(events, posts) do + self_url = Endpoint.url() + + title = + gettext("Public feed for %{instance}", + instance: Config.instance_name() + ) + + # Title uses default instance language + self_url + |> Feed.new( + DateTime.utc_now(), + title + ) + |> Feed.link(self_url, rel: "self") + |> Feed.link(self_url, rel: "alternate") + |> Feed.generator(Config.instance_name(), uri: Endpoint.url(), version: version()) + |> Feed.entries(Enum.map(events ++ posts, &get_entry/1)) + |> Feed.build() + |> Atomex.generate_document() + end + @spec fetch_actor_event_feed(String.t()) :: String.t() defp fetch_actor_event_feed(name) do - with %Actor{} = actor <- Actors.get_local_actor_by_name(name), - {:visibility, true} <- {:visibility, Actor.is_public_visibility?(actor)}, - %Page{elements: events} <- Events.list_public_events_for_actor(actor), - %Page{elements: posts} <- Posts.get_public_posts_for_group(actor) do - {:ok, build_actor_feed(actor, events, posts)} - else + case Common.fetch_actor_event_feed(name) do + {:ok, actor, events, posts} -> + {:ok, build_actor_feed(actor, events, posts)} + err -> {:error, err} end @@ -156,41 +199,15 @@ defmodule Mobilizon.Service.Export.Feed do # Only events, not posts @spec fetch_events_from_token(String.t()) :: String.t() defp fetch_events_from_token(token) do - with {:ok, _uuid} <- Ecto.UUID.cast(token), - %FeedToken{actor: actor, user: %User{} = user} <- Events.get_feed_token(token) do - case actor do - %Actor{} = actor -> - events = actor |> fetch_identity_participations() |> participations_to_events() - {:ok, build_actor_feed(actor, events, [], false)} - - nil -> - with actors <- Users.get_actors_for_user(user), - events <- - actors - |> Enum.map(fn actor -> - actor - |> Events.list_event_participations_for_actor() - |> participations_to_events() - end) - |> Enum.concat() do - {:ok, build_user_feed(events, user, token)} - end + with %{events: events, token: token, user: user, actor: actor, type: type} <- + Common.fetch_events_from_token(token) do + case type do + :user -> {:ok, build_user_feed(events, user, token)} + :actor -> {:ok, build_actor_feed(actor, events, [], false)} end end end - defp fetch_identity_participations(%Actor{} = actor) do - with %Page{} = page <- Events.list_event_participations_for_actor(actor) do - page - end - end - - defp participations_to_events(%Page{elements: participations}) do - participations - |> Enum.map(& &1.event_id) - |> Enum.map(&Events.get_event_with_preload!/1) - end - # Build an atom feed from actor and its public events @spec build_user_feed(list(), User.t(), String.t()) :: String.t() defp build_user_feed(events, %User{email: email}, token) do diff --git a/lib/service/export/icalendar.ex b/lib/service/export/icalendar.ex index 902712334..750a2ac27 100644 --- a/lib/service/export/icalendar.ex +++ b/lib/service/export/icalendar.ex @@ -3,83 +3,23 @@ defmodule Mobilizon.Service.Export.ICalendar do Export an event to iCalendar format. """ - alias Mobilizon.{Actors, Config, Events, Users} alias Mobilizon.Actors.Actor alias Mobilizon.Addresses.Address - alias Mobilizon.Events.{Event, FeedToken} + alias Mobilizon.{Config, Events} + alias Mobilizon.Events.Event + alias Mobilizon.Service.Export.Common alias Mobilizon.Service.Formatter.HTML - alias Mobilizon.Storage.Page - alias Mobilizon.Users.User @vendor "Mobilizon #{Config.instance_version()}" - @doc """ - Export a public event to iCalendar format. - - The event must have a visibility of `:public` or `:unlisted` - """ - @spec export_public_event(Event.t()) :: {:ok, String.t()} - def export_public_event(%Event{visibility: visibility} = event) - when visibility in [:public, :unlisted] do - export_event(event) - end - - @spec export_public_event(Event.t()) :: {:error, :event_not_public} - def export_public_event(%Event{}), do: {:error, :event_not_public} - - @doc """ - Export an event to iCalendar format - """ - def export_event(%Event{} = event) do - {:ok, %ICalendar{events: [do_export_event(event)]} |> ICalendar.to_ics(vendor: @vendor)} - end - - @spec do_export_event(Event.t()) :: ICalendar.Event.t() - defp do_export_event(%Event{} = event) do - %ICalendar.Event{ - summary: event.title, - dtstart: event.begins_on, - dtstamp: event.publish_at || DateTime.utc_now(), - dtend: event.ends_on, - description: HTML.strip_tags(event.description), - uid: event.uuid, - url: event.url, - geo: Address.coords(event.physical_address), - location: Address.representation(event.physical_address), - categories: event.tags |> Enum.map(& &1.title) - } - end - - @doc """ - Export a public actor's events to iCalendar format. - - The actor must have a visibility of `:public` or `:unlisted`, as well as the events - """ - @spec export_public_actor(Actor.t()) :: String.t() - def export_public_actor(%Actor{} = actor) do - with {:visibility, true} <- {:visibility, Actor.is_public_visibility?(actor)}, - %Page{elements: events} <- - Events.list_public_events_for_actor(actor) do - {:ok, %ICalendar{events: events |> Enum.map(&do_export_event/1)} |> ICalendar.to_ics()} - end - end - - @spec export_private_actor(Actor.t()) :: String.t() - def export_private_actor(%Actor{} = actor) do - with events <- - actor |> Events.list_event_participations_for_actor() |> participations_to_events() do - {:ok, %ICalendar{events: events |> Enum.map(&do_export_event/1)} |> ICalendar.to_ics()} - end - end - @doc """ Create cache for an actor, an event or an user token """ def create_cache("actor_" <> name) do - with %Actor{} = actor <- Actors.get_local_actor_by_name(name), - {:ok, res} <- export_public_actor(actor) do - {:commit, res} - else + case export_public_actor(name) do + {:ok, res} -> + {:commit, res} + err -> {:ignore, err} end @@ -105,33 +45,96 @@ defmodule Mobilizon.Service.Export.ICalendar do end end - @spec fetch_events_from_token(String.t()) :: String.t() - defp fetch_events_from_token(token) do - with %FeedToken{actor: actor, user: %User{} = user} <- Events.get_feed_token(token) do - case actor do - %Actor{} = actor -> - export_private_actor(actor) + def create_cache("instance") do + case fetch_instance_feed() do + {:ok, res} -> + {:commit, res} - nil -> - with actors <- Users.get_actors_for_user(user), - events <- - actors - |> Enum.map(fn actor -> - actor - |> Events.list_event_participations_for_actor() - |> participations_to_events() - end) - |> Enum.concat() do - {:ok, - %ICalendar{events: events |> Enum.map(&do_export_event/1)} |> ICalendar.to_ics()} - end - end + err -> + {:ignore, err} end end - defp participations_to_events(%Page{elements: participations}) do - participations - |> Enum.map(& &1.event_id) - |> Enum.map(&Events.get_event_with_preload!/1) + @spec fetch_instance_feed :: {:ok, String.t()} + defp fetch_instance_feed do + case Common.fetch_instance_public_content() do + {:ok, events, _posts} -> + {:ok, %ICalendar{events: events |> Enum.map(&do_export_event/1)} |> ICalendar.to_ics()} + + err -> + {:error, err} + end + end + + @doc """ + Export an event to iCalendar format. + """ + @spec export_event(Event.t()) :: {:ok, String.t()} + def export_event(%Event{} = event), do: {:ok, events_to_ics([event])} + + @doc """ + Export a public event to iCalendar format. + + The event must have a visibility of `:public` or `:unlisted` + """ + @spec export_public_event(Event.t()) :: {:ok, String.t()} + def export_public_event(%Event{visibility: visibility} = event) + when visibility in [:public, :unlisted] do + {:ok, events_to_ics([event])} + end + + @spec export_public_event(Event.t()) :: {:error, :event_not_public} + def export_public_event(%Event{}), do: {:error, :event_not_public} + + @doc """ + Export a public actor's events to iCalendar format. + + The actor must have a visibility of `:public` or `:unlisted`, as well as the events + """ + @spec export_public_actor(String.t()) :: String.t() + def export_public_actor(name) do + case Common.fetch_actor_event_feed(name) do + {:ok, _actor, events, _posts} -> + {:ok, events_to_ics(events)} + + err -> + {:error, err} + end + end + + @spec export_private_actor(Actor.t()) :: String.t() + def export_private_actor(%Actor{} = actor) do + with events <- Common.fetch_actor_private_events(actor) do + {:ok, events_to_ics(events)} + end + end + + @spec fetch_events_from_token(String.t()) :: String.t() + defp fetch_events_from_token(token) do + with %{events: events} <- Common.fetch_events_from_token(token) do + {:ok, events_to_ics(events)} + end + end + + @spec events_to_ics(list(Events.t())) :: String.t() + defp events_to_ics(events) do + %ICalendar{events: events |> Enum.map(&do_export_event/1)} + |> ICalendar.to_ics(vendor: @vendor) + end + + @spec do_export_event(Event.t()) :: ICalendar.Event.t() + defp do_export_event(%Event{} = event) do + %ICalendar.Event{ + summary: event.title, + dtstart: event.begins_on, + dtstamp: event.publish_at || DateTime.utc_now(), + dtend: event.ends_on, + description: HTML.strip_tags(event.description), + uid: event.uuid, + url: event.url, + geo: Address.coords(event.physical_address), + location: Address.representation(event.physical_address), + categories: event.tags |> Enum.map(& &1.title) + } end end diff --git a/lib/service/formatter/formatter.ex b/lib/service/formatter/formatter.ex index cf8c9526a..bba56b741 100644 --- a/lib/service/formatter/formatter.ex +++ b/lib/service/formatter/formatter.ex @@ -66,7 +66,15 @@ defmodule Mobilizon.Service.Formatter do def hashtag_handler("#" <> tag = tag_text, _buffer, _opts, acc) do tag = String.downcase(tag) url = "#{Endpoint.url()}/tag/#{tag}" - link = "
" + + link = + Tag.content_tag(:a, tag_text, + class: "hashtag", + "data-tag": tag, + href: url, + rel: "tag ugc" + ) + |> Phoenix.HTML.safe_to_string() {link, %{acc | tags: MapSet.put(acc.tags, {tag_text, tag})}} end @@ -81,7 +89,8 @@ defmodule Mobilizon.Service.Formatter do options = linkify_opts() ++ options acc = %{mentions: MapSet.new(), tags: MapSet.new()} - {text, %{mentions: mentions, tags: tags}} = Linkify.link_map(text, acc, options) + {text, %{mentions: mentions}} = Linkify.link_map(text, acc, options) + {text, tags} = extract_tags(text) {text, MapSet.to_list(mentions), MapSet.to_list(tags)} end @@ -135,10 +144,45 @@ defmodule Mobilizon.Service.Formatter do defp linkify_opts do Mobilizon.Config.get(__MODULE__) ++ [ - hashtag: true, - hashtag_handler: &__MODULE__.hashtag_handler/4, + hashtag: false, mention: true, mention_handler: &__MODULE__.mention_handler/4 ] end + + @match_hashtag ~r/(?:^|[^\p{L}\p{M}\p{Nd}\)])(?\#[[:word:]_]*[[:alpha:]_·][[:word:]_·\p{M}]*)/u + + @spec extract_tags(String.t()) :: {String.t(), MapSet.t()} + def extract_tags(text) do + matches = + @match_hashtag + |> Regex.scan(text, capture: [:tag]) + |> Enum.map(&hd/1) + |> Enum.map(&{&1, tag_text_strip(&1)}) + |> MapSet.new() + + text = + @match_hashtag + |> Regex.replace(text, &generate_tag_link/2) + |> String.trim() + + {text, matches} + end + + @spec generate_tag_link(String.t(), String.t()) :: String.t() + defp generate_tag_link(_, tag_text) do + tag = tag_text_strip(tag_text) + url = "#{Endpoint.url()}/tag/#{tag}" + + Tag.content_tag(:a, tag_text, + class: "hashtag", + "data-tag": tag, + href: url, + rel: "tag ugc" + ) + |> Phoenix.HTML.safe_to_string() + |> (&" #{&1}").() + end + + defp tag_text_strip(tag), do: tag |> String.trim("#") |> String.downcase() end diff --git a/lib/service/formatter/html.ex b/lib/service/formatter/html.ex index ef4cdd6a4..2e8bd5ee5 100644 --- a/lib/service/formatter/html.ex +++ b/lib/service/formatter/html.ex @@ -17,7 +17,7 @@ defmodule Mobilizon.Service.Formatter.HTML do def strip_tags(html) do case FastSanitize.strip_tags(html) do {:ok, html} -> - html + HtmlEntities.decode(html) _ -> raise "Failed to filter tags" diff --git a/lib/service/geospatial/addok.ex b/lib/service/geospatial/addok.ex index 95d38e4ae..e289925ae 100644 --- a/lib/service/geospatial/addok.ex +++ b/lib/service/geospatial/addok.ex @@ -6,15 +6,11 @@ defmodule Mobilizon.Service.Geospatial.Addok do alias Mobilizon.Addresses.Address alias Mobilizon.Service.Geospatial.Provider alias Mobilizon.Service.HTTP.GeospatialClient - + import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1] require Logger @behaviour Provider - @endpoint Application.get_env(:mobilizon, __MODULE__) |> get_in([:endpoint]) - @default_country Application.get_env(:mobilizon, __MODULE__) |> get_in([:default_country]) || - "France" - @impl Provider @doc """ Addok implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`. @@ -40,16 +36,16 @@ defmodule Mobilizon.Service.Geospatial.Addok do @spec build_url(atom(), map(), list()) :: String.t() defp build_url(method, args, options) do limit = Keyword.get(options, :limit, 10) - coords = Keyword.get(options, :coords, nil) - endpoint = Keyword.get(options, :endpoint, @endpoint) + endpoint = Keyword.get(options, :endpoint, endpoint(__MODULE__)) case method do :geocode -> "#{endpoint}/reverse/?lon=#{args.lon}&lat=#{args.lat}&limit=#{limit}" :search -> - url = "#{endpoint}/search/?q=#{URI.encode(args.q)}&limit=#{limit}" - if is_nil(coords), do: url, else: url <> "&lat=#{coords.lat}&lon=#{coords.lon}" + "#{endpoint}/search/?q=#{URI.encode(args.q)}&limit=#{limit}" + |> add_parameter(options, :country_code) + |> add_parameter(options, :type) end end @@ -71,7 +67,7 @@ defmodule Mobilizon.Service.Geospatial.Addok do features |> Enum.map(fn %{"geometry" => geometry, "properties" => properties} -> %Address{ - country: Map.get(properties, "country", @default_country), + country: Map.get(properties, "country", default_country()), locality: Map.get(properties, "city"), region: Map.get(properties, "context"), description: Map.get(properties, "name") || street_address(properties), @@ -89,4 +85,25 @@ defmodule Mobilizon.Service.Geospatial.Addok do Map.get(properties, "street") end end + + @spec add_parameter(String.t(), Keyword.t(), atom()) :: String.t() + defp add_parameter(url, options, key) do + value = Keyword.get(options, key) + + if is_nil(value), do: url, else: do_add_parameter(url, key, value) + end + + @spec do_add_parameter(String.t(), atom(), any()) :: String.t() + defp do_add_parameter(url, :coords, coords), + do: "#{url}&lat=#{coords.lat}&lon=#{coords.lon}" + + defp do_add_parameter(url, :type, :administrative), + do: "#{url}&type=municipality" + + defp do_add_parameter(url, :type, _type), do: url + + defp default_country do + Application.get_env(:mobilizon, __MODULE__) |> get_in([:default_country]) || + "France" + end end diff --git a/lib/service/geospatial/google_maps.ex b/lib/service/geospatial/google_maps.ex index e5c6bc5e4..3e145e6a7 100644 --- a/lib/service/geospatial/google_maps.ex +++ b/lib/service/geospatial/google_maps.ex @@ -13,11 +13,6 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do @behaviour Provider - @api_key Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key]) - - @fetch_place_details (Application.get_env(:mobilizon, __MODULE__) - |> get_in([:fetch_place_details])) in [true, "true", "True"] - @components [ "street_number", "route", @@ -29,6 +24,9 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do @api_key_missing_message "API Key required to use Google Maps" + @geocode_endpoint "https://maps.googleapis.com/maps/api/geocode/json" + @details_endpoint "https://maps.googleapis.com/maps/api/place/details/json" + @impl Provider @doc """ Google Maps implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`. @@ -74,18 +72,16 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do defp build_url(method, args, options) do limit = Keyword.get(options, :limit, 10) lang = Keyword.get(options, :lang, "en") - api_key = Keyword.get(options, :api_key, @api_key) + api_key = Keyword.get(options, :api_key, api_key()) if is_nil(api_key), do: raise(ArgumentError, message: @api_key_missing_message) - url = - "https://maps.googleapis.com/maps/api/geocode/json?limit=#{limit}&key=#{api_key}&language=#{ - lang - }" + url = "#{@geocode_endpoint}?limit=#{limit}&key=#{api_key}&language=#{lang}" uri = case method do :search -> - url <> "&address=#{args.q}" + "#{url}&address=#{args.q}" + |> add_parameter(options, :type) :geocode -> zoom = Keyword.get(options, :zoom, 15) @@ -95,9 +91,7 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do url <> "&latlng=#{args.lat},#{args.lon}&result_type=#{result_type}" :place_details -> - "https://maps.googleapis.com/maps/api/place/details/json?key=#{api_key}&placeid=#{ - args.place_id - }" + "#{@details_endpoint}?key=#{api_key}&placeid=#{args.place_id}" end URI.encode(uri) @@ -119,7 +113,7 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do end) description = - if Keyword.get(options, :fetch_place_details, @fetch_place_details) == true do + if Keyword.get(options, :fetch_place_details, fetch_place_details()) == true do do_fetch_place_details(place_id, options) || description else description @@ -173,4 +167,26 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do nil end end + + @spec add_parameter(String.t(), Keyword.t(), atom()) :: String.t() + defp add_parameter(url, options, key, default \\ nil) do + value = Keyword.get(options, key, default) + + if is_nil(value), do: url, else: do_add_parameter(url, key, value) + end + + @spec do_add_parameter(String.t(), atom(), any()) :: String.t() + defp do_add_parameter(url, :type, :administrative), + do: "#{url}&components=administrative_area" + + defp do_add_parameter(url, :type, _), do: url + + defp api_key do + Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key]) + end + + defp fetch_place_details do + (Application.get_env(:mobilizon, __MODULE__) + |> get_in([:fetch_place_details])) in [true, "true", "True"] + end end diff --git a/lib/service/geospatial/map_quest.ex b/lib/service/geospatial/map_quest.ex index 249dae21e..77e7f6536 100644 --- a/lib/service/geospatial/map_quest.ex +++ b/lib/service/geospatial/map_quest.ex @@ -17,8 +17,6 @@ defmodule Mobilizon.Service.Geospatial.MapQuest do @behaviour Provider - @api_key Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key]) - @api_key_missing_message "API Key required to use MapQuest" @impl Provider @@ -27,7 +25,7 @@ defmodule Mobilizon.Service.Geospatial.MapQuest do """ @spec geocode(String.t(), keyword()) :: list(Address.t()) def geocode(lon, lat, options \\ []) do - api_key = Keyword.get(options, :api_key, @api_key) + api_key = Keyword.get(options, :api_key, api_key()) limit = Keyword.get(options, :limit, 10) open_data = Keyword.get(options, :open_data, true) @@ -56,7 +54,7 @@ defmodule Mobilizon.Service.Geospatial.MapQuest do @spec search(String.t(), keyword()) :: list(Address.t()) def search(q, options \\ []) do limit = Keyword.get(options, :limit, 10) - api_key = Keyword.get(options, :api_key, @api_key) + api_key = Keyword.get(options, :api_key, api_key()) open_data = Keyword.get(options, :open_data, true) @@ -114,4 +112,8 @@ defmodule Mobilizon.Service.Geospatial.MapQuest do street: Map.get(address, "street") } end + + defp api_key do + Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key]) + end end diff --git a/lib/service/geospatial/mimirsbrunn.ex b/lib/service/geospatial/mimirsbrunn.ex index 01aa191b8..d718f9d9a 100644 --- a/lib/service/geospatial/mimirsbrunn.ex +++ b/lib/service/geospatial/mimirsbrunn.ex @@ -10,13 +10,11 @@ defmodule Mobilizon.Service.Geospatial.Mimirsbrunn do alias Mobilizon.Addresses.Address alias Mobilizon.Service.Geospatial.Provider alias Mobilizon.Service.HTTP.GeospatialClient - + import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1] require Logger @behaviour Provider - @endpoint Application.get_env(:mobilizon, __MODULE__) |> get_in([:endpoint]) - @impl Provider @doc """ Mimirsbrunn implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`. @@ -43,13 +41,13 @@ defmodule Mobilizon.Service.Geospatial.Mimirsbrunn do defp build_url(method, args, options) do limit = Keyword.get(options, :limit, 10) lang = Keyword.get(options, :lang, "en") - coords = Keyword.get(options, :coords, nil) - endpoint = Keyword.get(options, :endpoint, @endpoint) + endpoint = Keyword.get(options, :endpoint, endpoint(__MODULE__)) case method do :search -> - url = "#{endpoint}/autocomplete?q=#{URI.encode(args.q)}&lang=#{lang}&limit=#{limit}" - if is_nil(coords), do: url, else: url <> "&lat=#{coords.lat}&lon=#{coords.lon}" + "#{endpoint}/autocomplete?q=#{URI.encode(args.q)}&lang=#{lang}&limit=#{limit}" + |> add_parameter(options, :coords) + |> add_parameter(options, :type) :geocode -> "#{endpoint}/reverse?lon=#{args.lon}&lat=#{args.lat}" @@ -143,4 +141,20 @@ defmodule Mobilizon.Service.Geospatial.Mimirsbrunn do defp get_postal_code(%{"postcode" => nil}), do: nil defp get_postal_code(%{"postcode" => postcode}), do: postcode |> String.split(";") |> hd() + + @spec add_parameter(String.t(), Keyword.t(), atom()) :: String.t() + defp add_parameter(url, options, key) do + value = Keyword.get(options, key) + + if is_nil(value), do: url, else: do_add_parameter(url, key, value) + end + + @spec do_add_parameter(String.t(), atom(), any()) :: String.t() + defp do_add_parameter(url, :coords, coords), + do: "#{url}&lat=#{coords.lat}&lon=#{coords.lon}" + + defp do_add_parameter(url, :type, :administrative), + do: "#{url}&type=zone" + + defp do_add_parameter(url, :type, _type), do: url end diff --git a/lib/service/geospatial/nominatim.ex b/lib/service/geospatial/nominatim.ex index 9e94f8367..92ba1b3fc 100644 --- a/lib/service/geospatial/nominatim.ex +++ b/lib/service/geospatial/nominatim.ex @@ -6,14 +6,11 @@ defmodule Mobilizon.Service.Geospatial.Nominatim do alias Mobilizon.Addresses.Address alias Mobilizon.Service.Geospatial.Provider alias Mobilizon.Service.HTTP.GeospatialClient - + import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1] require Logger @behaviour Provider - @endpoint Application.get_env(:mobilizon, __MODULE__) |> get_in([:endpoint]) - @api_key Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key]) - @impl Provider @doc """ Nominatim implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`. @@ -40,10 +37,7 @@ defmodule Mobilizon.Service.Geospatial.Nominatim do defp build_url(method, args, options) do limit = Keyword.get(options, :limit, 10) lang = Keyword.get(options, :lang, "en") - endpoint = Keyword.get(options, :endpoint, @endpoint) - country_code = Keyword.get(options, :country_code) - zoom = Keyword.get(options, :zoom) - api_key = Keyword.get(options, :api_key, @api_key) + endpoint = Keyword.get(options, :endpoint, endpoint(__MODULE__)) url = case method do @@ -53,16 +47,15 @@ defmodule Mobilizon.Service.Geospatial.Nominatim do }&addressdetails=1&namedetails=1" :geocode -> - url = - "#{endpoint}/reverse?format=geocodejson&lat=#{args.lat}&lon=#{args.lon}&accept-language=#{ - lang - }&addressdetails=1&namedetails=1" - - if is_nil(zoom), do: url, else: url <> "&zoom=#{zoom}" + "#{endpoint}/reverse?format=geocodejson&lat=#{args.lat}&lon=#{args.lon}&accept-language=#{ + lang + }&addressdetails=1&namedetails=1" + |> add_parameter(options, :zoom) end - url = if is_nil(country_code), do: url, else: "#{url}&countrycodes=#{country_code}" - if is_nil(api_key), do: url, else: url <> "&key=#{api_key}" + url + |> add_parameter(options, :country_code) + |> add_parameter(options, :api_key, api_key()) end @spec fetch_features(String.t()) :: list(Address.t()) @@ -146,4 +139,27 @@ defmodule Mobilizon.Service.Geospatial.Nominatim do description end end + + @spec add_parameter(String.t(), Keyword.t(), atom()) :: String.t() + defp add_parameter(url, options, key, default \\ nil) do + value = Keyword.get(options, key, default) + + if is_nil(value), do: url, else: do_add_parameter(url, key, value) + end + + @spec do_add_parameter(String.t(), atom(), any()) :: String.t() + defp do_add_parameter(url, :zoom, zoom), + do: "#{url}&zoom=#{zoom}" + + @spec do_add_parameter(String.t(), atom(), any()) :: String.t() + defp do_add_parameter(url, :country_code, country_code), + do: "#{url}&countrycodes=#{country_code}" + + @spec do_add_parameter(String.t(), atom(), any()) :: String.t() + defp do_add_parameter(url, :api_key, api_key), + do: "#{url}&key=#{api_key}" + + defp api_key do + Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key]) + end end diff --git a/lib/service/geospatial/pelias.ex b/lib/service/geospatial/pelias.ex index f9d82797a..6622124be 100644 --- a/lib/service/geospatial/pelias.ex +++ b/lib/service/geospatial/pelias.ex @@ -8,13 +8,11 @@ defmodule Mobilizon.Service.Geospatial.Pelias do alias Mobilizon.Addresses.Address alias Mobilizon.Service.Geospatial.Provider alias Mobilizon.Service.HTTP.GeospatialClient - + import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1] require Logger @behaviour Provider - @endpoint Application.get_env(:mobilizon, __MODULE__) |> get_in([:endpoint]) - @impl Provider @doc """ Pelias implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`. @@ -41,25 +39,20 @@ defmodule Mobilizon.Service.Geospatial.Pelias do defp build_url(method, args, options) do limit = Keyword.get(options, :limit, 10) lang = Keyword.get(options, :lang, "en") - coords = Keyword.get(options, :coords, nil) - endpoint = Keyword.get(options, :endpoint, @endpoint) - country_code = Keyword.get(options, :country_code) + endpoint = Keyword.get(options, :endpoint, endpoint(__MODULE__)) url = case method do :search -> - url = - "#{endpoint}/v1/autocomplete?text=#{URI.encode(args.q)}&lang=#{lang}&size=#{limit}" - - if is_nil(coords), - do: url, - else: url <> "&focus.point.lat=#{coords.lat}&focus.point.lon=#{coords.lon}" + "#{endpoint}/v1/autocomplete?text=#{URI.encode(args.q)}&lang=#{lang}&size=#{limit}" + |> add_parameter(options, :coords) + |> add_parameter(options, :type) :geocode -> "#{endpoint}/v1/reverse?point.lon=#{args.lon}&point.lat=#{args.lat}" end - if is_nil(country_code), do: url, else: "#{url}&boundary.country=#{country_code}" + add_parameter(url, options, :country_code) end @spec fetch_features(String.t()) :: list(Address.t()) @@ -120,9 +113,31 @@ defmodule Mobilizon.Service.Geospatial.Pelias do "dependency" ] + @spec get_type(map()) :: String.t() | nil defp get_type(%{"layer" => layer}) when layer in @administrative_layers, do: "administrative" defp get_type(%{"layer" => "address"}), do: "house" defp get_type(%{"layer" => "street"}), do: "street" defp get_type(%{"layer" => "venue"}), do: "venue" defp get_type(%{"layer" => _}), do: nil + + @spec add_parameter(String.t(), Keyword.t(), atom()) :: String.t() + def add_parameter(url, options, key) do + value = Keyword.get(options, key) + + if is_nil(value), do: url, else: do_add_parameter(url, key, value) + end + + @spec do_add_parameter(String.t(), atom(), any()) :: String.t() + defp do_add_parameter(url, :coords, value), + do: "#{url}&focus.point.lat=#{value.lat}&focus.point.lon=#{value.lon}" + + defp do_add_parameter(url, :type, :administrative), + do: "#{url}&layers=coarse" + + defp do_add_parameter(url, :type, _type), do: url + + defp do_add_parameter(url, :country_code, nil), do: url + + defp do_add_parameter(url, :country_code, country_code), + do: "#{url}&boundary.country=#{country_code}" end diff --git a/lib/service/geospatial/photon.ex b/lib/service/geospatial/photon.ex index ef5f33b43..ef47bb7f5 100644 --- a/lib/service/geospatial/photon.ex +++ b/lib/service/geospatial/photon.ex @@ -6,13 +6,11 @@ defmodule Mobilizon.Service.Geospatial.Photon do alias Mobilizon.Addresses.Address alias Mobilizon.Service.Geospatial.Provider alias Mobilizon.Service.HTTP.GeospatialClient - + import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1] require Logger @behaviour Provider - @endpoint Application.get_env(:mobilizon, __MODULE__) |> get_in([:endpoint]) - @impl Provider @doc """ Photon implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`. @@ -42,7 +40,7 @@ defmodule Mobilizon.Service.Geospatial.Photon do limit = Keyword.get(options, :limit, 10) lang = Keyword.get(options, :lang, "en") coords = Keyword.get(options, :coords, nil) - endpoint = Keyword.get(options, :endpoint, @endpoint) + endpoint = Keyword.get(options, :endpoint, endpoint(__MODULE__)) case method do :search -> diff --git a/lib/service/geospatial/provider.ex b/lib/service/geospatial/provider.ex index 20afc49ce..4d9fadd11 100644 --- a/lib/service/geospatial/provider.ex +++ b/lib/service/geospatial/provider.ex @@ -54,6 +54,8 @@ defmodule Mobilizon.Service.Geospatial.Provider do * `coords` Map of coordinates (ex: `%{lon: 48.11, lat: -1.77}`) allowing to give a geographic priority to the search. Defaults to `nil`. + * `type` Filter by type of results. Allowed values: + * `:administrative` (cities, regions) ## Examples @@ -72,10 +74,15 @@ defmodule Mobilizon.Service.Geospatial.Provider do %Geo.Point{coordinates: {x, y}, srid: srid} end - def coordinates([x, y], srid) when is_bitstring(x) and is_bitstring(y) do + def coordinates([x, y], srid) when is_binary(x) and is_binary(y) do %Geo.Point{coordinates: {String.to_float(x), String.to_float(y)}, srid: srid} end @spec coordinates(any) :: nil def coordinates(_, _), do: nil + + @spec endpoint(atom()) :: String.t() + def endpoint(provider) do + Application.get_env(:mobilizon, provider) |> get_in([:endpoint]) + end end diff --git a/lib/service/http/activity_pub.ex b/lib/service/http/activity_pub.ex index ee5b21630..db9683d9b 100644 --- a/lib/service/http/activity_pub.ex +++ b/lib/service/http/activity_pub.ex @@ -5,28 +5,26 @@ defmodule Mobilizon.Service.HTTP.ActivityPub do alias Mobilizon.Config - @adapter Application.get_env(:tesla, __MODULE__, [])[:adapter] || Tesla.Adapter.Hackney @default_opts [ recv_timeout: 20_000 ] - @user_agent Config.instance_user_agent() def client(options \\ []) do headers = Keyword.get(options, :headers, []) + adapter = Application.get_env(:tesla, __MODULE__, [])[:adapter] || Tesla.Adapter.Hackney opts = Keyword.merge(@default_opts, Keyword.get(options, :opts, [])) middleware = [ {Tesla.Middleware.Headers, - [{"User-Agent", @user_agent}, {"Accept", "application/activity+json"}] ++ headers}, + [{"User-Agent", Config.instance_user_agent()}, {"Accept", "application/activity+json"}] ++ + headers}, Tesla.Middleware.FollowRedirects, {Tesla.Middleware.Timeout, timeout: 10_000}, {Tesla.Middleware.JSON, decode_content_types: ["application/activity+json", "application/ld+json"]} ] - adapter = {@adapter, opts} - - Tesla.client(middleware, adapter) + Tesla.client(middleware, {adapter, opts}) end def get(client, url) do diff --git a/lib/service/http/geospatial_client.ex b/lib/service/http/geospatial_client.ex index 1b578c9de..064fee4c4 100644 --- a/lib/service/http/geospatial_client.ex +++ b/lib/service/http/geospatial_client.ex @@ -13,13 +13,11 @@ defmodule Mobilizon.Service.HTTP.GeospatialClient do adapter(Tesla.Adapter.Hackney, @default_opts) - @user_agent Config.instance_user_agent() - plug(Tesla.Middleware.FollowRedirects) plug(Tesla.Middleware.Timeout, timeout: 10_000) - plug(Tesla.Middleware.Headers, [{"User-Agent", @user_agent}]) + plug(Tesla.Middleware.Headers, [{"User-Agent", Config.instance_user_agent()}]) plug(Tesla.Middleware.JSON) end diff --git a/lib/service/http/host_meta_client.ex b/lib/service/http/host_meta_client.ex new file mode 100644 index 000000000..4ebe0cf2d --- /dev/null +++ b/lib/service/http/host_meta_client.ex @@ -0,0 +1,24 @@ +defmodule Mobilizon.Service.HTTP.HostMetaClient do + @moduledoc """ + Tesla HTTP Basic Client + with XML middleware + """ + + use Tesla + alias Mobilizon.Config + + @default_opts [ + recv_timeout: 20_000 + ] + + adapter(Tesla.Adapter.Hackney, @default_opts) + + plug(Tesla.Middleware.FollowRedirects) + + plug(Tesla.Middleware.Timeout, timeout: 10_000) + + plug(Tesla.Middleware.Headers, [ + {"User-Agent", Config.instance_user_agent()}, + {"Accept", "application/xrd+xml, application/xml, text/xml"} + ]) +end diff --git a/lib/service/http/remote_media_downloader_client.ex b/lib/service/http/remote_media_downloader_client.ex index 06af2bf9d..f8be88793 100644 --- a/lib/service/http/remote_media_downloader_client.ex +++ b/lib/service/http/remote_media_downloader_client.ex @@ -12,11 +12,9 @@ defmodule Mobilizon.Service.HTTP.RemoteMediaDownloaderClient do adapter(Tesla.Adapter.Hackney, @default_opts) - @user_agent Config.instance_user_agent() - plug(Tesla.Middleware.FollowRedirects) plug(Tesla.Middleware.Timeout, timeout: 10_000) - plug(Tesla.Middleware.Headers, [{"User-Agent", @user_agent}]) + plug(Tesla.Middleware.Headers, [{"User-Agent", Config.instance_user_agent()}]) end diff --git a/lib/service/http/rich_media_preview_client.ex b/lib/service/http/rich_media_preview_client.ex index 8f3983548..520839241 100644 --- a/lib/service/http/rich_media_preview_client.ex +++ b/lib/service/http/rich_media_preview_client.ex @@ -12,11 +12,9 @@ defmodule Mobilizon.Service.HTTP.RichMediaPreviewClient do adapter(Tesla.Adapter.Hackney, @default_opts) - @user_agent Config.instance_user_agent() - plug(Tesla.Middleware.FollowRedirects) plug(Tesla.Middleware.Timeout, timeout: 10_000) - plug(Tesla.Middleware.Headers, [{"User-Agent", @user_agent}]) + plug(Tesla.Middleware.Headers, [{"User-Agent", Config.instance_user_agent()}]) end diff --git a/lib/service/http/webfinger_client.ex b/lib/service/http/webfinger_client.ex index 13b578a0d..d5c02e357 100644 --- a/lib/service/http/webfinger_client.ex +++ b/lib/service/http/webfinger_client.ex @@ -13,14 +13,12 @@ defmodule Mobilizon.Service.HTTP.WebfingerClient do adapter(Tesla.Adapter.Hackney, @default_opts) - @user_agent Config.instance_user_agent() - plug(Tesla.Middleware.FollowRedirects) plug(Tesla.Middleware.Timeout, timeout: 10_000) plug(Tesla.Middleware.Headers, [ - {"User-Agent", @user_agent}, + {"User-Agent", Config.instance_user_agent()}, {"Accept", "application/json, application/activity+json, application/jrd+json"} ]) diff --git a/lib/service/metadata/instance.ex b/lib/service/metadata/instance.ex index 5c88e4478..776a613d9 100644 --- a/lib/service/metadata/instance.ex +++ b/lib/service/metadata/instance.ex @@ -9,6 +9,8 @@ defmodule Mobilizon.Service.Metadata.Instance do alias Mobilizon.Config alias Mobilizon.Service.Metadata.Utils alias Mobilizon.Web.Endpoint + alias Mobilizon.Web.Router.Helpers, as: Routes + import Mobilizon.Web.Gettext @doc """ Build the list of tags for the instance @@ -40,6 +42,26 @@ defmodule Mobilizon.Service.Metadata.Instance do Tag.tag(:meta, property: "og:description", content: description), Tag.tag(:meta, property: "og:type", content: "website"), HTML.raw(instance_json_ld) + ] ++ maybe_add_instance_feeds(Config.get([:instance, :enable_instance_feeds])) + end + + @spec maybe_add_instance_feeds(boolean()) :: list() + defp maybe_add_instance_feeds(true) do + [ + Tag.tag(:link, + rel: "alternate", + type: "application/atom+xml", + title: gettext("%{name}'s feed", name: Config.instance_name()) |> HTML.raw(), + href: Routes.feed_url(Endpoint, :instance, :atom) + ), + Tag.tag(:link, + rel: "alternate", + type: "text/calendar", + title: gettext("%{name}'s feed", name: Config.instance_name()) |> HTML.raw(), + href: Routes.feed_url(Endpoint, :instance, :ics) + ) ] end + + defp maybe_add_instance_feeds(false), do: [] end diff --git a/lib/service/metadata/post.ex b/lib/service/metadata/post.ex index 6553b78f9..db3486eba 100644 --- a/lib/service/metadata/post.ex +++ b/lib/service/metadata/post.ex @@ -1,6 +1,7 @@ defimpl Mobilizon.Service.Metadata, for: Mobilizon.Posts.Post do alias Phoenix.HTML alias Phoenix.HTML.Tag + alias Mobilizon.Medias.{File, Media} alias Mobilizon.Posts.Post alias Mobilizon.Web.JsonLD.ObjectView import Mobilizon.Service.Metadata.Utils, only: [process_description: 2, strip_tags: 1] @@ -8,15 +9,17 @@ defimpl Mobilizon.Service.Metadata, for: Mobilizon.Posts.Post do def build_tags(%Post{} = post, locale \\ "en") do post = Map.put(post, :body, process_description(post.body, locale)) - tags = [ - Tag.tag(:meta, property: "og:title", content: post.title), - Tag.tag(:meta, property: "og:url", content: post.url), - Tag.tag(:meta, property: "og:description", content: post.body), - Tag.tag(:meta, property: "og:type", content: "article"), - Tag.tag(:meta, property: "twitter:card", content: "summary"), - # Tell Search Engines what's the origin - Tag.tag(:link, rel: "canonical", href: post.url) - ] + tags = + [ + Tag.tag(:meta, property: "og:title", content: post.title), + Tag.tag(:meta, property: "og:url", content: post.url), + Tag.tag(:meta, property: "og:description", content: post.body), + Tag.tag(:meta, property: "og:type", content: "article"), + Tag.tag(:meta, property: "twitter:card", content: "summary"), + # Tell Search Engines what's the origin + Tag.tag(:link, rel: "canonical", href: post.url) + ] + |> maybe_add_post_picture(post) tags ++ [ @@ -31,4 +34,17 @@ defimpl Mobilizon.Service.Metadata, for: Mobilizon.Posts.Post do |> ObjectView.render(%{post: %{post | title: strip_tags(title)}}) |> Jason.encode!() end + + @spec maybe_add_post_picture(list(), Post.t()) :: list() + defp maybe_add_post_picture(tags, %Post{picture: %Media{file: %File{url: url}}}), + do: + tags ++ + [ + Tag.tag(:meta, + property: "og:image", + content: url + ) + ] + + defp maybe_add_post_picture(tags, _), do: tags end diff --git a/lib/service/rich_media/favicon.ex b/lib/service/rich_media/favicon.ex index 12768b2de..bdb146cf9 100644 --- a/lib/service/rich_media/favicon.ex +++ b/lib/service/rich_media/favicon.ex @@ -56,14 +56,10 @@ defmodule Mobilizon.Service.RichMedia.Favicon do @spec format_url(String.t(), String.t()) :: String.t() defp format_url(url, path) do - image_uri = URI.parse(path) - uri = URI.parse(url) - - cond do - is_nil(image_uri.host) -> "#{uri.scheme}://#{uri.host}#{path}" - is_nil(image_uri.scheme) -> "#{uri.scheme}:#{path}" - true -> path - end + url + |> URI.parse() + |> URI.merge(path) + |> to_string() end @spec find_favicon_link_tag(String.t()) :: {:ok, tuple()} | {:error, any()} diff --git a/lib/service/rich_media/parser.ex b/lib/service/rich_media/parser.ex index 738d19620..6ffcb2d5f 100644 --- a/lib/service/rich_media/parser.ex +++ b/lib/service/rich_media/parser.ex @@ -19,6 +19,7 @@ defmodule Mobilizon.Service.RichMedia.Parser do alias Mobilizon.Config alias Mobilizon.Service.HTTP.RichMediaPreviewClient alias Mobilizon.Service.RichMedia.Favicon + alias Mobilizon.Service.RichMedia.Parsers.Fallback alias Plug.Conn.Utils require Logger @@ -57,7 +58,7 @@ defmodule Mobilizon.Service.RichMedia.Parser do @spec parse_url(String.t(), Enum.t()) :: {:ok, map()} | {:error, any()} defp parse_url(url, options \\ []) do - user_agent = Keyword.get(options, :user_agent, Config.instance_user_agent()) + user_agent = Keyword.get(options, :user_agent, default_user_agent(url)) headers = [{"User-Agent", user_agent}] Logger.debug("Fetching content at address #{inspect(url)}") @@ -73,12 +74,11 @@ defmodule Mobilizon.Service.RichMedia.Parser do {:is_html, _response_headers, true} <- {:is_html, response_headers, is_html(response_headers)} do body - |> parse_html() |> maybe_parse() |> Map.put(:url, url) |> maybe_add_favicon() |> clean_parsed_data() - |> check_parsed_data() + |> check_parsed_data(body) |> check_remote_picture_path() else {:is_html, response_headers, false} -> @@ -192,8 +192,7 @@ defmodule Mobilizon.Service.RichMedia.Parser do end end - defp parse_html(html), do: Floki.parse_document!(html) - + @spec maybe_parse(String.t()) :: {:halt, map()} | {:cont, map()} defp maybe_parse(html) do Enum.reduce_while(parsers(), %{}, fn parser, acc -> case parser.parse(html, acc) do @@ -206,13 +205,24 @@ defmodule Mobilizon.Service.RichMedia.Parser do end) end - defp check_parsed_data(%{title: title} = data) + defp check_parsed_data(data, html, first_run \\ true) + + defp check_parsed_data(%{title: title} = data, _html, _first_run) when is_binary(title) and byte_size(title) > 0 do - {:ok, data} + data end - defp check_parsed_data(data) do - {:error, "Found metadata was invalid or incomplete: #{inspect(data)}"} + defp check_parsed_data(data, html, first_run) do + # Maybe the first data found is incomplete, pass it through the Fallback parser once again + if first_run do + {:ok, data} = Fallback.parse(html, data) + Logger.debug("check parsed data") + Logger.debug(inspect(data)) + check_parsed_data(data, html, false) + else + Logger.debug("Found metadata was invalid or incomplete: #{inspect(data)}") + {:error, :invalid_parsed_data} + end end defp clean_parsed_data(data) do @@ -279,18 +289,31 @@ defmodule Mobilizon.Service.RichMedia.Parser do @spec check_remote_picture_path(map()) :: map() defp check_remote_picture_path(%{image_remote_url: image_remote_url, url: url} = data) do Logger.debug("Checking image_remote_url #{image_remote_url}") - image_uri = URI.parse(image_remote_url) - uri = URI.parse(url) - image_remote_url = - cond do - is_nil(image_uri.host) -> "#{uri.scheme}://#{uri.host}#{image_remote_url}" - is_nil(image_uri.scheme) -> "#{uri.scheme}:#{image_remote_url}" - true -> image_remote_url - end - - Map.put(data, :image_remote_url, image_remote_url) + data = Map.put(data, :image_remote_url, format_url(url, image_remote_url)) + {:ok, data} end - defp check_remote_picture_path(data), do: data + defp check_remote_picture_path(data), do: {:ok, data} + + @spec format_url(String.t(), String.t()) :: String.t() + defp format_url(url, path) do + url + |> URI.parse() + |> URI.merge(path) + |> to_string() + end + + # Twitter requires a well-know crawler user-agent to show server-rendered data + defp default_user_agent("https://twitter.com/" <> _) do + "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" + end + + defp default_user_agent("https://mobile.twitter.com/" <> _) do + "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" + end + + defp default_user_agent(_url) do + Config.instance_user_agent() + end end diff --git a/lib/service/rich_media/parsers/fallback.ex b/lib/service/rich_media/parsers/fallback.ex index 5c2d8d573..2a92113fe 100644 --- a/lib/service/rich_media/parsers/fallback.ex +++ b/lib/service/rich_media/parsers/fallback.ex @@ -29,11 +29,19 @@ defmodule Mobilizon.Service.RichMedia.Parsers.Fallback do end defp get_page(html, :title) do - html |> Floki.find("html head title") |> List.first() |> Floki.text() |> String.trim() + html + |> Floki.parse_document!() + |> Floki.find("html title") + |> List.first() + |> Floki.text() + |> String.trim() end defp get_page(html, :description) do - case html |> Floki.find("html head meta[name='description']") |> List.first() do + case html + |> Floki.parse_document!() + |> Floki.find("html meta[name='description']") + |> List.first() do nil -> "" elem -> elem |> Floki.attribute("content") |> List.first() |> String.trim() end diff --git a/lib/service/rich_media/parsers/meta_tags_parser.ex b/lib/service/rich_media/parsers/meta_tags_parser.ex index bd383db71..768baffa2 100644 --- a/lib/service/rich_media/parsers/meta_tags_parser.ex +++ b/lib/service/rich_media/parsers/meta_tags_parser.ex @@ -36,7 +36,7 @@ defmodule Mobilizon.Service.RichMedia.Parsers.MetaTagsParser do end defp get_elements(html, key_name, prefix) do - html |> Floki.find("meta[#{to_string(key_name)}^='#{prefix}:']") + html |> Floki.parse_document!() |> Floki.find("meta[#{to_string(key_name)}^='#{prefix}:']") end defp normalize_attributes(html_node, prefix, key_name, value_name, allowed_attributes) do @@ -70,21 +70,39 @@ defmodule Mobilizon.Service.RichMedia.Parsers.MetaTagsParser do defp maybe_put_description(meta, html) when meta != %{} do case get_page_description(html) do - "" -> meta - description -> Map.put_new(meta, :description, description) + "" -> + meta + + descriptions when is_list(descriptions) and length(descriptions) > 0 -> + Map.put_new(meta, :description, hd(descriptions)) + + description -> + Map.put_new(meta, :description, description) end end defp maybe_put_description(meta, _), do: meta + @spec get_page_title(String.t()) :: String.t() defp get_page_title(html) do - html |> Floki.find("html head title") |> List.first() |> Floki.text() + with {:ok, document} <- Floki.parse_document(html), + elem when not is_nil(elem) <- document |> Floki.find("html head title") |> List.first(), + title when is_binary(title) <- Floki.text(elem) do + title + else + _ -> "" + end end + @spec get_page_description(String.t()) :: String.t() defp get_page_description(html) do - case html |> Floki.find("html head meta[name='description']") |> List.first() do - nil -> "" - elem -> Floki.attribute(elem, "content") + with {:ok, document} <- Floki.parse_document(html), + elem when not is_nil(elem) <- + document |> Floki.find("html head meta[name='description']") |> List.first(), + description when is_binary(description) <- Floki.attribute(elem, "content") do + description + else + _ -> "" end end end diff --git a/lib/service/rich_media/parsers/oembed_parser.ex b/lib/service/rich_media/parsers/oembed_parser.ex index ce450d0d9..567277472 100644 --- a/lib/service/rich_media/parsers/oembed_parser.ex +++ b/lib/service/rich_media/parsers/oembed_parser.ex @@ -32,7 +32,9 @@ defmodule Mobilizon.Service.RichMedia.Parsers.OEmbed do end defp get_discovery_data(html) do - html |> Floki.find("link[type='application/json+oembed']") + with {:ok, document} <- Floki.parse_document(html) do + Floki.find(document, "link[type='application/json+oembed']") + end end defp get_oembed_url(nodes) do diff --git a/lib/service/workers/activity_builder.ex b/lib/service/workers/activity_builder.ex new file mode 100644 index 000000000..87049a832 --- /dev/null +++ b/lib/service/workers/activity_builder.ex @@ -0,0 +1,22 @@ +defmodule Mobilizon.Service.Workers.ActivityBuilder do + @moduledoc """ + Worker to insert activity items in users feeds + """ + + alias Mobilizon.Activities + alias Mobilizon.Activities.Activity + + use Mobilizon.Service.Workers.Helper, queue: "activity" + + @impl Oban.Worker + def perform(%Job{args: args}) do + with {"build_activity", args} <- Map.pop(args, "op") do + build_activity(args) + end + end + + @spec build_activity(map()) :: {:ok, Activity.t()} + def build_activity(args) do + Activities.create_activity(args) + end +end diff --git a/lib/service/workers/clean_old_activity_worker.ex b/lib/service/workers/clean_old_activity_worker.ex new file mode 100644 index 000000000..038d705af --- /dev/null +++ b/lib/service/workers/clean_old_activity_worker.ex @@ -0,0 +1,13 @@ +defmodule Mobilizon.Service.Workers.CleanOldActivityWorker do + @moduledoc """ + Worker to clean old activity + """ + + use Oban.Worker, queue: "background" + alias Mobilizon.Service.CleanOldActivity + + @impl Oban.Worker + def perform(%Job{}) do + CleanOldActivity.clean() + end +end diff --git a/lib/service/workers/notification.ex b/lib/service/workers/notification.ex index a3a7ff9a9..19202f8b2 100644 --- a/lib/service/workers/notification.ex +++ b/lib/service/workers/notification.ex @@ -23,7 +23,7 @@ defmodule Mobilizon.Service.Workers.Notification do Users.get_user_with_settings!(user_id) do email |> Notification.before_event_notification(participant, locale) - |> Mailer.deliver_later() + |> Mailer.send_email_later() :ok end @@ -48,7 +48,7 @@ defmodule Mobilizon.Service.Workers.Notification do true <- length(participations) > 0 do user |> Notification.on_day_notification(participations, total, locale) - |> Mailer.deliver_later() + |> Mailer.send_email_later() :ok else @@ -77,7 +77,7 @@ defmodule Mobilizon.Service.Workers.Notification do true <- length(participations) > 0 do user |> Notification.weekly_notification(participations, total, locale) - |> Mailer.deliver_later() + |> Mailer.send_email_later() :ok else @@ -99,7 +99,7 @@ defmodule Mobilizon.Service.Workers.Notification do Events.list_participants_for_event(event_id, [:not_approved]) do user |> Notification.pending_participation_notification(event, total) - |> Mailer.deliver_later() + |> Mailer.send_email_later() :ok else diff --git a/lib/web/auth/context.ex b/lib/web/auth/context.ex index 9f41dd61f..aaa16e25a 100644 --- a/lib/web/auth/context.ex +++ b/lib/web/auth/context.ex @@ -23,7 +23,8 @@ defmodule Mobilizon.Web.Auth.Context do context = case Guardian.Plug.current_resource(conn) do - %User{} = user -> + %User{id: user_id, email: user_email} = user -> + Sentry.Context.set_user_context(%{id: user_id, name: user_email}) Map.put(context, :current_user, user) nil -> diff --git a/lib/web/controllers/activity_pub_controller.ex b/lib/web/controllers/activity_pub_controller.ex index 0e35181c4..d8609359a 100644 --- a/lib/web/controllers/activity_pub_controller.ex +++ b/lib/web/controllers/activity_pub_controller.ex @@ -10,7 +10,8 @@ defmodule Mobilizon.Web.ActivityPubController do alias Mobilizon.Actors.{Actor, Member} alias Mobilizon.Federation.ActivityPub - alias Mobilizon.Federation.ActivityPub.Federator + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor + alias Mobilizon.Federation.ActivityPub.{Federator, Utils} alias Mobilizon.Web.ActivityPub.ActorView alias Mobilizon.Web.Cache @@ -105,7 +106,17 @@ defmodule Mobilizon.Web.ActivityPubController do actor_collection(conn, "outbox", args) end - # TODO: Ensure that this inbox is a recipient of the message + def inbox(%{assigns: %{valid_signature: true}} = conn, %{"name" => preferred_username} = params) do + with %Actor{url: recipient_url} = recipient <- + Actors.get_local_actor_by_name(preferred_username), + {:ok, %Actor{} = actor} <- ActivityPubActor.get_or_fetch_actor_by_url(params["actor"]), + true <- Utils.recipient_in_message(recipient, actor, params), + params <- Utils.maybe_splice_recipient(recipient_url, params) do + Federator.enqueue(:incoming_ap_doc, params) + json(conn, "ok") + end + end + def inbox(%{assigns: %{valid_signature: true}} = conn, params) do Logger.debug("Got something with valid signature inside inbox") Federator.enqueue(:incoming_ap_doc, params) @@ -114,7 +125,7 @@ defmodule Mobilizon.Web.ActivityPubController do # only accept relayed Creates def inbox(conn, %{"type" => "Create"} = params) do - Logger.info( + Logger.debug( "Signature missing or not from author, relayed Create message, fetching object from source" ) @@ -126,8 +137,9 @@ defmodule Mobilizon.Web.ActivityPubController do def inbox(conn, params) do headers = Enum.into(conn.req_headers, %{}) - if String.contains?(headers["signature"], params["actor"]) do - Logger.error( + if headers["signature"] && params["actor"] && + String.contains?(headers["signature"], params["actor"]) do + Logger.debug( "Signature validation error for: #{params["actor"]}, make sure you are forwarding the HTTP Host header!" ) diff --git a/lib/web/controllers/feed_controller.ex b/lib/web/controllers/feed_controller.ex index 6d1141a7c..4db698fea 100644 --- a/lib/web/controllers/feed_controller.ex +++ b/lib/web/controllers/feed_controller.ex @@ -5,31 +5,18 @@ defmodule Mobilizon.Web.FeedController do use Mobilizon.Web, :controller plug(:put_layout, false) action_fallback(Mobilizon.Web.FallbackController) + alias Mobilizon.Config - def actor(conn, %{"name" => name, "format" => "atom"}) do - case Cachex.fetch(:feed, "actor_" <> name) do - {status, data} when status in [:commit, :ok] -> - conn - |> put_resp_content_type("application/atom+xml") - |> put_resp_header("content-disposition", "attachment; filename=\"#{name}.atom\"") - |> send_resp(200, data) - - _ -> - {:error, :not_found} + def instance(conn, %{"format" => format}) do + if Config.get([:instance, :enable_instance_feeds], false) do + return_data(conn, format, "instance", Config.instance_name()) + else + send_resp(conn, 401, "Instance feeds are not enabled.") end end - def actor(conn, %{"name" => name, "format" => "ics"}) do - case Cachex.fetch(:ics, "actor_" <> name) do - {status, data} when status in [:commit, :ok] -> - conn - |> put_resp_content_type("text/calendar") - |> put_resp_header("content-disposition", "attachment; filename=\"#{name}.ics\"") - |> send_resp(200, data) - - _err -> - {:error, :not_found} - end + def actor(conn, %{"format" => format, "name" => name}) do + return_data(conn, format, "actor_" <> name, name) end def actor(_conn, _) do @@ -37,28 +24,46 @@ defmodule Mobilizon.Web.FeedController do end def event(conn, %{"uuid" => uuid, "format" => "ics"}) do - case Cachex.fetch(:ics, "event_" <> uuid) do - {status, data} when status in [:commit, :ok] -> - conn - |> put_resp_content_type("text/calendar") - |> put_resp_header("content-disposition", "attachment; filename=\"event.ics\"") - |> send_resp(200, data) - - _ -> - {:error, :not_found} - end + return_data(conn, "ics", "event_" <> uuid, "event") end def event(_conn, _) do {:error, :not_found} end - def going(conn, %{"token" => token, "format" => "ics"}) do - case Cachex.fetch(:ics, "token_" <> token) do + def going(conn, %{"token" => token, "format" => format}) do + return_data(conn, format, "token_" <> token, "events") + end + + def going(_conn, _) do + {:error, :not_found} + end + + defp return_data(conn, "atom", type, filename) do + case Cachex.fetch(:feed, type) do + {status, data} when status in [:commit, :ok] -> + conn + |> put_resp_content_type("application/atom+xml") + |> put_resp_header( + "content-disposition", + "attachment; filename=\"#{filename}.atom\"" + ) + |> send_resp(200, data) + + _err -> + {:error, :not_found} + end + end + + defp return_data(conn, "ics", type, filename) do + case Cachex.fetch(:ics, type) do {status, data} when status in [:commit, :ok] -> conn |> put_resp_content_type("text/calendar") - |> put_resp_header("content-disposition", "attachment; filename=\"events.ics\"") + |> put_resp_header( + "content-disposition", + "attachment; filename=\"#{filename}.ics\"" + ) |> send_resp(200, data) _ -> @@ -66,20 +71,7 @@ defmodule Mobilizon.Web.FeedController do end end - def going(conn, %{"token" => token, "format" => "atom"}) do - case Cachex.fetch(:feed, "token_" <> token) do - {status, data} when status in [:commit, :ok] -> - conn - |> put_resp_content_type("application/atom+xml") - |> put_resp_header("content-disposition", "attachment; filename=\"events.atom\"") - |> send_resp(200, data) - - {:ignore, _} -> - {:error, :not_found} - end - end - - def going(_conn, _) do + defp return_data(_conn, _, _, _) do {:error, :not_found} end end diff --git a/lib/web/email/email.ex b/lib/web/email/email.ex index 936503f88..7f6cfd2d4 100644 --- a/lib/web/email/email.ex +++ b/lib/web/email/email.ex @@ -5,7 +5,6 @@ defmodule Mobilizon.Web.Email do use Bamboo.Phoenix, view: Mobilizon.Web.EmailView - alias Ecto.UUID alias Mobilizon.{Config, Events} alias Mobilizon.Events.Event alias Mobilizon.Service.Export.ICalendar @@ -19,27 +18,27 @@ defmodule Mobilizon.Web.Email do |> new_email() |> from({Config.instance_name(), Config.instance_email_from()}) |> put_header("Reply-To", Config.instance_email_reply_to()) - |> put_header("Date", date()) - |> put_header("Message-Id", message_id()) + |> maybe_put_date_header() + |> maybe_put_message_id() |> assign(:instance, instance) |> put_html_layout({EmailView, "email.html"}) |> put_text_layout({EmailView, "email.text"}) end # Generating an UUID randomly causes Bamboo.Test.assert_delivered_email/1 to fail - defp message_id do + defp maybe_put_message_id(email) do if Application.fetch_env!(:mobilizon, :env) == :test do - "TEST_ENV_MESSAGE_ID@#{Config.instance_hostname()}" + put_header(email, "Message-Id", "TEST_ENV_MESSAGE_ID@#{Config.instance_hostname()}") else - "#{UUID.generate()}@#{Config.instance_hostname()}" + email end end - defp date do + defp maybe_put_date_header(email) do if Application.fetch_env!(:mobilizon, :env) == :test do - "REMOVED FOR TESTING" + put_header(email, "Date", "REMOVED FOR TESTING") else - Timex.format!(DateTime.utc_now(), "{WDshort}, {D} {Mshort} {YYYY} {h24}:{m}:{s} {Z}") + email end end diff --git a/lib/web/email/event.ex b/lib/web/email/event.ex index 2a34fb347..5b3e39ddc 100644 --- a/lib/web/email/event.ex +++ b/lib/web/email/event.ex @@ -143,6 +143,6 @@ defmodule Mobilizon.Web.Email.Event do ) do email |> Email.Event.event_updated(actor, old_event, event, diff, timezone, locale) - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() end end diff --git a/lib/web/email/follow.ex b/lib/web/email/follow.ex index ef12e495f..25c3c953d 100644 --- a/lib/web/email/follow.ex +++ b/lib/web/email/follow.ex @@ -62,7 +62,7 @@ defmodule Mobilizon.Web.Email.Follow do |> assign(:follower, follower) |> assign(:subject, subject) |> render(:instance_follow) - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() :ok end diff --git a/lib/web/email/group.ex b/lib/web/email/group.ex index 440c0f20b..2c3029007 100644 --- a/lib/web/email/group.ex +++ b/lib/web/email/group.ex @@ -42,7 +42,7 @@ defmodule Mobilizon.Web.Email.Group do |> assign(:group, group) |> assign(:subject, subject) |> render(:group_invite) - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() :ok end @@ -70,7 +70,7 @@ defmodule Mobilizon.Web.Email.Group do |> assign(:group, group) |> assign(:subject, subject) |> render(:group_member_removal) - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() :ok end @@ -107,7 +107,7 @@ defmodule Mobilizon.Web.Email.Group do |> assign(:subject, subject) |> assign(:instance, instance) |> render(:group_suspension) - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() :ok end @@ -147,7 +147,7 @@ defmodule Mobilizon.Web.Email.Group do |> assign(:instance, instance) |> assign(:author, author) |> render(:group_deletion) - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() :ok else diff --git a/lib/web/email/mailer.ex b/lib/web/email/mailer.ex index 87316f1ce..4996f7696 100644 --- a/lib/web/email/mailer.ex +++ b/lib/web/email/mailer.ex @@ -3,4 +3,28 @@ defmodule Mobilizon.Web.Email.Mailer do Mobilizon Mailer. """ use Bamboo.Mailer, otp_app: :mobilizon + + def send_email_later(email) do + Mobilizon.Web.Email.Mailer.deliver_later!(email) + rescue + error -> + Sentry.capture_exception(error, + stacktrace: __STACKTRACE__, + extra: %{extra: "Error while sending email"} + ) + + reraise error, __STACKTRACE__ + end + + def send_email(email) do + Mobilizon.Web.Email.Mailer.deliver_now!(email) + rescue + error -> + Sentry.capture_exception(error, + stacktrace: __STACKTRACE__, + extra: %{extra: "Error while sending email"} + ) + + reraise error, __STACKTRACE__ + end end diff --git a/lib/web/email/participation.ex b/lib/web/email/participation.ex index 132c0d8a2..dbd90e694 100644 --- a/lib/web/email/participation.ex +++ b/lib/web/email/participation.ex @@ -28,7 +28,7 @@ defmodule Mobilizon.Web.Email.Participation do email |> participation_updated(participation, locale) - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() end :ok @@ -40,7 +40,7 @@ defmodule Mobilizon.Web.Email.Participation do with %User{locale: locale} = user <- Users.get_user!(user_id) do user |> participation_updated(participation, locale) - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() :ok end diff --git a/lib/web/email/user.ex b/lib/web/email/user.ex index e4921836c..7dd74b70b 100644 --- a/lib/web/email/user.ex +++ b/lib/web/email/user.ex @@ -79,17 +79,18 @@ defmodule Mobilizon.Web.Email.User do {:ok, user} <- Users.update_user(user, %{ "confirmation_sent_at" => DateTime.utc_now() |> DateTime.truncate(:second) - }) do - send_confirmation_email(user, locale) + }), + %Bamboo.Email{} <- send_confirmation_email(user, locale) do Logger.info("Sent confirmation email again to #{user.email}") {:ok, user.email} end end + @spec send_confirmation_email(User.t(), String.t()) :: {:ok, Bamboo.Email.t()} | {:error, any()} def send_confirmation_email(%User{} = user, locale \\ "en") do user |> Email.User.confirmation_email(locale) - |> Email.Mailer.deliver_later() + |> Email.Mailer.send_email_later() end @doc """ @@ -130,12 +131,11 @@ defmodule Mobilizon.Web.Email.User do "reset_password_token" => Crypto.random_string(30), "reset_password_sent_at" => DateTime.utc_now() |> DateTime.truncate(:second) }) - ) do - mail = - user_updated - |> Email.User.reset_password_email(locale) - |> Email.Mailer.deliver_later() - + ), + %Bamboo.Email{} = mail <- + user_updated + |> Email.User.reset_password_email(locale) + |> Email.Mailer.send_email_later() do {:ok, mail} else {:error, reason} -> {:error, reason} diff --git a/lib/web/endpoint.ex b/lib/web/endpoint.ex index 24ba70034..5d062f6a5 100644 --- a/lib/web/endpoint.ex +++ b/lib/web/endpoint.ex @@ -2,11 +2,18 @@ defmodule Mobilizon.Web.Endpoint do @moduledoc """ Endpoint for Mobilizon app """ + if Application.fetch_env!(:mobilizon, :env) !== :test do + use Sentry.PlugCapture + end + use Phoenix.Endpoint, otp_app: :mobilizon use Absinthe.Phoenix.Endpoint plug(Mobilizon.Web.Plugs.SetLocalePlug) - plug(Mobilizon.Web.Plugs.HTTPSecurityPlug) + + if Application.fetch_env!(:mobilizon, :env) !== :dev do + plug(Mobilizon.Web.Plugs.HTTPSecurityPlug) + end # For e2e tests if Application.get_env(:mobilizon, :sql_sandbox) do @@ -55,9 +62,12 @@ defmodule Mobilizon.Web.Endpoint do plug(Plug.RequestId) plug(Plug.Logger) + upload_limit = + Keyword.get(Application.get_env(:mobilizon, :instance, []), :upload_limit, 10_485_760) + plug( Plug.Parsers, - parsers: [:urlencoded, {:multipart, length: 10_000_000}, :json, Absinthe.Plug.Parser], + parsers: [:urlencoded, {:multipart, length: upload_limit}, :json, Absinthe.Plug.Parser], pass: ["*/*"], json_decoder: Jason ) @@ -81,4 +91,8 @@ defmodule Mobilizon.Web.Endpoint do def websocket_url do String.replace_leading(url(), "http", "ws") end + + if Application.fetch_env!(:mobilizon, :env) !== :test do + plug(Sentry.PlugContext) + end end diff --git a/lib/web/media_proxy.ex b/lib/web/media_proxy.ex index eede9e72c..549f0918d 100644 --- a/lib/web/media_proxy.ex +++ b/lib/web/media_proxy.ex @@ -29,10 +29,6 @@ defmodule Mobilizon.Web.MediaProxy do def enabled?, do: Config.get([:media_proxy, :enabled], false) - # Note: media proxy must be enabled for media preview proxy in order to load all - # non-local non-whitelisted URLs through it and be sure that body size constraint is preserved. - def preview_enabled?, do: enabled?() and !!Config.get([:media_preview_proxy, :enabled]) - def local?(url), do: String.starts_with?(url, Web.Endpoint.url()) defp base64_sig64(url) do @@ -62,7 +58,7 @@ defmodule Mobilizon.Web.MediaProxy do end defp signed_url(url) do - :crypto.hmac(:sha, Config.get([Web.Endpoint, :secret_key_base]), url) + :crypto.mac(:hmac, :sha, Config.get([Web.Endpoint, :secret_key_base]), url) end def filename(url_or_path) do diff --git a/lib/web/plugs/http_security_plug.ex b/lib/web/plugs/http_security_plug.ex index ab10f77d9..acc5f55b7 100644 --- a/lib/web/plugs/http_security_plug.ex +++ b/lib/web/plugs/http_security_plug.ex @@ -29,6 +29,9 @@ defmodule Mobilizon.Web.Plugs.HTTPSecurityPlug do referrer_policy = Config.get([:http_security, :referrer_policy]) [ + {"x-xss-protection", "0"}, + {"x-frame-options", "DENY"}, + {"x-content-type-options", "nosniff"}, {"referrer-policy", referrer_policy}, {"content-security-policy", csp_string()} ] @@ -42,44 +45,57 @@ defmodule Mobilizon.Web.Plugs.HTTPSecurityPlug do @csp_start [Enum.join(@static_csp_rules, ";") <> ";"] + @img_src "img-src 'self' data: blob: " + @media_src "media-src 'self' " + # Connect-src is available for any origin (*) because of webfinger query to redirect to content + @connect_src "connect-src 'self' * blob: " + # unsafe-eval is because of JS issues with regenerator-runtime + # unsafe-inline will be overriten in prod with sha256 hash + @script_src "script-src 'self' 'unsafe-eval' 'unsafe-inline' " + @style_src "style-src 'self' " + @font_src "font-src 'self' " + defp csp_string do scheme = Config.get([Pleroma.Web.Endpoint, :url])[:scheme] static_url = Mobilizon.Web.Endpoint.static_url() websocket_url = Mobilizon.Web.Endpoint.websocket_url() - img_src = - ["img-src 'self' data: blob: "] ++ Config.get([:http_security, :csp_policy, :img_src]) + img_src = [@img_src | get_csp_config(:img_src)] - media_src = ["media-src 'self' "] ++ Config.get([:http_security, :csp_policy, :media_src]) + media_src = [@media_src | get_csp_config(:media_src)] - # Connect-src is available for any origin because of webfinger query to redirect to content - connect_src = - ["connect-src 'self' * blob: ", static_url, ?\s, websocket_url] ++ - Config.get([:http_security, :csp_policy, :connect_src]) + connect_src = [ + @connect_src, + static_url, + ?\s, + websocket_url, + ?\s, + get_csp_config(:connect_src) + ] script_src = if Config.get(:env) == :dev do - "script-src 'self' 'unsafe-eval' 'unsafe-inline' " + @script_src else - "script-src 'self' 'unsafe-eval' 'sha256-4RS22DYeB7U14dra4KcQYxmwt5HkOInieXK1NUMBmQI=' " + [ + @script_src, + "'sha256-4RS22DYeB7U14dra4KcQYxmwt5HkOInieXK1NUMBmQI=' " + ] end - script_src = [script_src] ++ Config.get([:http_security, :csp_policy, :script_src]) + script_src = [script_src | get_csp_config(:script_src)] - style_src = - ["style-src 'self' 'unsafe-inline' "] ++ - Config.get([:http_security, :csp_policy, :style_src]) + style_src = [@style_src | get_csp_config(:style_src)] - font_src = ["font-src 'self' "] ++ Config.get([:http_security, :csp_policy, :font_src]) + font_src = [@font_src | get_csp_config(:font_src)] frame_src = if Config.get(:env) == :dev, do: "frame-src 'self' ", else: "frame-src 'none' " - frame_src = [frame_src] ++ Config.get([:http_security, :csp_policy, :frame_src]) + frame_src = [frame_src | get_csp_config(:frame_src)] frame_ancestors = if Config.get(:env) == :dev, do: "frame-ancestors 'self' ", else: "frame-ancestors 'none' " - frame_ancestors = - [frame_ancestors] ++ Config.get([:http_security, :csp_policy, :frame_ancestors]) + frame_ancestors = [frame_ancestors | get_csp_config(:frame_ancestors)] insecure = if scheme == "https", do: "upgrade-insecure-requests" @@ -93,7 +109,7 @@ defmodule Mobilizon.Web.Plugs.HTTPSecurityPlug do |> add_csp_param(frame_src) |> add_csp_param(frame_ancestors) |> add_csp_param(insecure) - |> :erlang.iolist_to_binary() + |> to_string() end defp add_csp_param(csp_iodata, nil), do: csp_iodata @@ -109,4 +125,7 @@ defmodule Mobilizon.Web.Plugs.HTTPSecurityPlug do end defp maybe_send_sts_header(conn, _), do: conn + + defp get_csp_config(type), + do: [:http_security, :csp_policy, type] |> Config.get() |> Enum.join(" ") end diff --git a/lib/web/plugs/mapped_signature_to_identity.ex b/lib/web/plugs/mapped_signature_to_identity.ex index 84262bc3f..548f3ac0c 100644 --- a/lib/web/plugs/mapped_signature_to_identity.ex +++ b/lib/web/plugs/mapped_signature_to_identity.ex @@ -12,7 +12,7 @@ defmodule Mobilizon.Web.Plugs.MappedSignatureToIdentity do alias Mobilizon.Actors.Actor - alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityPub.Utils alias Mobilizon.Federation.HTTPSignatures.Signature @@ -34,7 +34,7 @@ defmodule Mobilizon.Web.Plugs.MappedSignatureToIdentity do @spec actor_from_key_id(Plug.Conn.t()) :: Actor.t() | nil defp actor_from_key_id(conn) do with key_actor_id when is_binary(key_actor_id) <- key_id_from_conn(conn), - {:ok, %Actor{} = actor} <- ActivityPub.get_or_fetch_actor_by_url(key_actor_id) do + {:ok, %Actor{} = actor} <- ActivityPubActor.get_or_fetch_actor_by_url(key_actor_id) do actor else _ -> diff --git a/lib/web/plugs/not_acceptable_error.ex b/lib/web/plugs/not_acceptable_error.ex new file mode 100644 index 000000000..0b1556c4e --- /dev/null +++ b/lib/web/plugs/not_acceptable_error.ex @@ -0,0 +1,4 @@ +defimpl Plug.Exception, for: Phoenix.NotAcceptableError do + def status(_exception), do: 406 + def actions(_exception), do: [] +end diff --git a/lib/web/proxy/reverse_proxy.ex b/lib/web/proxy/reverse_proxy.ex index cfc677de8..f09d751a0 100644 --- a/lib/web/proxy/reverse_proxy.ex +++ b/lib/web/proxy/reverse_proxy.ex @@ -120,7 +120,8 @@ defmodule Mobilizon.Web.ReverseProxy do opts end - with {:ok, code, headers, client} <- request(method, url, req_headers, hackney_opts), + with {:is_url, true} <- {:is_url, valid_uri?(url)}, + {:ok, code, headers, client} <- request(method, url, req_headers, hackney_opts), :ok <- header_length_constraint(headers, Keyword.get(opts, :max_body_length)) do response(conn, client, url, code, headers, opts) else @@ -129,6 +130,13 @@ defmodule Mobilizon.Web.ReverseProxy do |> head_response(url, code, headers, opts) |> halt() + {:is_url, false} -> + Logger.warn("Tried to reverse proxy URL #{inspect(url)}") + + conn + |> error_or_redirect(url, 500, "Request failed", opts) + |> halt() + {:error, {:invalid_http_response, code}} -> Logger.error("#{__MODULE__}: request to #{inspect(url)} failed with HTTP status #{code}") @@ -397,4 +405,10 @@ defmodule Mobilizon.Web.ReverseProxy do def filename(url_or_path) do if path = URI.parse(url_or_path).path, do: Path.basename(path) end + + @spec valid_uri?(String.t()) :: boolean() + defp valid_uri?(url) do + uri = URI.parse(url) + uri.scheme != nil && uri.host =~ "." + end end diff --git a/lib/web/router.ex b/lib/web/router.ex index a74a84bfd..4b54a1350 100644 --- a/lib/web/router.ex +++ b/lib/web/router.ex @@ -9,6 +9,10 @@ defmodule Mobilizon.Web.Router do plug(Mobilizon.Web.Auth.Pipeline) end + pipeline :host_meta do + plug(:accepts, ["xrd-xml"]) + end + pipeline :well_known do plug(:accepts, ["json", "jrd-json"]) end @@ -67,9 +71,14 @@ defmodule Mobilizon.Web.Router do end scope "/.well-known", Mobilizon.Web do - pipe_through(:well_known) + pipe_through(:host_meta) get("/host-meta", WebFingerController, :host_meta) + end + + scope "/.well-known", Mobilizon.Web do + pipe_through(:well_known) + get("/webfinger", WebFingerController, :webfinger) get("/nodeinfo", NodeInfoController, :schemas) get("/nodeinfo/:version", NodeInfoController, :nodeinfo) @@ -128,6 +137,7 @@ defmodule Mobilizon.Web.Router do get("/@:name/feed/:format", FeedController, :actor) get("/events/:uuid/export/:format", FeedController, :event) get("/events/going/:token/:format", FeedController, :going) + get("/feed/instance/:format", FeedController, :instance) end ## MOBILIZON diff --git a/lib/web/templates/email/email_changed_old.html.eex b/lib/web/templates/email/email_changed_old.html.eex index a4c2acd0c..ab5ea3e7e 100644 --- a/lib/web/templates/email/email_changed_old.html.eex +++ b/lib/web/templates/email/email_changed_old.html.eex @@ -37,9 +37,6 @@

<%= gettext("The email address for your account on %{host} is being changed to:", host: @instance[:name]) |> raw %>

-

- <%= gettext("If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}.", host: @instance[:name]) %> -

diff --git a/lib/web/templates/error/500_page.html.eex b/lib/web/templates/error/500_page.html.eex index da1cb2e7a..5af0859de 100644 --- a/lib/web/templates/error/500_page.html.eex +++ b/lib/web/templates/error/500_page.html.eex @@ -10,7 +10,6 @@ font-family: BlinkMacSystemFont, Roboto, Oxygen, Ubuntu, Cantarell, Segoe UI, Fira Sans, Droid Sans, Helvetica Neue, Helvetica, Arial, sans-serif; background: #efeef4; position: absolute; - text-align: center; color: #3c376e; width: 100%; height: 100%; @@ -18,6 +17,12 @@ display: flex; justify-content: center; align-items: center; + flex-direction: column; + margin: 0; + } + + body.error .dialog { + text-align: center; } body.error .dialog h1 { @@ -43,8 +48,30 @@

<%= gettext "We're sorry, but something went wrong on our end." %>

-

<%= gettext "The Mobilizon server seems to be temporarily down." %>

+

+ <%= gettext("The Mobilizon server %{instance} seems to be temporarily down.", instance: "#{@instance}") |> raw %>
+ + <%= if is_nil(@contact) do %> + <%= gettext("If the issue persists, you may try to contact the server administrator.") %> + <% else %> + <%= gettext("If the issue persists, you may contact the server administrator at %{contact}.", contact: cond do + String.contains?(@contact, "@") -> "#{@contact}" + String.match?(@contact, ~r/^https?:\/\/.*/) -> "#{@contact}" + true -> @contact + end) |> raw %> + <% end %> +

+ <%= if length(@details) > 0 do %> +
+ <%= gettext("Technical details") %> +
+        <%= for detail <- @details do %>
+          <%= detail %>
+ <% end %> +
+
+ <% end %> diff --git a/lib/web/views/auth_view.ex b/lib/web/views/auth_view.ex index 1f94a3407..67079bd8e 100644 --- a/lib/web/views/auth_view.ex +++ b/lib/web/views/auth_view.ex @@ -23,7 +23,12 @@ defmodule Mobilizon.Web.AuthView do Tag.tag(:meta, name: "auth-user-actor-id", content: user_actor_id) ] - tags = Instance.build_tags() ++ info_tags - inject_tags(tags, get_locale(conn)) + with tags <- Instance.build_tags() ++ info_tags, + {:ok, html} <- inject_tags(tags, get_locale(conn)) do + html + else + {:error, error} -> + return_error(conn, error) + end end end diff --git a/lib/web/views/error_view.ex b/lib/web/views/error_view.ex index 5c27caf5b..8d4ba7780 100644 --- a/lib/web/views/error_view.ex +++ b/lib/web/views/error_view.ex @@ -7,8 +7,13 @@ defmodule Mobilizon.Web.ErrorView do import Mobilizon.Web.Views.Utils def render("404.html", %{conn: conn}) do - tags = Instance.build_tags() - inject_tags(tags, get_locale(conn)) + with tags <- Instance.build_tags(), + {:ok, html} <- inject_tags(tags, get_locale(conn)) do + html + else + {:error, error} -> + return_error(conn, error) + end end def render("404.json", _assigns) do @@ -38,12 +43,30 @@ defmodule Mobilizon.Web.ErrorView do } end - def render("500.html", _assigns) do + def render("406.json", _assigns) do + %{msg: "Not acceptable"} + end + + def render("500.json", assigns) do + render("500.html", assigns) + end + + def render("500.activity-json", assigns) do + render("500.html", assigns) + end + + def render("500.html", assigns) do Mobilizon.Config.instance_config() |> Keyword.get(:default_language, "en") |> Gettext.put_locale() - render("500_page.html", %{}) + assigns = + assigns + |> Map.update(:details, [], & &1) + |> Map.put(:instance, Mobilizon.Config.instance_name()) + |> Map.put(:contact, Mobilizon.Config.contact()) + + render("500_page.html", assigns) end # In case no render clause matches or no diff --git a/lib/web/views/page_view.ex b/lib/web/views/page_view.ex index 92e625d3f..3ce02182b 100644 --- a/lib/web/views/page_view.ex +++ b/lib/web/views/page_view.ex @@ -63,16 +63,26 @@ defmodule Mobilizon.Web.PageView do def render(page, %{object: object, conn: conn} = _assigns) when page in ["actor.html", "event.html", "comment.html", "post.html"] do - locale = get_locale(conn) - tags = object |> Metadata.build_tags(locale) - inject_tags(tags, locale) + with locale <- get_locale(conn), + tags <- object |> Metadata.build_tags(locale), + {:ok, html} <- inject_tags(tags, locale) do + html + else + {:error, error} -> + return_error(conn, error) + end end # Discussions are private, no need to embed metadata def render("discussion.html", params), do: render("index.html", params) def render("index.html", %{conn: conn}) do - tags = Instance.build_tags() - inject_tags(tags, get_locale(conn)) + with tags <- Instance.build_tags(), + {:ok, html} <- inject_tags(tags, get_locale(conn)) do + html + else + {:error, error} -> + return_error(conn, error) + end end end diff --git a/lib/web/views/utils.ex b/lib/web/views/utils.ex index f1fba1796..043727116 100644 --- a/lib/web/views/utils.ex +++ b/lib/web/views/utils.ex @@ -4,18 +4,37 @@ defmodule Mobilizon.Web.Views.Utils do """ alias Mobilizon.Service.Metadata.Utils, as: MetadataUtils + import Mobilizon.Web.Gettext, only: [dgettext: 2] + import Plug.Conn, only: [put_status: 2, halt: 1] # sobelow_skip ["Traversal.FileModule"] - @spec inject_tags(Enum.t(), String.t()) :: {:safe, String.t()} + @spec inject_tags(Enum.t(), String.t()) :: {:ok, {:safe, String.t()}} def inject_tags(tags, locale \\ "en") do - with {:ok, index_content} <- File.read(index_file_path()) do - do_replacements(index_content, MetadataUtils.stringify_tags(tags), locale) + with path <- Path.join(Application.app_dir(:mobilizon, "priv/static"), "index.html"), + {:exists, true} <- {:exists, File.exists?(path)}, + {:ok, index_content} <- File.read(path), + safe <- do_replacements(index_content, MetadataUtils.stringify_tags(tags), locale) do + {:ok, {:safe, safe}} + else + {:exists, false} -> {:error, :index_not_found} end end - @spec index_file_path :: String.t() - defp index_file_path do - Path.join(Application.app_dir(:mobilizon, "priv/static"), "index.html") + @spec return_error(Plug.Conn.t(), atom()) :: Plug.Conn.t() + def return_error(conn, error) do + conn + |> put_status(500) + |> Phoenix.Controller.put_view(Mobilizon.Web.ErrorView) + |> Phoenix.Controller.render("500.html", %{details: details(error)}) + |> halt() + end + + defp details(:index_not_found) do + [dgettext("errors", "Index file not found. You need to recompile the front-end.")] + end + + defp details(_) do + [] end @spec replace_meta(String.t(), String.t()) :: String.t() @@ -25,12 +44,11 @@ defmodule Mobilizon.Web.Views.Utils do |> String.replace("", tags) end - @spec do_replacements(String.t(), String.t(), String.t()) :: {:safe, String.t()} + @spec do_replacements(String.t(), String.t(), String.t()) :: String.t() defp do_replacements(index_content, tags, locale) do index_content |> replace_meta(tags) |> String.replace("", "") - |> (&{:safe, &1}).() end @spec get_locale(Conn.t()) :: String.t() diff --git a/mix.exs b/mix.exs index 7cfa06538..7e56ef2d1 100644 --- a/mix.exs +++ b/mix.exs @@ -1,13 +1,13 @@ defmodule Mobilizon.Mixfile do use Mix.Project - @version "1.0.7" + @version "1.1.4" def project do [ app: :mobilizon, version: @version, - elixir: "~> 1.8", + elixir: "~> 1.11", elixirc_paths: elixirc_paths(Mix.env()), compilers: [:phoenix, :gettext] ++ Mix.compilers(), xref: [exclude: [:eldap]], @@ -31,7 +31,10 @@ defmodule Mobilizon.Mixfile do docs: docs(), releases: [ mobilizon: [ - applications: [eldap: :transient] + include_executables_for: [:unix], + applications: [eldap: :transient], + config_providers: [{Mobilizon.ConfigProvider, "/etc/mobilizon/config.exs"}], + steps: [:assemble, ©_files/1, ©_config/1] ] ] ] @@ -47,6 +50,23 @@ defmodule Mobilizon.Mixfile do ] end + def copy_files(%{path: target_path} = release) do + File.cp_r!("./rel/overlays", target_path) + release + end + + def copy_config(%{path: target_path} = release) do + support_path = Path.join([target_path, "support"]) + File.mkdir!(support_path) + + File.cp_r!( + "./support", + support_path + ) + + release + end + # Specifies which paths to compile per environment. defp elixirc_paths(:test), do: ["lib", "test/support"] defp elixirc_paths(:dev), do: ["lib", "test/support/factory.ex"] @@ -99,14 +119,13 @@ defmodule Mobilizon.Mixfile do {:http_sign, "~> 0.1.1"}, {:ecto_enum, "~> 1.4"}, {:ex_ical, "~> 0.2"}, - {:bamboo, "~> 1.5"}, - {:bamboo_smtp, "~> 3.0"}, + {:bamboo, "~> 2.1"}, + {:bamboo_phoenix, "~> 1.0"}, + {:bamboo_smtp, "~> 4.0"}, {:geolix, "~> 2.0"}, {:geolix_adapter_mmdb2, "~> 0.6.0"}, {:absinthe, "~> 1.6"}, - {:absinthe_phoenix, - github: "absinthe-graphql/absinthe_phoenix", - ref: "67dc53db5b826ea12f37860bcce4334d4aaad028"}, + {:absinthe_phoenix, "~> 2.0.1"}, {:absinthe_plug, "~> 1.5.0"}, {:dataloader, "~> 1.0.6"}, {:plug_cowboy, "~> 2.0"}, @@ -121,7 +140,7 @@ defmodule Mobilizon.Mixfile do {:ex_optimizer, "~> 0.1"}, {:progress_bar, "~> 2.0"}, {:oban, "~> 2.2"}, - {:floki, "~> 0.29.0"}, + {:floki, "~> 0.30.0"}, {:ip_reserved, "~> 0.1.0"}, {:fast_sanitize, "~> 0.1"}, {:ueberauth, "~> 0.6"}, @@ -138,17 +157,20 @@ defmodule Mobilizon.Mixfile do {:tesla, "~> 1.4.0"}, {:sitemapper, "~> 0.5.0"}, {:xml_builder, "~> 2.1.1"}, - {:remote_ip, "~> 0.2.0"}, + {:remote_ip, "~> 1.0.0"}, {:ex_cldr_languages, "~> 0.2.1"}, {:slugger, "~> 0.3"}, + {:sentry, "~> 8.0"}, + {:html_entities, "~> 0.5"}, + {:sweet_xml, "~> 0.6.6"}, # Dev and test dependencies {:phoenix_live_reload, "~> 1.2", only: [:dev, :e2e]}, {:ex_machina, "~> 2.3", only: [:dev, :test]}, - {:excoveralls, "~> 0.13.0", only: :test}, + {:excoveralls, "~> 0.14.0", only: :test}, {:ex_doc, "~> 0.23", only: [:dev, :test], runtime: false}, {:mix_test_watch, "~> 1.0", only: :dev, runtime: false}, {:ex_unit_notifier, "~> 1.0", only: :test}, - {:dialyxir, "~> 1.0.0", only: [:dev], runtime: false}, + {:dialyxir, "~> 1.1", only: [:dev], runtime: false}, {:exvcr, "~> 0.12", only: :test}, {:credo, "~> 1.5", only: [:dev, :test], runtime: false}, {:mock, "~> 0.3.4", only: :test}, diff --git a/mix.lock b/mix.lock index f678aae02..6e2c03442 100644 --- a/mix.lock +++ b/mix.lock @@ -1,63 +1,65 @@ %{ - "absinthe": {:hex, :absinthe, "1.6.1", "07bd1636027595c8d00d250a5878e617c24ccb25c84a08e807d8d00cf124696c", [:mix], [{:dataloader, "~> 1.0.0", [hex: :dataloader, repo: "hexpm", optional: true]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f0105f1de6176ca50789081f2465389cb7afa438d54bf5133aeb3549f8f629f6"}, - "absinthe_phoenix": {:git, "https://github.com/absinthe-graphql/absinthe_phoenix.git", "67dc53db5b826ea12f37860bcce4334d4aaad028", [ref: "67dc53db5b826ea12f37860bcce4334d4aaad028"]}, - "absinthe_plug": {:hex, :absinthe_plug, "1.5.4", "daff02d04be7c06d0114ef5b4361865a4dacbe8ddb325ce709b103253d4a014b", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "80360cd8ad541d87c75336f3abc59b894d474458f6a7f8e563781c01148860de"}, + "absinthe": {:hex, :absinthe, "1.6.4", "d2958908b72ce146698de8ccbc03622630471eb0e354e06823aaef183e5067bd", [:mix], [{:dataloader, "~> 1.0.0", [hex: :dataloader, repo: "hexpm", optional: true]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6e9c1cf36d86c704cb9a9c78db62d1c2676b03e0f61a28a23fc42749e8cd41ae"}, + "absinthe_phoenix": {:hex, :absinthe_phoenix, "2.0.1", "112cb3468db2748a85bd8bd3f4d6d33f37408a96cb170077026ace96ddb1bab2", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:absinthe_plug, "~> 1.5", [hex: :absinthe_plug, repo: "hexpm", optional: false]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.5", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}], "hexpm", "e773adc876fbc84fb05a82e125d9c263f129520b36e5576554ffcb8cf49db445"}, + "absinthe_plug": {:hex, :absinthe_plug, "1.5.8", "38d230641ba9dca8f72f1fed2dfc8abd53b3907d1996363da32434ab6ee5d6ab", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bbb04176647b735828861e7b2705465e53e2cf54ccf5a73ddd1ebd855f996e5a"}, "argon2_elixir": {:hex, :argon2_elixir, "2.4.0", "2a22ea06e979f524c53b42b598fc6ba38cdcbc977a155e33e057732cfb1fb311", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "4ea82e183cf8e7f66dab1f767fedcfe6a195e140357ef2b0423146b72e0a551d"}, "atomex": {:hex, :atomex, "0.4.1", "7d3910ff7795db91b9af9f8d3e65af7ac69f235adf03484995fc667a36f3edc5", [:mix], [{:xml_builder, "~> 2.1", [hex: :xml_builder, repo: "hexpm", optional: false]}], "hexpm", "f3ac737f7493d42cfddf917f3ac49d60e0a0cf1a35c0712851b07fe8c0a05c7a"}, - "bamboo": {:hex, :bamboo, "1.6.0", "adfb583bef028923aae6f22deaea6667290561da1246058556ecaeb0fec5a175", [:mix], [{:hackney, ">= 1.13.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "454e67feacbc9b6e00553ce1d2fba003c861e0035600d59b09d6159985b17f9b"}, - "bamboo_smtp": {:hex, :bamboo_smtp, "3.0.0", "b7f0c371af96a1cb7131908918b02abb228f9db234910bf10cf4fb177c083259", [:mix], [{:bamboo, "~> 1.2", [hex: :bamboo, repo: "hexpm", optional: false]}, {:gen_smtp, "~> 0.15.0", [hex: :gen_smtp, repo: "hexpm", optional: false]}], "hexpm", "77cb1fa3076b24109e54df622161fe1e5619376b4ecf86d8b99b46f327acc49f"}, + "bamboo": {:hex, :bamboo, "2.1.0", "3c58f862efd74fa8c8d48a410ac592b41f7d24785e828566f7a0af549269ddc3", [:mix], [{:hackney, ">= 1.15.2", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.4", [hex: :mime, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "f0ad2623b9a1d2dc06dcf289b59df9ebc522f49f3a21971ec87a8fce04e6d33e"}, + "bamboo_phoenix": {:hex, :bamboo_phoenix, "1.0.0", "f3cc591ffb163ed0bf935d256f1f4645cd870cf436545601215745fb9cc9953f", [:mix], [{:bamboo, ">= 2.0.0", [hex: :bamboo, repo: "hexpm", optional: false]}, {:phoenix, ">= 1.3.0", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "6db88fbb26019c84a47994bb2bd879c0887c29ce6c559bc6385fd54eb8b37dee"}, + "bamboo_smtp": {:hex, :bamboo_smtp, "4.0.1", "7e48188663f6164a81183688bb263be4c3952648fcd3ce52164f44d68777f9cd", [:mix], [{:bamboo, "~> 2.1.0", [hex: :bamboo, repo: "hexpm", optional: false]}, {:gen_smtp, "~> 1.1.1", [hex: :gen_smtp, repo: "hexpm", optional: false]}], "hexpm", "7ff1d62ae39bfb1c14f6d3cddba0fa1482a45c2a2b497a2da601eff7099605c8"}, "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"}, "cachex": {:hex, :cachex, "3.3.0", "6f2ebb8f27491fe39121bd207c78badc499214d76c695658b19d6079beeca5c2", [:mix], [{:eternal, "~> 1.2", [hex: :eternal, repo: "hexpm", optional: false]}, {:jumper, "~> 1.0", [hex: :jumper, repo: "hexpm", optional: false]}, {:sleeplocks, "~> 1.1", [hex: :sleeplocks, repo: "hexpm", optional: false]}, {:unsafe, "~> 1.0", [hex: :unsafe, repo: "hexpm", optional: false]}], "hexpm", "d90e5ee1dde14cef33f6b187af4335b88748b72b30c038969176cd4e6ccc31a1"}, - "certifi": {:hex, :certifi, "2.5.3", "70bdd7e7188c804f3a30ee0e7c99655bc35d8ac41c23e12325f36ab449b70651", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "ed516acb3929b101208a9d700062d520f3953da3b6b918d866106ffa980e1c10"}, - "cldr_utils": {:hex, :cldr_utils, "2.14.0", "edcef8dd2654b93d84a90087f3536ffabf9c9d82b34ff82bc9ca54c0668b3a4a", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "6903356ff6988342a29b90637eece4ca98a4ed2b9759c22233d3474ade57645a"}, + "certifi": {:hex, :certifi, "2.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, + "cldr_utils": {:hex, :cldr_utils, "2.15.1", "1136987437ac4821f3ec7d46ff150f1c020a1f79730ff1252bfa7681ed577f31", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:decimal, "~> 1.9 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "ca3c8da0aab18b4d944541392e9548422e30854e3a9d7768dc629c8123f8efb8"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, "comeonin": {:hex, :comeonin, "5.3.2", "5c2f893d05c56ae3f5e24c1b983c2d5dfb88c6d979c9287a76a7feb1e1d8d646", [:mix], [], "hexpm", "d0993402844c49539aeadb3fe46a3c9bd190f1ecf86b6f9ebd71957534c95f04"}, "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, - "cors_plug": {:hex, :cors_plug, "2.0.2", "2b46083af45e4bc79632bd951550509395935d3e7973275b2b743bd63cc942ce", [:mix], [{:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "f0d0e13f71c51fd4ef8b2c7e051388e4dfb267522a83a22392c856de7e46465f"}, - "cowboy": {:hex, :cowboy, "2.8.0", "f3dc62e35797ecd9ac1b50db74611193c29815401e53bac9a5c0577bd7bc667d", [:rebar3], [{:cowlib, "~> 2.9.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "4643e4fba74ac96d4d152c75803de6fad0b3fa5df354c71afdd6cbeeb15fac8a"}, + "cors_plug": {:hex, :cors_plug, "2.0.3", "316f806d10316e6d10f09473f19052d20ba0a0ce2a1d910ddf57d663dac402ae", [:mix], [{:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ee4ae1418e6ce117fc42c2ba3e6cbdca4e95ecd2fe59a05ec6884ca16d469aea"}, + "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.3.1", "ebd1a1d7aff97f27c66654e78ece187abdc646992714164380d8a041eda16754", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a6efd3366130eab84ca372cbd4a7d3c3a97bdfcfb4911233b035d117063f0af"}, - "cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"}, - "credo": {:hex, :credo, "1.5.4", "9914180105b438e378e94a844ec3a5088ae5875626fc945b7c1462b41afc3198", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "cf51af45eadc0a3f39ba13b56fdac415c91b34f7b7533a13dc13550277141bc4"}, + "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"}, + "credo": {:hex, :credo, "1.5.5", "e8f422026f553bc3bebb81c8e8bf1932f498ca03339856c7fec63d3faac8424b", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "dd8623ab7091956a855dc9f3062486add9c52d310dfd62748779c4315d8247de"}, "dataloader": {:hex, :dataloader, "1.0.8", "114294362db98a613f231589246aa5b0ce847412e8e75c4c94f31f204d272cbf", [:mix], [{:ecto, ">= 3.4.3 and < 4.0.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "eaf3c2aa2bc9dbd2f1e960561d616b7f593396c4754185b75904f6d66c82a667"}, - "db_connection": {:hex, :db_connection, "2.3.1", "4c9f3ed1ef37471cbdd2762d6655be11e38193904d9c5c1c9389f1b891a3088e", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm", "abaab61780dde30301d840417890bd9f74131041afd02174cf4e10635b3a63f5"}, + "db_connection": {:hex, :db_connection, "2.4.0", "d04b1b73795dae60cead94189f1b8a51cc9e1f911c234cc23074017c43c031e5", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ad416c21ad9f61b3103d254a71b63696ecadb6a917b36f563921e0de00d7d7c8"}, "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, - "dialyxir": {:hex, :dialyxir, "1.0.0", "6a1fa629f7881a9f5aaf3a78f094b2a51a0357c843871b8bc98824e7342d00a5", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "aeb06588145fac14ca08d8061a142d52753dbc2cf7f0d00fc1013f53f8654654"}, - "earmark": {:hex, :earmark, "1.4.13", "2c6ce9768fc9fdbf4046f457e207df6360ee6c91ee1ecb8e9a139f96a4289d91", [:mix], [{:earmark_parser, ">= 1.4.12", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "a0cf3ed88ef2b1964df408889b5ecb886d1a048edde53497fc935ccd15af3403"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.12", "b245e875ec0a311a342320da0551da407d9d2b65d98f7a9597ae078615af3449", [:mix], [], "hexpm", "711e2cc4d64abb7d566d43f54b78f7dc129308a63bc103fbd88550d2174b3160"}, - "ecto": {:hex, :ecto, "3.5.6", "29c77e999e471921c7ce7347732bab7bfa3e24c587640a36f17e0744d1474b8e", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3ae1f3eaecc3e72eeb65ed43239b292bb1eaf335c7e6cea3a7fc27aadb6e93e7"}, + "dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"}, + "earmark": {:hex, :earmark, "1.4.15", "2c7f924bf495ec1f65bd144b355d0949a05a254d0ec561740308a54946a67888", [:mix], [{:earmark_parser, ">= 1.4.13", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "3b1209b85bc9f3586f370f7c363f6533788fb4e51db23aa79565875e7f9999ee"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.13", "0c98163e7d04a15feb62000e1a891489feb29f3d10cb57d4f845c405852bbef8", [:mix], [], "hexpm", "d602c26af3a0af43d2f2645613f65841657ad6efc9f0e361c3b6c06b578214ba"}, + "ecto": {:hex, :ecto, "3.6.1", "7bb317e3fd0179ad725069fd0fe8a28ebe48fec6282e964ea502e4deccb0bd0f", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cbb3294a990447b19f0725488a749f8cf806374e0d9d0dffc45d61e7aeaf6553"}, "ecto_autoslug_field": {:hex, :ecto_autoslug_field, "2.0.1", "2177c1c253f6dd3efd4b56d1cb76104d0a6ef044c6b9a7a0ad6d32665c4111e5", [:mix], [{:ecto, ">= 2.1.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:slugger, ">= 0.2.0", [hex: :slugger, repo: "hexpm", optional: false]}], "hexpm", "a3cc73211f2e75b89a03332183812ebe1ac08be2e25a1df5aa3d1422f92c45c3"}, "ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"}, "ecto_shortuuid": {:hex, :ecto_shortuuid, "0.1.3", "d36aede64edf256e4b769be2ad15a8ad5d9d1ff8ad46befe39e8cb4489abcd05", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:shortuuid, "~> 2.1.1", [hex: :shortuuid, repo: "hexpm", optional: false]}], "hexpm", "d215c8ced7125265de94d55abc696125942caef33439cf281fafded9744a4294"}, - "ecto_sql": {:hex, :ecto_sql, "3.5.4", "a9e292c40bd79fff88885f95f1ecd7b2516e09aa99c7dd0201aa84c54d2358e4", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.5.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1fff1a28a898d7bbef263f1f3ea425b04ba9f33816d843238c84eff883347343"}, + "ecto_sql": {:hex, :ecto_sql, "3.6.1", "8774dc3fc0ff7b6be510858b99883640f990c0736b8ab54588f9a0c91807f909", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.6.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.4.0 or ~> 0.5.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "66f35c3f2d5978b6bffebd1e6351ab8c9d6b68650d62abd1ab8d149de40e0779"}, "elixir_feed_parser": {:hex, :elixir_feed_parser, "2.1.0", "bb96fb6422158dc7ad59de62ef211cc69d264acbbe63941a64a5dce97bbbc2e6", [:mix], [{:timex, "~> 3.4", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "2d3c62fe7b396ee3b73d7160bc8fadbd78bfe9597c98c7d79b3f1038d9cba28f"}, "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"}, "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, + "erlsom": {:hex, :erlsom, "1.5.0", "c5a5cdd0ee0e8dca62bcc4b13ff08da24fdefc16ccd8b25282a2fda2ba1be24a", [:rebar3], [], "hexpm", "55a9dbf9cfa77fcfc108bd8e2c4f9f784dea228a8f4b06ea10b684944946955a"}, "eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"}, - "ex_cldr": {:hex, :ex_cldr, "2.18.2", "c0557145c234a4d31ff450a0438c5a70e786ccba9449a9f9f895809be20bed7d", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:cldr_utils, "~> 2.12", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.13", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "ac28055ae6df438b72f98703c842c2c0d969af6bd68662a8f586862a9a0ddc79"}, - "ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.12.0", "0cf7c804937a93baa9c3b471667ad05c478942865cc457e8397b5d83fc6f2c7a", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:earmark, "~> 1.0", [hex: :earmark, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.16", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.3", [hex: :ex_cldr_units, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "edcb91ec52ee4e24a928e2bcf6d3354da465eced42887fbdb3f878a7a329963f"}, - "ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.8.0", "b2ecc94e9fa4b8ec07614830f4d6e811e5df5e7679c6d2be92f4fe4f31184913", [:mix], [{:ex_cldr, "~> 2.18", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "a39780667b73bfd3d2bd08e61981bca23a97912b86f3236042850ecb062f48eb"}, - "ex_cldr_dates_times": {:hex, :ex_cldr_dates_times, "2.6.4", "d383e033aaa7295dd4964bca95baff62ee259eca2e32d550cc470495e3d8a012", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_calendars, "~> 1.11", [hex: :ex_cldr_calendars, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.16", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "23c6d4cfdd1e00a6cd8c9ffb5ae5da909489e77f0f8d854856087ea5d5f666c5"}, + "ex_cldr": {:hex, :ex_cldr, "2.21.0", "27144a6649df3a315de85da5b9ad2db1b9e2a754d0c6ea498653b859b6340e04", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:cldr_utils, "~> 2.15", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.13", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "4b3d8df8ada72f0d82e867fea7c88de9904c19dc69e5797684757ad64e907df7"}, + "ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.14.1", "50b4d2b1105780743647bbcede5109c9efcf57c525cb773ba9467bea817df379", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:earmark, "~> 1.0", [hex: :earmark, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.17", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.5", [hex: :ex_cldr_units, repo: "hexpm", optional: true]}, {:ex_doc, "~> 0.21", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "ffd960e96a1d67d565a59c5d02c16506c4a3df6c70673d8d48087d6b11bca0a3"}, + "ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.9.1", "692d9d8262bd9c423d601d5ce6ae294df85f8652664e723e2cfd68d97bd72a10", [:mix], [{:ex_cldr, "~> 2.20", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "1bc6f9eabef1e79e98cb9f8b14dc5657c17ddcbea31e800440fd52a6e45e20ac"}, + "ex_cldr_dates_times": {:hex, :ex_cldr_dates_times, "2.7.2", "04aea75ccc017e006961f9c6413aa203630ec2a3bb03091b5943d0013ff21b61", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_calendars, "~> 1.13", [hex: :ex_cldr_calendars, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.17", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "ae6bcb69d5e6585b10265eb984d60894e82ff5b91c0ac61ea7d35278a11e9aa0"}, "ex_cldr_languages": {:hex, :ex_cldr_languages, "0.2.2", "d7dab93272443b70e18e6aef0f62974418baaca3a3b31a66d51921ec1547113c", [:mix], [{:ex_cldr, "~> 2.2 and >= 2.2.1", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "d9cbf4bf643365b0042e774520ddfcbc31618efd5a5383fac98f75149961622c"}, - "ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.16.1", "aea1cecbf19dfb6ac82658d05685015172866cf1a4ce0778f58157442ccf015d", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.18", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, "~> 2.8", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "ba7a6f9f50aaa7759d05e508a333747cf670c823b2857780b025f3c421f4f1d3"}, + "ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.18.0", "58ff26aa7420e6bc3d0e0902c031b409b30cbc924e31efa1df0988f865c7756c", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.21", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, "~> 2.9", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "9663db9c6a3d2bae4d6cf9847aad7f00c48c87a3336629b34d72f70ad753f7cb"}, "ex_crypto": {:hex, :ex_crypto, "0.10.0", "af600a89b784b36613a989da6e998c1b200ff1214c3cfbaf8deca4aa2f0a1739", [:mix], [{:poison, ">= 2.0.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm", "ccc7472cfe8a0f4565f97dce7e9280119bf15a5ea51c6535e5b65f00660cde1c"}, - "ex_doc": {:hex, :ex_doc, "0.23.0", "a069bc9b0bf8efe323ecde8c0d62afc13d308b1fa3d228b65bca5cf8703a529d", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm", "f5e2c4702468b2fd11b10d39416ddadd2fcdd173ba2a0285ebd92c39827a5a16"}, + "ex_doc": {:hex, :ex_doc, "0.24.2", "e4c26603830c1a2286dae45f4412a4d1980e1e89dc779fcd0181ed1d5a05c8d9", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "e134e1d9e821b8d9e4244687fb2ace58d479b67b282de5158333b0d57c6fb7da"}, "ex_ical": {:hex, :ex_ical, "0.2.0", "4b928b554614704016cc0c9ee226eb854da9327a1cc460457621ceacb1ac29a6", [:mix], [{:timex, "~> 3.1", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "db76473b2ae0259e6633c6c479a5a4d8603f09497f55c88f9ef4d53d2b75befb"}, - "ex_machina": {:hex, :ex_machina, "2.5.0", "8143cd1bf25364f197b089230c0e463941d5909b84c1a8491393ebf97a4b53fa", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "8f24851c32b3f9f8adb11335f1e4801ea76a2e0dfa21d8c4bc40ee0d6156c084"}, + "ex_machina": {:hex, :ex_machina, "2.7.0", "b792cc3127fd0680fecdb6299235b4727a4944a09ff0fa904cc639272cd92dc7", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "419aa7a39bde11894c87a615c4ecaa52d8f107bbdd81d810465186f783245bf8"}, "ex_optimizer": {:hex, :ex_optimizer, "0.1.1", "62da37e206fc2233ff7a4e54e40eae365c40f96c81992fcd15b782eb25169b80", [:mix], [{:file_info, "~> 0.0.4", [hex: :file_info, repo: "hexpm", optional: false]}], "hexpm", "e6f5c059bcd58b66be2f6f257fdc4f69b74b0fa5c9ddd669486af012e4b52286"}, - "ex_unit_notifier": {:hex, :ex_unit_notifier, "1.0.0", "85a95b4666b1300412798c76a33344b69f00fab99519c48839780ce2678dfead", [:mix], [], "hexpm", "ed54c8cf4a4ddb3230ef8a23071dd371e5d64cc4026a2b047532c1db4ca58e6d"}, + "ex_unit_notifier": {:hex, :ex_unit_notifier, "1.1.0", "a4d1a027d975a2ba84cec60200e3cb095fe1de6c6b63091ca0880e83830b09bb", [:mix], [], "hexpm", "12d78f3a62c521ee4c9f18bd01ea3b960a3200d5ca21a383b0707f4228486c4e"}, "exactor": {:hex, :exactor, "2.2.4", "5efb4ddeb2c48d9a1d7c9b465a6fffdd82300eb9618ece5d34c3334d5d7245b1", [:mix], [], "hexpm", "1222419f706e01bfa1095aec9acf6421367dcfab798a6f67c54cf784733cd6b5"}, - "excoveralls": {:hex, :excoveralls, "0.13.4", "7b0baee01fe150ef81153e6ffc0fc68214737f54570dc257b3ca4da8e419b812", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "faae00b3eee35cdf0342c10b669a7c91f942728217d2a7c7f644b24d391e6190"}, + "excoveralls": {:hex, :excoveralls, "0.14.0", "4b562d2acd87def01a3d1621e40037fdbf99f495ed3a8570dfcf1ab24e15f76d", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "94f17478b0cca020bcd85ce7eafea82d2856f7ed022be777734a2f864d36091a"}, "exgravatar": {:hex, :exgravatar, "2.0.2", "638412896170409da114f98947d3f8d4f38e851b0e329c1cc4cd324d5e2ea081", [:mix], [], "hexpm", "f3deb5baa6fcf354a965d794ee73a956d95f1f79f41bddf69800c713cfb014a1"}, "exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, repo: "hexpm", optional: false]}], "hexpm", "32e95820a97cffea67830e91514a2ad53b888850442d6d395f53a1ac60c82e07"}, - "exvcr": {:hex, :exvcr, "0.12.2", "e8fc0beeb62924d3b755b2718a161b13cb4ed53311378e5e587606c15190c8ed", [:mix], [{:exactor, "~> 2.2", [hex: :exactor, repo: "hexpm", optional: false]}, {:exjsx, "~> 4.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: true]}, {:httpotion, "~> 3.1", [hex: :httpotion, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:meck, "~> 0.8", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "63776555a1bd003ff60635aead47461ced1ff985c66427421ad344e317ba983c"}, + "exvcr": {:hex, :exvcr, "0.12.3", "eca9e0dc8727eed65621c334d34a9640760b40f748a871728cbdbe534d336c11", [:mix], [{:exactor, "~> 2.2", [hex: :exactor, repo: "hexpm", optional: false]}, {:exjsx, "~> 4.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: true]}, {:httpotion, "~> 3.1", [hex: :httpotion, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:meck, "~> 0.8", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "668bd08fad65bb21d4c9bb46f1747e5e01b5734d6387fa792ce0f2eb81b17b2b"}, "fast_html": {:hex, :fast_html, "2.0.4", "4910ee49f2f6b19692e3bf30bf97f1b6b7dac489cd6b0f34cd0fe3042c56ba30", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}], "hexpm", "3bb49d541dfc02ad5e425904f53376d758c09f89e521afc7d2b174b3227761ea"}, "fast_sanitize": {:hex, :fast_sanitize, "0.2.2", "3cbbaebaea6043865dfb5b4ecb0f1af066ad410a51470e353714b10c42007b81", [:mix], [{:fast_html, "~> 2.0", [hex: :fast_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "69f204db9250afa94a0d559d9110139850f57de2b081719fbafa1e9a89e94466"}, "file_info": {:hex, :file_info, "0.0.4", "2e0e77f211e833f38ead22cb29ce53761d457d80b3ffe0ffe0eb93880b0963b2", [:mix], [{:mimetype_parser, "~> 0.1.2", [hex: :mimetype_parser, repo: "hexpm", optional: false]}], "hexpm", "50e7ad01c2c8b9339010675fe4dc4a113b8d6ca7eddce24d1d74fd0e762781a5"}, "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, - "floki": {:hex, :floki, "0.29.0", "b1710d8c93a2f860dc2d7adc390dd808dc2fb8f78ee562304457b75f4c640881", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "008585ce64b9f74c07d32958ec9866f4b8a124bf4da1e2941b28e41384edaaad"}, - "gen_smtp": {:hex, :gen_smtp, "0.15.0", "9f51960c17769b26833b50df0b96123605a8024738b62db747fece14eb2fbfcc", [:rebar3], [], "hexpm", "29bd14a88030980849c7ed2447b8db6d6c9278a28b11a44cafe41b791205440f"}, - "geo": {:hex, :geo, "3.3.7", "d0354e099bdecc4138d1e01ac4d5aee8bccdb7cb8c9f840b6eb7b5ebbc328111", [:mix], [{:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "ec57118fd9de27c52d4a046e75ee6f0ecb1cdc28cab03642228ed1aa09bb30bc"}, - "geo_postgis": {:hex, :geo_postgis, "3.3.1", "45bc96b9121d0647341685dc9d44956d61338707482d655c803500676b0413a1", [:mix], [{:geo, "~> 3.3", [hex: :geo, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0 or ~> 4.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "3c3957d8750e3effd565f068ee658ef0e881f9a07084a23f6c5ef8262d09b8e9"}, + "floki": {:hex, :floki, "0.30.1", "75d35526d3a1459920b6e87fdbc2e0b8a3670f965dd0903708d2b267e0904c55", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "e9c03524447d1c4cbfccd672d739b8c18453eee377846b119d4fd71b1a176bb8"}, + "gen_smtp": {:hex, :gen_smtp, "1.1.1", "bf9303c31735100631b1d708d629e4c65944319d1143b5c9952054f4a1311d85", [:rebar3], [{:hut, "1.3.0", [hex: :hut, repo: "hexpm", optional: false]}, {:ranch, ">= 1.7.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "51bc50cc017efd4a4248cbc39ea30fb60efa7d4a49688986fafad84434ff9ab7"}, + "geo": {:hex, :geo, "3.4.2", "834f106e4ba072f5917920bd7ece42cfe1caa03c7fb278f85ea5d0905c8dc153", [:mix], [{:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "0a9fdad0d5197678cbac85e1dac674528bd90fa923398679a174b541cdf0ec68"}, + "geo_postgis": {:hex, :geo_postgis, "3.4.0", "67815cc9b3db12e378e7a96d0f77d3bc2188534aba4d2c2229e3ebf8370f9d52", [:mix], [{:geo, "~> 3.4", [hex: :geo, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0 or ~> 4.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "23563946ef6e5c747380e6a7a0493b0a631e91d0452314ee7e33354f4fdf5230"}, "geohax": {:hex, :geohax, "0.4.1", "87efd3c4bb00d9dd237cef917004b635417859f51dfe716ba0864b8c61eb7e0e", [:mix], [], "hexpm", "ce6aff24726f3824caf59aa8b903a1be99ac05820b53c23196d5ac36b13a1fa3"}, "geolix": {:hex, :geolix, "2.0.0", "7e65764bedfc98d08a3ddb24c417657c9d438eff163280b45fbb7de289626acd", [:mix], [], "hexpm", "8742bf588ed0bb7def2c443204d09d355990846c6efdff96ded66aac24c301df"}, "geolix_adapter_mmdb2": {:hex, :geolix_adapter_mmdb2, "0.6.0", "6ab9dbf6ea395817aa1fd2597be25d0dda1853c7f664e62716e47728d18bc4f9", [:mix], [{:geolix, "~> 2.0", [hex: :geolix, repo: "hexpm", optional: false]}, {:mmdb2_decoder, "~> 3.0", [hex: :mmdb2_decoder, repo: "hexpm", optional: false]}], "hexpm", "06ff962feae8a310cffdf86b74bfcda6e2d0dccb439bb1f62df2b657b1c0269b"}, @@ -65,11 +67,12 @@ "guardian": {:hex, :guardian, "2.1.1", "1f02b349f6ba765647cc834036a8d76fa4bd65605342fe3a031df3c99d0d411a", [:mix], [{:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}, {:plug, "~> 1.3.3 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "189b87ba7ce6b40d6ba029138098b96ffc4ae78f229f5b39539b9141af8bf0f8"}, "guardian_db": {:hex, :guardian_db, "2.1.0", "ec95a9d99cdd1e550555d09a7bb4a340d8887aad0697f594590c2fd74be02426", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.1", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:guardian, "~> 1.0 or ~> 2.0", [hex: :guardian, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "f8e7d543ac92c395f3a7fd5acbe6829faeade57d688f7562e2f0fca8f94a0d70"}, "guardian_phoenix": {:hex, :guardian_phoenix, "2.0.1", "89a817265af09a6ddf7cb1e77f17ffca90cea2db10ff888375ef34502b2731b1", [:mix], [{:guardian, "~> 2.0", [hex: :guardian, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.3", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "21f439246715192b231f228680465d1ed5fbdf01555a4a3b17165532f5f9a08c"}, - "hackney": {:hex, :hackney, "1.17.0", "717ea195fd2f898d9fe9f1ce0afcc2621a41ecfe137fae57e7fe6e9484b9aa99", [:rebar3], [{:certifi, "~>2.5", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "64c22225f1ea8855f584720c0e5b3cd14095703af1c9fbc845ba042811dc671c"}, - "html_entities": {:hex, :html_entities, "0.5.1", "1c9715058b42c35a2ab65edc5b36d0ea66dd083767bef6e3edb57870ef556549", [:mix], [], "hexpm", "30efab070904eb897ff05cd52fa61c1025d7f8ef3a9ca250bc4e6513d16c32de"}, + "hackney": {:hex, :hackney, "1.17.4", "99da4674592504d3fb0cfef0db84c3ba02b4508bae2dff8c0108baa0d6e0977c", [:rebar3], [{:certifi, "~>2.6.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "de16ff4996556c8548d512f4dbe22dd58a587bf3332e7fd362430a7ef3986b16"}, + "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"}, "http_sign": {:hex, :http_sign, "0.1.1", "b16edb83aa282892f3271f9a048c155e772bf36e15700ab93901484c55f8dd10", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "2d4b1c2579d85534035f12c9e1260abdf6d03a9ad4f515b2ee53b50e68c8b787"}, "http_signatures": {:hex, :http_signatures, "0.1.0", "4e4b501a936dbf4cb5222597038a89ea10781776770d2e185849fa829686b34c", [:mix], [], "hexpm", "f8a7b3731e3fd17d38fa6e343fcad7b03d6874a3b0a108c8568a71ed9c2cf824"}, "httpoison": {:hex, :httpoison, "1.8.0", "6b85dea15820b7804ef607ff78406ab449dd78bed923a49c7160e1886e987a3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "28089eaa98cf90c66265b6b5ad87c59a3729bea2e74e9d08f9b51eb9729b3c3a"}, + "hut": {:hex, :hut, "1.3.0", "71f2f054e657c03f959cf1acc43f436ea87580696528ca2a55c8afb1b06c85e7", [:"erlang.mk", :rebar, :rebar3], [], "hexpm", "7e15d28555d8a1f2b5a3a931ec120af0753e4853a4c66053db354f35bf9ab563"}, "icalendar": {:git, "https://github.com/tcitworld/icalendar.git", "e16a3a0b74e07ba79044361fbf5014bed344f2da", []}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "inet_cidr": {:hex, :inet_cidr, "1.0.4", "a05744ab7c221ca8e395c926c3919a821eb512e8f36547c062f62c4ca0cf3d6e", [:mix], [], "hexpm", "64a2d30189704ae41ca7dbdd587f5291db5d1dda1414e0774c29ffc81088c1bc"}, @@ -78,52 +81,55 @@ "jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"}, "jsx": {:hex, :jsx, "2.8.3", "a05252d381885240744d955fbe3cf810504eb2567164824e19303ea59eef62cf", [:mix, :rebar3], [], "hexpm", "fc3499fed7a726995aa659143a248534adc754ebd16ccd437cd93b649a95091f"}, "jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"}, - "junit_formatter": {:hex, :junit_formatter, "3.1.0", "3f69c61c5413750f9c45e367d77aabbeac9b395acf478d8e70b4ee9d1989c709", [:mix], [], "hexpm", "da52401a93f711fc4f77ffabdda68f9a16fcad5d96f5fce4ae606ab1d73b72f4"}, - "linkify": {:hex, :linkify, "0.4.1", "f881eb3429ae88010cf736e6fb3eed406c187bcdd544902ec937496636b7c7b3", [:mix], [], "hexpm", "ce98693f54ae9ace59f2f7a8aed3de2ef311381a8ce7794804bd75484c371dda"}, + "junit_formatter": {:hex, :junit_formatter, "3.2.0", "6a64d6327c48472e983af7645aeb1d756cad4b33c5ab3a5db820f13d6d2b85fe", [:mix], [], "hexpm", "043d6f660667ee64c6d7e5edb867b7900c395356346e77185879449b50486681"}, + "linkify": {:hex, :linkify, "0.5.0", "e0ea8de73ff44742d6a889721221f4c4eccaad5284957ee9832ffeb347602d54", [:mix], [], "hexpm", "4ccd958350aee7c51c89e21f05b15d30596ebbba707e051d21766be1809df2d7"}, "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.15.0", "98312c9f0d3730fde4049985a1105da5155bfe5c11e47bdc7406d88e01e4219b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "75ffa34ab1056b7e24844c90bfc62aaf6f3a37a15faa76b07bc5eba27e4a8b4a"}, - "meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, + "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, + "meck": {:hex, :meck, "0.9.2", "85ccbab053f1db86c7ca240e9fc718170ee5bda03810a6292b5306bf31bae5f5", [:rebar3], [], "hexpm", "81344f561357dc40a8344afa53767c32669153355b626ea9fcbc8da6b3045826"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "1.5.0", "203ef35ef3389aae6d361918bf3f952fa17a09e8e43b5aa592b93eba05d0fb8d", [:mix], [], "hexpm", "55a94c0f552249fc1a3dd9cd2d3ab9de9d3c89b559c2bd01121f824834f24746"}, + "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, "mimetype_parser": {:hex, :mimetype_parser, "0.1.3", "628ac9fe56aa7edcedb534d68397dd66674ab82493c8ebe39acb9a19b666099d", [:mix], [], "hexpm", "7d8f80c567807ce78cd93c938e7f4b0a20b1aaaaab914bf286f68457d9f7a852"}, "mix_test_watch": {:hex, :mix_test_watch, "1.0.2", "34900184cbbbc6b6ed616ed3a8ea9b791f9fd2088419352a6d3200525637f785", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "47ac558d8b06f684773972c6d04fcc15590abdb97aeb7666da19fcbfdc441a07"}, "mmdb2_decoder": {:hex, :mmdb2_decoder, "3.0.0", "54828676a36e75e9a25bc9a0bb0598d4c7fcc767bf0b40674850b22e05b7b6cc", [:mix], [], "hexpm", "359dc9242915538d1dceb9f6d96c72201dca76ce62e49d22e2ed1e86f20bea8e"}, - "mock": {:hex, :mock, "0.3.6", "e810a91fabc7adf63ab5fdbec5d9d3b492413b8cda5131a2a8aa34b4185eb9b4", [:mix], [{:meck, "~> 0.8.13", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "bcf1d0a6826fb5aee01bae3d74474669a3fa8b2df274d094af54a25266a1ebd2"}, + "mock": {:hex, :mock, "0.3.7", "75b3bbf1466d7e486ea2052a73c6e062c6256fb429d6797999ab02fa32f29e03", [:mix], [{:meck, "~> 0.9.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "4da49a4609e41fd99b7836945c26f373623ea968cfb6282742bcb94440cf7e5c"}, "mogrify": {:hex, :mogrify, "0.8.0", "3506f3ca3f7b95a155f3b4ef803b5db176f5a0633723e3fe85e0d6399e3b11c8", [:mix], [], "hexpm", "2278d245f07056ea3b586e98801e933695147066fa4cf563f552c1b4f0ff8ad9"}, "mox": {:hex, :mox, "1.0.0", "4b3c7005173f47ff30641ba044eb0fe67287743eec9bd9545e37f3002b0a9f8b", [:mix], [], "hexpm", "201b0a20b7abdaaab083e9cf97884950f8a30a1350a1da403b3145e213c6f4df"}, "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, "nimble_pool": {:hex, :nimble_pool, "0.1.0", "ffa9d5be27eee2b00b0c634eb649aa27f97b39186fec3c493716c2a33e784ec6", [:mix], [], "hexpm", "343a1eaa620ddcf3430a83f39f2af499fe2370390d4f785cd475b4df5acaf3f9"}, "oauth2": {:hex, :oauth2, "2.0.0", "338382079fe16c514420fa218b0903f8ad2d4bfc0ad0c9f988867dfa246731b0", [:mix], [{:hackney, "~> 1.13", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "881b8364ac7385f9fddc7949379cbe3f7081da37233a1aa7aab844670a91e7e7"}, "oauther": {:hex, :oauther, "1.1.1", "7d8b16167bb587ecbcddd3f8792beb9ec3e7b65c1f8ebd86b8dd25318d535752", [:mix], [], "hexpm", "9374f4302045321874cccdc57eb975893643bd69c3b22bf1312dab5f06e5788e"}, - "oban": {:hex, :oban, "2.3.4", "ec7509b9af2524d55f529cb7aee93d36131ae0bf0f37706f65d2fe707f4d9fd8", [:mix], [{:ecto_sql, ">= 3.4.3", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c70ca0434758fd1805422ea4446af5e910ddc697c0c861549c8f0eb0cfbd2fdf"}, + "oban": {:hex, :oban, "2.6.1", "7466e25934be6c3f696c624ed0779459dd2add03d19f9865a478d3b47b77e814", [:mix], [{:ecto_sql, ">= 3.4.3", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3e86eaab8fdd1c1af64f7cfd46ad4352d19696709eb2068de239e40894a254ea"}, "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, - "phoenix": {:hex, :phoenix, "1.5.7", "2923bb3af924f184459fe4fa4b100bd25fa6468e69b2803dfae82698269aa5e0", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "774cd64417c5a3788414fdbb2be2eb9bcd0c048d9e6ad11a0c1fd67b7c0d0978"}, + "phoenix": {:hex, :phoenix, "1.5.9", "a6368d36cfd59d917b37c44386e01315bc89f7609a10a45a22f47c007edf2597", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7e4bce20a67c012f1fbb0af90e5da49fa7bf0d34e3a067795703b74aef75427d"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.2.1", "13f124cf0a3ce0f1948cf24654c7b9f2347169ff75c1123f44674afee6af3b03", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "478a1bae899cac0a6e02be1deec7e2944b7754c04e7d4107fc5a517f877743c0"}, "phoenix_html": {:hex, :phoenix_html, "2.14.3", "51f720d0d543e4e157ff06b65de38e13303d5778a7919bcc696599e5934271b8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "efd697a7fff35a13eeeb6b43db884705cba353a1a41d127d118fda5f90c8e80f"}, - "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.3.0", "f35f61c3f959c9a01b36defaa1f0624edd55b87e236b606664a556d6f72fd2e7", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "02c1007ae393f2b76ec61c1a869b1e617179877984678babde131d716f95b582"}, + "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.3.1", "9eba6ad16bd80c45f338b2059c7b255ce30784d76f4181304e7b78640e5a7513", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "f3ae26b5abb85a1cb2bc8bb199e29fbcefb34259e469b31fe0c6323f2175a5ef"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"}, - "plug": {:hex, :plug, "1.11.0", "f17217525597628298998bc3baed9f8ea1fa3f1160aa9871aee6df47a6e4d38e", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2d9c633f0499f9dc5c2fd069161af4e2e7756890b81adcbb2ceaa074e8308876"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.4.1", "779ba386c0915027f22e14a48919a9545714f849505fa15af2631a0d298abf0f", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d72113b6dff7b37a7d9b2a5b68892808e3a9a752f2bf7e503240945385b70507"}, - "plug_crypto": {:hex, :plug_crypto, "1.2.0", "1cb20793aa63a6c619dd18bb33d7a3aa94818e5fd39ad357051a67f26dfa2df6", [:mix], [], "hexpm", "a48b538ae8bf381ffac344520755f3007cc10bd8e90b240af98ea29b69683fc2"}, + "plug": {:hex, :plug, "1.11.1", "f2992bac66fdae679453c9e86134a4201f6f43a687d8ff1cd1b2862d53c80259", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "23524e4fefbb587c11f0833b3910bfb414bf2e2534d61928e920f54e3a1b881f"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.5.0", "51c998f788c4e68fc9f947a5eba8c215fbb1d63a520f7604134cab0270ea6513", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5b2c8925a5e2587446f33810a58c01e66b3c345652eeec809b76ba007acde71a"}, + "plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"}, "poison": {:hex, :poison, "4.0.1", "bcb755a16fac91cad79bfe9fc3585bb07b9331e50cfe3420a24bcc2d735709ae", [:mix], [], "hexpm", "ba8836feea4b394bb718a161fc59a288fe0109b5006d6bdf97b6badfcf6f0f25"}, - "postgrex": {:hex, :postgrex, "0.15.8", "f5e782bbe5e8fa178d5e3cd1999c857dc48eda95f0a4d7f7bd92a50e84a0d491", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "698fbfacea34c4cf22c8281abeb5cf68d99628d541874f085520ab3b53d356fe"}, + "postgrex": {:hex, :postgrex, "0.15.9", "46f8fe6f25711aeb861c4d0ae09780facfdf3adbd2fb5594ead61504dd489bda", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "610719103e4cb2223d4ab78f9f0f3e720320eeca6011415ab4137ddef730adee"}, "progress_bar": {:hex, :progress_bar, "2.0.1", "7b40200112ae533d5adceb80ff75fbe66dc753bca5f6c55c073bfc122d71896d", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "2519eb58a2f149a3a094e729378256d8cb6d96a259ec94841bd69fdc71f18f87"}, - "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, - "remote_ip": {:hex, :remote_ip, "0.2.1", "cd27cd8ea54ecaaf3532776ff4c5e353b3804e710302e88c01eadeaaf42e7e24", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:inet_cidr, "~> 1.0", [hex: :inet_cidr, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "2e7ab1a461cc3cd5719f37e116a08f45c8b8493923063631b164315d6b7ee8e0"}, + "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, + "remote_ip": {:hex, :remote_ip, "1.0.0", "3d7fb45204a5704443f480cee9515e464997f52c35e0a60b6ece1f81484067ae", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "9e9fcad4e50c43b5234bb6a9629ed6ab223f3ed07147bd35470e4ee5c8caf907"}, "rsa_ex": {:hex, :rsa_ex, "0.4.0", "e28dd7dc5236e156df434af0e4aa822384c8866c928e17b785d4edb7c253b558", [:mix], [], "hexpm", "40e1f08e8401da4be59a6dd0f4da30c42d5bb01703161f0208d839d97db27f4e"}, + "sentry": {:hex, :sentry, "8.0.5", "5ca922b9238a50c7258b52f47364b2d545beda5e436c7a43965b34577f1ef61f", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, "~> 2.3", [hex: :plug_cowboy, repo: "hexpm", optional: true]}], "hexpm", "4972839fdbf52e886d7b3e694c8adf421f764f2fa79036b88fb4742049bd4b7c"}, "shortuuid": {:hex, :shortuuid, "2.1.2", "14dbafdb2f6c7213fdfcc05c7572384b5051a7b1621170018ad4c05504bd96c1", [:mix], [], "hexpm", "d9b0c4f37500ea5199b6275ece872e213e9f45a015caf4aa777cec84f63ad353"}, "sitemapper": {:hex, :sitemapper, "0.5.0", "23b0bb7b3888f03d4e4e5bedb7034e6d2979e169366372d960d6f433112b9bdf", [:mix], [{:ex_aws_s3, "~> 2.0", [hex: :ex_aws_s3, repo: "hexpm", optional: true]}, {:xml_builder, "~> 2.1.1", [hex: :xml_builder, repo: "hexpm", optional: false]}], "hexpm", "be7acff8d0245aa7ca125b9c4d0751009bbbca26ef866d888fef4fdf98670e41"}, "sleeplocks": {:hex, :sleeplocks, "1.1.1", "3d462a0639a6ef36cc75d6038b7393ae537ab394641beb59830a1b8271faeed3", [:rebar3], [], "hexpm", "84ee37aeff4d0d92b290fff986d6a95ac5eedf9b383fadfd1d88e9b84a1c02e1"}, "slugger": {:hex, :slugger, "0.3.0", "efc667ab99eee19a48913ccf3d038b1fb9f165fa4fbf093be898b8099e61b6ed", [:mix], [], "hexpm", "20d0ded0e712605d1eae6c5b4889581c3460d92623a930ddda91e0e609b5afba"}, - "sobelow": {:hex, :sobelow, "0.11.0", "cdc17e3a9f1ea78dc55dbe0a03121cb6767fef737c6d9f1e62ee7e78730abccc", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "c57807bfe6f231338b657781f89ef0320b66a0dbe779aa911d6ed27cfa14ae6e"}, + "sobelow": {:hex, :sobelow, "0.11.1", "23438964486f8112b41e743bbfd402da3e5b296fdc9eacab29914b79c48916dd", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "9897363a7eff96f4809304a90aad819e2ad5e5d24db547af502885146746a53c"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, - "telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"}, - "tesla": {:hex, :tesla, "1.4.0", "1081bef0124b8bdec1c3d330bbe91956648fb008cf0d3950a369cda466a31a87", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "bf1374a5569f5fca8e641363b63f7347d680d91388880979a33bc12a6eb3e0aa"}, - "timex": {:hex, :timex, "3.6.3", "58ce6c9eda8ed47fc80c24dde09d481465838d3bcfc230949287fc1b0b0041c1", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5 or ~> 1.0.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "6d69f4f95fcf5684102a9cb3cf92c5ba6545bd60ed8d8a6a93cd2a4a4fb0d9ec"}, - "tzdata": {:hex, :tzdata, "1.0.5", "69f1ee029a49afa04ad77801febaf69385f3d3e3d1e4b56b9469025677b89a28", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "55519aa2a99e5d2095c1e61cc74c9be69688f8ab75c27da724eb8279ff402a5a"}, + "sweet_xml": {:hex, :sweet_xml, "0.6.6", "fc3e91ec5dd7c787b6195757fbcf0abc670cee1e4172687b45183032221b66b8", [:mix], [], "hexpm", "2e1ec458f892ffa81f9f8386e3f35a1af6db7a7a37748a64478f13163a1f3573"}, + "telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"}, + "tesla": {:hex, :tesla, "1.4.1", "ff855f1cac121e0d16281b49e8f066c4a0d89965f98864515713878cca849ac8", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "95f5de35922c8c4b3945bee7406f66eb680b0955232f78f5fb7e853aa1ce201a"}, + "timex": {:hex, :timex, "3.7.5", "3eca56e23bfa4e0848f0b0a29a92fa20af251a975116c6d504966e8a90516dfd", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a15608dca680f2ef663d71c95842c67f0af08a0f3b1d00e17bbd22872e2874e4"}, + "tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"}, "ueberauth": {:hex, :ueberauth, "0.6.3", "d42ace28b870e8072cf30e32e385579c57b9cc96ec74fa1f30f30da9c14f3cc0", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "afc293d8a1140d6591b53e3eaf415ca92842cb1d32fad3c450c6f045f7f91b60"}, - "ueberauth_discord": {:hex, :ueberauth_discord, "0.5.2", "afc5d68879575c365972fd4d7cf7b01c16f7d062fc6bf7e86e2595736ac41127", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.3", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "bbd7701d8fef02623fb106ed7c24427ed2327ef769bcb1d2eba5670e54716cdc"}, + "ueberauth_discord": {:hex, :ueberauth_discord, "0.6.0", "d6ec040e4195c4138b9a959c79024ab4c213ba1aed9fc08099ecff141a6486da", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.3", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "c5ea960191c1d6c3a974947cae4d57efa565a9a0796b8e82bee45fac7ae2fabc"}, "ueberauth_facebook": {:hex, :ueberauth_facebook, "0.8.1", "c254be4ab367c276773c2e41d3c0fe343ae118e244afc8d5a4e3e5c438951fdc", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "c2cf210ef45bd20611234ef17517f9d1dff6b31d3fb6ad96789143eb0943f540"}, "ueberauth_github": {:hex, :ueberauth_github, "0.8.0", "2216c8cdacee0de6245b422fb397921b64a29416526985304e345dab6a799d17", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "b65ccc001a7b0719ba069452f3333d68891f4613ae787a340cce31e2a43307a3"}, "ueberauth_gitlab_strategy": {:git, "https://github.com/tcitworld/ueberauth_gitlab.git", "9fc5d30b5d87ff7cdef293a1c128f25777dcbe59", [branch: "upgrade-deps"]}, diff --git a/priv/gettext/ar/LC_MESSAGES/default.po b/priv/gettext/ar/LC_MESSAGES/default.po index 198ec7a3c..276f18628 100644 --- a/priv/gettext/ar/LC_MESSAGES/default.po +++ b/priv/gettext/ar/LC_MESSAGES/default.po @@ -868,8 +868,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1374,18 +1374,13 @@ msgstr "الفعالية" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1397,20 +1392,46 @@ msgstr "" #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/ar/LC_MESSAGES/errors.po b/priv/gettext/ar/LC_MESSAGES/errors.po index 7b861f485..fb6d0cd83 100644 --- a/priv/gettext/ar/LC_MESSAGES/errors.po +++ b/priv/gettext/ar/LC_MESSAGES/errors.po @@ -8,17 +8,18 @@ ## to merge POT files into PO files. msgid "" msgstr "" -"PO-Revision-Date: 2020-02-24 09:08+0000\n" -"Last-Translator: ButterflyOfFire \n" +"PO-Revision-Date: 2021-03-05 13:05+0000\n" +"Last-Translator: Esmail_Hazem \n" "Language-Team: Arabic \n" "Language: ar\n" "Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 3.11\n" -"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Weblate 4.4.2\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "لا يمكن أن يترك فارغا" @@ -29,34 +30,34 @@ msgid "is invalid" msgstr "غير صالح" msgid "must be accepted" -msgstr "" +msgstr "يجب الموافقة عليه" msgid "has invalid format" -msgstr "" +msgstr "لديه تنسيق غير صالح" msgid "has an invalid entry" -msgstr "" +msgstr "لديه إدخال غير صالح" msgid "is reserved" msgstr "محجوز" msgid "does not match confirmation" -msgstr "" +msgstr "لا تتطابق مع التأكيد" msgid "is still associated with this entry" -msgstr "" +msgstr "ما زالت مرتبطة مع هذا الإدخال" msgid "are still associated with this entry" -msgstr "" +msgstr "ما زالوا مرتبطين مع هذا الإدخال" msgid "should be %{count} character(s)" msgid_plural "should be %{count} character(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" +msgstr[0] "يجب أن يكون %{count} حرف" +msgstr[1] "يجب أن يكون %{count} حرف" +msgstr[2] "يجب أن يكون %{count} حرفَيْن" +msgstr[3] "يجب أن يكون %{count} حُروف" +msgstr[4] "يجب أن يكون %{count} حرف" +msgstr[5] "يجب أن يكون %{count} حرف" msgid "should have %{count} item(s)" msgid_plural "should have %{count} item(s)" @@ -119,198 +120,199 @@ msgid "must be equal to %{number}" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "" @@ -360,22 +362,22 @@ msgid "Anonymous participation is not enabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "" @@ -395,8 +397,8 @@ msgid "Event id not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "" @@ -412,7 +414,7 @@ msgid "Internal Error" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "" @@ -422,7 +424,7 @@ msgid "No profile found for user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "" @@ -439,12 +441,12 @@ msgid "Participant not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "" @@ -470,30 +472,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -519,22 +516,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -543,23 +540,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -569,17 +561,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -590,17 +582,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -610,12 +602,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -635,32 +627,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -675,12 +667,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -690,7 +682,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -705,7 +697,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -715,17 +707,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -770,7 +762,7 @@ msgid "Resource not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -790,12 +782,12 @@ msgid "You need to be logged in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -805,32 +797,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -840,12 +832,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -855,7 +847,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/gettext/be/LC_MESSAGES/default.po b/priv/gettext/be/LC_MESSAGES/default.po index 1355eafdd..32160bf85 100644 --- a/priv/gettext/be/LC_MESSAGES/default.po +++ b/priv/gettext/be/LC_MESSAGES/default.po @@ -844,8 +844,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1350,18 +1350,13 @@ msgstr "" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1373,20 +1368,46 @@ msgstr "" #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/be/LC_MESSAGES/errors.po b/priv/gettext/be/LC_MESSAGES/errors.po index 26d001b77..3776146f5 100644 --- a/priv/gettext/be/LC_MESSAGES/errors.po +++ b/priv/gettext/be/LC_MESSAGES/errors.po @@ -11,6 +11,7 @@ msgstr "" "Language: be\n" "Plural-Forms: nplurals=3\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "" @@ -93,198 +94,199 @@ msgid "must be equal to %{number}" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "" @@ -334,22 +336,22 @@ msgid "Anonymous participation is not enabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "" @@ -369,8 +371,8 @@ msgid "Event id not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "" @@ -386,7 +388,7 @@ msgid "Internal Error" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "" @@ -396,7 +398,7 @@ msgid "No profile found for user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "" @@ -413,12 +415,12 @@ msgid "Participant not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "" @@ -444,30 +446,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -493,22 +490,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -517,23 +514,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -543,17 +535,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -564,17 +556,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -584,12 +576,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -609,32 +601,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -649,12 +641,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -664,7 +656,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -679,7 +671,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -689,17 +681,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -744,7 +736,7 @@ msgid "Resource not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -764,12 +756,12 @@ msgid "You need to be logged in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -779,32 +771,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -814,12 +806,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -829,7 +821,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/gettext/ca/LC_MESSAGES/default.po b/priv/gettext/ca/LC_MESSAGES/default.po index 3576ac493..bc7947db6 100644 --- a/priv/gettext/ca/LC_MESSAGES/default.po +++ b/priv/gettext/ca/LC_MESSAGES/default.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-12-17 11:48+0000\n" -"PO-Revision-Date: 2021-01-26 13:04+0000\n" +"PO-Revision-Date: 2021-03-09 15:51+0000\n" "Last-Translator: fadelkon \n" "Language-Team: Catalan \n" @@ -12,267 +12,267 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4.2\n" +"X-Generator: Weblate 4.5.1\n" -#: lib/web/templates/email/password_reset.html.eex:48 #, elixir-format +#: lib/web/templates/email/password_reset.html.eex:48 msgid "If you didn't request this, please ignore this email. Your password won't change until you access the link below and create a new one." msgstr "" "Si no ho has demanat tu, ignora aquest email. La teva contrasenya només " "canviarà si cliques l'enllaç de sota i n'escrius una altra." -#: lib/web/templates/email/report.html.eex:74 #, elixir-format +#: lib/web/templates/email/report.html.eex:74 msgid "%{title} by %{creator}" msgstr "%{title} de %{creator}" -#: lib/web/templates/email/registration_confirmation.html.eex:58 #, elixir-format +#: lib/web/templates/email/registration_confirmation.html.eex:58 msgid "Activate my account" msgstr "Activa el meu compte" +#, elixir-format #: lib/web/templates/email/email.html.eex:117 #: lib/web/templates/email/email.text.eex:9 -#, elixir-format msgid "Ask the community on Framacolibri" msgstr "Pregunta a la comunitat a Framacolibri" -#: lib/web/templates/email/report.text.eex:15 #, elixir-format +#: lib/web/templates/email/report.text.eex:15 msgid "Comments" msgstr "Comentaris" +#, elixir-format #: lib/web/templates/email/report.html.eex:72 #: lib/web/templates/email/report.text.eex:11 -#, elixir-format msgid "Event" msgstr "Activitat" -#: lib/web/email/user.ex:48 #, elixir-format +#: lib/web/email/user.ex:48 msgid "Instructions to reset your password on %{instance}" msgstr "Instruccions per canviar la contrasenya a %{instance}" -#: lib/web/templates/email/report.text.eex:21 #, elixir-format +#: lib/web/templates/email/report.text.eex:21 msgid "Reason" msgstr "Raó" -#: lib/web/templates/email/password_reset.html.eex:61 #, elixir-format +#: lib/web/templates/email/password_reset.html.eex:61 msgid "Reset Password" msgstr "Canvia la contrasenya" -#: lib/web/templates/email/password_reset.html.eex:41 #, elixir-format +#: lib/web/templates/email/password_reset.html.eex:41 msgid "Resetting your password is easy. Just press the button below and follow the instructions. We'll have you up and running in no time." msgstr "" "Restablir la teva contrasenya és fàcil. Prem el botó de sota i segueix les " "instruccions. Acabarem de seguida." -#: lib/web/email/user.ex:28 #, elixir-format +#: lib/web/email/user.ex:28 msgid "Instructions to confirm your Mobilizon account on %{instance}" msgstr "Instruccions per confirmar el teu compte de Mobilizon a %{instance}" -#: lib/web/email/admin.ex:24 #, elixir-format +#: lib/web/email/admin.ex:24 msgid "New report on Mobilizon instance %{instance}" msgstr "S'ha denunciat una activitat al servidor de Mobilizon %{instance}" +#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:51 #: lib/web/templates/email/before_event_notification.text.eex:4 -#, elixir-format msgid "Go to event page" msgstr "Ves a la pàgina de l'activitat" -#: lib/web/templates/email/report.text.eex:1 #, elixir-format +#: lib/web/templates/email/report.text.eex:1 msgid "New report from %{reporter} on %{instance}" msgstr "S'ha denunciat una activitat a %{instance}" -#: lib/web/templates/email/event_participation_approved.text.eex:1 #, elixir-format +#: lib/web/templates/email/event_participation_approved.text.eex:1 msgid "Participation approved" msgstr "S'ha aprovat la participació" +#, elixir-format #: lib/web/templates/email/password_reset.html.eex:13 #: lib/web/templates/email/password_reset.text.eex:1 -#, elixir-format msgid "Password reset" msgstr "Reinicia la contrasenya" -#: lib/web/templates/email/password_reset.text.eex:7 #, elixir-format +#: lib/web/templates/email/password_reset.text.eex:7 msgid "Resetting your password is easy. Just click the link below and follow the instructions. We'll have you up and running in no time." msgstr "" "Restablir la contrasenya és fàcil. Segueix l'enllaç de sota i segueix les " "instruccions. Serà un no-res." -#: lib/web/templates/email/registration_confirmation.text.eex:5 #, elixir-format +#: lib/web/templates/email/registration_confirmation.text.eex:5 msgid "You created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email." msgstr "" "Has creat un compte a %{host} amb aquesta adreça de mail. Estàs a un clic d" "'activar-lo. Si no l'has creat tu, ignora aquest mail." -#: lib/web/email/participation.ex:112 #, elixir-format +#: lib/web/email/participation.ex:112 msgid "Your participation to event %{title} has been approved" msgstr "T'han aprovat la participació a %{title}" -#: lib/web/email/participation.ex:70 #, elixir-format +#: lib/web/email/participation.ex:70 msgid "Your participation to event %{title} has been rejected" msgstr "T'han denegat la participació a %{title}" -#: lib/web/email/event.ex:37 #, elixir-format +#: lib/web/email/event.ex:37 msgid "Event %{title} has been updated" msgstr "S'ha actualitzat {%title}" -#: lib/web/templates/email/event_updated.text.eex:15 #, elixir-format +#: lib/web/templates/email/event_updated.text.eex:15 msgid "New title: %{title}" msgstr "Nou títol: %{title}" -#: lib/web/templates/email/password_reset.text.eex:5 #, elixir-format +#: lib/web/templates/email/password_reset.text.eex:5 msgid "You requested a new password for your account on %{instance}." msgstr "Algú ha soŀlicitat a %{instance} una contrasenya nova." -#: lib/web/templates/email/email.html.eex:85 #, elixir-format +#: lib/web/templates/email/email.html.eex:85 msgid "Warning" msgstr "Alerta" -#: lib/web/email/participation.ex:135 #, elixir-format +#: lib/web/email/participation.ex:135 msgid "Confirm your participation to event %{title}" msgstr "Confirma que participaràs a l'activitat %{title}" -#: lib/web/templates/api/privacy.html.eex:75 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:75 msgctxt "terms" msgid "An internal ID for your current selected identity" msgstr "Un identificador intern per la teva identitat actual" -#: lib/web/templates/api/privacy.html.eex:74 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:74 msgctxt "terms" msgid "An internal user ID" msgstr "Un identificador intern" -#: lib/web/templates/api/privacy.html.eex:37 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:37 msgctxt "terms" msgid "Any of the information we collect from you may be used in the following ways:" msgstr "" "Qualsevol informació que recollim de tu la podrem fer servir d'aquestes " "maneres:" -#: lib/web/templates/api/privacy.html.eex:9 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:9 msgctxt "terms" msgid "Basic account information" msgstr "Informació bàsica del compte" -#: lib/web/templates/api/privacy.html.eex:25 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:25 msgctxt "terms" msgid "Do not share any dangerous information over Mobilizon." msgstr "No comparteixis informació perillosa a través de Mobilizon." -#: lib/web/templates/api/privacy.html.eex:90 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:90 msgctxt "terms" msgid "Do we disclose any information to outside parties?" msgstr "Revelem algun tipus d'informació a altri?" -#: lib/web/templates/api/privacy.html.eex:68 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:68 msgctxt "terms" msgid "Do we use cookies?" msgstr "Fem servir cookies?" -#: lib/web/templates/api/privacy.html.eex:51 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:51 msgctxt "terms" msgid "How do we protect your information?" msgstr "Com protegim la teva informació?" -#: lib/web/templates/api/privacy.html.eex:29 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:29 msgctxt "terms" msgid "IPs and other metadata" msgstr "Adreces IP i altres metadades" -#: lib/web/templates/api/privacy.html.eex:17 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:17 msgctxt "terms" msgid "Published events and comments" msgstr "Activitats i comentaris publicats" -#: lib/web/templates/api/privacy.html.eex:64 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:64 msgctxt "terms" msgid "Retain the IP addresses associated with registered users no more than 12 months." msgstr "" "Mantingues les adreces IP associades a usuàries registrades no més de 12 " "mesos." -#: lib/web/templates/api/privacy.html.eex:76 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:76 msgctxt "terms" msgid "Tokens to authenticate you" msgstr "Claus per autenticar-te" -#: lib/web/templates/api/privacy.html.eex:31 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:31 msgctxt "terms" msgid "We also may retain server logs which include the IP address of every request to our server." msgstr "" "També podem guardar registres del funcionament del servidor, que poden " "incloure l'adreça IP de cada petició que rep." -#: lib/web/templates/api/privacy.html.eex:70 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:70 msgctxt "terms" msgid "We store the following information on your device when you connect:" msgstr "Desem aquesta informació al teu dispositiu quan et connectes:" -#: lib/web/templates/api/privacy.html.eex:58 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:58 msgctxt "terms" msgid "We will make a good faith effort to:" msgstr "Ens esforçarem de bona fe per a:" -#: lib/web/templates/api/privacy.html.eex:35 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:35 msgctxt "terms" msgid "What do we use your information for?" msgstr "Per a què fem servir la teva informació?" -#: lib/web/templates/api/privacy.html.eex:57 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:57 msgctxt "terms" msgid "What is our data retention policy?" msgstr "Quina és la nostra política de retenció de dades?" -#: lib/web/templates/api/privacy.html.eex:67 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:67 msgctxt "terms" msgid "You may irreversibly delete your account at any time." msgstr "Pots esborrar el teu compte irreversiblement en qualsevol moment." -#: lib/web/templates/api/privacy.html.eex:115 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:115 msgctxt "terms" msgid "Changes to our Privacy Policy" msgstr "Canvis a la nostra política de privacitat" -#: lib/web/templates/api/privacy.html.eex:106 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:106 msgctxt "terms" msgid "If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site." msgstr "" @@ -283,8 +283,8 @@ msgstr "" "wikipedia.org/wiki/Reglament_General_de_Protecci%C3%B3_de_Dades\">Reglament " "General de Protecció de Dades), si us plau, no facis servir aquest lloc." -#: lib/web/templates/api/privacy.html.eex:109 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:109 msgctxt "terms" msgid "If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site." msgstr "" @@ -295,30 +295,30 @@ msgstr "" "la privacitat online dels infants), si us plau, no facis servir aquest " "lloc." -#: lib/web/templates/api/privacy.html.eex:117 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:117 msgctxt "terms" msgid "If we decide to change our privacy policy, we will post those changes on this page." msgstr "" "Si decidim canviar la nostra política de privacitat publicarem els canvis en " "aquesta pàgina." -#: lib/web/templates/api/privacy.html.eex:112 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:112 msgctxt "terms" msgid "Law requirements can be different if this server is in another jurisdiction." msgstr "" "Els requisits legals poden diferir si aquest servidor cau dins d'una altra " "jurisdicció." -#: lib/web/templates/api/privacy.html.eex:103 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:103 msgctxt "terms" msgid "Site usage by children" msgstr "Ús del lloc per part d'infants" -#: lib/web/templates/api/privacy.html.eex:47 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:47 msgctxt "terms" msgid "The email address you provide may be used to send you information, updates and notifications about other people\n interacting with your content or sending you messages and to respond to inquiries, and/or other requests or\n questions." msgstr "" @@ -328,8 +328,8 @@ msgstr "" "contingut, i per respondre a consultes o\n" " soŀlicituds o preguntes." -#: lib/web/templates/api/privacy.html.eex:45 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:45 msgctxt "terms" msgid "To aid moderation of the community, for example comparing your IP address with other known ones to determine ban\n evasion or other violations." msgstr "" @@ -337,8 +337,8 @@ msgstr "" "amb d'altres conegudes per determinar\n" " evasió d'un bloqueig o altres violacions de les condicions." -#: lib/web/templates/api/privacy.html.eex:43 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:43 msgctxt "terms" msgid "To provide the core functionality of Mobilizon. Depending on this instance's policy you may only be able to\n interact with other people's content and post your own content if you are logged in." msgstr "" @@ -347,89 +347,89 @@ msgstr "" " poguessis interaccionar amb continguts i publicacions teus i d'altres, " "amb una sessió iniciada." -#: lib/web/templates/api/privacy.html.eex:6 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:6 msgctxt "terms" msgid "What information do we collect?" msgstr "Quina informació recollim?" -#: lib/web/email/user.ex:176 #, elixir-format +#: lib/web/email/user.ex:176 msgid "Mobilizon on %{instance}: confirm your email address" msgstr "Mobilizon a %{instance}: confirma la teva adreça de correu" -#: lib/web/email/user.ex:152 #, elixir-format +#: lib/web/email/user.ex:152 msgid "Mobilizon on %{instance}: email changed" msgstr "Mobilizon a %{instance}: s'ha canviat l'adreça de correu" -#: lib/web/email/notification.ex:47 #, elixir-format +#: lib/web/email/notification.ex:47 msgid "One event planned today" msgid_plural "%{nb_events} events planned today" msgstr[0] "Una activitat planificada per avui" msgstr[1] "%{nb_events} activitats planificades avui" +#, elixir-format #: lib/web/templates/email/on_day_notification.html.eex:38 #: lib/web/templates/email/on_day_notification.text.eex:4 -#, elixir-format msgid "You have one event today:" msgid_plural "You have %{total} events today:" msgstr[0] "Tens una activitat avui:" msgstr[1] "Tens %{total} activitats avui:" -#: lib/web/templates/email/group_invite.text.eex:3 #, elixir-format +#: lib/web/templates/email/group_invite.text.eex:3 msgid "%{inviter} just invited you to join their group %{group}" msgstr "%{inviter} t'acaba de convidar al seu grup %{group}" +#, elixir-format #: lib/web/templates/email/group_invite.html.eex:13 #: lib/web/templates/email/group_invite.text.eex:1 -#, elixir-format msgid "Come along!" msgstr "Vine!" -#: lib/web/email/notification.ex:24 #, elixir-format +#: lib/web/email/notification.ex:24 msgid "Don't forget to go to %{title}" msgstr "No t'oblidis d'anar a %{title}" +#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:38 #: lib/web/templates/email/before_event_notification.text.eex:3 -#, elixir-format msgid "Get ready for %{title}" msgstr "Prepara't per %{title}" -#: lib/web/templates/email/group_invite.html.eex:59 #, elixir-format +#: lib/web/templates/email/group_invite.html.eex:59 msgid "See my groups" msgstr "Mostra els meus grups" +#, elixir-format #: lib/web/templates/email/group_invite.html.eex:45 #: lib/web/templates/email/group_invite.text.eex:5 -#, elixir-format msgid "To accept this invitation, head over to your groups." msgstr "Per acceptar la invitació, ves als teus grups." -#: lib/web/templates/email/before_event_notification.text.eex:5 #, elixir-format +#: lib/web/templates/email/before_event_notification.text.eex:5 msgid "View the event on: %{link}" msgstr "Vés a l'activitat actualitzada a %{link}" -#: lib/web/email/group.ex:33 #, elixir-format +#: lib/web/email/group.ex:33 msgid "You have been invited by %{inviter} to join group %{group}" msgstr "%{inviter} t'ha convidat al grup %{group}" -#: lib/web/email/notification.ex:71 #, elixir-format +#: lib/web/email/notification.ex:71 msgid "One event planned this week" msgid_plural "%{nb_events} events planned this week" msgstr[0] "Una activitat planificada per aquesta setmana" msgstr[1] "%{nb_events} planificades per aquesta setmana" -#: lib/web/email/notification.ex:93 #, elixir-format +#: lib/web/email/notification.ex:93 msgid "One participation request for event %{title} to process" msgid_plural "%{number_participation_requests} participation requests for event %{title} to process" msgstr[0] "Hi ha una soŀlicitud de participar a %{title} pendent de resoldre" @@ -437,21 +437,21 @@ msgstr[1] "" "Hi ha %{number_participation_requests} soŀlicituds de participar a %{title} " "pendents de resoldre" +#, elixir-format #: lib/web/templates/email/notification_each_week.html.eex:38 #: lib/web/templates/email/notification_each_week.text.eex:3 -#, elixir-format msgid "You have one event this week:" msgid_plural "You have %{total} events this week:" msgstr[0] "Tens una activitat aquesta setmana:" msgstr[1] "Tens %{total} activitats aquesta setmana:" -#: lib/service/metadata/utils.ex:52 #, elixir-format +#: lib/service/metadata/utils.ex:52 msgid "The event organizer didn't add any description." msgstr "L'organitzadora no hi ha posat cap descripció." -#: lib/web/templates/api/privacy.html.eex:54 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:54 msgctxt "terms" msgid "We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL/TLS, and your password is hashed using a strong one-way algorithm." msgstr "" @@ -461,8 +461,8 @@ msgstr "" "aplicacions client i l'API del servidor, i desem les contrasenyes " "transformades amb una funció de hash forta, unidireccional." -#: lib/web/templates/api/privacy.html.eex:94 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:94 msgctxt "terms" msgid "No. We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety." msgstr "" @@ -474,20 +474,20 @@ msgstr "" "fer-ho per complir amb la llei, per fer complir la política del lloc, per " "protegir el nostres drets o d'altres, la propietat, o la seguretat." -#: lib/web/templates/api/terms.html.eex:23 #, elixir-format +#: lib/web/templates/api/terms.html.eex:23 msgctxt "terms" msgid "Accepting these Terms" msgstr "Acceptar aquestes condicions" -#: lib/web/templates/api/terms.html.eex:27 #, elixir-format +#: lib/web/templates/api/terms.html.eex:27 msgctxt "terms" msgid "Changes to these Terms" msgstr "Canvis an aquestes condicions" -#: lib/web/templates/api/terms.html.eex:85 #, elixir-format +#: lib/web/templates/api/terms.html.eex:85 msgctxt "terms" msgid "A lot of the content on the Service is from you and others, and we don't review, verify or authenticate it, and it may include inaccuracies or false information. We make no representations, warranties, or guarantees relating to the quality, suitability, truth, accuracy or completeness of any content contained in the Service. You acknowledge sole responsibility for and assume all risk arising from your use of or reliance on any content." msgstr "" @@ -498,16 +498,16 @@ msgstr "" "Assumeixes el risc i responsabilitat derivats de l'ús o confiança en " "qualsevol contingut." -#: lib/web/templates/api/terms.html.eex:60 #, elixir-format +#: lib/web/templates/api/terms.html.eex:60 msgctxt "terms" msgid "Also, you agree that you will not do any of the following in connection with the Service or other users:" msgstr "" "També et compromets a no fer res del següent en relació amb el Servei o " "altres usuari/es:" -#: lib/web/templates/api/terms.html.eex:65 #, elixir-format +#: lib/web/templates/api/terms.html.eex:65 msgctxt "terms" msgid "Circumvent or attempt to circumvent any filtering, security measures, rate limits or other features designed to protect the Service, users of the Service, or third parties." msgstr "" @@ -515,22 +515,22 @@ msgstr "" "freqüència d'ús, o altres funcions dissenyades per protegir el Servei, " "usuàries del Servei, o d'altri." -#: lib/web/templates/api/terms.html.eex:64 #, elixir-format +#: lib/web/templates/api/terms.html.eex:64 msgctxt "terms" msgid "Collect any personal information about other users, or intimidate, threaten, stalk or otherwise harass other users of the Service;" msgstr "" "Recopilar informació personal d'altres usuàries, intimidar, amenaçar, espiar " "o assetjar altres usuàries del Servei;" -#: lib/web/templates/api/terms.html.eex:55 #, elixir-format +#: lib/web/templates/api/terms.html.eex:55 msgctxt "terms" msgid "Content that is illegal or unlawful, that would otherwise create liability;" msgstr "Continguts iŀlegals, que poguessin comportar responsabilitats;" -#: lib/web/templates/api/terms.html.eex:56 #, elixir-format +#: lib/web/templates/api/terms.html.eex:56 msgctxt "terms" msgid "Content that may infringe or violate any patent, trademark, trade secret, copyright, right of privacy, right of publicity or other intellectual or other right of any party;" msgstr "" @@ -538,48 +538,48 @@ msgstr "" "secret comercial, drets d'autoria, dret a la privacitat, dret de publicitat " "o qualsevol altres drets inteŀlectuals o drets de qualsevol part;" -#: lib/web/templates/api/terms.html.eex:42 #, elixir-format +#: lib/web/templates/api/terms.html.eex:42 msgctxt "terms" msgid "Creating Accounts" msgstr "Creació dels comptes" -#: lib/web/templates/api/terms.html.eex:89 #, elixir-format +#: lib/web/templates/api/terms.html.eex:89 msgctxt "terms" msgid "Entire Agreement" msgstr "Acord complet" -#: lib/web/templates/api/terms.html.eex:92 #, elixir-format +#: lib/web/templates/api/terms.html.eex:92 msgctxt "terms" msgid "Feedback" msgstr "Valoracions" -#: lib/web/templates/api/terms.html.eex:83 #, elixir-format +#: lib/web/templates/api/terms.html.eex:83 msgctxt "terms" msgid "Hyperlinks and Third Party Content" msgstr "Enllaços i continguts de tercers" -#: lib/web/templates/api/terms.html.eex:88 #, elixir-format +#: lib/web/templates/api/terms.html.eex:88 msgctxt "terms" msgid "If you breach any of these Terms, we have the right to suspend or disable your access to or use of the Service." msgstr "" "Si incompleixes qualsevol d'aquestes condicions, ens reservem el dret de " "suspendre o desactivar el teu accés al Servei." -#: lib/web/templates/api/terms.html.eex:63 #, elixir-format +#: lib/web/templates/api/terms.html.eex:63 msgctxt "terms" msgid "Impersonate or post on behalf of any person or entity or otherwise misrepresent your affiliation with a person or entity;" msgstr "" "Suplantar la identitat o publicar en nom d'una persona o entitat, o " "tergiversar la teva afiliació amb una persona o entitat;" -#: lib/web/templates/api/terms.html.eex:48 #, elixir-format +#: lib/web/templates/api/terms.html.eex:48 msgctxt "terms" msgid "Our Service allows you and other users to post, link and otherwise make available content. You are responsible for the content that you make available to the Service, including its legality, reliability, and appropriateness." msgstr "" @@ -587,26 +587,26 @@ msgstr "" "continguts a disposició del públic. Ets responsable del contingut que " "publiques al Servei, incloent-ne la legalitat, fiabilitat i adequació." -#: lib/web/templates/api/terms.html.eex:39 #, elixir-format +#: lib/web/templates/api/terms.html.eex:39 msgctxt "terms" msgid "Privacy Policy" msgstr "Política de privacitat" -#: lib/web/templates/api/terms.html.eex:95 #, elixir-format +#: lib/web/templates/api/terms.html.eex:95 msgctxt "terms" msgid "Questions & Contact Information" msgstr "Preguntes i informació de contacte" -#: lib/web/templates/api/terms.html.eex:87 #, elixir-format +#: lib/web/templates/api/terms.html.eex:87 msgctxt "terms" msgid "Termination" msgstr "Finalització" -#: lib/web/templates/api/terms.html.eex:62 #, elixir-format +#: lib/web/templates/api/terms.html.eex:62 msgctxt "terms" msgid "Use the Service in any manner that could interfere with, disrupt, negatively affect or inhibit other users from fully enjoying the Service or that could damage, disable, overburden or impair the functioning of the Service;" msgstr "" @@ -615,14 +615,14 @@ msgstr "" "plenament del Servei, que pugui malmetre, deshabilitar, sobrecarregar o " "perjudicar el funcionament del Servei;" -#: lib/web/templates/api/terms.html.eex:47 #, elixir-format +#: lib/web/templates/api/terms.html.eex:47 msgctxt "terms" msgid "Your Content & Conduct" msgstr "El teu contingut i conducta" -#: lib/web/templates/api/terms.html.eex:84 #, elixir-format +#: lib/web/templates/api/terms.html.eex:84 msgctxt "terms" msgid "%{instance_name} makes no claim or representation regarding, and accepts no responsibility for third party websites accessible by hyperlink from the Service or websites linking to the Service. When you leave the Service, you should be aware that these Terms and our policies no longer govern. The inclusion of any link does not imply endorsement by %{instance_name} of the site. Use of any such linked website is at the user's own risk." msgstr "" @@ -633,8 +633,8 @@ msgstr "" "externs no implica el suport per part de %{instance_name} per al lloc " "destí. L'ús de tals enllaços són responsabilitat de cada persona usuària." -#: lib/web/templates/api/terms.html.eex:68 #, elixir-format +#: lib/web/templates/api/terms.html.eex:68 msgctxt "terms" msgid "Finally, your use of the Service is also subject to acceptance of the instance's own specific rules regarding the code of conduct and moderation rules. Breaking those rules may also result in your account being disabled or suspended." msgstr "" @@ -643,16 +643,16 @@ msgstr "" "conducta i normes de moderació. Trencar aquestes normes pot implicar la " "suspensió o retirada del vostre compte." -#: lib/web/templates/api/terms.html.eex:81 #, elixir-format +#: lib/web/templates/api/terms.html.eex:81 msgctxt "terms" msgid "For full details about the Mobilizon software see here." msgstr "" "Vegeu detalls complets sobre el " "software Mobilizon." -#: lib/web/templates/api/terms.html.eex:18 #, elixir-format +#: lib/web/templates/api/terms.html.eex:18 msgctxt "terms" msgid "Here are the important things you need to know about accessing and using the %{instance_name} (%{instance_url}) website and service (collectively, \"Service\"). These are our terms of service (\"Terms\"). Please read them carefully." msgstr "" @@ -662,8 +662,8 @@ msgstr "" "condicions del servei, (\"Condicions del Servei\" o \"Condicions\"). Llegiu-" "les amb atenció." -#: lib/web/templates/api/terms.html.eex:33 #, elixir-format +#: lib/web/templates/api/terms.html.eex:33 msgctxt "terms" msgid "If we make major changes, we will notify our users in a clear and prominent manner. Minor changes may only be highlighted in the footer of our website. It is your responsibility to check the website regularly for changes to these Terms." msgstr "" @@ -672,8 +672,8 @@ msgstr "" "pàgina. És la vostra responsabilitat comprovar el web regularment per " "assabentar-vos dels canvis de les Condicions." -#: lib/web/templates/api/terms.html.eex:53 #, elixir-format +#: lib/web/templates/api/terms.html.eex:53 msgctxt "terms" msgid "In order to make %{instance_name} a great place for all of us, please do not post, link and otherwise make available on or through the Service any of the following:" msgstr "" @@ -681,16 +681,16 @@ msgstr "" "absteniu-vos de publicar, enllaçar, o fer disponible de qualsevol altra " "manera al Servei o a través d'ell:" -#: lib/web/templates/api/terms.html.eex:57 #, elixir-format +#: lib/web/templates/api/terms.html.eex:57 msgctxt "terms" msgid "Private information of any third party (e.g., addresses, phone numbers, email addresses, Social Security numbers and credit card numbers); and" msgstr "" "Informació privada d'altri (ex.: adreces postals o de correu, números de " "telèfon, números d'identitat o de targetes bancàries, etc.); ni" -#: lib/web/templates/api/terms.html.eex:52 #, elixir-format +#: lib/web/templates/api/terms.html.eex:52 msgctxt "terms" msgid "Since Mobilizon is a distributed network, it is possible, depending on the visibility rules set to your content, that your content has been distributed to other Mobilizon instances. When you delete your content, we will request those other instances to also delete the content. Our responsibility on the content being deleted from those other instances ends here. If for some reason, some other instance does not delete the content, we cannot be held responsible." msgstr "" @@ -701,8 +701,8 @@ msgstr "" "qualsevol motiu alguna instància no respecta aquesta petició, no ens en " "podem fer responsables." -#: lib/web/templates/api/terms.html.eex:90 #, elixir-format +#: lib/web/templates/api/terms.html.eex:90 msgctxt "terms" msgid "These Terms constitute the entire agreement between you and %{instance_name} regarding the use of the Service, superseding any prior agreements between you and %{instance_name} relating to your use of the Service." msgstr "" @@ -710,8 +710,8 @@ msgstr "" "entre entre vós i %{instance_name}, i substitueix qualsevol altre " "acord previ." -#: lib/web/templates/api/terms.html.eex:80 #, elixir-format +#: lib/web/templates/api/terms.html.eex:80 msgctxt "terms" msgid "This Service runs on a Mobilizon instance. This source code is licensed under an AGPLv3 license which means you are allowed to and even encouraged to take the source code, modify it and use it." msgstr "" @@ -721,16 +721,16 @@ msgstr "" "teniu dret i se us anima a usar, consultar, modificar i distribuir-ne el " "codi font." -#: lib/web/templates/api/terms.html.eex:58 #, elixir-format +#: lib/web/templates/api/terms.html.eex:58 msgctxt "terms" msgid "Viruses, corrupted data or other harmful, disruptive or destructive files or code." msgstr "" "Virus, dades corrompudes o qualsevol altre tipus de malware o arxius " "destructius o nocius." -#: lib/web/templates/api/terms.html.eex:51 #, elixir-format +#: lib/web/templates/api/terms.html.eex:51 msgctxt "terms" msgid "You can remove the content that you posted by deleting it. Once you delete your content, it will not appear on the Service, but copies of your deleted content may remain in our system or backups for some period of time. Web server access logs might also be stored for some time in the system." msgstr "" @@ -740,30 +740,30 @@ msgstr "" "de correu també son subjectes de ser conservats dins el sistema durant un " "temps." -#: lib/web/templates/api/terms.html.eex:96 #, elixir-format +#: lib/web/templates/api/terms.html.eex:96 msgctxt "terms" msgid "Questions or comments about the Service may be directed to us at %{contact}" msgstr "" "Podeu dirigir-vos a %{contact} per qualsevol pregunta o comentari sobre el " "Servei" -#: lib/web/templates/api/terms.html.eex:79 #, elixir-format +#: lib/web/templates/api/terms.html.eex:79 msgctxt "terms" msgid "Source code" msgstr "Codi font" -#: lib/web/templates/api/terms.html.eex:93 #, elixir-format +#: lib/web/templates/api/terms.html.eex:93 msgctxt "terms" msgid "We love feedback. Please let us know what you think of the Service, these Terms and, in general, %{instance_name}." msgstr "" "Ens encanten les valoracions i els comentaris. Feu-nos saber què en penseu " "del Servei, aquestes Condicions, i, en general, de %{instance_name}." -#: lib/web/templates/api/terms.html.eex:74 #, elixir-format +#: lib/web/templates/api/terms.html.eex:74 msgctxt "terms" msgid "Instance administrators (and community moderators, given the relevant access) are responsible for monitoring and acting on flagged content and other user reports, and have the right and responsibility to remove or edit content that is not aligned to this Instance set of rules, or to suspend, block or ban (temporarily or permanently) any account, community, or instance for breaking these terms, or for other behaviours that they deem inappropriate, threatening, offensive, or harmful." msgstr "" @@ -777,14 +777,14 @@ msgstr "" "condicions, com també altres comportaments no descrits però que siguin " "considerats inapropiats, amenaçadors, ofensius o nocius." -#: lib/web/templates/api/terms.html.eex:6 #, elixir-format +#: lib/web/templates/api/terms.html.eex:6 msgctxt "terms" msgid "%{instance_name} will not use or transmit or resell your personal data" msgstr "%{instance_name} no fa profit de les vostres dades personals" -#: lib/web/templates/api/terms.html.eex:44 #, elixir-format +#: lib/web/templates/api/terms.html.eex:44 msgctxt "terms" msgid "If you discover or suspect any Service security breaches, please let us know as soon as possible. For security holes in the Mobilizon software itself, please contact its contributors directly." msgstr "" @@ -793,16 +793,16 @@ msgstr "" "i no de la instància, contacteu-ne la comunitat de contribuïdores directament." -#: lib/web/templates/api/terms.html.eex:77 #, elixir-format +#: lib/web/templates/api/terms.html.eex:77 msgctxt "terms" msgid "Instance administrators should ensure that every community hosted on the instance is properly moderated according to the defined rules." msgstr "" "Les persones administradores de la instància han d'assegurar-se que les " "comunitats allotjades són moderades segons les normes definides." -#: lib/web/templates/api/terms.html.eex:98 #, elixir-format +#: lib/web/templates/api/terms.html.eex:98 msgctxt "terms" msgid "Originally adapted from the Diaspora* and App.net privacy policies, also licensed under CC BY-SA." msgstr "" @@ -811,8 +811,8 @@ msgstr "" "appdotnet/terms-of-service\">les de App.net llicenciades també amb CC BY-SA." -#: lib/web/templates/api/privacy.html.eex:119 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:119 msgctxt "terms" msgid "Originally adapted from the Mastodon and Discourse privacy policies, also licensed under CC BY-SA." msgstr "" @@ -821,22 +821,22 @@ msgstr "" "discourse/discourse\">les de Discourse, llicenciades també amb CC BY-SA." -#: lib/web/templates/api/terms.html.eex:3 #, elixir-format +#: lib/web/templates/api/terms.html.eex:3 msgctxt "terms" msgid "Short version" msgstr "Versió curta" -#: lib/web/templates/api/terms.html.eex:9 #, elixir-format +#: lib/web/templates/api/terms.html.eex:9 msgctxt "terms" msgid "The service is provided without warranties and these terms may change in the future" msgstr "" "El servei s'ofereix sense garanties i les condicions poden canviar en el " "futur" -#: lib/web/templates/api/privacy.html.eex:118 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:118 msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 18, 2020." msgstr "" @@ -844,8 +844,8 @@ msgstr "" "licenses/by-sa/4.0/\">CC BY-SA. Va ser actualitzat per darrer cop del 18 " "de juny de 2020." -#: lib/web/templates/api/terms.html.eex:97 #, elixir-format +#: lib/web/templates/api/terms.html.eex:97 msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 22, 2020." msgstr "" @@ -853,82 +853,82 @@ msgstr "" "licenses/by-sa/4.0/\">CC BY-SA. Va ser actualitzat per darrer cop del 22 " "de juny de 2020." -#: lib/web/templates/api/terms.html.eex:8 #, elixir-format +#: lib/web/templates/api/terms.html.eex:8 msgctxt "terms" msgid "You must respect other people and %{instance_name}'s rules when using the service" msgstr "" "Quan useu el servei heu de respectar les altres persones i les normes de " "%{instance_name}" -#: lib/web/templates/api/terms.html.eex:7 #, elixir-format +#: lib/web/templates/api/terms.html.eex:7 msgctxt "terms" msgid "You must respect the law when using %{instance_name}" msgstr "Quan feu servir %{instance_name} heu de respectar la llei" -#: lib/web/templates/api/terms.html.eex:5 #, elixir-format +#: lib/web/templates/api/terms.html.eex:5 msgctxt "terms" msgid "Your content is yours" msgstr "El teu contingut et pertany" -#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:51 #, elixir-format +#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:51 msgid "Confirm my e-mail address" msgstr "Confirma la meva adreça de correu" +#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:13 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:1 -#, elixir-format msgid "Confirm your e-mail" msgstr "Confirma l'adreça de correu" -#: lib/web/templates/email/anonymous_participation_confirmation.text.eex:3 #, elixir-format +#: lib/web/templates/email/anonymous_participation_confirmation.text.eex:3 msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" "Hola! Acabes d'apuntar-te a aquesta activitat: « %{title} ». Si us plau, " "confirma l'adreça de correu que has introduït:" +#, elixir-format #: lib/web/templates/email/email.html.eex:114 #: lib/web/templates/email/email.text.eex:8 -#, elixir-format msgid "Need help? Is something not working as expected?" msgstr "Necessites ajuda? Alguna cosa no funciona?" -#: lib/web/templates/email/registration_confirmation.html.eex:38 #, elixir-format +#: lib/web/templates/email/registration_confirmation.html.eex:38 msgid "You created an account on %{host} with this email address. You are one click away from activating it." msgstr "" "Has creat un compte a %{host} amb aquest mail. Estàs a un clic d'activar-lo." -#: lib/web/templates/email/report.html.eex:13 #, elixir-format +#: lib/web/templates/email/report.html.eex:13 msgid "New report on %{instance}" msgstr "Nova denúncia a %{instance}" -#: lib/web/templates/email/email_changed_old.html.eex:38 #, elixir-format +#: lib/web/templates/email/email_changed_old.html.eex:38 msgid "The email address for your account on %{host} is being changed to:" msgstr "L'adreça de correu pel teu compte a %{host} s'està canviant a:" -#: lib/web/templates/email/password_reset.html.eex:38 #, elixir-format +#: lib/web/templates/email/password_reset.html.eex:38 msgid "You requested a new password for your account on %{instance}." msgstr "Algú ha soŀlicitat a %{instance} una contrasenya nova." -#: lib/web/templates/email/email.text.eex:5 #, elixir-format +#: lib/web/templates/email/email.text.eex:5 msgid "Please do not use it for real purposes." msgstr "No ho facis servir més que proves, sisplau" +#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:63 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:6 lib/web/templates/email/event_updated.html.eex:133 #: lib/web/templates/email/event_updated.text.eex:24 lib/web/templates/email/notification_each_week.html.eex:70 #: lib/web/templates/email/notification_each_week.text.eex:11 lib/web/templates/email/on_day_notification.html.eex:70 #: lib/web/templates/email/on_day_notification.text.eex:14 -#, elixir-format msgid "Would you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgid_plural "Would you wish to cancel your attendance to one or several events, visit the event pages through the links above and click the « Attending » button." msgstr[0] "" @@ -938,9 +938,9 @@ msgstr[1] "" "Si has de canceŀlar la teva participació, accedeix a l'activitat per " "l'enllaç de dalt i clica al botó de participació." +#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:38 #: lib/web/templates/email/pending_participation_notification.text.eex:4 -#, elixir-format msgid "You have one pending attendance request to process:" msgid_plural "You have %{number_participation_requests} attendance requests to process:" msgstr[0] "Tens una soŀlicitud de participació pendent de resoldre:" @@ -948,67 +948,67 @@ msgstr[1] "" "Tens %{number_participation_requests} soŀlicituds de participació pendents " "de resoldre:" -#: lib/web/templates/email/email.text.eex:11 #, elixir-format +#: lib/web/templates/email/email.text.eex:11 msgid "%{instance} is powered by Mobilizon." msgstr "%{instance} és un servidor de Mobilizon." -#: lib/web/templates/email/email.html.eex:142 #, elixir-format +#: lib/web/templates/email/email.html.eex:142 msgid "%{instance} is powered by Mobilizon." msgstr "%{instance} és un servidor de Mobilizon." +#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:13 #: lib/web/templates/email/pending_participation_notification.text.eex:1 -#, elixir-format msgid "A request is pending!" msgstr "Una soŀlicitud pendent!" +#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:13 #: lib/web/templates/email/before_event_notification.text.eex:1 -#, elixir-format msgid "An event is upcoming!" msgstr "S'apropa una activitat!" +#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:13 #: lib/web/templates/email/email_changed_new.text.eex:1 -#, elixir-format msgid "Confirm new email" msgstr "Confirma la nova adreça" -#: lib/web/templates/email/event_updated.html.eex:84 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:84 msgid "End" msgstr "Final" -#: lib/web/templates/email/event_updated.text.eex:21 #, elixir-format +#: lib/web/templates/email/event_updated.text.eex:21 msgid "End %{ends_on}" msgstr "Final %{ends_on}" +#, elixir-format #: lib/web/templates/email/event_updated.html.eex:13 #: lib/web/templates/email/event_updated.text.eex:1 -#, elixir-format msgid "Event update!" msgstr "S'ha actualitzat l'activitat!" -#: lib/web/templates/email/report.html.eex:88 #, elixir-format +#: lib/web/templates/email/report.html.eex:88 msgid "Flagged comments" msgstr "Comentaris denunciats" +#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:45 #: lib/web/templates/email/event_participation_approved.text.eex:7 -#, elixir-format msgid "Good news: one of the event organizers just approved your request. Update your calendar, because you're on the guest list now!" msgstr "" "Bones notícies: alguna de les organitzadores de l'activitat t'ha aprovat la " "soŀlicitud de participar-hi. Ja t'ho pots apuntar a l'agenda, estàs a la " "llista d'assistents!" +#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:38 #: lib/web/templates/email/email_changed_new.text.eex:3 -#, elixir-format msgid "Hi there! It seems like you wanted to change the email address linked to your account on %{instance}. If you still wish to do so, please click the button below to confirm the change. You will then be able to log in to %{instance} with this new email address." msgstr "" "Ei hola! Sembla que vols canviar l'adreça de correu vinculada al teu compte " @@ -1016,16 +1016,16 @@ msgstr "" "el canvi. Un cop fet, podràs iniciar sessió a %{instance} amb aquesta nova " "adreça." -#: lib/web/templates/email/email_changed_old.text.eex:3 #, elixir-format +#: lib/web/templates/email/email_changed_old.text.eex:3 msgid "Hi there! Just a quick note to confirm that the email address linked to your account on %{host} has been changed from this one to:" msgstr "" "Ep! Només confirmar que ha canviat el correu vinculat al teu compte a %{host}" ". Ara és:" -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 #, elixir-format +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" "Si no has fet aquest canvi tu mateix/a, és possible que algú hagi aconseguit " @@ -1033,173 +1033,173 @@ msgstr "" "contrasenya de seguida. Si no pots entrar, contacta amb les admins de " "%{host}." -#: lib/web/templates/email/password_reset.text.eex:12 #, elixir-format +#: lib/web/templates/email/password_reset.text.eex:12 msgid "If you didn't trigger the change yourself, please ignore this message. Your password won't be changed until you click the link above." msgstr "" "Si no has fet aquest canvi, pots ignorar aquest missatge. La teva " "contrasenya es mantindrà si no cliques l'enllaç de sobre." +#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:70 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:4 lib/web/templates/email/registration_confirmation.html.eex:45 -#, elixir-format msgid "If you didn't trigger this email, you may safely ignore it." msgstr "Si no has demanat això, sisplau ignora aquest correu." +#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:63 #: lib/web/templates/email/before_event_notification.text.eex:6 -#, elixir-format msgid "If you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgstr "" "Si has de canceŀlar la teva participació, accedeix a l'activitat per " "l'enllaç de dalt i clica al botó de participació." +#, elixir-format #: lib/web/templates/email/email.html.eex:143 #: lib/web/templates/email/email.text.eex:11 -#, elixir-format msgid "Learn more about Mobilizon here!" msgstr "Per aprendre més de Mobilizon." -#: lib/web/templates/email/event_updated.html.eex:94 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:94 msgid "Location" msgstr "Ubicació" -#: lib/web/templates/email/event_updated.html.eex:104 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:104 msgid "Location address was removed" msgstr "L'adreça postal ha estat esborrada" +#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:51 #: lib/web/templates/email/pending_participation_notification.text.eex:6 -#, elixir-format msgid "Manage pending requests" msgstr "Gestiona les soŀlicituds pendents" +#, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:13 #: lib/web/templates/email/registration_confirmation.text.eex:1 -#, elixir-format msgid "Nearly there!" msgstr "Hi ets a prop!" +#, elixir-format #: lib/web/templates/email/email_changed_old.html.eex:13 #: lib/web/templates/email/email_changed_old.text.eex:1 -#, elixir-format msgid "New email confirmation" msgstr "Nova confirmació de correu" -#: lib/web/templates/email/report.html.eex:106 #, elixir-format +#: lib/web/templates/email/report.html.eex:106 msgid "Reasons for report" msgstr "Motius de l'informe" -#: lib/web/templates/email/report.html.eex:39 #, elixir-format +#: lib/web/templates/email/report.html.eex:39 msgid "Someone on %{instance} reported the following content for you to analyze:" msgstr "Algú a %{instance} ha denunciat el contingut següent." +#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:13 #: lib/web/templates/email/event_participation_rejected.text.eex:1 -#, elixir-format msgid "Sorry! You're not going." msgstr "Ho sentim! No hi podràs anar." -#: lib/web/templates/email/event_updated.html.eex:74 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:74 msgid "Start" msgstr "Inici" -#: lib/web/templates/email/event_updated.text.eex:18 #, elixir-format +#: lib/web/templates/email/event_updated.text.eex:18 msgid "Start %{begins_on}" msgstr "Inici %{starts_on}" -#: lib/web/templates/email/event_updated.text.eex:3 #, elixir-format +#: lib/web/templates/email/event_updated.text.eex:3 msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "Hi ha hagut canvis a %{title} i et volíem avisar." +#, elixir-format #: lib/web/templates/email/event_updated.html.eex:55 #: lib/web/templates/email/event_updated.text.eex:11 -#, elixir-format msgid "This event has been cancelled by its organizers. Sorry!" msgstr "Les organitzadores d'aquesta activitat l'han canceŀlada. Ho sentim!" +#, elixir-format #: lib/web/templates/email/event_updated.html.eex:51 #: lib/web/templates/email/event_updated.text.eex:7 -#, elixir-format msgid "This event has been confirmed" msgstr "S'ha confirmat l'activitat" +#, elixir-format #: lib/web/templates/email/event_updated.html.eex:53 #: lib/web/templates/email/event_updated.text.eex:9 -#, elixir-format msgid "This event has yet to be confirmed: organizers will let you know if they do confirm it." msgstr "" "Aquesta activitat encara no està confirmada: l'organització t'ho farà saber " "si la confirmen." +#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:45 #: lib/web/templates/email/event_participation_rejected.text.eex:7 -#, elixir-format msgid "Unfortunately, the organizers rejected your request." msgstr "Malauradament, les organitzadores han rebutjat la teva participació." -#: lib/web/templates/email/email_changed_new.html.eex:51 #, elixir-format +#: lib/web/templates/email/email_changed_new.html.eex:51 msgid "Verify your email address" msgstr "Verifica l'adreça de correu" -#: lib/web/templates/email/report.html.eex:126 #, elixir-format +#: lib/web/templates/email/report.html.eex:126 msgid "View report" msgstr "Mostra la denúncia" -#: lib/web/templates/email/report.text.eex:24 #, elixir-format +#: lib/web/templates/email/report.text.eex:24 msgid "View report:" msgstr "Mostra la denúncia" +#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:58 #: lib/web/templates/email/event_participation_confirmed.html.eex:58 -#, elixir-format msgid "Visit event page" msgstr "Vés a la pàgina d'activitat" -#: lib/web/templates/email/event_updated.html.eex:121 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:121 msgid "Visit the updated event page" msgstr "Vés a la pàgina d'activitat actualitzada" -#: lib/web/templates/email/event_updated.text.eex:23 #, elixir-format +#: lib/web/templates/email/event_updated.text.eex:23 msgid "Visit the updated event page: %{link}" msgstr "Vés a l'activitat actualitzada a %{link}" +#, elixir-format #: lib/web/templates/email/notification_each_week.html.eex:13 #: lib/web/templates/email/notification_each_week.text.eex:1 -#, elixir-format msgid "What's up this week?" msgstr "Què hi ha aquesta setmana?" +#, elixir-format #: lib/web/templates/email/on_day_notification.html.eex:13 #: lib/web/templates/email/on_day_notification.text.eex:1 -#, elixir-format msgid "What's up today?" msgstr "Què fan avui?" +#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:70 #: lib/web/templates/email/event_participation_approved.text.eex:11 lib/web/templates/email/event_participation_confirmed.html.eex:70 #: lib/web/templates/email/event_participation_confirmed.text.eex:6 -#, elixir-format msgid "Would you wish to update or cancel your attendance, simply access the event page through the link above and click on the Attending button." msgstr "" "Si desitges actualitzar o canceŀlar la teva assistència , entra a la pàgina " "de l'activitat amb l'enllaç d'amunt i clica al botó de participació." +#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:64 #: lib/web/templates/email/pending_participation_notification.text.eex:8 -#, elixir-format msgid "You are receiving this email because you chose to get notifications for pending attendance requests to your events. You can disable or change your notification settings in your user account settings under « Notifications »." msgstr "" "Has rebut aquest correu perquè tens configurat de rebre notificacions per a " @@ -1207,129 +1207,129 @@ msgstr "" "deshabilitar o canviar la configuració de les notificacions en les opcions " "del compte, a l'apartat «Notificacions»." -#: lib/web/templates/email/event_participation_rejected.text.eex:5 #, elixir-format +#: lib/web/templates/email/event_participation_rejected.text.eex:5 msgid "You issued a request to attend %{title}." msgstr "Has soŀlicitat participar a %{title}." +#, elixir-format #: lib/web/templates/email/event_participation_approved.text.eex:5 #: lib/web/templates/email/event_participation_confirmed.text.eex:3 -#, elixir-format msgid "You recently requested to attend %{title}." msgstr "Has soŀlicitat participar a l'activitat %{title}." +#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:13 #: lib/web/templates/email/event_participation_confirmed.html.eex:13 lib/web/templates/email/event_participation_confirmed.text.eex:1 -#, elixir-format msgid "You're going!" msgstr "T'han acceptat!" +#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:64 #: lib/web/templates/email/email_changed_new.text.eex:5 -#, elixir-format msgid "If you didn't trigger the change yourself, please ignore this message." msgstr "Si no has fet tu aquest canvi, pots ignorar aquest missatge." -#: lib/web/templates/email/email.html.eex:89 #, elixir-format +#: lib/web/templates/email/email.html.eex:89 msgid "Please do not use it for real purposes." msgstr "No ho facis servir més que proves, sisplau." +#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:45 #: lib/web/templates/email/group_member_removal.text.eex:5 -#, elixir-format msgid "If you feel this is an error, you may contact the group's administrators so that they can add you back." msgstr "" "Si creus que es tracta d'un error, pots contactar l'equip d'administració " "del grup per tal que et tornin a afegir." +#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:13 #: lib/web/templates/email/group_member_removal.text.eex:1 -#, elixir-format msgid "So long, and thanks for the fish!" msgstr "Salut i canya al forçut!" -#: lib/web/email/group.ex:63 #, elixir-format +#: lib/web/email/group.ex:63 msgid "You have been removed from group %{group}" msgstr "T'han tret del grup %{group}" -#: lib/web/templates/email/group_member_removal.text.eex:3 #, elixir-format +#: lib/web/templates/email/group_member_removal.text.eex:3 msgid "You have been removed from group %{group}. You will not be able to access this group's private content anymore." msgstr "" "T'han esborrat del grup %{group}. Ja no pots accedir al seu contingut privat." -#: lib/web/templates/email/group_invite.html.eex:38 #, elixir-format +#: lib/web/templates/email/group_invite.html.eex:38 msgid "%{inviter} just invited you to join their group %{link_start}%{group}%{link_end}" msgstr "" "%{inviter} t'acaba de convidar de ficar-te al seu grup " "%{link_start}%{group}%{link_end}" -#: lib/web/templates/email/group_member_removal.html.eex:38 #, elixir-format +#: lib/web/templates/email/group_member_removal.html.eex:38 msgid "You have been removed from group %{link_start}%{group}%{link_end}. You will not be able to access this group's private content anymore." msgstr "" "T'han esborrat del grup %{link_start}%{group}%{link_end}. Ja no pots " "accedir al seu contingut privat." +#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:54 #: lib/web/templates/email/group_suspension.text.eex:7 -#, elixir-format msgid "As this group was located on another instance, it will continue to work for other instances than this one." msgstr "" "Com que aquest grup estava ubicat en una altra instància, només queda suspès " "en aquesta." +#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:46 #: lib/web/templates/email/group_suspension.text.eex:5 -#, elixir-format msgid "As this group was located on this instance, all of it's data has been irretrievably deleted." msgstr "" "Com que aquest grup estava ubicat en aquesta instància, totes les seves " "dades han estat esborrades irreversiblement." +#, elixir-format #: lib/web/templates/email/group_deletion.html.eex:38 #: lib/web/templates/email/group_deletion.text.eex:3 -#, elixir-format msgid "The administrator %{author} deleted group %{group}. All of the group's events, discussions, posts and todos have been deleted." msgstr "" "L'administrador/a %{author} ha esborrat el grup %{group}, i amb ell, totes " "les seves activitats, discussions, publicacions i tasques." +#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:13 #: lib/web/templates/email/group_suspension.text.eex:1 -#, elixir-format msgid "The group %{group} has been suspended on %{instance}!" msgstr "El grup %{group} ha estat suspès a %{instance}!" +#, elixir-format #: lib/web/templates/email/group_deletion.html.eex:13 #: lib/web/templates/email/group_deletion.text.eex:1 -#, elixir-format msgid "The group %{group} was deleted on %{instance}!" msgstr "El grup %{group} ha estat esborrat a %{instance}!" +#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:38 #: lib/web/templates/email/group_suspension.text.eex:3 -#, elixir-format msgid "Your instance's moderation team has decided to suspend %{group_name} (%{group_address}). You are no longer a member of this group." msgstr "" "L'equip de moderació de la teva instància ha decidit suspendre el grup " "%{group_name} (%{group_address}). Ja no formes part del grup." -#: lib/web/email/group.ex:136 #, elixir-format +#: lib/web/email/group.ex:136 msgid "The group %{group} has been deleted on %{instance}" msgstr "El grup %{group} ha estat esborrat a %{instance}" -#: lib/web/email/group.ex:97 #, elixir-format +#: lib/web/email/group.ex:97 msgid "The group %{group} has been suspended on %{instance}" msgstr "El grup %{group} ha estat suspès a %{instance}" -#: lib/web/templates/api/terms.html.eex:24 #, elixir-format +#: lib/web/templates/api/terms.html.eex:24 msgctxt "terms" msgid "By accessing or using the Service, this means you agree to be bound by all the terms below. If these terms are in any way unclear, please let us know by contacting %{contact}." msgstr "" @@ -1337,8 +1337,8 @@ msgstr "" "condicions següents. Si les condicions no et resulten clares, contacta a " "%{contact}." -#: lib/web/templates/api/terms.html.eex:40 #, elixir-format +#: lib/web/templates/api/terms.html.eex:40 msgctxt "terms" msgid "For information about how we collect and use information about users of the Service, please check our privacy policy." msgstr "" @@ -1346,22 +1346,22 @@ msgstr "" "persones usuàries del servei a la nostra política de " "privacitat." -#: lib/web/templates/api/terms.html.eex:36 #, elixir-format +#: lib/web/templates/api/terms.html.eex:36 msgctxt "terms" msgid "If you continue to use the Service after the revised Terms go into effect, you accept the revised Terms." msgstr "" "Continuar fent servir el Servei després que les Condicions revisades hagin " "entrat en vigor, implica l'acceptació d'aquestes noves Condicions." -#: lib/web/templates/api/privacy.html.eex:78 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:78 msgctxt "terms" msgid "If you delete this information, you need to login again." msgstr "Si esborres aquesta informació hauràs de tornar a iniciar sessió." -#: lib/web/templates/api/privacy.html.eex:80 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:80 msgctxt "terms" msgid "If you're not connected, we don't store any information on your device, unless you participate in an event anonymously. In this specific case we store the hash of an unique identifier for the event and participation status in your browser so that we may display participation status. Deleting this information will only stop displaying participation status in your browser." msgstr "" @@ -1373,31 +1373,31 @@ msgstr "" "informació és que deixarem de mostrar el teu estat d'assistència en el teu " "navegador." -#: lib/web/templates/api/privacy.html.eex:87 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:87 msgctxt "terms" msgid "Note: This information is stored in your localStorage and not your cookies." msgstr "" "Nota: Aquesta informació es desa en l'emmagatzematge local (local storage) i " "no en les cookies." -#: lib/web/templates/api/terms.html.eex:71 #, elixir-format +#: lib/web/templates/api/terms.html.eex:71 msgctxt "terms" msgid "Our responsibility" msgstr "La nostra responsabilitat" -#: lib/web/templates/api/privacy.html.eex:61 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:61 msgctxt "terms" msgid "Retain server logs containing the IP address of all requests to this server, insofar as such logs are kept, no more than 90 days." msgstr "" "Retenir registres del sistema que continguin l'adreça IP de totes les " "peticions en aquest servidor, si és que se'n desen, no més de 90 dies." +#, elixir-format #: lib/web/templates/api/privacy.html.eex:3 #: lib/web/templates/api/terms.html.eex:15 -#, elixir-format msgctxt "terms" msgid "Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary to help you understand them better." msgstr "" @@ -1405,8 +1405,8 @@ msgstr "" "mena, cobreixen conceptes que poden ser difícils d'entendre. Proporcionem un " "glossari per ajudar-te a entendre-les millor." -#: lib/web/templates/api/terms.html.eex:45 #, elixir-format +#: lib/web/templates/api/terms.html.eex:45 msgctxt "terms" msgid "We are not liable for any loss you may incur as a result of someone else using your email or password, either with or without your knowledge." msgstr "" @@ -1414,215 +1414,249 @@ msgstr "" "altre faci servir el teu correu o contrasenya, amb el teu coneixement o " "sense." -#: lib/web/templates/api/terms.html.eex:50 #, elixir-format +#: lib/web/templates/api/terms.html.eex:50 msgctxt "terms" msgid "We cannot be held responsible should a programming or administrative error make your content visible to a larger audience than intended. Aside from our limited right to your content, you retain all of your rights to the content you post, link and otherwise make available on or through the Service." msgstr "" -#: lib/web/templates/api/privacy.html.eex:10 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:10 msgctxt "terms" msgid "We collect information from you when you register on this instance and gather data when you participate in the platform by reading, writing, and interacting with content shared here. If you register on this instance, you will be asked to enter an email address, a password (hashed) and at least an username. Your email address will be verified by an email containing a unique link. Once the link is activated, we know you control that email address. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly. You may however visit this instance without registering." msgstr "" -#: lib/web/templates/api/terms.html.eex:30 #, elixir-format +#: lib/web/templates/api/terms.html.eex:30 msgctxt "terms" msgid "We reserve the right to modify these Terms at any time. For instance, we may need to change these Terms if we come out with a new feature." msgstr "" -#: lib/web/templates/api/terms.html.eex:20 #, elixir-format +#: lib/web/templates/api/terms.html.eex:20 msgctxt "terms" msgid "When we say “we”, “our”, or “us” in this document, we are referring to the owners, operators and administrators of this Mobilizon instance. The Mobilizon software is provided by the team of Mobilizon contributors, supported by Framasoft, a French not-for-profit organization advocating for Free/Libre Software. Unless explicitly stated, this Mobilizon instance is an independent service using Mobilizon's source code. You may find more information about this instance on the \"About this instance\" page." msgstr "" -#: lib/web/templates/api/terms.html.eex:43 #, elixir-format +#: lib/web/templates/api/terms.html.eex:43 msgctxt "terms" msgid "When you create an account you agree to maintain the security and confidentiality of your password and accept all risks of unauthorized access to your account data and any other information you provide to %{instance_name}." msgstr "" -#: lib/web/templates/api/terms.html.eex:49 #, elixir-format +#: lib/web/templates/api/terms.html.eex:49 msgctxt "terms" msgid "When you post, link or otherwise make available content to the Service, you grant us the right and license to display and distribute your content on or through the Service (including via applications). We may format your content for display throughout the Service, but we will not edit or revise the substance of your content itself. The displaying and distribution of your content happens only according to the visibility rules you have set for the content. We will not modify the visibility of the content you have set." msgstr "" -#: lib/web/templates/api/privacy.html.eex:19 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:19 msgctxt "terms" msgid "Your events and comments are delivered to other instances that follow your own, meaning they are delivered to different instances and copies are stored there. When you delete events or comments, this is likewise delivered to these other instances. All interactions related to event features - such as joining an event - or group features - such as managing resources - are federated as well. Please keep in mind that the operators of the instance and any receiving instances may view such messages and information, and that recipients may screenshot, copy or otherwise re-share them." msgstr "" -#: lib/web/templates/api/privacy.html.eex:99 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:99 msgctxt "terms" msgid "Your content may be downloaded by other instances in the network. Your public events and comments are delivered to the instances following your own instance. Content created through a group is forwarded to all the instances of all the members of the group, insofar as these members reside on a different instance than this one." msgstr "" -#: lib/web/templates/email/event_participation_confirmed.text.eex:4 #, elixir-format +#: lib/web/templates/email/event_participation_confirmed.text.eex:4 msgid "You have confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "" +#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:38 #: lib/web/templates/email/event_participation_confirmed.html.eex:38 -#, elixir-format msgid "You recently requested to attend %{title}." msgstr "Has soŀlicitat participar a l'activitat %{title}." -#: lib/web/email/participation.ex:91 #, elixir-format +#: lib/web/email/participation.ex:91 msgid "Your participation to event %{title} has been confirmed" msgstr "T'han aprovat la participació a %{title}" -#: lib/web/templates/email/report.html.eex:41 #, elixir-format +#: lib/web/templates/email/report.html.eex:41 msgid "%{reporter} reported the following content." msgstr "%{reporter_name} (%{reporter_username}) ha denunciat aquest contingut." +#, elixir-format #: lib/web/templates/email/report.text.eex:5 -#, elixir-format msgid "Group %{group} was reported" -msgstr "" +msgstr "S'ha denunciat el grup %{group}" +#, elixir-format #: lib/web/templates/email/report.html.eex:51 -#, elixir-format msgid "Group reported" -msgstr "" +msgstr "Grup denunciat" +#, elixir-format #: lib/web/templates/email/report.text.eex:7 -#, elixir-format msgid "Profile %{profile} was reported" -msgstr "" +msgstr "S'ha denunciat el perfil %{profile}" +#, elixir-format #: lib/web/templates/email/report.html.eex:56 -#, elixir-format msgid "Profile reported" -msgstr "" +msgstr "Perfil denunciat" -#: lib/web/templates/email/event_participation_confirmed.html.eex:45 #, elixir-format +#: lib/web/templates/email/event_participation_confirmed.html.eex:45 msgid "You have now confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "" +"Has confirmat la teva participació. Actualitza't l'agenda, perquè estàs a la " +"llista de convidades!" +#, elixir-format #: lib/mobilizon/posts/post.ex:94 -#, elixir-format msgid "A text is required for the post" -msgstr "" +msgstr "Cal un text per la publicació" +#, elixir-format #: lib/mobilizon/posts/post.ex:93 -#, elixir-format msgid "A title is required for the post" -msgstr "" +msgstr "Cal un títol per la publicació" -#: lib/web/templates/email/instance_follow.text.eex:3 #, elixir-format +#: lib/web/templates/email/instance_follow.text.eex:3 msgid "%{name} (%{domain}) just requested to follow your instance." msgstr "" +"%{name} (%{domain}) acaba de demanar-vos poder seguir la vostra instància." +#, elixir-format #: lib/web/email/follow.ex:54 -#, elixir-format msgid "%{name} requests to follow your instance" -msgstr "" +msgstr "%{name} demana poder seguir la vostra instància" -#: lib/web/templates/email/instance_follow.html.eex:38 #, elixir-format +#: lib/web/templates/email/instance_follow.html.eex:38 msgid "%{name} (%{domain}) just requested to follow your instance. If you accept, this instance will receive all of your instance's public events." msgstr "" +"%{name} (%{domain}) acaba de demanar poder seguir la vostra " +"instància. Si accepteu, la seva instància rebrà totes les activitats " +"públiques de la vostra." +#, elixir-format #: lib/web/templates/email/instance_follow.text.eex:4 -#, elixir-format msgid "If you accept, this instance will receive all of your public events." -msgstr "" +msgstr "Si accepteu, la instància rebrà totes les vostres activitats públiques." -#: lib/web/email/follow.ex:48 #, elixir-format +#: lib/web/email/follow.ex:48 msgid "Instance %{name} (%{domain}) requests to follow your instance" msgstr "" +"La instància %{name} (%{domain}) soŀlicita poder seguir la vostra instància" -#: lib/web/templates/email/instance_follow.html.eex:66 #, elixir-format +#: lib/web/templates/email/instance_follow.html.eex:66 msgid "See the federation settings" -msgstr "" +msgstr "Obre les opcions de federació" +#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:52 #: lib/web/templates/email/instance_follow.text.eex:6 -#, elixir-format msgid "To accept this invitation, head over to the instance's admin settings." msgstr "" +"Per acceptar la invitació, ves a la configuració d'administració de la " +"instància." +#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:13 #: lib/web/templates/email/instance_follow.text.eex:1 -#, elixir-format msgid "Want to connect?" -msgstr "" +msgstr "Voleu connectar-vos?" +#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:45 #: lib/web/templates/email/instance_follow.text.eex:5 -#, elixir-format msgid "Note: %{name} (%{domain}) following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too." msgstr "" +"Nota: que us segueixi %{name} (%{domain}) no implica que vosaltres la " +"seguiu, però podeu demanar de seguir-la també." -#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:38 #, elixir-format +#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:38 msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" +"Hola! Acabes de demanar participar en « %{title} ». Si us plau, " +"confirma l'adreça que has posat:" +#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:38 -#, elixir-format msgid "You issued a request to attend %{title}." -msgstr "" +msgstr "Has soŀlicitat assistir a %{title}." -#: lib/web/templates/email/event_updated.html.eex:64 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:64 msgid "Event title" msgstr "Activitat" -#: lib/web/templates/email/event_updated.html.eex:38 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:38 msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "Hem pensat d'avisar-te dels canvis que hi ha hagut a %{title}." -#: lib/web/templates/error/500_page.html.eex:46 #, elixir-format -msgid "The Mobilizon server seems to be temporarily down." -msgstr "Sembla ser que el servidor de Mobilizon està temporalment inaccessible." - #: lib/web/templates/error/500_page.html.eex:7 -#, elixir-format msgid "This page is not correct" msgstr "La pàgina no és correcta" -#: lib/web/templates/error/500_page.html.eex:45 #, elixir-format +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "Ho sentim, s'ha produït un error al nostre costat." +#, elixir-format #: lib/web/templates/email/email.html.eex:88 #: lib/web/templates/email/email.text.eex:4 -#, elixir-format msgid "This is a demonstration site to test Mobilizon." msgstr "Aquesta és una web de proves per provar la beta de Mobilizon." -#: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 #, elixir-format +#: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "El flux de %{name}" -#: lib/service/export/feed.ex:77 #, elixir-format +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "El flux d'activitats privades de %{actor} a %{instance}" -#: lib/service/export/feed.ex:72 #, elixir-format +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "El flux d'activitats públiques de %{actor} a %{instance}" -#: lib/service/export/feed.ex:203 #, elixir-format +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "Flux de %{email} a %{instance}" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "Sembla ser que el servidor de Mobilizon està temporalment inaccessible." + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/ca/LC_MESSAGES/errors.po b/priv/gettext/ca/LC_MESSAGES/errors.po index effb558b7..fa2a6bbc3 100644 --- a/priv/gettext/ca/LC_MESSAGES/errors.po +++ b/priv/gettext/ca/LC_MESSAGES/errors.po @@ -18,6 +18,7 @@ msgstr "" "X-Generator: Weblate 4.1\n" "Content-Transfer-Encoding: 8bit\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "no pot estar buit" @@ -94,198 +95,199 @@ msgid "must be equal to %{number}" msgstr "ha de ser igual a %{number}" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "No s'ha pogut actualitzar el codi d'accés" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "El perfil actual no pertany a aquest grup" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "El perfil actual no administra el grup seleccionat" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "No s'han pogut desar les preferències" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "No s'ha trobat el grup" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "No s'ha trobat el grup amb identificador %{id}" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "No t'hem pogut autenticar. El teu correu o contrasenya són incorrectes." #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "No s'ha trobat el/la membre" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "" @@ -335,22 +337,22 @@ msgid "Anonymous participation is not enabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "" @@ -370,8 +372,8 @@ msgid "Event id not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "" @@ -387,7 +389,7 @@ msgid "Internal Error" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "" @@ -397,7 +399,7 @@ msgid "No profile found for user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "" @@ -414,12 +416,12 @@ msgid "Participant not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "" @@ -445,30 +447,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -494,22 +491,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -518,23 +515,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -544,17 +536,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -565,17 +557,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -585,12 +577,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -610,32 +602,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -650,12 +642,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -665,7 +657,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -680,7 +672,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -690,17 +682,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -745,7 +737,7 @@ msgid "Resource not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -765,12 +757,12 @@ msgid "You need to be logged in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -780,32 +772,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -815,12 +807,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -830,7 +822,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/gettext/cs/LC_MESSAGES/default.po b/priv/gettext/cs/LC_MESSAGES/default.po index c9047c5a4..a6d7d033e 100644 --- a/priv/gettext/cs/LC_MESSAGES/default.po +++ b/priv/gettext/cs/LC_MESSAGES/default.po @@ -844,8 +844,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1350,18 +1350,13 @@ msgstr "" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1373,20 +1368,46 @@ msgstr "" #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/cs/LC_MESSAGES/errors.po b/priv/gettext/cs/LC_MESSAGES/errors.po index 31ff2f843..0c2d0a708 100644 --- a/priv/gettext/cs/LC_MESSAGES/errors.po +++ b/priv/gettext/cs/LC_MESSAGES/errors.po @@ -11,6 +11,7 @@ msgstr "" "Language: cs\n" "Plural-Forms: nplurals=3\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "" @@ -93,198 +94,199 @@ msgid "must be equal to %{number}" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "" @@ -334,22 +336,22 @@ msgid "Anonymous participation is not enabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "" @@ -369,8 +371,8 @@ msgid "Event id not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "" @@ -386,7 +388,7 @@ msgid "Internal Error" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "" @@ -396,7 +398,7 @@ msgid "No profile found for user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "" @@ -413,12 +415,12 @@ msgid "Participant not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "" @@ -444,30 +446,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -493,22 +490,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -517,23 +514,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -543,17 +535,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -564,17 +556,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -584,12 +576,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -609,32 +601,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -649,12 +641,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -664,7 +656,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -679,7 +671,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -689,17 +681,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -744,7 +736,7 @@ msgid "Resource not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -764,12 +756,12 @@ msgid "You need to be logged in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -779,32 +771,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -814,12 +806,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -829,7 +821,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index e61f7a06d..f16635ce8 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-24 14:39+0000\n" -"PO-Revision-Date: 2020-12-17 10:26+0000\n" -"Last-Translator: Kate \n" +"PO-Revision-Date: 2021-04-01 21:14+0000\n" +"Last-Translator: Thomas Frenzel \n" "Language-Team: German \n" "Language: de\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.1\n" +"X-Generator: Weblate 4.5.1\n" #, elixir-format #: lib/web/templates/email/password_reset.html.eex:48 @@ -36,7 +36,7 @@ msgstr "Mein Konto aktivieren" #: lib/web/templates/email/email.html.eex:117 #: lib/web/templates/email/email.text.eex:9 msgid "Ask the community on Framacolibri" -msgstr "Frag die Gemeinschaft auf Framacolibri" +msgstr "Richte deine Fragen an die Gemeinschaft auf Framacolibri" #, elixir-format #: lib/web/templates/email/report.text.eex:15 @@ -158,7 +158,7 @@ msgstr "Meine Teilnahme an der Veranstaltung %{title} zusagen" #: lib/web/templates/api/privacy.html.eex:75 msgctxt "terms" msgid "An internal ID for your current selected identity" -msgstr "Eine interne ID für deine derzeitig ausgewählte Identität." +msgstr "Eine interne ID für deine aktuell ausgewählte Identität" #, elixir-format #: lib/web/templates/api/privacy.html.eex:74 @@ -235,8 +235,8 @@ msgstr "Tokens, um dich zu authentifizieren" msgctxt "terms" msgid "We also may retain server logs which include the IP address of every request to our server." msgstr "" -"Wir können auch Serverprotokolle aufbewahren, die die IP-Adresse jeder " -"Anfrage an unseren Server enthalten." +"Wir können auch Serverprotokolle mit den IP-Adressen der Anfragen an unseren " +"Server aufbewahren." #, elixir-format #: lib/web/templates/api/privacy.html.eex:70 @@ -329,8 +329,10 @@ msgid "The email address you provide may be used to send you information, update msgstr "" "Die von Ihnen angegebene E-Mail-Adresse kann verwendet werden, um Ihnen " "Informationen, Updates und Benachrichtigungen über andere Personen zu senden " +"\n" "die mit Ihren Inhalten interagieren oder Ihnen Nachrichten senden, sowie zur " -"Beantwortung von Anfragen, und/oder anderen Bitten oder Fragen." +"Beantwortung von Anfragen, und/oder anderen Bitten oder \n" +"Fragen." #, elixir-format #: lib/web/templates/api/privacy.html.eex:45 @@ -568,7 +570,7 @@ msgstr "Gesamte Vereinbarung" #: lib/web/templates/api/terms.html.eex:92 msgctxt "terms" msgid "Feedback" -msgstr "Feedback" +msgstr "Rückmeldung" #, elixir-format #: lib/web/templates/api/terms.html.eex:83 @@ -626,10 +628,10 @@ msgstr "Dauer" msgctxt "terms" msgid "Use the Service in any manner that could interfere with, disrupt, negatively affect or inhibit other users from fully enjoying the Service or that could damage, disable, overburden or impair the functioning of the Service;" msgstr "" -"den Dienst in einer Weise zu nutzen, die andere Nutzer stören, unterbrechen, " -"negativ beeinflussen oder daran hindern könnte, den Dienst in vollem Umfang " -"zu genießen, oder die die Funktion des Dienstes beschädigen, deaktivieren, " -"überlasten oder beeinträchtigen könnte;" +"Benutze unseren Dienst in einer Weise, die andere Nutzer nicht stören, " +"unterbrechen, negativ beeinflussen oder daran hindern könnte, den Dienst in " +"vollem Umfang zu genießen. Oder die Funktion des Dienstes beschädigen, " +"deaktivieren, überlasten oder beeinträchtigen könnte;" #, elixir-format #: lib/web/templates/api/terms.html.eex:47 @@ -929,13 +931,13 @@ msgstr "Brauchst Du Hilfe? Funktioniert etwas nicht richtig?" #: lib/web/templates/email/registration_confirmation.html.eex:38 msgid "You created an account on %{host} with this email address. You are one click away from activating it." msgstr "" -"Du hast einen Account auf %{host} mit dieser E-Mail-Adresse. Du bist nur ein " -"Klick von der Aktivierung entfernt." +"Du hast einen Account auf %{host} mit dieser E-Mail-Adresse. Du bist " +"nur ein Klick von der Aktivierung entfernt." #, elixir-format #: lib/web/templates/email/report.html.eex:13 msgid "New report on %{instance}" -msgstr "Neue Meldung auf %{instance}" +msgstr "Neue Meldung auf %{instance}" #, elixir-format #: lib/web/templates/email/email_changed_old.html.eex:38 @@ -946,7 +948,8 @@ msgstr "Die E-Mail-Adresse für Ihr Konto auf %{host} wird geändert in:" #: lib/web/templates/email/password_reset.html.eex:38 msgid "You requested a new password for your account on %{instance}." msgstr "" -"Du hast ein neues Passwort für deinen Account auf %{instance} angefragt." +"Du hast ein neues Passwort für deinen Account auf %{instance} " +"angefragt." #, elixir-format #: lib/web/templates/email/email.text.eex:5 @@ -962,11 +965,12 @@ msgstr "Bitte verwenden Sie es nicht für reale Zwecke." msgid "Would you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgid_plural "Would you wish to cancel your attendance to one or several events, visit the event pages through the links above and click the « Attending » button." msgstr[0] "" -"Wenn Du deine Teilnahme absagen musst, gehe einfach über obenstehenden Link " +"Wenn Du die Teilnahme absagen musst, gehe einfach über obenstehenden Link " "auf die Veranstaltungs-Seite und klicke auf den Teilnahme-Button." msgstr[1] "" -"Wenn Du deine Teilnahme absagen musst, gehe einfach über obenstehenden Link " -"auf die Veranstaltungs-Seite und klicke auf den Teilnahme-Button." +"Wenn Du die Teilnahme für ein oder mehrere Veranstaltungen absagen musst, " +"gehe einfach über obenstehenden Link auf die Veranstaltungs-Seite und klicke " +"auf den Teilnahme-Button." #, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:38 @@ -984,7 +988,7 @@ msgstr "%{instance} ist ein Mobilizon-Server." #, elixir-format #: lib/web/templates/email/email.html.eex:142 msgid "%{instance} is powered by Mobilizon." -msgstr "%{instance} ist ein Mobilizon-Server." +msgstr "%{instance} ist ein Mobilizon-Server." #, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:13 @@ -1052,8 +1056,8 @@ msgstr "" "Konto auf %{host} verknüpfte E-Mail-Adresse von dieser zu geändert wurde:" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" "Wenn Sie diese Änderung nicht selbst ausgelöst haben, ist es wahrscheinlich, " @@ -1087,7 +1091,7 @@ msgstr "" #: lib/web/templates/email/email.html.eex:143 #: lib/web/templates/email/email.text.eex:11 msgid "Learn more about Mobilizon here!" -msgstr "Lerne mehr über Mobilizon." +msgstr "Lerne mehr über Mobilizon!" #, elixir-format #: lib/web/templates/email/event_updated.html.eex:94 @@ -1133,7 +1137,7 @@ msgstr "" #: lib/web/templates/email/event_participation_rejected.html.eex:13 #: lib/web/templates/email/event_participation_rejected.text.eex:1 msgid "Sorry! You're not going." -msgstr "Entschuldigen Sie! Sie sind nicht dabei." +msgstr "Schade! Sie sind nicht dabei." #, elixir-format #: lib/web/templates/email/event_updated.html.eex:74 @@ -1149,8 +1153,8 @@ msgstr "Start %{begins_on}" #: lib/web/templates/email/event_updated.text.eex:3 msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -"Es haben sich Änderungen für %{title} daher dachten wir, wir lassen es Sie " -"wissen." +"Es gibt Änderungen für %{title}. Wir dachten daher, das könnte für Dich " +"interessant sein." #, elixir-format #: lib/web/templates/email/event_updated.html.eex:55 @@ -1170,8 +1174,8 @@ msgstr "Veranstaltung wurde bestätigt" #: lib/web/templates/email/event_updated.text.eex:9 msgid "This event has yet to be confirmed: organizers will let you know if they do confirm it." msgstr "" -"Diese Veranstaltung muss noch bestätigt werden: Die Organisatoren werden Sie " -"informieren, wenn sie sie bestätigen." +"Diese Veranstaltung muss noch bestätigt werden: Die Organisatorinnen werden " +"Dich nach der Bestätigung informieren." #, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:45 @@ -1192,7 +1196,7 @@ msgstr "Meldung ansehen" #, elixir-format #: lib/web/templates/email/report.text.eex:24 msgid "View report:" -msgstr "Meldung ansehen" +msgstr "Meldung ansehen:" #, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:58 @@ -1432,9 +1436,8 @@ msgstr "Unsere Verantwortung" msgctxt "terms" msgid "Retain server logs containing the IP address of all requests to this server, insofar as such logs are kept, no more than 90 days." msgstr "" -"Bewahren Sie Serverprotokolle, die die IP-Adresse aller Anfragen an diesen " -"Server enthalten, sofern solche Protokolle geführt werden, nicht länger als " -"90 Tage auf." +"Serverprotokolle mit den IP-Adressen aller Anfragen an diesen Server werden " +"nach 90 Tagen gelöscht, sofern solche Protokolle geführt werden." #, elixir-format #: lib/web/templates/api/privacy.html.eex:3 @@ -1556,10 +1559,10 @@ msgstr "" msgctxt "terms" msgid "Your content may be downloaded by other instances in the network. Your public events and comments are delivered to the instances following your own instance. Content created through a group is forwarded to all the instances of all the members of the group, insofar as these members reside on a different instance than this one." msgstr "" -"Ihre Inhalte können von anderen Instanzen im Netzwerk heruntergeladen " -"werden. Ihre öffentlichen Ereignisse und Kommentare werden an die Instanzen " -"geliefert, die Ihrer eigenen Instanz folgen. Inhalte, die über eine Gruppe " -"erstellt werden, werden an alle Instanzen aller Mitglieder der Gruppe " +"Deine Inhalte können von anderen Instanzen im Netzwerk heruntergeladen " +"werden. Deine öffentlichen Veranstaltungen und Kommentare werden an die " +"Instanzen ausgeliefert, die Deiner Instanz folgen. Inhalte, die über eine " +"Gruppe erstellt wurden, werden an alle Instanzen aller Mitglieder der Gruppe " "weitergeleitet, sofern sich diese Mitglieder auf einer anderen Instanz als " "dieser befinden." @@ -1574,7 +1577,7 @@ msgstr "" #: lib/web/templates/email/event_participation_approved.html.eex:38 #: lib/web/templates/email/event_participation_confirmed.html.eex:38 msgid "You recently requested to attend %{title}." -msgstr "Du hast angefragt, an der Veranstaltung %{title} teilzunehmen." +msgstr "Du hast angefragt, an der Veranstaltung %{title} teilzunehmen." #, elixir-format #: lib/web/email/participation.ex:91 @@ -1584,8 +1587,7 @@ msgstr "Deine Teilnahme an der Veranstaltung %{title}wurde akzeptiert" #, elixir-format #: lib/web/templates/email/report.html.eex:41 msgid "%{reporter} reported the following content." -msgstr "" -"%{reporter_name} (%{reporter_username}) hat den folgenden Inhalt gemeldet." +msgstr "%{reporter} hat den folgenden Inhalt gemeldet." #, elixir-format #: lib/web/templates/email/report.text.eex:5 @@ -1703,13 +1705,8 @@ msgstr "Veranstaltung" #: lib/web/templates/email/event_updated.html.eex:38 msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -"Es gibt Änderungen für %{title}, also dachten wir, wir lassen Sie das " -"wissen." - -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "Der Mobilizon-Server scheint vorübergehend nicht erreichbar zu sein." +"Es gibt Änderungen für %{title}, also dachten wir, das ist für Dich " +"interessant." #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 @@ -1717,7 +1714,7 @@ msgid "This page is not correct" msgstr "Diese Seite ist nicht korrekt" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "Es tut uns leid, aber auf unserer Seite ist etwas schief gelaufen." @@ -1729,20 +1726,52 @@ msgstr "Dies ist eine Demo-Seite, um die Beta-Version von Mobilizon zu testen." #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" -msgstr "" +msgstr "Feed von %{name}" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" -msgstr "" +msgstr "Privater Veranstaltungsfeed von %{actor} auf %{instance}" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" -msgstr "" +msgstr "Öffentlicher Veranstaltungsfeed von %{actor} auf %{instance}" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" +msgstr "Feed für %{email} auf %{instance}" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" +"Falls das Problem bestehen bleibt, kontaktieren Sie den/die " +"Server-Administrator/in unter %{contact}." + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" +"Falls das Problem bestehen bleibt, versuchen Sie den/die " +"Server-Administrator/in zu kontaktieren." + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "Technische Details" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" +"Der Mobilizon-Server %{instance} scheint vorübergehend nicht erreichbar zu " +"sein." + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" msgstr "" diff --git a/priv/gettext/de/LC_MESSAGES/errors.po b/priv/gettext/de/LC_MESSAGES/errors.po index 15697e536..3aaf076ce 100644 --- a/priv/gettext/de/LC_MESSAGES/errors.po +++ b/priv/gettext/de/LC_MESSAGES/errors.po @@ -8,16 +8,17 @@ ## to merge POT files into PO files. msgid "" msgstr "" -"PO-Revision-Date: 2020-12-17 10:26+0000\n" -"Last-Translator: Kate \n" +"PO-Revision-Date: 2021-02-08 11:01+0000\n" +"Last-Translator: Valentin Bachem \n" "Language-Team: German \n" "Language: de\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.1\n" +"X-Generator: Weblate 4.4.2\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "darf nicht leer sein" @@ -55,28 +56,28 @@ msgstr[1] "sollten %{count} Zeichen sein" msgid "should have %{count} item(s)" msgid_plural "should have %{count} item(s)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sollte ein Stück haben" +msgstr[1] "sollte %{count} Stück haben" msgid "should be at least %{count} character(s)" msgid_plural "should be at least %{count} character(s)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sollte mindestens ein Zeichen haben" +msgstr[1] "sollte mindestens %{count} Zeichen haben" msgid "should have at least %{count} item(s)" msgid_plural "should have at least %{count} item(s)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sollte mindestens einen Artikel haben" +msgstr[1] "sollte mindestens %{count} Artikel haben" msgid "should be at most %{count} character(s)" msgid_plural "should be at most %{count} character(s)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sollte höchstens ein Zeichen haben" +msgstr[1] "sollte höchstens %{count} Zeichen haben" msgid "should have at most %{count} item(s)" msgid_plural "should have at most %{count} item(s)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sollte maximal einen Artikel haben" +msgstr[1] "sollte maximal %{count} Artikel haben" msgid "must be less than %{number}" msgstr "muss kleiner sein als %{number}" @@ -94,206 +95,207 @@ msgid "must be equal to %{number}" msgstr "muss gleich %{number} sein" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "Der Token konnte nicht aktualisiert werden" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "Aktuelles Profil ist nicht Mitglied dieser Gruppe" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "Aktuelles Profil ist kein Administrator der ausgewählten Gruppe" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "Fehler beim Speichern von Benutzereinstellungen" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "Gruppe nicht gefunden" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "Gruppe mit der ID %{id} nicht gefunden" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" "Die Authentifizierung ist nicht möglich, entweder Ihre E-Mail oder Ihr " "Passwort sind ungültig." #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "Mitglied wurde nicht gefunden" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "Kein Profil für den Moderator-Benutzer gefunden" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" "Es wurde kein Benutzer gefunden, der mit dieser E-Mail validiert werden kann" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "Es wurde kein Benutzer mit dieser E-Mail gefunden" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "Profil ist nicht im Besitz des authentifizierten Benutzers" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "Registrierungen sind nicht geöffnet" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "Das aktuelle Passwort ist ungültig" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "Die neue E-Mail scheint nicht gültig zu sein" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "Die neue E-Mail muss anders lauten" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "Das neue Passwort muss anders lauten" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "Das angegebene Passwort ist ungültig" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" "Das von Ihnen gewählte Passwort ist zu kurz. Bitte stellen Sie sicher, dass " "Ihr Passwort mindestens 6 Zeichen enthält." #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "Dieser Benutzer kann sein Passwort nicht zurücksetzen" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "Dieser Benutzer wurde deaktiviert" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "Benutzer kann nicht validiert werden" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "Benutzer bereits deaktiviert" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "Angeforderter Benutzer ist nicht eingeloggt" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "Sie sind bereits Mitglied in dieser Gruppe" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" "Sie können diese Gruppe nicht verlassen, da Sie der einzige Administrator " "sind" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "Sie können dieser Gruppe nicht beitreten" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "Sie dürfen keine Gruppen auflisten, es sei denn, Sie sind Moderator." #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "Sie müssen eingeloggt sein, um Ihre E-Mail zu ändern" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "Sie müssen eingeloggt sein, um Ihr Passwort zu ändern" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "Sie müssen eingeloggt sein, um eine Gruppe zu löschen" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "Sie müssen eingeloggt sein, um Ihr Konto zu löschen" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "Sie müssen eingeloggt sein, um einer Gruppe beizutreten" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "Sie müssen eingeloggt sein, um eine Gruppe zu verlassen" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "Sie müssen eingeloggt sein, um eine Gruppe zu aktualisieren" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" "Sie müssen ein bestehendes Token haben, um ein Refresh-Token zu erhalten" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "Sie haben erneut eine Bestätigungs-E-Mail zu früh angefordert" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "Ihre E-Mail ist nicht in der Zulassungsliste enthalten" @@ -343,22 +345,22 @@ msgid "Anonymous participation is not enabled" msgstr "Anonyme Teilnahme ist nicht möglich" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "Der letzte Administrator einer Gruppe kann nicht entfernt werden" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "Kann die letzte Identität eines Benutzers nicht entfernen" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "Kommentar ist bereits gelöscht" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "Diskussion nicht gefunden" @@ -378,8 +380,8 @@ msgid "Event id not found" msgstr "Veranstaltungs-ID nicht gefunden" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "Veranstaltung nicht gefunden" @@ -395,7 +397,7 @@ msgid "Internal Error" msgstr "Interner Fehler" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "Keine Diskussion mit ID %{id}" @@ -405,7 +407,7 @@ msgid "No profile found for user" msgstr "Kein Profil für Benutzer gefunden" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "Kein solches Feed-Token" @@ -422,12 +424,12 @@ msgid "Participant not found" msgstr "Teilnehmer nicht gefunden" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "Person mit ID %{id} nicht gefunden" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "Person mit Benutzernamen %{username} nicht gefunden" @@ -455,30 +457,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "Profil ist nicht Mitglied der Gruppe" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "Profil nicht gefunden" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "Dieses Moderatorenprofil hat keine Berechtigung für diese Veranstaltung" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "Meldung nicht gefunden" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "Ressource ist nicht vorhanden" @@ -504,22 +501,22 @@ msgid "Todo list doesn't exist" msgstr "ToDo-Liste existiert nicht" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "Token existiert nicht" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "Token ist keine gültige UUID" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "User nicht gefunden" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "Sie haben bereits ein Profil für diesen Benutzer" @@ -528,23 +525,18 @@ msgstr "Sie haben bereits ein Profil für diesen Benutzer" msgid "You are already a participant of this event" msgstr "Sie sind bereits ein Teilnehmer dieser Veranstaltung" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "Sie sind kein Mitglied der Gruppe, zu der die Diskussion gehört" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "Sie sind nicht Mitglied in dieser Gruppe" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "Sie sind kein Moderator oder Admin für diese Gruppe" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "Wenn Sie nicht verbunden sind, dürfen Sie keinen Kommentar erstellen" @@ -554,17 +546,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "Sie dürfen kein Feed-Token erstellen, wenn Sie nicht verbunden sind" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "Sie dürfen einen Kommentar nicht löschen, wenn Sie nicht verbunden sind" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "Sie dürfen ein Feed-Token nicht löschen, wenn keine Verbindung besteht" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" "Sie dürfen einen Kommentar nicht aktualisieren, wenn Sie nicht verbunden sind" @@ -578,19 +570,19 @@ msgstr "" "Teilnehmer sind, der die Veranstaltung erstellt" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" "Sie können sich nicht auf eine niedrigere Mitgliedsrolle für diese Gruppe " "einstellen, da Sie der einzige Administrator sind" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "Sie können diesen Kommentar nicht löschen" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "Sie können diese Veranstaltung nicht löschen" @@ -600,12 +592,12 @@ msgid "You cannot invite to this group" msgstr "Sie können nicht in diese Gruppe einladen" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "Sie haben nicht die Berechtigung diesen Token zu löschen" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" "Sie müssen eingeloggt und ein Moderator sein, um Aktionsprotokolle " @@ -629,38 +621,38 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "Sie müssen eingeloggt und ein Moderator sein, um einen Bericht zu sehen" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" "Sie müssen angemeldet und ein Administrator sein, um auf die Admin-" "Einstellungen zugreifen zu können" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" "Sie müssen angemeldet und ein Administrator sein, um auf die Dashboard-" "Statistiken zugreifen zu können" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" "Sie müssen eingeloggt und ein Administrator sein, um Admin-Einstellungen zu " "speichern" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "Sie müssen eingeloggt sein, um auf Diskussionen zugreifen zu können" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "Sie müssen eingeloggt sein, um auf Ressourcen zugreifen zu können" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "Sie müssen eingeloggt sein, um Ereignisse zu erstellen" @@ -675,12 +667,12 @@ msgid "You need to be logged-in to create reports" msgstr "Sie müssen eingeloggt sein, um Berichte zu erstellen" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "Sie müssen eingeloggt sein, um Ressourcen zu erstellen" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "Sie müssen eingeloggt sein, um ein Ereignis zu löschen" @@ -690,7 +682,7 @@ msgid "You need to be logged-in to delete posts" msgstr "Sie müssen eingeloggt sein, um Beiträge zu löschen" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "Sie müssen eingeloggt sein, um Ressourcen zu löschen" @@ -705,7 +697,7 @@ msgid "You need to be logged-in to leave an event" msgstr "Sie müssen eingeloggt sein, um eine Veranstaltung zu verlassen" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "Sie müssen eingeloggt sein, um ein Ereignis zu aktualisieren" @@ -715,17 +707,17 @@ msgid "You need to be logged-in to update posts" msgstr "Sie müssen eingeloggt sein, um Beiträge zu aktualisieren" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "Sie müssen eingeloggt sein, um Ressourcen zu aktualisieren" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "Sie müssen eingeloggt sein, um eine Ressourcenvorschau zu sehen" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "Die übergeordnete Ressource gehört nicht zu dieser Gruppe" @@ -772,7 +764,7 @@ msgid "Resource not found" msgstr "Ressource nicht gefunden" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "Etwas lief falsch" @@ -792,12 +784,12 @@ msgid "You need to be logged in" msgstr "Sie müssen eingeloggt sein" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "Sie können diese Einladung mit diesem Profil nicht annehmen." #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "Sie können diese Einladung mit diesem Profil nicht ablehnen." @@ -807,32 +799,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "Die Datei hat keinen zulässigen MIME-Typ." #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "Profil ist nicht Administrator für die Gruppe" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "Sie können dieses Ereignis nicht bearbeiten." #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "Sie können dieses Ereignis nicht diesem Profil zuordnen." #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "Diese Einladung gibt es nicht." #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "Dieses Mitglied ist bereits abgelehnt worden." #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "Sie haben nicht das Recht, dieses Mitglied zu entfernen." @@ -842,14 +834,14 @@ msgid "This username is already taken." msgstr "Dieser Benutzername ist bereits vergeben." #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" "Sie müssen entweder eine ID oder einen Slug angeben, um auf eine Diskussion " "zuzugreifen" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "Organizer-Profil ist nicht im Besitz des Benutzers" @@ -859,7 +851,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "Die angegebene Profil-ID ist nicht die des anonymen Profils" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" +msgstr "Das Bild ist zu groß" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "Fehler beim Speichern des Reports" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "Dieses Moderatorenprofil hat keine Berechtigung für diese Veranstaltung" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 125de0f9a..25056224f 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -823,8 +823,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1329,18 +1329,13 @@ msgstr "" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1352,20 +1347,46 @@ msgstr "" #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index dfd9b553b..1f9fda354 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -876,8 +876,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1382,18 +1382,13 @@ msgstr "Event" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1405,20 +1400,46 @@ msgstr "This is a demonstration site to test the beta version of Mobilizon." #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/errors.po b/priv/gettext/en/LC_MESSAGES/errors.po index 8b86938e3..c563dff57 100644 --- a/priv/gettext/en/LC_MESSAGES/errors.po +++ b/priv/gettext/en/LC_MESSAGES/errors.po @@ -11,6 +11,7 @@ msgstr "" "Language: en\n" ## From Ecto.Changeset.cast/4 +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "" @@ -97,198 +98,199 @@ msgid "must be equal to %{number}" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "" @@ -338,22 +340,22 @@ msgid "Anonymous participation is not enabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "" @@ -373,8 +375,8 @@ msgid "Event id not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "" @@ -390,7 +392,7 @@ msgid "Internal Error" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "" @@ -400,7 +402,7 @@ msgid "No profile found for user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "" @@ -417,12 +419,12 @@ msgid "Participant not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "" @@ -448,30 +450,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -497,22 +494,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -521,23 +518,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -547,17 +539,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -568,17 +560,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -588,12 +580,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -613,32 +605,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -653,12 +645,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -668,7 +660,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -683,7 +675,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -693,17 +685,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -748,7 +740,7 @@ msgid "Resource not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -768,12 +760,12 @@ msgid "You need to be logged in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -783,32 +775,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -818,12 +810,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -833,7 +825,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/gettext/errors.pot b/priv/gettext/errors.pot index 1943ac3e6..8cc4bf0f0 100644 --- a/priv/gettext/errors.pot +++ b/priv/gettext/errors.pot @@ -8,6 +8,7 @@ ## date. Leave `msgstr`s empty as changing them here as no ## effect: edit them in PO (`.po`) files instead. ## From Ecto.Changeset.cast/4 +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "" @@ -94,198 +95,199 @@ msgid "must be equal to %{number}" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "" @@ -335,22 +337,22 @@ msgid "Anonymous participation is not enabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "" @@ -370,8 +372,8 @@ msgid "Event id not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "" @@ -387,7 +389,7 @@ msgid "Internal Error" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "" @@ -397,7 +399,7 @@ msgid "No profile found for user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "" @@ -414,12 +416,12 @@ msgid "Participant not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "" @@ -445,30 +447,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -494,22 +491,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -518,23 +515,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -544,17 +536,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -565,17 +557,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -585,12 +577,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -610,32 +602,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -650,12 +642,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -665,7 +657,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -680,7 +672,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -690,17 +682,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -745,7 +737,7 @@ msgid "Resource not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -765,12 +757,12 @@ msgid "You need to be logged in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -780,32 +772,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -815,12 +807,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -830,7 +822,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/default.po b/priv/gettext/es/LC_MESSAGES/default.po index 7a0e5639c..58210c716 100644 --- a/priv/gettext/es/LC_MESSAGES/default.po +++ b/priv/gettext/es/LC_MESSAGES/default.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-24 14:39+0000\n" -"PO-Revision-Date: 2021-01-20 16:18+0000\n" +"PO-Revision-Date: 2021-05-01 10:59+0000\n" "Last-Translator: Berto Te \n" "Language-Team: Spanish \n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4\n" +"X-Generator: Weblate 4.6\n" #: lib/web/templates/email/password_reset.html.eex:48 #, elixir-format @@ -61,7 +61,7 @@ msgstr "Razón" #: lib/web/templates/email/password_reset.html.eex:61 #, elixir-format msgid "Reset Password" -msgstr "Reinicializar la contraseña" +msgstr "Restablecer la contraseña" #: lib/web/templates/email/password_reset.html.eex:41 #, elixir-format @@ -100,7 +100,7 @@ msgstr "Participación aprobada" #: lib/web/templates/email/password_reset.text.eex:1 #, elixir-format msgid "Password reset" -msgstr "Restablecer contraseña" +msgstr "Restablecer la contraseña" #: lib/web/templates/email/password_reset.text.eex:7 #, elixir-format @@ -663,8 +663,8 @@ msgctxt "terms" msgid "Here are the important things you need to know about accessing and using the %{instance_name} (%{instance_url}) website and service (collectively, \"Service\"). These are our terms of service (\"Terms\"). Please read them carefully." msgstr "" "Estas son las cosas importantes que necesita saber sobre el acceso y uso de " -"% {instance_name} (% " -"{instance_url} ) sitio web y servicio (colectivamente, \"Servicio\"). " +" %{instance_name} ( " +"%{instance_url} ) sitio web y servicio (colectivamente, \"Servicio\"). " "Estos son nuestros términos de servicio (\"Términos\"). Por favor, léalos " "atentamente." @@ -714,9 +714,9 @@ msgstr "" msgctxt "terms" msgid "These Terms constitute the entire agreement between you and %{instance_name} regarding the use of the Service, superseding any prior agreements between you and %{instance_name} relating to your use of the Service." msgstr "" -"Estos Términos constituyen el acuerdo completo entre usted y % " -"{instance_name} con respecto al uso del Servicio, reemplazando " -"cualquier acuerdo previo entre usted y % {instance_name} relacionado " +"Estos Términos constituyen el acuerdo completo entre usted y " +"%{instance_name} con respecto al uso del Servicio, reemplazando " +"cualquier acuerdo previo entre usted y %{instance_name} relacionado " "con su uso de el servicio." #: lib/web/templates/api/terms.html.eex:80 @@ -768,7 +768,7 @@ msgctxt "terms" msgid "We love feedback. Please let us know what you think of the Service, these Terms and, in general, %{instance_name}." msgstr "" "Nos encantan los comentarios. Háganos saber lo que piensa del Servicio, " -"estos Términos y, en general, % {instance_name} ." +"estos Términos y, en general, %{instance_name} ." #: lib/web/templates/api/terms.html.eex:74 #, elixir-format @@ -789,7 +789,7 @@ msgstr "" msgctxt "terms" msgid "%{instance_name} will not use or transmit or resell your personal data" msgstr "" -"% {instance_name} no usará ni transmitirá ni revenderá sus datos " +" %{instance_name} no usará ni transmitirá ni revenderá sus datos " "personales" #: lib/web/templates/api/terms.html.eex:44 @@ -868,14 +868,14 @@ msgstr "" msgctxt "terms" msgid "You must respect other people and %{instance_name}'s rules when using the service" msgstr "" -"Debe respetar las reglas de otras personas y % {instance_name} al " +"Debe respetar las reglas de otras personas y %{instance_name} al " "usar el servicio" #: lib/web/templates/api/terms.html.eex:7 #, elixir-format msgctxt "terms" msgid "You must respect the law when using %{instance_name}" -msgstr "Debe respetar la ley cuando use % {instance_name} " +msgstr "Debe respetar la ley cuando use %{instance_name} " #: lib/web/templates/api/terms.html.eex:5 #, elixir-format @@ -898,7 +898,7 @@ msgstr "Confirme su email" #, elixir-format msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" -"¡Hola! Te acabas de registrar para unirte a este evento: «% {title}». " +"¡Hola! Te acabas de registrar para unirte a este evento: «%{title}». " "Confirme la dirección de correo electrónico que proporcionó:" #: lib/web/templates/email/email.html.eex:114 @@ -911,25 +911,25 @@ msgstr "¿Necesita ayuda? ¿Algo no está funcionando correctamente?" #, elixir-format msgid "You created an account on %{host} with this email address. You are one click away from activating it." msgstr "" -"Creó una cuenta en % {host} con esta dirección de correo " -"electrónico. Estás a un clic de activarlo." +"Creó una cuenta en %{host} con esta dirección de correo electrónico. " +"Estás a un clic de activarlo." #: lib/web/templates/email/report.html.eex:13 #, elixir-format msgid "New report on %{instance}" -msgstr "Nuevo informe sobre % {instancia} " +msgstr "Nuevo informe sobre %{instance} " #: lib/web/templates/email/email_changed_old.html.eex:38 #, elixir-format msgid "The email address for your account on %{host} is being changed to:" msgstr "" -"La dirección de correo electrónico de su cuenta en % {host} se " +"La dirección de correo electrónico de su cuenta en %{host} se " "cambiará a:" #: lib/web/templates/email/password_reset.html.eex:38 #, elixir-format msgid "You requested a new password for your account on %{instance}." -msgstr "Solicitó una nueva contraseña para su cuenta en % {instancia} ." +msgstr "Solicitó una nueva contraseña para su cuenta en %{instance} ." #: lib/web/templates/email/email.text.eex:5 #, elixir-format @@ -948,8 +948,8 @@ msgstr[0] "" "Si necesitas cancelar su participación, sólo accede a la página del evento " "mediante el enlace debajo y presiona el botón." msgstr[1] "" -"Si necesitas cancelar su participación, sólo accede a la página del evento " -"mediante el enlace debajo y presiona el botón." +"Si desea cancelar su participación en uno o varios eventos, visite las " +"páginas de los eventos a través de los enlaces de arriba y presiona el botón." #: lib/web/templates/email/pending_participation_notification.html.eex:38 #: lib/web/templates/email/pending_participation_notification.text.eex:4 @@ -969,7 +969,7 @@ msgstr "%{instance} es un servidor de Mobilizon." #: lib/web/templates/email/email.html.eex:142 #, elixir-format msgid "%{instance} is powered by Mobilizon." -msgstr "%{instancia} es una instancia de Mobilizon." +msgstr "%{instance} es una instancia de Mobilizon." #: lib/web/templates/email/pending_participation_notification.html.eex:13 #: lib/web/templates/email/pending_participation_notification.text.eex:1 @@ -997,7 +997,7 @@ msgstr "Final" #: lib/web/templates/email/event_updated.text.eex:21 #, elixir-format msgid "End %{ends_on}" -msgstr "Final% {ends_on}" +msgstr "Final %{ends_on}" #: lib/web/templates/email/event_updated.html.eex:13 #: lib/web/templates/email/event_updated.text.eex:1 @@ -1024,7 +1024,7 @@ msgstr "" msgid "Hi there! It seems like you wanted to change the email address linked to your account on %{instance}. If you still wish to do so, please click the button below to confirm the change. You will then be able to log in to %{instance} with this new email address." msgstr "" "¡Hola! Parece que desea cambiar la dirección de correo electrónico vinculada " -"a su cuenta en % {instance} . Si aún desea hacerlo, haga clic en el " +"a su cuenta en %{instance} . Si aún desea hacerlo, haga clic en el " "botón de abajo para confirmar el cambio. Luego podrá iniciar sesión en% " "{instance} con esta nueva dirección de correo electrónico." @@ -1033,17 +1033,17 @@ msgstr "" msgid "Hi there! Just a quick note to confirm that the email address linked to your account on %{host} has been changed from this one to:" msgstr "" "¡Hola! Solo una nota rápida para confirmar que la dirección de correo " -"electrónico vinculada a su cuenta en% {host} se ha cambiado de esta a:" +"electrónico vinculada a su cuenta en %{host} se ha cambiado de esta a:" -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 #, elixir-format msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" "Si no activó este cambio usted mismo, es probable que alguien haya obtenido " -"acceso a su cuenta% {host}. Inicie sesión y cambie su contraseña " +"acceso a su cuenta %{host}. Inicie sesión y cambie su contraseña " "inmediatamente. Si no puede iniciar sesión, comuníquese con el administrador " -"en% {host}." +"en %{host}." #: lib/web/templates/email/password_reset.text.eex:12 #, elixir-format @@ -1108,7 +1108,7 @@ msgstr "Razones para informar" #: lib/web/templates/email/report.html.eex:39 #, elixir-format msgid "Someone on %{instance} reported the following content for you to analyze:" -msgstr "Alguien en % {instancia} informó el siguiente contenido:" +msgstr "Alguien en %{instance} informó el siguiente contenido:" #: lib/web/templates/email/event_participation_rejected.html.eex:13 #: lib/web/templates/email/event_participation_rejected.text.eex:1 @@ -1124,12 +1124,12 @@ msgstr "Inicio" #: lib/web/templates/email/event_updated.text.eex:18 #, elixir-format msgid "Start %{begins_on}" -msgstr "Inicio% {starts_on}" +msgstr "Inicio %{begins_on}" #: lib/web/templates/email/event_updated.text.eex:3 #, elixir-format msgid "There have been changes for %{title} so we'd thought we'd let you know." -msgstr "Ha habido cambios para% {title}, así que pensamos en avisarle." +msgstr "Ha habido cambios para %{title}, así que pensamos en avisarle." #: lib/web/templates/email/event_updated.html.eex:55 #: lib/web/templates/email/event_updated.text.eex:11 @@ -1279,13 +1279,13 @@ msgstr "" msgid "%{inviter} just invited you to join their group %{link_start}%{group}%{link_end}" msgstr "" "%{inviter} le acaba de invitar a unirse a su grupo% {link_start} " -"% {group} % {link_end}" +"%{group %{link_end}" #: lib/web/templates/email/group_member_removal.html.eex:38 #, elixir-format msgid "You have been removed from group %{link_start}%{group}%{link_end}. You will not be able to access this group's private content anymore." msgstr "" -"Ha sido eliminado del grupo% {link_start} % {group} % {link_end}. Ya " +"Ha sido eliminado del grupo% {link_start} %{group} % {link_end}. Ya " "no podrá acceder al contenido privado de este grupo." #: lib/web/templates/email/group_suspension.html.eex:54 @@ -1478,11 +1478,11 @@ msgstr "" "instancia de Mobilizon. El software de Mobilizon es proporcionado por el " "equipo de contribuyentes de Mobilizon, respaldado por Framasoft , una organización educativa popular " -"francesa sin fines de lucro que aboga por el Software Libre / Libre . A " -"menos que se indique explícitamente, esta instancia de Mobilizon es un " -"servicio independiente que utiliza el código fuente de Mobilizon. Puede " -"encontrar más información sobre esta instancia en la página \"Acerca de esta instancia\" ." +"francesa sin fines de lucro que aboga por el Software Libre. A menos que se " +"indique explícitamente, esta instancia de Mobilizon es un servicio " +"independiente que utiliza el código fuente de Mobilizon. Puede encontrar más " +"información sobre esta instancia en la página " +"\"Acerca de esta instancia\" ." #: lib/web/templates/api/terms.html.eex:43 #, elixir-format @@ -1492,7 +1492,7 @@ msgstr "" "Cuando crea una cuenta, también acepta mantener la seguridad y " "confidencialidad de su contraseña y acepta todos los riesgos de acceso no " "autorizado a los datos de su cuenta y cualquier otra información que " -"proporcione a % {instance_name} ." +"proporcione a %{instance_name}." #: lib/web/templates/api/terms.html.eex:49 #, elixir-format @@ -1542,7 +1542,7 @@ msgstr "" #: lib/web/templates/email/event_participation_confirmed.html.eex:38 #, elixir-format msgid "You recently requested to attend %{title}." -msgstr "Solicitaste participar en el evento %{title}." +msgstr "Solicitaste participar en el evento%{title}." #: lib/web/email/participation.ex:91 #, elixir-format @@ -1552,9 +1552,7 @@ msgstr "Su participación en el evento %{title} ha sido aprobada" #: lib/web/templates/email/report.html.eex:41 #, elixir-format msgid "%{reporter} reported the following content." -msgstr "" -"% {reporter_name} (% {reporter_username}) informó el siguiente " -"contenido." +msgstr "%{reporter} informó el siguiente contenido." #: lib/web/templates/email/report.text.eex:5 #, elixir-format @@ -1601,7 +1599,7 @@ msgstr "%{name} (%{domain}) sólo solicitó seguir su instancia." #: lib/web/email/follow.ex:54 #, elixir-format msgid "%{name} requests to follow your instance" -msgstr "%{name}solicita seguir tu instancia" +msgstr "%{name} solicita seguir tu instancia" #: lib/web/templates/email/instance_follow.html.eex:38 #, elixir-format @@ -1649,7 +1647,7 @@ msgstr "" #, elixir-format msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" -"¡Hola! Te acabas de registrar para unirte a este evento: «% {title}». " +"¡Hola! Te acabas de registrar para unirte a este evento: «%{title}». " "Confirme la dirección de correo electrónico que proporcionó:" #: lib/web/templates/email/event_participation_rejected.html.eex:38 @@ -1665,19 +1663,14 @@ msgstr "Título del evento" #: lib/web/templates/email/event_updated.html.eex:38 #, elixir-format msgid "There have been changes for %{title} so we'd thought we'd let you know." -msgstr "Ha habido cambios para% {title}, así que pensamos en avisarle." - -#: lib/web/templates/error/500_page.html.eex:46 -#, elixir-format -msgid "The Mobilizon server seems to be temporarily down." -msgstr "El servidor de Mobilizon parece estar temporalmente inactivo." +msgstr "Ha habido cambios para%{title}, así que pensamos en avisarle." #: lib/web/templates/error/500_page.html.eex:7 #, elixir-format msgid "This page is not correct" msgstr "Esta página no es correcta" -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 #, elixir-format msgid "We're sorry, but something went wrong on our end." msgstr "Lo sentimos, pero algo salió mal por nuestra parte." @@ -1689,21 +1682,52 @@ msgid "This is a demonstration site to test Mobilizon." msgstr "Este es un sitio de demostración para probar Mobilizon." #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 #, elixir-format msgid "%{name}'s feed" msgstr "Flujo de %{name}" -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 #, elixir-format msgid "%{actor}'s private events feed on %{instance}" msgstr "Flujo de eventos privados de %{actor} a %{instance}" -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 #, elixir-format msgid "%{actor}'s public events feed on %{instance}" msgstr "Flujo público de eventos de %{actor} a %{instance}" -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 #, elixir-format msgid "Feed for %{email} on %{instance}" msgstr "Flujo para %{email} en %{instance}" + +#: lib/web/templates/error/500_page.html.eex:57 +#, elixir-format +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" +"Si el problema persiste, puede comunicarse con el administrador del servidor " +"en %{contact}." + +#: lib/web/templates/error/500_page.html.eex:55 +#, elixir-format +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" +"Si el problema persiste, puede intentar comunicarse con el administrador del " +"servidor." + +#: lib/web/templates/error/500_page.html.eex:68 +#, elixir-format +msgid "Technical details" +msgstr "Detalles técnicos" + +#: lib/web/templates/error/500_page.html.eex:52 +#, elixir-format +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" +"El servidor de Mobilizon %{instance} parece estar temporalmente inactivo." + +#: lib/service/export/feed.ex:73 +#, elixir-format +msgid "Public feed for %{instance}" +msgstr "Flujo público para %{instance}" diff --git a/priv/gettext/es/LC_MESSAGES/errors.po b/priv/gettext/es/LC_MESSAGES/errors.po index 8167a4c87..f3d57ba71 100644 --- a/priv/gettext/es/LC_MESSAGES/errors.po +++ b/priv/gettext/es/LC_MESSAGES/errors.po @@ -8,7 +8,7 @@ ## to merge POT files into PO files. msgid "" msgstr "" -"PO-Revision-Date: 2021-01-20 16:18+0000\n" +"PO-Revision-Date: 2021-03-27 07:14+0000\n" "Last-Translator: Berto Te \n" "Language-Team: Spanish \n" @@ -16,8 +16,9 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4\n" +"X-Generator: Weblate 4.5.1\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "no pueden estar vacíos" @@ -93,764 +94,780 @@ msgstr "debe ser mayor o igual que% {number}" msgid "must be equal to %{number}" msgstr "debe ser igual a% {number}" -#: lib/graphql/resolvers/user.ex:103 #, elixir-format +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "No se puede actualizar el token" -#: lib/graphql/resolvers/group.ex:195 #, elixir-format +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "El perfil actual no es miembro de este grupo" -#: lib/graphql/resolvers/group.ex:199 #, elixir-format +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "El perfil actual no es un administrador del grupo seleccionado" -#: lib/graphql/resolvers/user.ex:512 #, elixir-format +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "Error al guardar los parámetros del usuario" -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 #, elixir-format +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "Grupo no encontrado" -#: lib/graphql/resolvers/group.ex:63 #, elixir-format +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "No se encontró el grupo con ID% {id}" -#: lib/graphql/resolvers/user.ex:83 #, elixir-format +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" "Imposible autenticarse, su correo electrónico o contraseña no son válidos." -#: lib/graphql/resolvers/group.ex:255 #, elixir-format +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "Miembro no encontrado" -#: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 #, elixir-format +#: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "No se encontró el perfil del usuario moderador" -#: lib/graphql/resolvers/user.ex:195 #, elixir-format +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "No se encontró ningún usuario para validar con este correo electrónico" -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 #, elixir-format +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "No se encontró ningún usuario con este correo electrónico" +#, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 -#, elixir-format +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "El perfil no es propiedad del usuario autenticado" -#: lib/graphql/resolvers/user.ex:125 #, elixir-format +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "Las inscripciones no están abiertas" -#: lib/graphql/resolvers/user.ex:330 #, elixir-format +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "La contraseña actual no es válida" -#: lib/graphql/resolvers/user.ex:382 #, elixir-format +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "El nuevo correo electrónico no parece ser válido" -#: lib/graphql/resolvers/user.ex:379 #, elixir-format +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "El nuevo correo electrónico debe ser diferente" -#: lib/graphql/resolvers/user.ex:333 #, elixir-format +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "La nueva contraseña debe ser diferente" -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 #, elixir-format +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "La contraseña proporcionada no es válida" -#: lib/graphql/resolvers/user.ex:337 #, elixir-format +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" "La contraseña que ha elegido es demasiado corta. Asegúrese de que su " "contraseña contenga al menos 6 caracteres." -#: lib/graphql/resolvers/user.ex:215 #, elixir-format +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "Este usuario no puede restablecer su contraseña" -#: lib/graphql/resolvers/user.ex:79 #, elixir-format +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "Este usuario ha sido inhabilitado" -#: lib/graphql/resolvers/user.ex:179 #, elixir-format +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "No se puede validar al usuario" -#: lib/graphql/resolvers/user.ex:420 #, elixir-format +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "El usuario ya está inhabilitado" -#: lib/graphql/resolvers/user.ex:487 #, elixir-format +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "El usuario solicitado no ha iniciado sesión" -#: lib/graphql/resolvers/group.ex:229 #, elixir-format +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "Ya eres miembro de este grupo" -#: lib/graphql/resolvers/group.ex:262 #, elixir-format +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "No puedes dejar este grupo porque eres el único administrador" -#: lib/graphql/resolvers/group.ex:226 #, elixir-format +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "No puedes unirte a este grupo" -#: lib/graphql/resolvers/group.ex:91 #, elixir-format +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "No puedes enumerar grupos a menos que seas moderador." -#: lib/graphql/resolvers/user.ex:387 #, elixir-format +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "Debes iniciar sesión para cambiar tu correo electrónico" -#: lib/graphql/resolvers/user.ex:345 #, elixir-format +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "Debes iniciar sesión para cambiar tu contraseña" -#: lib/graphql/resolvers/group.ex:204 #, elixir-format +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "Debes iniciar sesión para eliminar un grupo" -#: lib/graphql/resolvers/user.ex:447 #, elixir-format +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "Debes iniciar sesión para eliminar su cuenta" -#: lib/graphql/resolvers/group.ex:234 #, elixir-format +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "Debes iniciar sesión para eliminar su cuenta" -#: lib/graphql/resolvers/group.ex:267 #, elixir-format +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "Debes iniciar sesión para dejar un grupo" -#: lib/graphql/resolvers/group.ex:169 #, elixir-format +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "Debes iniciar sesión para actualizar un grupo" -#: lib/graphql/resolvers/user.ex:108 #, elixir-format +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "Debes tener un token existente para obtener un token de actualización" -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 #, elixir-format +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" "Solicitó de nuevo un correo electrónico de confirmación demasiado pronto" -#: lib/graphql/resolvers/user.ex:128 #, elixir-format +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "Tu correo electrónico no está en la lista de permitidos" -#: lib/graphql/resolvers/actor.ex:64 lib/graphql/resolvers/actor.ex:94 #, elixir-format +#: lib/graphql/resolvers/actor.ex:64 lib/graphql/resolvers/actor.ex:94 msgid "Error while performing background task" msgstr "Error al realizar la tarea en segundo plano" -#: lib/graphql/resolvers/actor.ex:27 #, elixir-format +#: lib/graphql/resolvers/actor.ex:27 msgid "No profile found with this ID" msgstr "No se encontró ningún perfil con este ID" -#: lib/graphql/resolvers/actor.ex:54 lib/graphql/resolvers/actor.ex:91 #, elixir-format +#: lib/graphql/resolvers/actor.ex:54 lib/graphql/resolvers/actor.ex:91 msgid "No remote profile found with this ID" msgstr "No se encontró ningún perfil remoto con este ID" -#: lib/graphql/resolvers/actor.ex:69 #, elixir-format +#: lib/graphql/resolvers/actor.ex:69 msgid "Only moderators and administrators can suspend a profile" msgstr "Solo los moderadores y administradores pueden suspender un perfil" -#: lib/graphql/resolvers/actor.ex:99 #, elixir-format +#: lib/graphql/resolvers/actor.ex:99 msgid "Only moderators and administrators can unsuspend a profile" msgstr "" "Solo los moderadores y administradores pueden anular la suspensión de un " "perfil" -#: lib/graphql/resolvers/actor.ex:24 #, elixir-format +#: lib/graphql/resolvers/actor.ex:24 msgid "Only remote profiles may be refreshed" msgstr "Solo se pueden actualizar los perfiles remotos" -#: lib/graphql/resolvers/actor.ex:61 #, elixir-format +#: lib/graphql/resolvers/actor.ex:61 msgid "Profile already suspended" msgstr "Perfil ya suspendido" -#: lib/graphql/resolvers/participant.ex:92 #, elixir-format +#: lib/graphql/resolvers/participant.ex:92 msgid "A valid email is required by your instance" msgstr "Su instancia requiere un correo electrónico válido" -#: lib/graphql/resolvers/participant.ex:86 #, elixir-format +#: lib/graphql/resolvers/participant.ex:86 msgid "Anonymous participation is not enabled" msgstr "La participación anónima no está habilitada" -#: lib/graphql/resolvers/person.ex:192 #, elixir-format +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "No se puede eliminar al último administrador de un grupo" -#: lib/graphql/resolvers/person.ex:189 #, elixir-format +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "No se puede eliminar la última identidad de un usuario" -#: lib/graphql/resolvers/comment.ex:105 #, elixir-format +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "El comentario ya está eliminado" -#: lib/graphql/resolvers/discussion.ex:62 #, elixir-format +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "Discusión no encontrada" -#: lib/graphql/resolvers/report.ex:58 lib/graphql/resolvers/report.ex:77 #, elixir-format +#: lib/graphql/resolvers/report.ex:58 lib/graphql/resolvers/report.ex:77 msgid "Error while saving report" msgstr "Error al guardar el informe" -#: lib/graphql/resolvers/report.ex:96 #, elixir-format +#: lib/graphql/resolvers/report.ex:96 msgid "Error while updating report" msgstr "Error al actualizar el informe" -#: lib/graphql/resolvers/participant.ex:127 #, elixir-format +#: lib/graphql/resolvers/participant.ex:127 msgid "Event id not found" msgstr "ID de evento no encontrado" -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 #, elixir-format +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "Evento no encontrado" +#, elixir-format #: lib/graphql/resolvers/participant.ex:83 #: lib/graphql/resolvers/participant.ex:124 lib/graphql/resolvers/participant.ex:156 -#, elixir-format msgid "Event with this ID %{id} doesn't exist" msgstr "El evento con este ID%{id} no existe" -#: lib/graphql/resolvers/participant.ex:99 #, elixir-format +#: lib/graphql/resolvers/participant.ex:99 msgid "Internal Error" msgstr "Error interno" -#: lib/graphql/resolvers/discussion.ex:186 #, elixir-format +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "Sin discusión con ID%{id}" -#: lib/graphql/resolvers/todos.ex:78 lib/graphql/resolvers/todos.ex:168 #, elixir-format +#: lib/graphql/resolvers/todos.ex:78 lib/graphql/resolvers/todos.ex:168 msgid "No profile found for user" msgstr "No se encontró perfil para el usuario" -#: lib/graphql/resolvers/feed_token.ex:63 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "No existe tal token de alimentación" -#: lib/graphql/resolvers/participant.ex:237 #, elixir-format +#: lib/graphql/resolvers/participant.ex:237 msgid "Participant already has role %{role}" msgstr "El participante ya tiene el rol%{role}" +#, elixir-format #: lib/graphql/resolvers/participant.ex:169 #: lib/graphql/resolvers/participant.ex:198 lib/graphql/resolvers/participant.ex:230 #: lib/graphql/resolvers/participant.ex:240 -#, elixir-format msgid "Participant not found" msgstr "Participante no encontrado" -#: lib/graphql/resolvers/person.ex:29 #, elixir-format +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "Persona con ID%{id} no encontrada" -#: lib/graphql/resolvers/person.ex:51 #, elixir-format +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "Persona con nombre de usuario %{username} no encontrada" -#: lib/graphql/resolvers/post.ex:167 lib/graphql/resolvers/post.ex:200 #, elixir-format +#: lib/graphql/resolvers/post.ex:167 lib/graphql/resolvers/post.ex:200 msgid "Post ID is not a valid ID" msgstr "La ID de publicación no es válida" -#: lib/graphql/resolvers/post.ex:170 lib/graphql/resolvers/post.ex:203 #, elixir-format +#: lib/graphql/resolvers/post.ex:170 lib/graphql/resolvers/post.ex:203 msgid "Post doesn't exist" msgstr "La publicación no existe" -#: lib/graphql/resolvers/member.ex:83 #, elixir-format +#: lib/graphql/resolvers/member.ex:83 msgid "Profile invited doesn't exist" msgstr "El perfil invitado no existe" -#: lib/graphql/resolvers/member.ex:92 lib/graphql/resolvers/member.ex:96 #, elixir-format +#: lib/graphql/resolvers/member.ex:92 lib/graphql/resolvers/member.ex:96 msgid "Profile is already a member of this group" msgstr "Perfil ya es miembro de este grupo" +#, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 -#, elixir-format msgid "Profile is not member of group" msgstr "El perfil no es miembro del grupo" -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 #, elixir-format +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "Perfil no encontrado" -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 #, elixir-format -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "El perfil de moderador proporcionado no tiene permiso para este evento" - #: lib/graphql/resolvers/report.ex:36 -#, elixir-format msgid "Report not found" msgstr "Informe no encontrado" -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 #, elixir-format +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "El recurso no existe" -#: lib/graphql/resolvers/participant.ex:120 #, elixir-format +#: lib/graphql/resolvers/participant.ex:120 msgid "The event has already reached its maximum capacity" msgstr "El evento ya alcanzó su capacidad máxima" -#: lib/graphql/resolvers/participant.ex:260 #, elixir-format +#: lib/graphql/resolvers/participant.ex:260 msgid "This token is invalid" msgstr "Este token no es válido" -#: lib/graphql/resolvers/todos.ex:165 lib/graphql/resolvers/todos.ex:219 #, elixir-format +#: lib/graphql/resolvers/todos.ex:165 lib/graphql/resolvers/todos.ex:219 msgid "Todo doesn't exist" msgstr "Todo no existe" +#, elixir-format #: lib/graphql/resolvers/todos.ex:75 lib/graphql/resolvers/todos.ex:191 #: lib/graphql/resolvers/todos.ex:216 -#, elixir-format msgid "Todo list doesn't exist" msgstr "La lista de tareas pendientes no existe" -#: lib/graphql/resolvers/feed_token.ex:69 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "El token no existe" -#: lib/graphql/resolvers/feed_token.ex:66 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "El token no es un UUID válido" -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 #, elixir-format +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "Usuario no encontrado" -#: lib/graphql/resolvers/person.ex:252 #, elixir-format +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "Ya tienes un perfil para este usuario" -#: lib/graphql/resolvers/participant.ex:130 #, elixir-format +#: lib/graphql/resolvers/participant.ex:130 msgid "You are already a participant of this event" msgstr "Ya eres participante de este evento" -#: lib/graphql/resolvers/discussion.ex:190 #, elixir-format -msgid "You are not a member of the group the discussion belongs to" -msgstr "No eres miembro del grupo al que pertenece la discusión" - #: lib/graphql/resolvers/member.ex:86 -#, elixir-format msgid "You are not a member of this group" msgstr "no eres un miembro de este grupo" -#: lib/graphql/resolvers/member.ex:151 #, elixir-format +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "No eres moderador ni administrador de este grupo" -#: lib/graphql/resolvers/comment.ex:51 #, elixir-format +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "No está permitido crear un comentario si no está conectado" -#: lib/graphql/resolvers/feed_token.ex:41 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:41 msgid "You are not allowed to create a feed token if not connected" msgstr "No puede crear un token de feed si no está conectado" -#: lib/graphql/resolvers/comment.ex:110 #, elixir-format +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "No puede eliminar un comentario si no está conectado" -#: lib/graphql/resolvers/feed_token.ex:78 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "No puede eliminar un token de feed si no está conectado" -#: lib/graphql/resolvers/comment.ex:73 #, elixir-format +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "No se le permite actualizar un comentario si no está conectado" +#, elixir-format #: lib/graphql/resolvers/participant.ex:163 #: lib/graphql/resolvers/participant.ex:192 -#, elixir-format msgid "You can't leave event because you're the only event creator participant" msgstr "" "No puedes abandonar el evento porque eres el único participante creador del " "evento" -#: lib/graphql/resolvers/member.ex:155 #, elixir-format +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" "No puede establecerse en un rol de miembro inferior para este grupo porque " "es el único administrador" -#: lib/graphql/resolvers/comment.ex:101 #, elixir-format +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "No puedes borrar este comentario" -#: lib/graphql/resolvers/event.ex:276 #, elixir-format +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "No puedes borrar este evento" -#: lib/graphql/resolvers/member.ex:89 #, elixir-format +#: lib/graphql/resolvers/member.ex:89 msgid "You cannot invite to this group" msgstr "No puedes invitar a este grupo" -#: lib/graphql/resolvers/feed_token.ex:72 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "No tienes permiso para eliminar este token" -#: lib/graphql/resolvers/admin.ex:52 #, elixir-format +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" "Debe iniciar sesión y un moderador para enumerar los registros de acción" -#: lib/graphql/resolvers/report.ex:26 #, elixir-format +#: lib/graphql/resolvers/report.ex:26 msgid "You need to be logged-in and a moderator to list reports" msgstr "Debe iniciar sesión y un moderador para enumerar los informes" -#: lib/graphql/resolvers/report.ex:101 #, elixir-format +#: lib/graphql/resolvers/report.ex:101 msgid "You need to be logged-in and a moderator to update a report" msgstr "Debe iniciar sesión y ser un moderador para actualizar un informe" -#: lib/graphql/resolvers/report.ex:41 #, elixir-format +#: lib/graphql/resolvers/report.ex:41 msgid "You need to be logged-in and a moderator to view a report" msgstr "Debe iniciar sesión y ser un moderador para actualizar un informe" -#: lib/graphql/resolvers/admin.ex:236 #, elixir-format +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" "Debe iniciar sesión y ser administrador para acceder a la configuración de " "administrador" -#: lib/graphql/resolvers/admin.ex:221 #, elixir-format +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" "Debe iniciar sesión y ser administrador para acceder a las estadísticas del " "panel" -#: lib/graphql/resolvers/admin.ex:260 #, elixir-format +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" "Debe iniciar sesión y ser administrador para acceder a las estadísticas del " "panel" -#: lib/graphql/resolvers/discussion.ex:76 #, elixir-format +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "Debe iniciar sesión para acceder a las discusiones" -#: lib/graphql/resolvers/resource.ex:93 #, elixir-format +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "Debes iniciar sesión para acceder a los recursos" -#: lib/graphql/resolvers/event.ex:211 #, elixir-format +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "Debes iniciar sesión para crear eventos" -#: lib/graphql/resolvers/post.ex:140 #, elixir-format +#: lib/graphql/resolvers/post.ex:140 msgid "You need to be logged-in to create posts" msgstr "Debes iniciar sesión para crear publicaciones" -#: lib/graphql/resolvers/report.ex:74 #, elixir-format +#: lib/graphql/resolvers/report.ex:74 msgid "You need to be logged-in to create reports" msgstr "Debe iniciar sesión para crear informes" -#: lib/graphql/resolvers/resource.ex:129 #, elixir-format +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "Debe iniciar sesión para crear recursos" -#: lib/graphql/resolvers/event.ex:285 #, elixir-format +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "Debe iniciar sesión para eliminar un evento" -#: lib/graphql/resolvers/post.ex:211 #, elixir-format +#: lib/graphql/resolvers/post.ex:211 msgid "You need to be logged-in to delete posts" msgstr "Debes iniciar sesión para eliminar publicaciones" -#: lib/graphql/resolvers/resource.ex:187 #, elixir-format +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "Debes iniciar sesión para eliminar recursos" -#: lib/graphql/resolvers/participant.ex:104 #, elixir-format +#: lib/graphql/resolvers/participant.ex:104 msgid "You need to be logged-in to join an event" msgstr "Debes iniciar sesión para eliminar recursos" -#: lib/graphql/resolvers/participant.ex:203 #, elixir-format +#: lib/graphql/resolvers/participant.ex:203 msgid "You need to be logged-in to leave an event" msgstr "Debes iniciar sesión para salir de un evento" -#: lib/graphql/resolvers/event.ex:250 #, elixir-format +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "Debe iniciar sesión para actualizar un evento" -#: lib/graphql/resolvers/post.ex:178 #, elixir-format +#: lib/graphql/resolvers/post.ex:178 msgid "You need to be logged-in to update posts" msgstr "Debes iniciar sesión para actualizar las publicaciones" -#: lib/graphql/resolvers/resource.ex:158 #, elixir-format +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "Debes iniciar sesión para actualizar los recursos" -#: lib/graphql/resolvers/resource.ex:210 #, elixir-format +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "Debe iniciar sesión para ver una vista previa del recurso" -#: lib/graphql/resolvers/resource.ex:121 #, elixir-format +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "El recurso principal no pertenece a este grupo" -#: lib/mobilizon/users/user.ex:109 #, elixir-format +#: lib/mobilizon/users/user.ex:109 msgid "The chosen password is too short." msgstr "La contraseña elegida es demasiado corta." -#: lib/mobilizon/users/user.ex:138 #, elixir-format +#: lib/mobilizon/users/user.ex:138 msgid "The registration token is already in use, this looks like an issue on our side." msgstr "" "El token de registro ya está en uso, esto parece un problema de nuestra " "parte." -#: lib/mobilizon/users/user.ex:104 #, elixir-format +#: lib/mobilizon/users/user.ex:104 msgid "This email is already used." msgstr "Este correo electrónico ya está en uso." -#: lib/graphql/error.ex:88 #, elixir-format +#: lib/graphql/error.ex:88 msgid "Post not found" msgstr "Informe no encontrado" -#: lib/graphql/error.ex:75 #, elixir-format +#: lib/graphql/error.ex:75 msgid "Invalid arguments passed" msgstr "Se pasaron argumentos no válidos" -#: lib/graphql/error.ex:81 #, elixir-format +#: lib/graphql/error.ex:81 msgid "Invalid credentials" msgstr "Credenciales no válidas" -#: lib/graphql/error.ex:79 #, elixir-format +#: lib/graphql/error.ex:79 msgid "Reset your password to login" msgstr "Restablezca su contraseña para iniciar sesión" -#: lib/graphql/error.ex:86 lib/graphql/error.ex:91 #, elixir-format +#: lib/graphql/error.ex:86 lib/graphql/error.ex:91 msgid "Resource not found" msgstr "Recurso no encontrado" -#: lib/graphql/error.ex:92 #, elixir-format +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "Algo salió mal" -#: lib/graphql/error.ex:74 #, elixir-format +#: lib/graphql/error.ex:74 msgid "Unknown Resource" msgstr "Recurso desconocido" -#: lib/graphql/error.ex:84 #, elixir-format +#: lib/graphql/error.ex:84 msgid "You don't have permission to do this" msgstr "No tienes permiso para hacer esto" -#: lib/graphql/error.ex:76 #, elixir-format +#: lib/graphql/error.ex:76 msgid "You need to be logged in" msgstr "Debes iniciar sesión" -#: lib/graphql/resolvers/member.ex:116 #, elixir-format +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "No puedes aceptar esta invitación con este perfil." -#: lib/graphql/resolvers/member.ex:134 #, elixir-format +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "No puedes rechazar esta invitación con este perfil." -#: lib/graphql/resolvers/media.ex:62 #, elixir-format +#: lib/graphql/resolvers/media.ex:62 msgid "File doesn't have an allowed MIME type." msgstr "El archivo no tiene un tipo MIME permitido." -#: lib/graphql/resolvers/group.ex:164 #, elixir-format +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "El perfil no es miembro del grupo" -#: lib/graphql/resolvers/event.ex:239 #, elixir-format +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "No puedes borrar este evento." -#: lib/graphql/resolvers/event.ex:242 #, elixir-format +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "No puedes rechazar esta invitación con este perfil." -#: lib/graphql/resolvers/member.ex:137 #, elixir-format +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "Esta invitación no existe." -#: lib/graphql/resolvers/member.ex:179 #, elixir-format +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "Este miembro ya ha sido rechazado." -#: lib/graphql/resolvers/member.ex:186 #, elixir-format +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "No tiene derecho a eliminar este miembro." -#: lib/mobilizon/actors/actor.ex:351 #, elixir-format +#: lib/mobilizon/actors/actor.ex:351 msgid "This username is already taken." msgstr "Este nombre de usuario ya está en uso." -#: lib/graphql/resolvers/discussion.ex:73 #, elixir-format +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" "Debe proporcionar una identificación o un slug para acceder a una discusión" -#: lib/graphql/resolvers/event.ex:200 #, elixir-format +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "El perfil del organizador no es propiedad del usuario" -#: lib/graphql/resolvers/participant.ex:89 #, elixir-format +#: lib/graphql/resolvers/participant.ex:89 msgid "Profile ID provided is not the anonymous profile one" msgstr "El ID de perfil proporcionado no es el del perfil anónimo" -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 #, elixir-format +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "La imagen proporcionada es demasiado pesada" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "No se encontró el archivo de índice. Necesita recompilar el front-end." + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "Error al crear el recurso" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "Token de activación no válido" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "No se pueden recuperar los detalles del recurso de esta URL." + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "El perfil de moderador proporcionado no tiene permiso para este evento" diff --git a/priv/gettext/fi/LC_MESSAGES/default.po b/priv/gettext/fi/LC_MESSAGES/default.po index 61f948e59..0746805ec 100644 --- a/priv/gettext/fi/LC_MESSAGES/default.po +++ b/priv/gettext/fi/LC_MESSAGES/default.po @@ -14,263 +14,263 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.4\n" -#: lib/web/templates/email/password_reset.html.eex:48 #, elixir-format +#: lib/web/templates/email/password_reset.html.eex:48 msgid "If you didn't request this, please ignore this email. Your password won't change until you access the link below and create a new one." msgstr "" "Jos et lähettänyt pyyntöä, voit jättää tämän viestin huomiotta. Salasanasi " "ei vaihdu, ennen kuin käytät alla olevaa linkkiä ja luot uuden salasanan." -#: lib/web/templates/email/report.html.eex:74 #, elixir-format +#: lib/web/templates/email/report.html.eex:74 msgid "%{title} by %{creator}" msgstr "%{title} luojalta %{creator}" -#: lib/web/templates/email/registration_confirmation.html.eex:58 #, elixir-format +#: lib/web/templates/email/registration_confirmation.html.eex:58 msgid "Activate my account" msgstr "Aktivoi tilini" +#, elixir-format #: lib/web/templates/email/email.html.eex:117 #: lib/web/templates/email/email.text.eex:9 -#, elixir-format msgid "Ask the community on Framacolibri" msgstr "Kysy yhteisöltä Framacolibrissa" -#: lib/web/templates/email/report.text.eex:15 #, elixir-format +#: lib/web/templates/email/report.text.eex:15 msgid "Comments" msgstr "Kommentit" +#, elixir-format #: lib/web/templates/email/report.html.eex:72 #: lib/web/templates/email/report.text.eex:11 -#, elixir-format msgid "Event" msgstr "Tapahtuma" -#: lib/web/email/user.ex:48 #, elixir-format +#: lib/web/email/user.ex:48 msgid "Instructions to reset your password on %{instance}" msgstr "Ohjeet salasanan palauttamiseen palvelimella %{instance}" -#: lib/web/templates/email/report.text.eex:21 #, elixir-format +#: lib/web/templates/email/report.text.eex:21 msgid "Reason" msgstr "Syy" -#: lib/web/templates/email/password_reset.html.eex:61 #, elixir-format +#: lib/web/templates/email/password_reset.html.eex:61 msgid "Reset Password" msgstr "Palauta salasana" -#: lib/web/templates/email/password_reset.html.eex:41 #, elixir-format +#: lib/web/templates/email/password_reset.html.eex:41 msgid "Resetting your password is easy. Just press the button below and follow the instructions. We'll have you up and running in no time." msgstr "" "Salasana on helppo palauttaa. Paina alla olevaa painiketta ja noudata " "ohjeita. Pääset tuota pikaa jatkamaan käyttöä." -#: lib/web/email/user.ex:28 #, elixir-format +#: lib/web/email/user.ex:28 msgid "Instructions to confirm your Mobilizon account on %{instance}" msgstr "Ohjeet Mobilizon-tilin vahvistamiseen palvelimella %{instance}" -#: lib/web/email/admin.ex:24 #, elixir-format +#: lib/web/email/admin.ex:24 msgid "New report on Mobilizon instance %{instance}" msgstr "Uusi raportti Mobilizon-palvelimella %{instance}" +#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:51 #: lib/web/templates/email/before_event_notification.text.eex:4 -#, elixir-format msgid "Go to event page" msgstr "Siirry tapahtuman sivulle" -#: lib/web/templates/email/report.text.eex:1 #, elixir-format +#: lib/web/templates/email/report.text.eex:1 msgid "New report from %{reporter} on %{instance}" msgstr "Uusi raportti käyttäjältä %{reporter} palvelimella %{instance}" -#: lib/web/templates/email/event_participation_approved.text.eex:1 #, elixir-format +#: lib/web/templates/email/event_participation_approved.text.eex:1 msgid "Participation approved" msgstr "Osallistuminen hyväksytty" +#, elixir-format #: lib/web/templates/email/password_reset.html.eex:13 #: lib/web/templates/email/password_reset.text.eex:1 -#, elixir-format msgid "Password reset" msgstr "Salasanan palautus" -#: lib/web/templates/email/password_reset.text.eex:7 #, elixir-format +#: lib/web/templates/email/password_reset.text.eex:7 msgid "Resetting your password is easy. Just click the link below and follow the instructions. We'll have you up and running in no time." msgstr "" "Salasana on helppo palauttaa. Paina alla olevaa linkkiä ja noudata ohjeita. " "Pääset tuota pikaa jatkamaan käyttöä." -#: lib/web/templates/email/registration_confirmation.text.eex:5 #, elixir-format +#: lib/web/templates/email/registration_confirmation.text.eex:5 msgid "You created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email." msgstr "" "Loit palvelimelle %{host} tilin tällä sähköpostiosoitteella. Aktivoi se " "yhdellä napsautuksella. Jos et luonut tiliä itse, voit jättää tämän viestin " "huomiotta." -#: lib/web/email/participation.ex:112 #, elixir-format +#: lib/web/email/participation.ex:112 msgid "Your participation to event %{title} has been approved" msgstr "Osallistumisesi tapahtumaan %{title} on hyväksytty" -#: lib/web/email/participation.ex:70 #, elixir-format +#: lib/web/email/participation.ex:70 msgid "Your participation to event %{title} has been rejected" msgstr "Osallistumisesi tapahtumaan %{title) on hylätty" -#: lib/web/email/event.ex:37 #, elixir-format +#: lib/web/email/event.ex:37 msgid "Event %{title} has been updated" msgstr "Tapahtumaa %{title} on päivitetty" -#: lib/web/templates/email/event_updated.text.eex:15 #, elixir-format +#: lib/web/templates/email/event_updated.text.eex:15 msgid "New title: %{title}" msgstr "Uusi otsikko: %{title}" -#: lib/web/templates/email/password_reset.text.eex:5 #, elixir-format +#: lib/web/templates/email/password_reset.text.eex:5 msgid "You requested a new password for your account on %{instance}." msgstr "Pyysit uutta salasanaa tilillesi palvelimella %{instance}." -#: lib/web/templates/email/email.html.eex:85 #, elixir-format +#: lib/web/templates/email/email.html.eex:85 msgid "Warning" msgstr "Varoitus" -#: lib/web/email/participation.ex:135 #, elixir-format +#: lib/web/email/participation.ex:135 msgid "Confirm your participation to event %{title}" msgstr "Vahvista osallistumisesi tapahtumaan %{title}" -#: lib/web/templates/api/privacy.html.eex:75 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:75 msgctxt "terms" msgid "An internal ID for your current selected identity" msgstr "Valittuna olevan identiteettisi sisäinen tunniste" -#: lib/web/templates/api/privacy.html.eex:74 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:74 msgctxt "terms" msgid "An internal user ID" msgstr "Sisäinen käyttäjätunniste" -#: lib/web/templates/api/privacy.html.eex:37 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:37 msgctxt "terms" msgid "Any of the information we collect from you may be used in the following ways:" msgstr "Kaikkia sinulta kerättäviä tietoja voidaan käyttää seuraavin tavoin:" -#: lib/web/templates/api/privacy.html.eex:9 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:9 msgctxt "terms" msgid "Basic account information" msgstr "Tilin perustiedot" -#: lib/web/templates/api/privacy.html.eex:25 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:25 msgctxt "terms" msgid "Do not share any dangerous information over Mobilizon." msgstr "Älä jaa vaarallisia tietoja Mobilizonin kautta." -#: lib/web/templates/api/privacy.html.eex:90 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:90 msgctxt "terms" msgid "Do we disclose any information to outside parties?" msgstr "Luovutetaanko tietoja ulkopuolisille?" -#: lib/web/templates/api/privacy.html.eex:68 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:68 msgctxt "terms" msgid "Do we use cookies?" msgstr "Käytetäänkö evästeitä?" -#: lib/web/templates/api/privacy.html.eex:51 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:51 msgctxt "terms" msgid "How do we protect your information?" msgstr "Kuinka tietojasi suojataan?" -#: lib/web/templates/api/privacy.html.eex:29 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:29 msgctxt "terms" msgid "IPs and other metadata" msgstr "IP-osoitteet ja muu metadata" -#: lib/web/templates/api/privacy.html.eex:17 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:17 msgctxt "terms" msgid "Published events and comments" msgstr "Julkaistut tapahtumat ja kommentit" -#: lib/web/templates/api/privacy.html.eex:64 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:64 msgctxt "terms" msgid "Retain the IP addresses associated with registered users no more than 12 months." msgstr "" "Säilyttämään rekisteröityjen käyttäjien IP-osoitteita enintään 12 kuukautta." -#: lib/web/templates/api/privacy.html.eex:76 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:76 msgctxt "terms" msgid "Tokens to authenticate you" msgstr "Tunnistautumismerkkisi" -#: lib/web/templates/api/privacy.html.eex:31 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:31 msgctxt "terms" msgid "We also may retain server logs which include the IP address of every request to our server." msgstr "" "Myös palvelinlokeja, jotka sisältävät jokaisen palvelimelle tehdyn pyynnön " "IP-osoitteen, saatetaan säilyttää." -#: lib/web/templates/api/privacy.html.eex:70 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:70 msgctxt "terms" msgid "We store the following information on your device when you connect:" msgstr "Kun muodostat yhteyden, laitteellesi tallennetaan seuraavat tiedot:" -#: lib/web/templates/api/privacy.html.eex:58 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:58 msgctxt "terms" msgid "We will make a good faith effort to:" msgstr "Pyrimme parhaamme mukaan seuraavaan:" -#: lib/web/templates/api/privacy.html.eex:35 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:35 msgctxt "terms" msgid "What do we use your information for?" msgstr "Mihin käytämme tietojasi?" -#: lib/web/templates/api/privacy.html.eex:57 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:57 msgctxt "terms" msgid "What is our data retention policy?" msgstr "Millainen tietojensäilytyskäytäntö meillä on?" -#: lib/web/templates/api/privacy.html.eex:67 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:67 msgctxt "terms" msgid "You may irreversibly delete your account at any time." msgstr "Voit milloin tahansa poistaa tilisi pysyvästi." -#: lib/web/templates/api/privacy.html.eex:115 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:115 msgctxt "terms" msgid "Changes to our Privacy Policy" msgstr "Muutokset tietosuojakäytäntöön" -#: lib/web/templates/api/privacy.html.eex:106 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:106 msgctxt "terms" msgid "If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site." msgstr "" @@ -280,8 +280,8 @@ msgstr "" "wiki/Yleinen_tietosuoja-asetus\">yleinen tietosuoja-asetus) mukaisesti " "et voi käyttää tätä sivustoa." -#: lib/web/templates/api/privacy.html.eex:109 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:109 msgctxt "terms" msgid "If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site." msgstr "" @@ -291,30 +291,30 @@ msgstr "" "27s_Online_Privacy_Protection_Act\">Children's Online Privacy Protection " "Act) mukaisesti et voi käyttää tätä sivustoa." -#: lib/web/templates/api/privacy.html.eex:117 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:117 msgctxt "terms" msgid "If we decide to change our privacy policy, we will post those changes on this page." msgstr "" "Jos päätämme muuttaa tietosuojakäytäntöämme, muutoksesta kerrotaan tällä " "sivulla." -#: lib/web/templates/api/privacy.html.eex:112 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:112 msgctxt "terms" msgid "Law requirements can be different if this server is in another jurisdiction." msgstr "" "Lakisääteiset vaatimukset saattavat poiketa tästä, jos palvelin sijaitsee " "muulla lainkäyttöalueella." -#: lib/web/templates/api/privacy.html.eex:103 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:103 msgctxt "terms" msgid "Site usage by children" msgstr "Lapset sivuston käyttäjinä" -#: lib/web/templates/api/privacy.html.eex:47 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:47 msgctxt "terms" msgid "The email address you provide may be used to send you information, updates and notifications about other people\n interacting with your content or sending you messages and to respond to inquiries, and/or other requests or\n questions." msgstr "" @@ -324,8 +324,8 @@ msgstr "" "kyselyihisi, tai muihin pyyntöihin tai kysymyksiin\n" " liittyen." -#: lib/web/templates/api/privacy.html.eex:45 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:45 msgctxt "terms" msgid "To aid moderation of the community, for example comparing your IP address with other known ones to determine ban\n evasion or other violations." msgstr "" @@ -333,8 +333,8 @@ msgstr "" "muihin tiedossa oleviin osoitteisiin\n" " porttikieltojen kiertämisen tai muiden rikkomusten havaitsemiseksi." -#: lib/web/templates/api/privacy.html.eex:43 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:43 msgctxt "terms" msgid "To provide the core functionality of Mobilizon. Depending on this instance's policy you may only be able to\n interact with other people's content and post your own content if you are logged in." msgstr "" @@ -343,89 +343,89 @@ msgstr "" " vaikuttaminen ja oman sisällön julkaiseminen saattaa olla mahdollista " "vain sisäänkirjautuneena." -#: lib/web/templates/api/privacy.html.eex:6 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:6 msgctxt "terms" msgid "What information do we collect?" msgstr "Mitä tietoja kerätään?" -#: lib/web/email/user.ex:176 #, elixir-format +#: lib/web/email/user.ex:176 msgid "Mobilizon on %{instance}: confirm your email address" msgstr "Mobilizon palvelimella %{instance}: vahvista sähköpostiosoitteesi" -#: lib/web/email/user.ex:152 #, elixir-format +#: lib/web/email/user.ex:152 msgid "Mobilizon on %{instance}: email changed" msgstr "Mobilizon palvelimella %{instance}: sähköpostiosoite vaihdettu" -#: lib/web/email/notification.ex:47 #, elixir-format +#: lib/web/email/notification.ex:47 msgid "One event planned today" msgid_plural "%{nb_events} events planned today" msgstr[0] "Yksi suunniteltu tapahtuma tänään" msgstr[1] "%{nb_events} suunniteltua tapahtumaa tänään" +#, elixir-format #: lib/web/templates/email/on_day_notification.html.eex:38 #: lib/web/templates/email/on_day_notification.text.eex:4 -#, elixir-format msgid "You have one event today:" msgid_plural "You have %{total} events today:" msgstr[0] "Sinulla on tänään yksi tapahtuma:" msgstr[1] "Sinulla on tänään %{total} tapahtumaa:" -#: lib/web/templates/email/group_invite.text.eex:3 #, elixir-format +#: lib/web/templates/email/group_invite.text.eex:3 msgid "%{inviter} just invited you to join their group %{group}" msgstr "%{inviter} kutsui sinut ryhmään %{group}" +#, elixir-format #: lib/web/templates/email/group_invite.html.eex:13 #: lib/web/templates/email/group_invite.text.eex:1 -#, elixir-format msgid "Come along!" msgstr "Tule mukaan!" -#: lib/web/email/notification.ex:24 #, elixir-format +#: lib/web/email/notification.ex:24 msgid "Don't forget to go to %{title}" msgstr "Muista %{title}" +#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:38 #: lib/web/templates/email/before_event_notification.text.eex:3 -#, elixir-format msgid "Get ready for %{title}" msgstr "%{title} tulee, oletko valmis?" -#: lib/web/templates/email/group_invite.html.eex:59 #, elixir-format +#: lib/web/templates/email/group_invite.html.eex:59 msgid "See my groups" msgstr "Näytä omat ryhmät" +#, elixir-format #: lib/web/templates/email/group_invite.html.eex:45 #: lib/web/templates/email/group_invite.text.eex:5 -#, elixir-format msgid "To accept this invitation, head over to your groups." msgstr "Hyväksy kutsu siirtymällä omiin ryhmiisi." -#: lib/web/templates/email/before_event_notification.text.eex:5 #, elixir-format +#: lib/web/templates/email/before_event_notification.text.eex:5 msgid "View the event on: %{link}" msgstr "Katso päivitetty tapahtuma: %{linkki}" -#: lib/web/email/group.ex:33 #, elixir-format +#: lib/web/email/group.ex:33 msgid "You have been invited by %{inviter} to join group %{group}" msgstr "%{inviter} kutsui sinut ryhmään %{group}" -#: lib/web/email/notification.ex:71 #, elixir-format +#: lib/web/email/notification.ex:71 msgid "One event planned this week" msgid_plural "%{nb_events} events planned this week" msgstr[0] "Yksi suunniteltu tapahtuma tällä viikolla" msgstr[1] "%{nb_events} suunniteltua tapahtumaa tällä viikolla" -#: lib/web/email/notification.ex:93 #, elixir-format +#: lib/web/email/notification.ex:93 msgid "One participation request for event %{title} to process" msgid_plural "%{number_participation_requests} participation requests for event %{title} to process" msgstr[0] "Yksi osallistujapyyntö tapahtumaan %{title} odottaa käsittelyä" @@ -433,21 +433,21 @@ msgstr[1] "" "%{number_participation_requests} osallistujapyyntöä tapahtumaan %{title} " "odottaa käsittelyä" +#, elixir-format #: lib/web/templates/email/notification_each_week.html.eex:38 #: lib/web/templates/email/notification_each_week.text.eex:3 -#, elixir-format msgid "You have one event this week:" msgid_plural "You have %{total} events this week:" msgstr[0] "Sinulla on tällä viikolla yksi tapahtuma:" msgstr[1] "Sinulla on tällä viikolla %{total} tapahtumaa:" -#: lib/service/metadata/utils.ex:52 #, elixir-format +#: lib/service/metadata/utils.ex:52 msgid "The event organizer didn't add any description." msgstr "Tapahtuman järjestäjä ei ole lisännyt kuvausta." -#: lib/web/templates/api/privacy.html.eex:54 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:54 msgctxt "terms" msgid "We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL/TLS, and your password is hashed using a strong one-way algorithm." msgstr "" @@ -456,8 +456,8 @@ msgstr "" "sovellusten ja sovellusrajapinnan välinen tietoliikenne ovat SSL/TLS-" "suojattuja, ja salasanasi salataan vahvalla yksisuuntaisella algoritmilla." -#: lib/web/templates/api/privacy.html.eex:94 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:94 msgctxt "terms" msgid "No. We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety." msgstr "" @@ -469,20 +469,20 @@ msgstr "" "välttämätöntä lain tai sivustomme noudattamisen tahi meidän tai muiden " "oikeuksien, omaisuuden tai turvallisuuden suojelemisen kannalta." -#: lib/web/templates/api/terms.html.eex:23 #, elixir-format +#: lib/web/templates/api/terms.html.eex:23 msgctxt "terms" msgid "Accepting these Terms" msgstr "Ehtojen hyväksyminen" -#: lib/web/templates/api/terms.html.eex:27 #, elixir-format +#: lib/web/templates/api/terms.html.eex:27 msgctxt "terms" msgid "Changes to these Terms" msgstr "Ehtojen muutokset" -#: lib/web/templates/api/terms.html.eex:85 #, elixir-format +#: lib/web/templates/api/terms.html.eex:85 msgctxt "terms" msgid "A lot of the content on the Service is from you and others, and we don't review, verify or authenticate it, and it may include inaccuracies or false information. We make no representations, warranties, or guarantees relating to the quality, suitability, truth, accuracy or completeness of any content contained in the Service. You acknowledge sole responsibility for and assume all risk arising from your use of or reliance on any content." msgstr "" @@ -493,16 +493,16 @@ msgstr "" "Olet yksin vastuussa sisällön käyttämisestä, siihen luottamisesta ja siihen " "liittyvistä riskeistä." -#: lib/web/templates/api/terms.html.eex:60 #, elixir-format +#: lib/web/templates/api/terms.html.eex:60 msgctxt "terms" msgid "Also, you agree that you will not do any of the following in connection with the Service or other users:" msgstr "" "Lisäksi sitoudut olemaan tekemättä palvelun tai muiden käyttäjien osalta " "mitään seuraavista:" -#: lib/web/templates/api/terms.html.eex:65 #, elixir-format +#: lib/web/templates/api/terms.html.eex:65 msgctxt "terms" msgid "Circumvent or attempt to circumvent any filtering, security measures, rate limits or other features designed to protect the Service, users of the Service, or third parties." msgstr "" @@ -510,22 +510,22 @@ msgstr "" "suodatus- ja turvallisuuskeinojen, käyttömäärärajoitusten tai muiden " "vastaavien ominaisuuksien kiertäminen tai kiertämisen yritys" -#: lib/web/templates/api/terms.html.eex:64 #, elixir-format +#: lib/web/templates/api/terms.html.eex:64 msgctxt "terms" msgid "Collect any personal information about other users, or intimidate, threaten, stalk or otherwise harass other users of the Service;" msgstr "" "palvelun muiden käyttäjien henkilötietojen kerääminen tai heidän " "ahdisteleminen, uhkaaminen, seuraaminen tai häiritseminen muilla tavoin" -#: lib/web/templates/api/terms.html.eex:55 #, elixir-format +#: lib/web/templates/api/terms.html.eex:55 msgctxt "terms" msgid "Content that is illegal or unlawful, that would otherwise create liability;" msgstr "laittoman sisällön oikeudellisiin seuraamuksiin johtava lähettäminen" -#: lib/web/templates/api/terms.html.eex:56 #, elixir-format +#: lib/web/templates/api/terms.html.eex:56 msgctxt "terms" msgid "Content that may infringe or violate any patent, trademark, trade secret, copyright, right of privacy, right of publicity or other intellectual or other right of any party;" msgstr "" @@ -533,48 +533,48 @@ msgstr "" "yksityisyydensuojaa, julkisuusoikeutta tai muuta immateriaali- tai muuta " "oikeutta loukkaavan sisällön lähettäminen" -#: lib/web/templates/api/terms.html.eex:42 #, elixir-format +#: lib/web/templates/api/terms.html.eex:42 msgctxt "terms" msgid "Creating Accounts" msgstr "Tilien luominen" -#: lib/web/templates/api/terms.html.eex:89 #, elixir-format +#: lib/web/templates/api/terms.html.eex:89 msgctxt "terms" msgid "Entire Agreement" msgstr "Koko sopimusteksti" -#: lib/web/templates/api/terms.html.eex:92 #, elixir-format +#: lib/web/templates/api/terms.html.eex:92 msgctxt "terms" msgid "Feedback" msgstr "Palaute" -#: lib/web/templates/api/terms.html.eex:83 #, elixir-format +#: lib/web/templates/api/terms.html.eex:83 msgctxt "terms" msgid "Hyperlinks and Third Party Content" msgstr "Linkit ja kolmansien osapuolten sisältö" -#: lib/web/templates/api/terms.html.eex:88 #, elixir-format +#: lib/web/templates/api/terms.html.eex:88 msgctxt "terms" msgid "If you breach any of these Terms, we have the right to suspend or disable your access to or use of the Service." msgstr "" "Jos toimit näiden ehtojen vastaisesti, voimme poistaa tai keskeyttää " "käyttöoikeutesi palveluun." -#: lib/web/templates/api/terms.html.eex:63 #, elixir-format +#: lib/web/templates/api/terms.html.eex:63 msgctxt "terms" msgid "Impersonate or post on behalf of any person or entity or otherwise misrepresent your affiliation with a person or entity;" msgstr "" "luvaton toisen henkilön tai tahon nimissä esiintyminen tai julkaiseminen tai " "muunlainen valheellisen yhteyden ilmaiseminen" -#: lib/web/templates/api/terms.html.eex:48 #, elixir-format +#: lib/web/templates/api/terms.html.eex:48 msgctxt "terms" msgid "Our Service allows you and other users to post, link and otherwise make available content. You are responsible for the content that you make available to the Service, including its legality, reliability, and appropriateness." msgstr "" @@ -583,26 +583,26 @@ msgstr "" "saataville saattamastasi sisällöstä sekä sen laillisuudesta, " "luotettavuudesta ja sopivaisuudesta." -#: lib/web/templates/api/terms.html.eex:39 #, elixir-format +#: lib/web/templates/api/terms.html.eex:39 msgctxt "terms" msgid "Privacy Policy" msgstr "Tietosuojakäytäntö" -#: lib/web/templates/api/terms.html.eex:95 #, elixir-format +#: lib/web/templates/api/terms.html.eex:95 msgctxt "terms" msgid "Questions & Contact Information" msgstr "Kysymykset ja yhteystiedot" -#: lib/web/templates/api/terms.html.eex:87 #, elixir-format +#: lib/web/templates/api/terms.html.eex:87 msgctxt "terms" msgid "Termination" msgstr "Lopettaminen" -#: lib/web/templates/api/terms.html.eex:62 #, elixir-format +#: lib/web/templates/api/terms.html.eex:62 msgctxt "terms" msgid "Use the Service in any manner that could interfere with, disrupt, negatively affect or inhibit other users from fully enjoying the Service or that could damage, disable, overburden or impair the functioning of the Service;" msgstr "" @@ -610,14 +610,14 @@ msgstr "" "käyttäjiä heidän käyttäessään palvelua, tai joka voi vahingoittaa, estää, " "ylikuormittaa tai rajoittaa palvelun toimivuutta" -#: lib/web/templates/api/terms.html.eex:47 #, elixir-format +#: lib/web/templates/api/terms.html.eex:47 msgctxt "terms" msgid "Your Content & Conduct" msgstr "Oma sisältö ja käytös" -#: lib/web/templates/api/terms.html.eex:84 #, elixir-format +#: lib/web/templates/api/terms.html.eex:84 msgctxt "terms" msgid "%{instance_name} makes no claim or representation regarding, and accepts no responsibility for third party websites accessible by hyperlink from the Service or websites linking to the Service. When you leave the Service, you should be aware that these Terms and our policies no longer govern. The inclusion of any link does not imply endorsement by %{instance_name} of the site. Use of any such linked website is at the user's own risk." msgstr "" @@ -629,8 +629,8 @@ msgstr "" "sivuston. Linkitettyjen verkkosivujen käyttö tapahtuu käyttäjän omalla " "vastuulla." -#: lib/web/templates/api/terms.html.eex:68 #, elixir-format +#: lib/web/templates/api/terms.html.eex:68 msgctxt "terms" msgid "Finally, your use of the Service is also subject to acceptance of the instance's own specific rules regarding the code of conduct and moderation rules. Breaking those rules may also result in your account being disabled or suspended." msgstr "" @@ -639,16 +639,16 @@ msgstr "" "hyväksymistä. Sääntöjen rikkomisesta voi seurata tilisi tilapäinen tai " "pysyvä käytöstäpoisto." -#: lib/web/templates/api/terms.html.eex:81 #, elixir-format +#: lib/web/templates/api/terms.html.eex:81 msgctxt "terms" msgid "For full details about the Mobilizon software see here." msgstr "" "Katso täältä tarkempia Mobilizon-" "ohjelmaa koskevia tietoja." -#: lib/web/templates/api/terms.html.eex:18 #, elixir-format +#: lib/web/templates/api/terms.html.eex:18 msgctxt "terms" msgid "Here are the important things you need to know about accessing and using the %{instance_name} (%{instance_url}) website and service (collectively, \"Service\"). These are our terms of service (\"Terms\"). Please read them carefully." msgstr "" @@ -657,8 +657,8 @@ msgstr "" "palvelua (yhteisesti ”palvelu”). Ne ovat käyttöehtomme (”ehdot”). Lue ne " "huolellisesti." -#: lib/web/templates/api/terms.html.eex:33 #, elixir-format +#: lib/web/templates/api/terms.html.eex:33 msgctxt "terms" msgid "If we make major changes, we will notify our users in a clear and prominent manner. Minor changes may only be highlighted in the footer of our website. It is your responsibility to check the website regularly for changes to these Terms." msgstr "" @@ -667,8 +667,8 @@ msgstr "" "huomautuksella verkkosivun alaosassa. Verkkosivun ehdoissa tapahtuvien " "muutosten säännöllinen tarkistaminen on omalla vastuullasi." -#: lib/web/templates/api/terms.html.eex:53 #, elixir-format +#: lib/web/templates/api/terms.html.eex:53 msgctxt "terms" msgid "In order to make %{instance_name} a great place for all of us, please do not post, link and otherwise make available on or through the Service any of the following:" msgstr "" @@ -676,16 +676,16 @@ msgstr "" "julkaise, linkitä tai muulla tavoin saata palvelussa tai sen välityksellä " "saataville mitään seuraavista:" -#: lib/web/templates/api/terms.html.eex:57 #, elixir-format +#: lib/web/templates/api/terms.html.eex:57 msgctxt "terms" msgid "Private information of any third party (e.g., addresses, phone numbers, email addresses, Social Security numbers and credit card numbers); and" msgstr "" "kolmannen osapuolen yksityisiä tietoja (esim. osoitteita, puhelinnumeroita, " "sähköpostiosoitteita, henkilötunnuksia ja maksukorttien numeroita)" -#: lib/web/templates/api/terms.html.eex:52 #, elixir-format +#: lib/web/templates/api/terms.html.eex:52 msgctxt "terms" msgid "Since Mobilizon is a distributed network, it is possible, depending on the visibility rules set to your content, that your content has been distributed to other Mobilizon instances. When you delete your content, we will request those other instances to also delete the content. Our responsibility on the content being deleted from those other instances ends here. If for some reason, some other instance does not delete the content, we cannot be held responsible." msgstr "" @@ -696,8 +696,8 @@ msgstr "" "sisällön poistamisesta päättyy siihen. Jos jokin toinen palvelin ei syystä " "tai toisesta poista sisältöä, emme ole siitä vastuussa." -#: lib/web/templates/api/terms.html.eex:90 #, elixir-format +#: lib/web/templates/api/terms.html.eex:90 msgctxt "terms" msgid "These Terms constitute the entire agreement between you and %{instance_name} regarding the use of the Service, superseding any prior agreements between you and %{instance_name} relating to your use of the Service." msgstr "" @@ -706,8 +706,8 @@ msgstr "" "aiemmat sinun ja palvelimen %{instance_name} väliset palvelun käyttöä " "koskevat sopimukset." -#: lib/web/templates/api/terms.html.eex:80 #, elixir-format +#: lib/web/templates/api/terms.html.eex:80 msgctxt "terms" msgid "This Service runs on a Mobilizon instance. This source code is licensed under an AGPLv3 license which means you are allowed to and even encouraged to take the source code, modify it and use it." msgstr "" @@ -717,16 +717,16 @@ msgstr "" "tarkoittaa, että lähdekoodin lataaminen, muokkaaminen ja käyttö on paitsi " "sallittua myös kannustettavaa." -#: lib/web/templates/api/terms.html.eex:58 #, elixir-format +#: lib/web/templates/api/terms.html.eex:58 msgctxt "terms" msgid "Viruses, corrupted data or other harmful, disruptive or destructive files or code." msgstr "" "Virukset, vioittuneet tiedot tai muut haitalliset, häiritsevät tai tuhoa " "aiheuttavat tiedostot tai koodikatkelmat." -#: lib/web/templates/api/terms.html.eex:51 #, elixir-format +#: lib/web/templates/api/terms.html.eex:51 msgctxt "terms" msgid "You can remove the content that you posted by deleting it. Once you delete your content, it will not appear on the Service, but copies of your deleted content may remain in our system or backups for some period of time. Web server access logs might also be stored for some time in the system." msgstr "" @@ -735,30 +735,30 @@ msgstr "" "järjestelmässämme tai varmuuskopioissamme. Niin ikään www-palvelimen " "käyttölokeja säilytetään järjestelmässä jonkin aikaa." -#: lib/web/templates/api/terms.html.eex:96 #, elixir-format +#: lib/web/templates/api/terms.html.eex:96 msgctxt "terms" msgid "Questions or comments about the Service may be directed to us at %{contact}" msgstr "" "Meille voi lähettää palvelua koskevia kysymyksiä ja kommentteja osoitteeseen " "%{contact}" -#: lib/web/templates/api/terms.html.eex:79 #, elixir-format +#: lib/web/templates/api/terms.html.eex:79 msgctxt "terms" msgid "Source code" msgstr "Lähdekoodi" -#: lib/web/templates/api/terms.html.eex:93 #, elixir-format +#: lib/web/templates/api/terms.html.eex:93 msgctxt "terms" msgid "We love feedback. Please let us know what you think of the Service, these Terms and, in general, %{instance_name}." msgstr "" "Pidämme palautteesta. Kerro meille, mitä mieltä olet palvelusta, näistä " "ehdoista ja yleisesti palvelimesta %{instance_name}." -#: lib/web/templates/api/terms.html.eex:74 #, elixir-format +#: lib/web/templates/api/terms.html.eex:74 msgctxt "terms" msgid "Instance administrators (and community moderators, given the relevant access) are responsible for monitoring and acting on flagged content and other user reports, and have the right and responsibility to remove or edit content that is not aligned to this Instance set of rules, or to suspend, block or ban (temporarily or permanently) any account, community, or instance for breaking these terms, or for other behaviours that they deem inappropriate, threatening, offensive, or harmful." msgstr "" @@ -771,15 +771,15 @@ msgstr "" "toimivat muulla tavoin asiattomasti, uhkaavasti, hyökkäävästi tai " "vahingollisesti." -#: lib/web/templates/api/terms.html.eex:6 #, elixir-format +#: lib/web/templates/api/terms.html.eex:6 msgctxt "terms" msgid "%{instance_name} will not use or transmit or resell your personal data" msgstr "" "%{instance_name} ei käytä, lähetä edelleen tai myy henkilötietojasi" -#: lib/web/templates/api/terms.html.eex:44 #, elixir-format +#: lib/web/templates/api/terms.html.eex:44 msgctxt "terms" msgid "If you discover or suspect any Service security breaches, please let us know as soon as possible. For security holes in the Mobilizon software itself, please contact its contributors directly." msgstr "" @@ -788,16 +788,16 @@ msgstr "" "aukkojen osalta ota yhteyttä suoraan ohjelman tekijöihin." -#: lib/web/templates/api/terms.html.eex:77 #, elixir-format +#: lib/web/templates/api/terms.html.eex:77 msgctxt "terms" msgid "Instance administrators should ensure that every community hosted on the instance is properly moderated according to the defined rules." msgstr "" "Palvelimen ylläpitäjien tulee varmistaa, että kaikkia palvelimella toimivia " "yhteisöjä moderoidaan sääntöjen mukaisesti." -#: lib/web/templates/api/terms.html.eex:98 #, elixir-format +#: lib/web/templates/api/terms.html.eex:98 msgctxt "terms" msgid "Originally adapted from the Diaspora* and App.net privacy policies, also licensed under CC BY-SA." msgstr "" @@ -806,8 +806,8 @@ msgstr "" "a> tietosuojakäytännöistä, lisäksi lisensoitu CC BY-SA -lisenssillä." -#: lib/web/templates/api/privacy.html.eex:119 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:119 msgctxt "terms" msgid "Originally adapted from the Mastodon and Discourse privacy policies, also licensed under CC BY-SA." msgstr "" @@ -816,114 +816,114 @@ msgstr "" "tietosuojakäytännöistä, lisäksi lisensoitu CC BY-SA -lisenssillä." -#: lib/web/templates/api/terms.html.eex:3 #, elixir-format +#: lib/web/templates/api/terms.html.eex:3 msgctxt "terms" msgid "Short version" msgstr "Lyhyt versio" -#: lib/web/templates/api/terms.html.eex:9 #, elixir-format +#: lib/web/templates/api/terms.html.eex:9 msgctxt "terms" msgid "The service is provided without warranties and these terms may change in the future" msgstr "" "Palvelu tarjotaan ilman minkäänlaista takuuta, ja nämä ehdot voivat " "myöhemmin muuttua" -#: lib/web/templates/api/privacy.html.eex:118 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:118 msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 18, 2020." msgstr "" "Tämän asiakirjan lisenssinä on CC BY-SA. Se päivitettiin viimeksi 18.6.2020." -#: lib/web/templates/api/terms.html.eex:97 #, elixir-format +#: lib/web/templates/api/terms.html.eex:97 msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 22, 2020." msgstr "" "Tämän asiakirjan lisenssinä on CC BY-SA. Se päivitettiin viimeksi 22.6.2020." -#: lib/web/templates/api/terms.html.eex:8 #, elixir-format +#: lib/web/templates/api/terms.html.eex:8 msgctxt "terms" msgid "You must respect other people and %{instance_name}'s rules when using the service" msgstr "" "Kun käytät palvelua, kunnioita muita ihmisiä ja palvelimen " "%{instance_name} sääntöjä" -#: lib/web/templates/api/terms.html.eex:7 #, elixir-format +#: lib/web/templates/api/terms.html.eex:7 msgctxt "terms" msgid "You must respect the law when using %{instance_name}" msgstr "Noudata lakia käyttäessäsi palvelinta %{instance_name}" -#: lib/web/templates/api/terms.html.eex:5 #, elixir-format +#: lib/web/templates/api/terms.html.eex:5 msgctxt "terms" msgid "Your content is yours" msgstr "Sisältösi kuuluu sinulle" -#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:51 #, elixir-format +#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:51 msgid "Confirm my e-mail address" msgstr "Vahvista sähköpostiosoite" +#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:13 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:1 -#, elixir-format msgid "Confirm your e-mail" msgstr "Vahvista sähköpostiosoite" -#: lib/web/templates/email/anonymous_participation_confirmation.text.eex:3 #, elixir-format +#: lib/web/templates/email/anonymous_participation_confirmation.text.eex:3 msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" "Hei! Rekisteröidyit juuri tapahtumaan ”%{title}”. Vahvista ilmoittamasi " "sähköpostiosoite:" +#, elixir-format #: lib/web/templates/email/email.html.eex:114 #: lib/web/templates/email/email.text.eex:8 -#, elixir-format msgid "Need help? Is something not working as expected?" msgstr "Tarvitsetko apua? Eikö kaikki toimi niin kuin pitäisi?" -#: lib/web/templates/email/registration_confirmation.html.eex:38 #, elixir-format +#: lib/web/templates/email/registration_confirmation.html.eex:38 msgid "You created an account on %{host} with this email address. You are one click away from activating it." msgstr "" "Loit palvelimelle %{host} tilin tällä sähköpostiosoitteella. Aktivoi " "se yhdellä napsautuksella." -#: lib/web/templates/email/report.html.eex:13 #, elixir-format +#: lib/web/templates/email/report.html.eex:13 msgid "New report on %{instance}" msgstr "Uusi raportti palvelimella %{instance}" -#: lib/web/templates/email/email_changed_old.html.eex:38 #, elixir-format +#: lib/web/templates/email/email_changed_old.html.eex:38 msgid "The email address for your account on %{host} is being changed to:" msgstr "" "Palvelimella %{host} olevan tilisi sähköpostiosoitteeksi vaihdetaan:" -#: lib/web/templates/email/password_reset.html.eex:38 #, elixir-format +#: lib/web/templates/email/password_reset.html.eex:38 msgid "You requested a new password for your account on %{instance}." msgstr "Pyysit uutta salasanaa tilillesi palvelimella %{instance}." -#: lib/web/templates/email/email.text.eex:5 #, elixir-format +#: lib/web/templates/email/email.text.eex:5 msgid "Please do not use it for real purposes." msgstr "Älä käytä todellisiin tarkoituksiin." +#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:63 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:6 lib/web/templates/email/event_updated.html.eex:133 #: lib/web/templates/email/event_updated.text.eex:24 lib/web/templates/email/notification_each_week.html.eex:70 #: lib/web/templates/email/notification_each_week.text.eex:11 lib/web/templates/email/on_day_notification.html.eex:70 #: lib/web/templates/email/on_day_notification.text.eex:14 -#, elixir-format msgid "Would you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgid_plural "Would you wish to cancel your attendance to one or several events, visit the event pages through the links above and click the « Attending » button." msgstr[0] "" @@ -933,75 +933,75 @@ msgstr[1] "" "Jos haluat perua osallistumisesi, siirry tapahtumien sivuille yllä olevista " "linkeistä ja napsauta niissä osallistumispainiketta." +#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:38 #: lib/web/templates/email/pending_participation_notification.text.eex:4 -#, elixir-format msgid "You have one pending attendance request to process:" msgid_plural "You have %{number_participation_requests} attendance requests to process:" msgstr[0] "Yksi osallistujapyyntö odottaa käsittelyäsi:" msgstr[1] "" "%{number_participation_requests} osallistujapyyntöä odottaa käsittelyäsi:" -#: lib/web/templates/email/email.text.eex:11 #, elixir-format +#: lib/web/templates/email/email.text.eex:11 msgid "%{instance} is powered by Mobilizon." msgstr "%{instance} on Mobilizon-palvelin." -#: lib/web/templates/email/email.html.eex:142 #, elixir-format +#: lib/web/templates/email/email.html.eex:142 msgid "%{instance} is powered by Mobilizon." msgstr "%{instance} on Mobilizon-palvelin." +#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:13 #: lib/web/templates/email/pending_participation_notification.text.eex:1 -#, elixir-format msgid "A request is pending!" msgstr "Pyyntö odottaa!" +#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:13 #: lib/web/templates/email/before_event_notification.text.eex:1 -#, elixir-format msgid "An event is upcoming!" msgstr "Tapahtuma lähestyy!" +#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:13 #: lib/web/templates/email/email_changed_new.text.eex:1 -#, elixir-format msgid "Confirm new email" msgstr "Vahvista sähköpostiosoite" -#: lib/web/templates/email/event_updated.html.eex:84 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:84 msgid "End" msgstr "Päättyy" -#: lib/web/templates/email/event_updated.text.eex:21 #, elixir-format +#: lib/web/templates/email/event_updated.text.eex:21 msgid "End %{ends_on}" msgstr "Päättyy %{ends_on}" +#, elixir-format #: lib/web/templates/email/event_updated.html.eex:13 #: lib/web/templates/email/event_updated.text.eex:1 -#, elixir-format msgid "Event update!" msgstr "Tapahtuma päivitetty!" -#: lib/web/templates/email/report.html.eex:88 #, elixir-format +#: lib/web/templates/email/report.html.eex:88 msgid "Flagged comments" msgstr "Merkityt kommentit" +#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:45 #: lib/web/templates/email/event_participation_approved.text.eex:7 -#, elixir-format msgid "Good news: one of the event organizers just approved your request. Update your calendar, because you're on the guest list now!" msgstr "" "Hyviä uutisia: joku tapahtuman järjestäjistä hyväksyi juuri pyyntösi. Olet " "kutsuttujen joukossa, joten merkitse tapahtuma kalenteriisi!" +#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:38 #: lib/web/templates/email/email_changed_new.text.eex:3 -#, elixir-format msgid "Hi there! It seems like you wanted to change the email address linked to your account on %{instance}. If you still wish to do so, please click the button below to confirm the change. You will then be able to log in to %{instance} with this new email address." msgstr "" "Hei! Haluat ilmeisesti vaihtaa palvelimella %{instance} olevaan " @@ -1009,16 +1009,16 @@ msgstr "" "vaihto napsauttamalla alla olevaa painiketta. Sen jälkeen voit kirjautua " "palvelimelle %{instance} uudella sähköpostiosoitteella." -#: lib/web/templates/email/email_changed_old.text.eex:3 #, elixir-format +#: lib/web/templates/email/email_changed_old.text.eex:3 msgid "Hi there! Just a quick note to confirm that the email address linked to your account on %{host} has been changed from this one to:" msgstr "" "Hei! Vahvistamme vain, että palvelimella %{host} olevaan tiliisi yhdistetty " "sähköpostiosoite on vaihdettu seuraavaan osoitteeseen:" -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 #, elixir-format +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" "Jos et tehnyt vaihtoa itse, todennäköisesti joku muu on päässyt käyttämään " @@ -1026,173 +1026,173 @@ msgstr "" "viipymättä. Jos et pääse kirjautumaan sisään, ota yhteyttä palvelimen %{host}" " ylläpitäjään." -#: lib/web/templates/email/password_reset.text.eex:12 #, elixir-format +#: lib/web/templates/email/password_reset.text.eex:12 msgid "If you didn't trigger the change yourself, please ignore this message. Your password won't be changed until you click the link above." msgstr "" "Jos et tehnyt vaihtoa itse, voit jättää tämän viestin huomiotta. Salasana ei " "vaihdu, ellet avaa yllä olevaa linkkiä." +#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:70 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:4 lib/web/templates/email/registration_confirmation.html.eex:45 -#, elixir-format msgid "If you didn't trigger this email, you may safely ignore it." msgstr "Jos et lähettänyt pyyntöä, voit jättää tämän viestin huomiotta." +#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:63 #: lib/web/templates/email/before_event_notification.text.eex:6 -#, elixir-format msgid "If you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgstr "" "Jos haluat perua osallistumisesi, siirry tapahtuman sivulle yllä olevasta " "linkistä ja napsauta siellä osallistumispainiketta." +#, elixir-format #: lib/web/templates/email/email.html.eex:143 #: lib/web/templates/email/email.text.eex:11 -#, elixir-format msgid "Learn more about Mobilizon here!" msgstr "Lue lisää Mobilizonista." -#: lib/web/templates/email/event_updated.html.eex:94 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:94 msgid "Location" msgstr "Sijainti" -#: lib/web/templates/email/event_updated.html.eex:104 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:104 msgid "Location address was removed" msgstr "Käyntiosoite poistettiin" +#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:51 #: lib/web/templates/email/pending_participation_notification.text.eex:6 -#, elixir-format msgid "Manage pending requests" msgstr "Hallinnoi odottavia osallistujapyyntöjä" +#, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:13 #: lib/web/templates/email/registration_confirmation.text.eex:1 -#, elixir-format msgid "Nearly there!" msgstr "Melkein valmista!" +#, elixir-format #: lib/web/templates/email/email_changed_old.html.eex:13 #: lib/web/templates/email/email_changed_old.text.eex:1 -#, elixir-format msgid "New email confirmation" msgstr "Uuden sähköpostiosoitteen vahvistaminen" -#: lib/web/templates/email/report.html.eex:106 #, elixir-format +#: lib/web/templates/email/report.html.eex:106 msgid "Reasons for report" msgstr "Raportin syy" -#: lib/web/templates/email/report.html.eex:39 #, elixir-format +#: lib/web/templates/email/report.html.eex:39 msgid "Someone on %{instance} reported the following content for you to analyze:" msgstr "Seuraava sisältö raportoitiin palvelimelta %{instance}:" +#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:13 #: lib/web/templates/email/event_participation_rejected.text.eex:1 -#, elixir-format msgid "Sorry! You're not going." msgstr "Valitettavasti et pääse mukaan." -#: lib/web/templates/email/event_updated.html.eex:74 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:74 msgid "Start" msgstr "Alkaa" -#: lib/web/templates/email/event_updated.text.eex:18 #, elixir-format +#: lib/web/templates/email/event_updated.text.eex:18 msgid "Start %{begins_on}" msgstr "Alkaa %{begins_on}" -#: lib/web/templates/email/event_updated.text.eex:3 #, elixir-format +#: lib/web/templates/email/event_updated.text.eex:3 msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "%{title} on joiltain osin muuttunut, ja ajattelimme ilmoittaa asiasta." +#, elixir-format #: lib/web/templates/email/event_updated.html.eex:55 #: lib/web/templates/email/event_updated.text.eex:11 -#, elixir-format msgid "This event has been cancelled by its organizers. Sorry!" msgstr "Valitettavasti tapahtuman järjestäjät peruivat tapahtuman." +#, elixir-format #: lib/web/templates/email/event_updated.html.eex:51 #: lib/web/templates/email/event_updated.text.eex:7 -#, elixir-format msgid "This event has been confirmed" msgstr "Tapahtuma on vahvistettu" +#, elixir-format #: lib/web/templates/email/event_updated.html.eex:53 #: lib/web/templates/email/event_updated.text.eex:9 -#, elixir-format msgid "This event has yet to be confirmed: organizers will let you know if they do confirm it." msgstr "" "Tapahtumaa ei ole vielä vahvistettu. Järjestäjät ilmoittavat vahvistamisesta " "myöhemmin." +#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:45 #: lib/web/templates/email/event_participation_rejected.text.eex:7 -#, elixir-format msgid "Unfortunately, the organizers rejected your request." msgstr "Ikävä kyllä järjestäjät hylkäsivät osallistumisesi." -#: lib/web/templates/email/email_changed_new.html.eex:51 #, elixir-format +#: lib/web/templates/email/email_changed_new.html.eex:51 msgid "Verify your email address" msgstr "Vahvista sähköpostiosoite" -#: lib/web/templates/email/report.html.eex:126 #, elixir-format +#: lib/web/templates/email/report.html.eex:126 msgid "View report" msgstr "Näytä raportti" -#: lib/web/templates/email/report.text.eex:24 #, elixir-format +#: lib/web/templates/email/report.text.eex:24 msgid "View report:" msgstr "Näytä raportti:" +#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:58 #: lib/web/templates/email/event_participation_confirmed.html.eex:58 -#, elixir-format msgid "Visit event page" msgstr "Käy tapahtumasivulla" -#: lib/web/templates/email/event_updated.html.eex:121 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:121 msgid "Visit the updated event page" msgstr "Käy päivitetyllä tapahtumasivulla" -#: lib/web/templates/email/event_updated.text.eex:23 #, elixir-format +#: lib/web/templates/email/event_updated.text.eex:23 msgid "Visit the updated event page: %{link}" msgstr "Katso päivitetty tapahtuma: %{linkki}" +#, elixir-format #: lib/web/templates/email/notification_each_week.html.eex:13 #: lib/web/templates/email/notification_each_week.text.eex:1 -#, elixir-format msgid "What's up this week?" msgstr "Mitä tällä viikolla tapahtuu?" +#, elixir-format #: lib/web/templates/email/on_day_notification.html.eex:13 #: lib/web/templates/email/on_day_notification.text.eex:1 -#, elixir-format msgid "What's up today?" msgstr "Mitä tänään tapahtuu?" +#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:70 #: lib/web/templates/email/event_participation_approved.text.eex:11 lib/web/templates/email/event_participation_confirmed.html.eex:70 #: lib/web/templates/email/event_participation_confirmed.text.eex:6 -#, elixir-format msgid "Would you wish to update or cancel your attendance, simply access the event page through the link above and click on the Attending button." msgstr "" "Jos haluat päivittää tai perua osallistumisesi, siirry yllä olevasta " "linkistä tapahtumasivulle ja napsauta osallistumispainiketta." +#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:64 #: lib/web/templates/email/pending_participation_notification.text.eex:8 -#, elixir-format msgid "You are receiving this email because you chose to get notifications for pending attendance requests to your events. You can disable or change your notification settings in your user account settings under « Notifications »." msgstr "" "Saat tämän sähköpostin, koska olet tilannut ilmoitukset tapahtumiesi " @@ -1200,160 +1200,160 @@ msgstr "" "poistaa ilmoitukset käytöstä käyttäjätilisi asetuksista kohdasta " "”Ilmoitukset”." -#: lib/web/templates/email/event_participation_rejected.text.eex:5 #, elixir-format +#: lib/web/templates/email/event_participation_rejected.text.eex:5 msgid "You issued a request to attend %{title}." msgstr "Lähetit pyynnön osallistua tapahtumaan %{title}." +#, elixir-format #: lib/web/templates/email/event_participation_approved.text.eex:5 #: lib/web/templates/email/event_participation_confirmed.text.eex:3 -#, elixir-format msgid "You recently requested to attend %{title}." msgstr "Lähetit pyynnön osallistua tapahtumaan %{title}." +#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:13 #: lib/web/templates/email/event_participation_confirmed.html.eex:13 lib/web/templates/email/event_participation_confirmed.text.eex:1 -#, elixir-format msgid "You're going!" msgstr "Olet mukana!" +#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:64 #: lib/web/templates/email/email_changed_new.text.eex:5 -#, elixir-format msgid "If you didn't trigger the change yourself, please ignore this message." msgstr "Jos et tehnyt vaihtoa itse, voit jättää tämän viestin huomiotta." -#: lib/web/templates/email/email.html.eex:89 #, elixir-format +#: lib/web/templates/email/email.html.eex:89 msgid "Please do not use it for real purposes." msgstr "Älä käytä todellisiin tarkoituksiin." +#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:45 #: lib/web/templates/email/group_member_removal.text.eex:5 -#, elixir-format msgid "If you feel this is an error, you may contact the group's administrators so that they can add you back." msgstr "" "Jos tämä on virhe, ota yhteyttä ryhmän ylläpitäjiin ja pyydä lisäämään sinut " "takaisin." +#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:13 #: lib/web/templates/email/group_member_removal.text.eex:1 -#, elixir-format msgid "So long, and thanks for the fish!" msgstr "Näkemiin ja kiitos kaloista!" -#: lib/web/email/group.ex:63 #, elixir-format +#: lib/web/email/group.ex:63 msgid "You have been removed from group %{group}" msgstr "Sinut on poistettu ryhmästä %{group}" -#: lib/web/templates/email/group_member_removal.text.eex:3 #, elixir-format +#: lib/web/templates/email/group_member_removal.text.eex:3 msgid "You have been removed from group %{group}. You will not be able to access this group's private content anymore." msgstr "" "Sinut on poistettu ryhmästä %{group}. Et voi enää käyttää ryhmän yksityistä " "sisältöä." -#: lib/web/templates/email/group_invite.html.eex:38 #, elixir-format +#: lib/web/templates/email/group_invite.html.eex:38 msgid "%{inviter} just invited you to join their group %{link_start}%{group}%{link_end}" msgstr "" "%{inviter} kutsui sinut ryhmään " "%{link_start}%{group}%{link_end}" -#: lib/web/templates/email/group_member_removal.html.eex:38 #, elixir-format +#: lib/web/templates/email/group_member_removal.html.eex:38 msgid "You have been removed from group %{link_start}%{group}%{link_end}. You will not be able to access this group's private content anymore." msgstr "" "Sinut on poistettu ryhmästä %{link_start}%{group}%{link_end}. Et voi " "enää käyttää ryhmän yksityistä sisältöä." +#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:54 #: lib/web/templates/email/group_suspension.text.eex:7 -#, elixir-format msgid "As this group was located on another instance, it will continue to work for other instances than this one." msgstr "" "Koska tämä ryhmä sijaitsi toisella palvelimella, sen toiminta jatkuu muilla " "kuin tällä palvelimella." +#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:46 #: lib/web/templates/email/group_suspension.text.eex:5 -#, elixir-format msgid "As this group was located on this instance, all of it's data has been irretrievably deleted." msgstr "" "Koska tämä ryhmä sijaitsi tällä palvelimella, kaikki siihen kuuluvat tiedot " "on poistettu pysyvästi." +#, elixir-format #: lib/web/templates/email/group_deletion.html.eex:38 #: lib/web/templates/email/group_deletion.text.eex:3 -#, elixir-format msgid "The administrator %{author} deleted group %{group}. All of the group's events, discussions, posts and todos have been deleted." msgstr "" "Ylläpitäjä %{author} poisti ryhmän %{group}. Kaikki ryhmän tapahtumat, " "keskustelut, julkaisut ja tehtävät on poistettu." +#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:13 #: lib/web/templates/email/group_suspension.text.eex:1 -#, elixir-format msgid "The group %{group} has been suspended on %{instance}!" msgstr "Ryhmä %{group} on estetty palvelimella %{instance}!" +#, elixir-format #: lib/web/templates/email/group_deletion.html.eex:13 #: lib/web/templates/email/group_deletion.text.eex:1 -#, elixir-format msgid "The group %{group} was deleted on %{instance}!" msgstr "Ryhmä %{group} on poistettu palvelimelta %{instance}!" +#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:38 #: lib/web/templates/email/group_suspension.text.eex:3 -#, elixir-format msgid "Your instance's moderation team has decided to suspend %{group_name} (%{group_address}). You are no longer a member of this group." msgstr "" "Palvelimesi moderointitiimi on päättänyt estää ryhmän %{group_name} " "(%{group_address}). Et ole enää tämän ryhmän jäsen." -#: lib/web/email/group.ex:136 #, elixir-format +#: lib/web/email/group.ex:136 msgid "The group %{group} has been deleted on %{instance}" msgstr "Ryhmä %{group} on poistettu palvelimelta %{instance}" -#: lib/web/email/group.ex:97 #, elixir-format +#: lib/web/email/group.ex:97 msgid "The group %{group} has been suspended on %{instance}" msgstr "Ryhmä %{group} on estetty palvelimella %{instance}" -#: lib/web/templates/api/terms.html.eex:24 #, elixir-format +#: lib/web/templates/api/terms.html.eex:24 msgctxt "terms" msgid "By accessing or using the Service, this means you agree to be bound by all the terms below. If these terms are in any way unclear, please let us know by contacting %{contact}." msgstr "" "Jos käytät palvelua, sinun katsotaan hyväksyvän kaikki alla olevat ehdot. " "Jos et ymmärrä jotain kohtaa ehdoista, ota yhteyttä: %{contact}." -#: lib/web/templates/api/terms.html.eex:40 #, elixir-format +#: lib/web/templates/api/terms.html.eex:40 msgctxt "terms" msgid "For information about how we collect and use information about users of the Service, please check our privacy policy." msgstr "" "Tietosuojakäytännössämme kerrotaan, kuinka keräämme " "ja käytämme palvelun käyttäjien tietoja." -#: lib/web/templates/api/terms.html.eex:36 #, elixir-format +#: lib/web/templates/api/terms.html.eex:36 msgctxt "terms" msgid "If you continue to use the Service after the revised Terms go into effect, you accept the revised Terms." msgstr "" "Jos jatkat palvelun käyttöä muutettujen ehtojen astuttua voimaan, osoitat " "hyväksyneesi muutetut ehdot." -#: lib/web/templates/api/privacy.html.eex:78 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:78 msgctxt "terms" msgid "If you delete this information, you need to login again." msgstr "Jos poistat nämä tiedot, joudut kirjautumaan uudelleen." -#: lib/web/templates/api/privacy.html.eex:80 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:80 msgctxt "terms" msgid "If you're not connected, we don't store any information on your device, unless you participate in an event anonymously. In this specific case we store the hash of an unique identifier for the event and participation status in your browser so that we may display participation status. Deleting this information will only stop displaying participation status in your browser." msgstr "" @@ -1363,20 +1363,20 @@ msgstr "" "voidaan näyttää. Näiden tietojen poisto vaikuttaa vain siten, että " "osallistumisen tilaa ei enää näytetä selaimessa." -#: lib/web/templates/api/privacy.html.eex:87 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:87 msgctxt "terms" msgid "Note: This information is stored in your localStorage and not your cookies." msgstr "Huomaa: Nämä tiedot tallennetaan localStorage-tietoina eikä evästeinä." -#: lib/web/templates/api/terms.html.eex:71 #, elixir-format +#: lib/web/templates/api/terms.html.eex:71 msgctxt "terms" msgid "Our responsibility" msgstr "Meidän vastuumme" -#: lib/web/templates/api/privacy.html.eex:61 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:61 msgctxt "terms" msgid "Retain server logs containing the IP address of all requests to this server, insofar as such logs are kept, no more than 90 days." msgstr "" @@ -1384,9 +1384,9 @@ msgstr "" "sisältäviä palvelinlokeja, mikäli sellaisia pidetään, enintään 90 päivän " "ajan." +#, elixir-format #: lib/web/templates/api/privacy.html.eex:3 #: lib/web/templates/api/terms.html.eex:15 -#, elixir-format msgctxt "terms" msgid "Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary to help you understand them better." msgstr "" @@ -1394,16 +1394,16 @@ msgstr "" "ymmärtää. Laatimamme sanasto voi auttaa niiden " "ymmärtämisessä." -#: lib/web/templates/api/terms.html.eex:45 #, elixir-format +#: lib/web/templates/api/terms.html.eex:45 msgctxt "terms" msgid "We are not liable for any loss you may incur as a result of someone else using your email or password, either with or without your knowledge." msgstr "" "Emme ole vastuussa seurauksista, jos joku muu käyttää sähköpostiosoitettasi " "ja salasanaasi joko sinun tietäen tai tietämättäsi." -#: lib/web/templates/api/terms.html.eex:50 #, elixir-format +#: lib/web/templates/api/terms.html.eex:50 msgctxt "terms" msgid "We cannot be held responsible should a programming or administrative error make your content visible to a larger audience than intended. Aside from our limited right to your content, you retain all of your rights to the content you post, link and otherwise make available on or through the Service." msgstr "" @@ -1413,8 +1413,8 @@ msgstr "" "julkaisemaasi, linkittämääsi tai muulla tavoin palvelussa tai sen kautta " "saataville saattamaasi sisältöä koskevat oikeudet säilyvät sinulla." -#: lib/web/templates/api/privacy.html.eex:10 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:10 msgctxt "terms" msgid "We collect information from you when you register on this instance and gather data when you participate in the platform by reading, writing, and interacting with content shared here. If you register on this instance, you will be asked to enter an email address, a password (hashed) and at least an username. Your email address will be verified by an email containing a unique link. Once the link is activated, we know you control that email address. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly. You may however visit this instance without registering." msgstr "" @@ -1430,8 +1430,8 @@ msgstr "" "otsikkokuva ovat aina julkista tietoa. Voit myös käyttää " "palvelinta rekisteröitymättä." -#: lib/web/templates/api/terms.html.eex:30 #, elixir-format +#: lib/web/templates/api/terms.html.eex:30 msgctxt "terms" msgid "We reserve the right to modify these Terms at any time. For instance, we may need to change these Terms if we come out with a new feature." msgstr "" @@ -1439,8 +1439,8 @@ msgstr "" "esimerkiksi olla tarpeen muuttaa, jos käyttöön otetaan uusia ominaisuuksia, " "tai muusta syystä." -#: lib/web/templates/api/terms.html.eex:20 #, elixir-format +#: lib/web/templates/api/terms.html.eex:20 msgctxt "terms" msgid "When we say “we”, “our”, or “us” in this document, we are referring to the owners, operators and administrators of this Mobilizon instance. The Mobilizon software is provided by the team of Mobilizon contributors, supported by Framasoft, a French not-for-profit organization advocating for Free/Libre Software. Unless explicitly stated, this Mobilizon instance is an independent service using Mobilizon's source code. You may find more information about this instance on the \"About this instance\" page." msgstr "" @@ -1453,8 +1453,8 @@ msgstr "" "itsenäinen palvelu. Voit lukea lisää tästä palvelimesta ”Tietoja tästä palvelimesta” -sivulta." -#: lib/web/templates/api/terms.html.eex:43 #, elixir-format +#: lib/web/templates/api/terms.html.eex:43 msgctxt "terms" msgid "When you create an account you agree to maintain the security and confidentiality of your password and accept all risks of unauthorized access to your account data and any other information you provide to %{instance_name}." msgstr "" @@ -1463,8 +1463,8 @@ msgstr "" "luovuttamiesi tilitietojen ja muiden tietojen luvattomaan käyttöön liittyvät " "riskit." -#: lib/web/templates/api/terms.html.eex:49 #, elixir-format +#: lib/web/templates/api/terms.html.eex:49 msgctxt "terms" msgid "When you post, link or otherwise make available content to the Service, you grant us the right and license to display and distribute your content on or through the Service (including via applications). We may format your content for display throughout the Service, but we will not edit or revise the substance of your content itself. The displaying and distribution of your content happens only according to the visibility rules you have set for the content. We will not modify the visibility of the content you have set." msgstr "" @@ -1476,8 +1476,8 @@ msgstr "" "sisällölle asettamiesi näkyvyysehtojen mukaisesti. Emme muuta sisällölle " "asettamiasi näkyvyysehtoja." -#: lib/web/templates/api/privacy.html.eex:19 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:19 msgctxt "terms" msgid "Your events and comments are delivered to other instances that follow your own, meaning they are delivered to different instances and copies are stored there. When you delete events or comments, this is likewise delivered to these other instances. All interactions related to event features - such as joining an event - or group features - such as managing resources - are federated as well. Please keep in mind that the operators of the instance and any receiving instances may view such messages and information, and that recipients may screenshot, copy or otherwise re-share them." msgstr "" @@ -1490,8 +1490,8 @@ msgstr "" "voivat kopioida viestin tekstinä tai kuvankaappauksena tai muulla tavoin " "levittää niitä edelleen." -#: lib/web/templates/api/privacy.html.eex:99 #, elixir-format +#: lib/web/templates/api/privacy.html.eex:99 msgctxt "terms" msgid "Your content may be downloaded by other instances in the network. Your public events and comments are delivered to the instances following your own instance. Content created through a group is forwarded to all the instances of all the members of the group, insofar as these members reside on a different instance than this one." msgstr "" @@ -1501,182 +1501,203 @@ msgstr "" "jäsenten kaikille palvelimille, mikäli ryhmässä on muita kuin tätä " "palvelinta käyttäviä jäseniä." -#: lib/web/templates/email/event_participation_confirmed.text.eex:4 #, elixir-format +#: lib/web/templates/email/event_participation_confirmed.text.eex:4 msgid "You have confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "" "Olet vahvistanut osallistumisesi. Päivitä kalenterisi, sillä olet " "osallistujaluettelossa!" +#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:38 #: lib/web/templates/email/event_participation_confirmed.html.eex:38 -#, elixir-format msgid "You recently requested to attend %{title}." msgstr "Lähetit pyynnön osallistua tapahtumaan %{title}." -#: lib/web/email/participation.ex:91 #, elixir-format +#: lib/web/email/participation.ex:91 msgid "Your participation to event %{title} has been confirmed" msgstr "Osallistumisesi tapahtumaan %{title} on hyväksytty" -#: lib/web/templates/email/report.html.eex:41 #, elixir-format +#: lib/web/templates/email/report.html.eex:41 msgid "%{reporter} reported the following content." msgstr "" "%{reporter_name} (%{reporter_username}) raportoi seuraavan sisällön." -#: lib/web/templates/email/report.text.eex:5 #, elixir-format +#: lib/web/templates/email/report.text.eex:5 msgid "Group %{group} was reported" msgstr "Ryhmästä %{group} tehtiin ilmoitus" -#: lib/web/templates/email/report.html.eex:51 #, elixir-format +#: lib/web/templates/email/report.html.eex:51 msgid "Group reported" msgstr "Ryhmästä ilmoitettu" -#: lib/web/templates/email/report.text.eex:7 #, elixir-format +#: lib/web/templates/email/report.text.eex:7 msgid "Profile %{profile} was reported" msgstr "Profiilista %{profile} tehtiin ilmoitus" -#: lib/web/templates/email/report.html.eex:56 #, elixir-format +#: lib/web/templates/email/report.html.eex:56 msgid "Profile reported" msgstr "Profiili ilmoitettu" -#: lib/web/templates/email/event_participation_confirmed.html.eex:45 #, elixir-format +#: lib/web/templates/email/event_participation_confirmed.html.eex:45 msgid "You have now confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "" "Olet vahvistanut osallistumisesi. Päivitä kalenterisi, sillä olet " "osallistujaluettelossa!" -#: lib/mobilizon/posts/post.ex:94 #, elixir-format +#: lib/mobilizon/posts/post.ex:94 msgid "A text is required for the post" msgstr "Julkaisuun vaaditaan tekstiä" -#: lib/mobilizon/posts/post.ex:93 #, elixir-format +#: lib/mobilizon/posts/post.ex:93 msgid "A title is required for the post" msgstr "Julkaisulle vaaditaan otsikko" -#: lib/web/templates/email/instance_follow.text.eex:3 #, elixir-format +#: lib/web/templates/email/instance_follow.text.eex:3 msgid "%{name} (%{domain}) just requested to follow your instance." msgstr "%{name} (%{domain}) pyysi saada seurata palvelintasi." -#: lib/web/email/follow.ex:54 #, elixir-format +#: lib/web/email/follow.ex:54 msgid "%{name} requests to follow your instance" msgstr "%{name} pyytää saada seurata palvelintasi" -#: lib/web/templates/email/instance_follow.html.eex:38 #, elixir-format +#: lib/web/templates/email/instance_follow.html.eex:38 msgid "%{name} (%{domain}) just requested to follow your instance. If you accept, this instance will receive all of your instance's public events." msgstr "" "%{name} (%{domain}) pyysi saada seurata palvelintasi. Jos hyväksyt " "pyynnön, kyseiselle palvelimelle lähetetään kaikki julkiset tapahtumat tällä " "palvelimella." -#: lib/web/templates/email/instance_follow.text.eex:4 #, elixir-format +#: lib/web/templates/email/instance_follow.text.eex:4 msgid "If you accept, this instance will receive all of your public events." msgstr "" "Jos hyväksyt, kyseiselle palvelimelle lähetetään kaikki julkiset tapahtumasi." -#: lib/web/email/follow.ex:48 #, elixir-format +#: lib/web/email/follow.ex:48 msgid "Instance %{name} (%{domain}) requests to follow your instance" msgstr "Palvelin %{name} (%{domain}) haluaa seurata palvelintasi" -#: lib/web/templates/email/instance_follow.html.eex:66 #, elixir-format +#: lib/web/templates/email/instance_follow.html.eex:66 msgid "See the federation settings" msgstr "Katso federaatioasetukset" +#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:52 #: lib/web/templates/email/instance_follow.text.eex:6 -#, elixir-format msgid "To accept this invitation, head over to the instance's admin settings." msgstr "Hyväksy kutsu siirtymällä omiin ryhmiisi." +#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:13 #: lib/web/templates/email/instance_follow.text.eex:1 -#, elixir-format msgid "Want to connect?" msgstr "Haluatko yhdistää?" +#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:45 #: lib/web/templates/email/instance_follow.text.eex:5 -#, elixir-format msgid "Note: %{name} (%{domain}) following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too." msgstr "" "Huom: vaikka %{name} (%{domain}) seuraa sinua, se ei tarkoita, että sinä " "seuraisit kyseistä palvelinta, mutta voit tietenkin lähettää sinne " "seuraamispyynnön." -#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:38 #, elixir-format +#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:38 msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" "Hei! Rekisteröidyit juuri tapahtumaan ”%{title}”. Vahvista " "ilmoittamasi sähköpostiosoite:" -#: lib/web/templates/email/event_participation_rejected.html.eex:38 #, elixir-format +#: lib/web/templates/email/event_participation_rejected.html.eex:38 msgid "You issued a request to attend %{title}." msgstr "Lähetit pyynnön osallistua tapahtumaan %{title}." -#: lib/web/templates/email/event_updated.html.eex:64 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:64 msgid "Event title" msgstr "Tapahtuman otsikko" -#: lib/web/templates/email/event_updated.html.eex:38 #, elixir-format +#: lib/web/templates/email/event_updated.html.eex:38 msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" "%{title} on joiltain osin muuttunut, ja ajattelimme ilmoittaa asiasta." -#: lib/web/templates/error/500_page.html.eex:46 #, elixir-format -msgid "The Mobilizon server seems to be temporarily down." -msgstr "Mobilizon-palvelin näyttää olevan väliakaisesti alhaalla." - #: lib/web/templates/error/500_page.html.eex:7 -#, elixir-format msgid "This page is not correct" msgstr "Sivua ei löydy" -#: lib/web/templates/error/500_page.html.eex:45 #, elixir-format +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "Pahoittelemme, tapahtui virhe palvelimen päässä." +#, elixir-format #: lib/web/templates/email/email.html.eex:88 #: lib/web/templates/email/email.text.eex:4 -#, elixir-format msgid "This is a demonstration site to test Mobilizon." msgstr "Tällä kokeilusivustolla voit koekäyttää Mobilizonia." -#: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 #, elixir-format +#: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "%{name} – syöte" -#: lib/service/export/feed.ex:77 #, elixir-format +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "%{actor} – yksityistapahtumien syöte palvelimella %{instance}" -#: lib/service/export/feed.ex:72 #, elixir-format +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "%{actor} – julkisten tapahtumien syöte palvelimella %{instance}" -#: lib/service/export/feed.ex:203 #, elixir-format +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "%{email}-syöte palvelimella %{instance}" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "Mobilizon-palvelin näyttää olevan väliakaisesti alhaalla." + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/fi/LC_MESSAGES/errors.po b/priv/gettext/fi/LC_MESSAGES/errors.po index f4dd2a073..286327703 100644 --- a/priv/gettext/fi/LC_MESSAGES/errors.po +++ b/priv/gettext/fi/LC_MESSAGES/errors.po @@ -18,6 +18,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.4\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "ei voi olla tyhjä" @@ -93,750 +94,766 @@ msgstr "tulee olla vähintään %{number}" msgid "must be equal to %{number}" msgstr "tulee olla tasas %{number}" -#: lib/graphql/resolvers/user.ex:103 #, elixir-format +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "Merkkiä ei voi päivittää" -#: lib/graphql/resolvers/group.ex:195 #, elixir-format +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "Nykyinen profiili ei kuulu tähän ryhmään" -#: lib/graphql/resolvers/group.ex:199 #, elixir-format +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "Nykyinen profiili ei ole valitun ryhmän ylläpitäjä" -#: lib/graphql/resolvers/user.ex:512 #, elixir-format +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "Käyttäjän asetusten tallennuksessa tapahtui virhe" -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 #, elixir-format +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "Ryhmää ei löydy" -#: lib/graphql/resolvers/group.ex:63 #, elixir-format +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "Tunnuksella %{id} ei löydy ryhmää" -#: lib/graphql/resolvers/user.ex:83 #, elixir-format +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" "Kirjautuminen epäonnistui - joko sähköpostiosoitteesi tai salasana on väärin." -#: lib/graphql/resolvers/group.ex:255 #, elixir-format +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "Jäsentä ei löydy" -#: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 #, elixir-format +#: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "Moderaattorikäyttäjän profiilia ei löydy" -#: lib/graphql/resolvers/user.ex:195 #, elixir-format +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "Käyttäjää tämän sähköpostin vahvistamiseksi ei löydy" -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 #, elixir-format +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "Käyttäjää, jolla on tämä sähköpostiosoite ei löydy" +#, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 -#, elixir-format +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "Profiili ei ole tunnistautuneen käyttäjän omistuksessa" -#: lib/graphql/resolvers/user.ex:125 #, elixir-format +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "Ei voi rekisteröityä" -#: lib/graphql/resolvers/user.ex:330 #, elixir-format +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "Nykyinen salasana ei kelpaa" -#: lib/graphql/resolvers/user.ex:382 #, elixir-format +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "Uusi sähköpostiosoite ei vaikuta kelvolliselta" -#: lib/graphql/resolvers/user.ex:379 #, elixir-format +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "Uuden sähköpostiosoitteen on poikettava vanhasta" -#: lib/graphql/resolvers/user.ex:333 #, elixir-format +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "Uuden salasanan on poikettava vanhasta" -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 #, elixir-format +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "Annettu salasana on epäkelpo" -#: lib/graphql/resolvers/user.ex:337 #, elixir-format +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" "Valitsemasi salasana on liian lyhyt. Käytä vähintään kuuden merkin mittaista " "salasanaa." -#: lib/graphql/resolvers/user.ex:215 #, elixir-format +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "Käyttäjä ei voi palauttaa salasanaansa" -#: lib/graphql/resolvers/user.ex:79 #, elixir-format +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "Käyttäjä on poistettu käytöstä" -#: lib/graphql/resolvers/user.ex:179 #, elixir-format +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "Käyttäjää ei voi vahvistaa" -#: lib/graphql/resolvers/user.ex:420 #, elixir-format +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "Käyttäjä on jo poistettu käytöstä" -#: lib/graphql/resolvers/user.ex:487 #, elixir-format +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "Pyydetty käyttäjä ei ole kirjautuneena sisään" -#: lib/graphql/resolvers/group.ex:229 #, elixir-format +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "Olet jo tämän ryhmän jäsen" -#: lib/graphql/resolvers/group.ex:262 #, elixir-format +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "Et voi poistua ryhmästä, koska olet sen ainoa ylläpitäjä" -#: lib/graphql/resolvers/group.ex:226 #, elixir-format +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "Et voi liittyä tähän ryhmään" -#: lib/graphql/resolvers/group.ex:91 #, elixir-format +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "Voit nähdä ryhmäluettelon vain, jos olet moderaattori." -#: lib/graphql/resolvers/user.ex:387 #, elixir-format +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "Sähköpostiosoitteen voi vaihtaa vain sisäänkirjautuneena" -#: lib/graphql/resolvers/user.ex:345 #, elixir-format +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "Salasanan voi vaihtaa vain sisäänkirjautuneena" -#: lib/graphql/resolvers/group.ex:204 #, elixir-format +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "Ryhmän voi poistaa vain sisäänkirjautuneena" -#: lib/graphql/resolvers/user.ex:447 #, elixir-format +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "Voit poistaa tilisi vain sisäänkirjautuneena" -#: lib/graphql/resolvers/group.ex:234 #, elixir-format +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "Voit liittyä ryhmään vain sisäänkirjautuneena" -#: lib/graphql/resolvers/group.ex:267 #, elixir-format +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "Voit poistua ryhmästä vain sisäänkirjautuneena" -#: lib/graphql/resolvers/group.ex:169 #, elixir-format +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "Voit päivittää ryhmää vain sisäänkirjautuneena" -#: lib/graphql/resolvers/user.ex:108 #, elixir-format +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "Voit saada uuden merkin vain, jos sinulla on jo merkki" -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 #, elixir-format +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "Pyysit uutta vahvistussähköpostia liian aikaisin" -#: lib/graphql/resolvers/user.ex:128 #, elixir-format +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "Sähköpostiosoitteesi ei ole sallittujen luettelossa" -#: lib/graphql/resolvers/actor.ex:64 lib/graphql/resolvers/actor.ex:94 #, elixir-format +#: lib/graphql/resolvers/actor.ex:64 lib/graphql/resolvers/actor.ex:94 msgid "Error while performing background task" msgstr "Virhe taustatehtävää suoritettaessa" -#: lib/graphql/resolvers/actor.ex:27 #, elixir-format +#: lib/graphql/resolvers/actor.ex:27 msgid "No profile found with this ID" msgstr "Tällä tunnisteella ei löytynyt profiilia" -#: lib/graphql/resolvers/actor.ex:54 lib/graphql/resolvers/actor.ex:91 #, elixir-format +#: lib/graphql/resolvers/actor.ex:54 lib/graphql/resolvers/actor.ex:91 msgid "No remote profile found with this ID" msgstr "Tällä tunnisteella ei löytynyt etäprofiilia" -#: lib/graphql/resolvers/actor.ex:69 #, elixir-format +#: lib/graphql/resolvers/actor.ex:69 msgid "Only moderators and administrators can suspend a profile" msgstr "Vain moderaattorit ja ylläpitäjät voivat hyllyttää profiilin" -#: lib/graphql/resolvers/actor.ex:99 #, elixir-format +#: lib/graphql/resolvers/actor.ex:99 msgid "Only moderators and administrators can unsuspend a profile" msgstr "Vain moderaattorit ja ylläpitäjät voivat palauttaa hyllytetyn profiilin" -#: lib/graphql/resolvers/actor.ex:24 #, elixir-format +#: lib/graphql/resolvers/actor.ex:24 msgid "Only remote profiles may be refreshed" msgstr "Vain etäprofiilit voi ladata uudelleen" -#: lib/graphql/resolvers/actor.ex:61 #, elixir-format +#: lib/graphql/resolvers/actor.ex:61 msgid "Profile already suspended" msgstr "Profiili on jo hyllytetty" -#: lib/graphql/resolvers/participant.ex:92 #, elixir-format +#: lib/graphql/resolvers/participant.ex:92 msgid "A valid email is required by your instance" msgstr "Palvelin vaatii kelvollisen sähköpostiosoitteen" -#: lib/graphql/resolvers/participant.ex:86 #, elixir-format +#: lib/graphql/resolvers/participant.ex:86 msgid "Anonymous participation is not enabled" msgstr "Anonyymi osallistuminen ei ole käytössä" -#: lib/graphql/resolvers/person.ex:192 #, elixir-format +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "Ryhmän viimeistä ylläpitäjää ei voi poistaa" -#: lib/graphql/resolvers/person.ex:189 #, elixir-format +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "Käyttäjän viimeistä identiteettiä ei voi poistaa" -#: lib/graphql/resolvers/comment.ex:105 #, elixir-format +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "Kommentti on jo poistettu" -#: lib/graphql/resolvers/discussion.ex:62 #, elixir-format +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "Keskustelua ei löydy" -#: lib/graphql/resolvers/report.ex:58 lib/graphql/resolvers/report.ex:77 #, elixir-format +#: lib/graphql/resolvers/report.ex:58 lib/graphql/resolvers/report.ex:77 msgid "Error while saving report" msgstr "Virhe raporttia tallennettaessa" -#: lib/graphql/resolvers/report.ex:96 #, elixir-format +#: lib/graphql/resolvers/report.ex:96 msgid "Error while updating report" msgstr "Virhe raporttia päivitettäessä" -#: lib/graphql/resolvers/participant.ex:127 #, elixir-format +#: lib/graphql/resolvers/participant.ex:127 msgid "Event id not found" msgstr "Tapahtumatunnistetta ei löydy" -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 #, elixir-format +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "Tapahtumaa ei löydy" +#, elixir-format #: lib/graphql/resolvers/participant.ex:83 #: lib/graphql/resolvers/participant.ex:124 lib/graphql/resolvers/participant.ex:156 -#, elixir-format msgid "Event with this ID %{id} doesn't exist" msgstr "Tunnisteella %{id} ei ole tapahtumaa" -#: lib/graphql/resolvers/participant.ex:99 #, elixir-format +#: lib/graphql/resolvers/participant.ex:99 msgid "Internal Error" msgstr "Sisäinen virhe" -#: lib/graphql/resolvers/discussion.ex:186 #, elixir-format +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "Tunnisteella %{id} ei ole keskustelua" -#: lib/graphql/resolvers/todos.ex:78 lib/graphql/resolvers/todos.ex:168 #, elixir-format +#: lib/graphql/resolvers/todos.ex:78 lib/graphql/resolvers/todos.ex:168 msgid "No profile found for user" msgstr "Käyttäjälle ei löydy profiilia" -#: lib/graphql/resolvers/feed_token.ex:63 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "Kyseistä syötemerkkiä ei ole" -#: lib/graphql/resolvers/participant.ex:237 #, elixir-format +#: lib/graphql/resolvers/participant.ex:237 msgid "Participant already has role %{role}" msgstr "Osallistujalla on jo rooli %{role}" +#, elixir-format #: lib/graphql/resolvers/participant.ex:169 #: lib/graphql/resolvers/participant.ex:198 lib/graphql/resolvers/participant.ex:230 #: lib/graphql/resolvers/participant.ex:240 -#, elixir-format msgid "Participant not found" msgstr "Osallistujaa ei löydy" -#: lib/graphql/resolvers/person.ex:29 #, elixir-format +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "Tunnuksella %{id} ei löydy henkilöä" -#: lib/graphql/resolvers/person.ex:51 #, elixir-format +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "Käyttäjänimellä %{username} ei löydy henkilöä" -#: lib/graphql/resolvers/post.ex:167 lib/graphql/resolvers/post.ex:200 #, elixir-format +#: lib/graphql/resolvers/post.ex:167 lib/graphql/resolvers/post.ex:200 msgid "Post ID is not a valid ID" msgstr "Julkaisun tunnus ei ole kelvollinen" -#: lib/graphql/resolvers/post.ex:170 lib/graphql/resolvers/post.ex:203 #, elixir-format +#: lib/graphql/resolvers/post.ex:170 lib/graphql/resolvers/post.ex:203 msgid "Post doesn't exist" msgstr "Julkaisua ei ole" -#: lib/graphql/resolvers/member.ex:83 #, elixir-format +#: lib/graphql/resolvers/member.ex:83 msgid "Profile invited doesn't exist" msgstr "Kutsuttua profiilia ei ole" -#: lib/graphql/resolvers/member.ex:92 lib/graphql/resolvers/member.ex:96 #, elixir-format +#: lib/graphql/resolvers/member.ex:92 lib/graphql/resolvers/member.ex:96 msgid "Profile is already a member of this group" msgstr "Profiili on jo ryhmän jäsen" +#, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 -#, elixir-format msgid "Profile is not member of group" msgstr "Profiili ei ole ryhmän jäsen" -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 #, elixir-format +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "Profiilia ei löydy" -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 #, elixir-format -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "Annetulla moderaattoriprofiililla ei ole oikeuksia tähän tapahtumaan" - #: lib/graphql/resolvers/report.ex:36 -#, elixir-format msgid "Report not found" msgstr "Raporttia ei löydy" -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 #, elixir-format +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "Resurssia ei ole" -#: lib/graphql/resolvers/participant.ex:120 #, elixir-format +#: lib/graphql/resolvers/participant.ex:120 msgid "The event has already reached its maximum capacity" msgstr "Tapahtuma on jo täynnä" -#: lib/graphql/resolvers/participant.ex:260 #, elixir-format +#: lib/graphql/resolvers/participant.ex:260 msgid "This token is invalid" msgstr "Epäkelpo merkki" -#: lib/graphql/resolvers/todos.ex:165 lib/graphql/resolvers/todos.ex:219 #, elixir-format +#: lib/graphql/resolvers/todos.ex:165 lib/graphql/resolvers/todos.ex:219 msgid "Todo doesn't exist" msgstr "Työkalua ei ole" +#, elixir-format #: lib/graphql/resolvers/todos.ex:75 lib/graphql/resolvers/todos.ex:191 #: lib/graphql/resolvers/todos.ex:216 -#, elixir-format msgid "Todo list doesn't exist" msgstr "Tehtäväluetteloa ei ole" -#: lib/graphql/resolvers/feed_token.ex:69 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "Merkkiä ei ole" -#: lib/graphql/resolvers/feed_token.ex:66 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "Merkki ei ole kelvollinen UUID" -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 #, elixir-format +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "Käyttäjää ei löydy" -#: lib/graphql/resolvers/person.ex:252 #, elixir-format +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "Sinulla on jo profiili tälle käyttäjälle" -#: lib/graphql/resolvers/participant.ex:130 #, elixir-format +#: lib/graphql/resolvers/participant.ex:130 msgid "You are already a participant of this event" msgstr "Olet jo tapahtuman osallistuja" -#: lib/graphql/resolvers/discussion.ex:190 #, elixir-format -msgid "You are not a member of the group the discussion belongs to" -msgstr "Et ole jäsenenä ryhmässä, johon keskustelu liittyy" - #: lib/graphql/resolvers/member.ex:86 -#, elixir-format msgid "You are not a member of this group" msgstr "Et ole ryhmän jäsen" -#: lib/graphql/resolvers/member.ex:151 #, elixir-format +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "Et ole ryhmän moderaattori tai ylläpitäjä" -#: lib/graphql/resolvers/comment.ex:51 #, elixir-format +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "Ilman yhteyttä ei voi kommentoida" -#: lib/graphql/resolvers/feed_token.ex:41 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:41 msgid "You are not allowed to create a feed token if not connected" msgstr "Ilman yhteyttä ei voi luoda syötemerkkiä" -#: lib/graphql/resolvers/comment.ex:110 #, elixir-format +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "Ilman yhteyttä ei voi poistaa kommenttia" -#: lib/graphql/resolvers/feed_token.ex:78 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "Ilman yhteyttä ei voi poistaa syötemerkkiä" -#: lib/graphql/resolvers/comment.ex:73 #, elixir-format +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "Ilman yhteyttä ei voi päivittää kommenttia" +#, elixir-format #: lib/graphql/resolvers/participant.ex:163 #: lib/graphql/resolvers/participant.ex:192 -#, elixir-format msgid "You can't leave event because you're the only event creator participant" msgstr "" "Et voi poistua tapahtumasta, koska olet ainoa tapahtuman luonut osallistuja" -#: lib/graphql/resolvers/member.ex:155 #, elixir-format +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" "Et voi vaihtaa jäsenrooliasi ryhmässä nykyistä alemmaksi, koska olet ainoa " "ylläpitäjä" -#: lib/graphql/resolvers/comment.ex:101 #, elixir-format +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "Et voi poistaa kommenttia" -#: lib/graphql/resolvers/event.ex:276 #, elixir-format +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "Et voi poistaa tapahtumaa" -#: lib/graphql/resolvers/member.ex:89 #, elixir-format +#: lib/graphql/resolvers/member.ex:89 msgid "You cannot invite to this group" msgstr "Et voi kutsua tähän ryhmään" -#: lib/graphql/resolvers/feed_token.ex:72 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "Sinulla ei ole oikeutta poistaa tätä merkkiä" -#: lib/graphql/resolvers/admin.ex:52 #, elixir-format +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "Toimintalokien katselu vain moderaattorille sisäänkirjautuneena" -#: lib/graphql/resolvers/report.ex:26 #, elixir-format +#: lib/graphql/resolvers/report.ex:26 msgid "You need to be logged-in and a moderator to list reports" msgstr "Raporttien katselu vain moderaattorille sisäänkirjautuneena" -#: lib/graphql/resolvers/report.ex:101 #, elixir-format +#: lib/graphql/resolvers/report.ex:101 msgid "You need to be logged-in and a moderator to update a report" msgstr "Raportin päivittäminen vain moderaattorille sisäänkirjautuneena" -#: lib/graphql/resolvers/report.ex:41 #, elixir-format +#: lib/graphql/resolvers/report.ex:41 msgid "You need to be logged-in and a moderator to view a report" msgstr "Raportin katselu vain moderaattorille sisäänkirjautuneena" -#: lib/graphql/resolvers/admin.ex:236 #, elixir-format +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "Pääsy ylläpitoasetuksiin vain ylläpitäjälle sisäänkirjautuneena" -#: lib/graphql/resolvers/admin.ex:221 #, elixir-format +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "Pääsy koontinäytön tilastoihin vain ylläpitäjälle sisäänkirjautuneena" -#: lib/graphql/resolvers/admin.ex:260 #, elixir-format +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "Ylläpitoasetusten tallennus vain ylläpitäjälle sisäänkirjautuneena" -#: lib/graphql/resolvers/discussion.ex:76 #, elixir-format +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "Pääsy keskusteluihin vain sisäänkirjautuneena" -#: lib/graphql/resolvers/resource.ex:93 #, elixir-format +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "Pääsy resursseihin vain sisäänkirjautuneena" -#: lib/graphql/resolvers/event.ex:211 #, elixir-format +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "Tapahtumien luonti vain sisäänkirjautuneena" -#: lib/graphql/resolvers/post.ex:140 #, elixir-format +#: lib/graphql/resolvers/post.ex:140 msgid "You need to be logged-in to create posts" msgstr "Julkaisujen luonti vain sisäänkirjautuneena" -#: lib/graphql/resolvers/report.ex:74 #, elixir-format +#: lib/graphql/resolvers/report.ex:74 msgid "You need to be logged-in to create reports" msgstr "Raporttien luonti vain sisäänkirjautuneena" -#: lib/graphql/resolvers/resource.ex:129 #, elixir-format +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "Resurssien luonti vain sisäänkirjautuneena" -#: lib/graphql/resolvers/event.ex:285 #, elixir-format +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "Tapahtuman poisto vain sisäänkirjautuneena" -#: lib/graphql/resolvers/post.ex:211 #, elixir-format +#: lib/graphql/resolvers/post.ex:211 msgid "You need to be logged-in to delete posts" msgstr "Julkaisujen poisto vain sisäänkirjautuneena" -#: lib/graphql/resolvers/resource.ex:187 #, elixir-format +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "Resurssien poisto vain sisäänkirjautuneena" -#: lib/graphql/resolvers/participant.ex:104 #, elixir-format +#: lib/graphql/resolvers/participant.ex:104 msgid "You need to be logged-in to join an event" msgstr "Tapahtumaan liittyminen vain sisäänkirjautuneena" -#: lib/graphql/resolvers/participant.ex:203 #, elixir-format +#: lib/graphql/resolvers/participant.ex:203 msgid "You need to be logged-in to leave an event" msgstr "Tapahtumasta poistuminen vain sisäänkirjautuneena" -#: lib/graphql/resolvers/event.ex:250 #, elixir-format +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "Tapahtuman päivittäminen vain sisäänkirjautuneena" -#: lib/graphql/resolvers/post.ex:178 #, elixir-format +#: lib/graphql/resolvers/post.ex:178 msgid "You need to be logged-in to update posts" msgstr "Julkaisujen päivittäminen vain sisäänkirjautuneena" -#: lib/graphql/resolvers/resource.ex:158 #, elixir-format +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "Resurssien päivittäminen vain sisäänkirjautuneena" -#: lib/graphql/resolvers/resource.ex:210 #, elixir-format +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "Resurssin esikatselu vain sisäänkirjautuneena" -#: lib/graphql/resolvers/resource.ex:121 #, elixir-format +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "Ylätason resurssi ei kuulu tähän ryhmään" -#: lib/mobilizon/users/user.ex:109 #, elixir-format +#: lib/mobilizon/users/user.ex:109 msgid "The chosen password is too short." msgstr "Valittu salasana on liian lyhyt." -#: lib/mobilizon/users/user.ex:138 #, elixir-format +#: lib/mobilizon/users/user.ex:138 msgid "The registration token is already in use, this looks like an issue on our side." msgstr "Rekisteröintimerkki on jo käytössä. Vaikuttaa palvelinpään virheeltä." -#: lib/mobilizon/users/user.ex:104 #, elixir-format +#: lib/mobilizon/users/user.ex:104 msgid "This email is already used." msgstr "Sähköpostiosoite on jo käytössä." -#: lib/graphql/error.ex:88 #, elixir-format +#: lib/graphql/error.ex:88 msgid "Post not found" msgstr "Julkaisua ei löydy" -#: lib/graphql/error.ex:75 #, elixir-format +#: lib/graphql/error.ex:75 msgid "Invalid arguments passed" msgstr "Virheelliset argumentit välitetty" -#: lib/graphql/error.ex:81 #, elixir-format +#: lib/graphql/error.ex:81 msgid "Invalid credentials" msgstr "Virheelliset kirjautumistiedot" -#: lib/graphql/error.ex:79 #, elixir-format +#: lib/graphql/error.ex:79 msgid "Reset your password to login" msgstr "Palauta salasana, jotta voit kirjautua sisään" -#: lib/graphql/error.ex:86 lib/graphql/error.ex:91 #, elixir-format +#: lib/graphql/error.ex:86 lib/graphql/error.ex:91 msgid "Resource not found" msgstr "Resurssia ei löydy" -#: lib/graphql/error.ex:92 #, elixir-format +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "Jokin meni vikaan" -#: lib/graphql/error.ex:74 #, elixir-format +#: lib/graphql/error.ex:74 msgid "Unknown Resource" msgstr "Tuntematon resurssi" -#: lib/graphql/error.ex:84 #, elixir-format +#: lib/graphql/error.ex:84 msgid "You don't have permission to do this" msgstr "Sinulla ei ole oikeutta tähän" -#: lib/graphql/error.ex:76 #, elixir-format +#: lib/graphql/error.ex:76 msgid "You need to be logged in" msgstr "Kirjaudu ensin sisään" -#: lib/graphql/resolvers/member.ex:116 #, elixir-format +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "Et voi hyväksyä kutsua tällä profiililla." -#: lib/graphql/resolvers/member.ex:134 #, elixir-format +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "Et voi hylätä kutsua tällä profiililla." -#: lib/graphql/resolvers/media.ex:62 #, elixir-format +#: lib/graphql/resolvers/media.ex:62 msgid "File doesn't have an allowed MIME type." msgstr "Tiedostolla ei ole sallittua MIME-tyyppiä." -#: lib/graphql/resolvers/group.ex:164 #, elixir-format +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "Profiili ei ole ryhmän ylläpitäjä" -#: lib/graphql/resolvers/event.ex:239 #, elixir-format +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "Et voi muokata tapahtumaa." -#: lib/graphql/resolvers/event.ex:242 #, elixir-format +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "Et voi yhdistää tapahtumaa tähän profiiliin." -#: lib/graphql/resolvers/member.ex:137 #, elixir-format +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "Kutsua ei ole." -#: lib/graphql/resolvers/member.ex:179 #, elixir-format +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "Jäsen on jo hylätty." -#: lib/graphql/resolvers/member.ex:186 #, elixir-format +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "Sinulla ei ole oikeutta poistaa jäsentä." -#: lib/mobilizon/actors/actor.ex:351 #, elixir-format +#: lib/mobilizon/actors/actor.ex:351 msgid "This username is already taken." msgstr "Käyttäjänimi on jo käytössä." -#: lib/graphql/resolvers/discussion.ex:73 #, elixir-format +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "Keskusteluun pääsemiseen vaaditaan tunniste tai polkutunnus" -#: lib/graphql/resolvers/event.ex:200 #, elixir-format +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "Järjestäjän profiili ei ole käyttäjän hallussa" -#: lib/graphql/resolvers/participant.ex:89 #, elixir-format +#: lib/graphql/resolvers/participant.ex:89 msgid "Profile ID provided is not the anonymous profile one" msgstr "Annettu profiilitunniste ei kuulu anonyymille profiilille" -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 #, elixir-format +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "Toimitettu kuva on liian suuri" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "Virhe raporttia tallennettaessa" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "Annetulla moderaattoriprofiililla ei ole oikeuksia tähän tapahtumaan" diff --git a/priv/gettext/fr/LC_MESSAGES/default.po b/priv/gettext/fr/LC_MESSAGES/default.po index aab8d99b7..513b808b0 100644 --- a/priv/gettext/fr/LC_MESSAGES/default.po +++ b/priv/gettext/fr/LC_MESSAGES/default.po @@ -10,935 +10,1198 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-19 15:28+0100\n" -"Last-Translator: Alexandra \n" -"Language-Team: French \n" +"PO-Revision-Date: 2021-05-01 10:59+0000\n" +"Last-Translator: Thomas Citharel \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Poedit 2.3\n" +"X-Generator: Weblate 4.6\n" #: lib/web/templates/email/password_reset.html.eex:48 +#, elixir-format msgid "If you didn't request this, please ignore this email. Your password won't change until you access the link below and create a new one." msgstr "Si vous n'avez pas demandé ceci, vous pouvez ignorer cet email. Votre mot de passe ne changera pas tant que vous n'en créerez pas un nouveau en cliquant sur le lien ci-dessous." #: lib/web/templates/email/report.html.eex:74 +#, elixir-format msgid "%{title} by %{creator}" msgstr "%{title} par %{creator}" #: lib/web/templates/email/registration_confirmation.html.eex:58 +#, elixir-format msgid "Activate my account" msgstr "Activer mon compte" -#: lib/web/templates/email/email.html.eex:117 lib/web/templates/email/email.text.eex:9 +#: lib/web/templates/email/email.html.eex:117 +#: lib/web/templates/email/email.text.eex:9 +#, elixir-format msgid "Ask the community on Framacolibri" msgstr "Demander à la communauté sur Framacolibri" #: lib/web/templates/email/report.text.eex:15 +#, elixir-format msgid "Comments" msgstr "Commentaires" -#: lib/web/templates/email/report.html.eex:72 lib/web/templates/email/report.text.eex:11 +#: lib/web/templates/email/report.html.eex:72 +#: lib/web/templates/email/report.text.eex:11 +#, elixir-format msgid "Event" msgstr "Événement" #: lib/web/email/user.ex:48 +#, elixir-format msgid "Instructions to reset your password on %{instance}" msgstr "Instructions pour réinitialiser votre mot de passe sur %{instance}" #: lib/web/templates/email/report.text.eex:21 +#, elixir-format msgid "Reason" msgstr "Raison" #: lib/web/templates/email/password_reset.html.eex:61 +#, elixir-format msgid "Reset Password" msgstr "Réinitialiser mon mot de passe" #: lib/web/templates/email/password_reset.html.eex:41 +#, elixir-format msgid "Resetting your password is easy. Just press the button below and follow the instructions. We'll have you up and running in no time." msgstr "Réinitialiser votre mot de passe est facile. Cliquez simplement sur le bouton et suivez les inscriptions. Vous serez opérationnel en un rien de temps." #: lib/web/email/user.ex:28 +#, elixir-format msgid "Instructions to confirm your Mobilizon account on %{instance}" msgstr "Instructions pour confirmer votre compte Mobilizon sur %{instance}" #: lib/web/email/admin.ex:24 +#, elixir-format msgid "New report on Mobilizon instance %{instance}" msgstr "Nouveau signalement sur l'instance Mobilizon %{instance}" -#: lib/web/templates/email/before_event_notification.html.eex:51 lib/web/templates/email/before_event_notification.text.eex:4 +#: lib/web/templates/email/before_event_notification.html.eex:51 +#: lib/web/templates/email/before_event_notification.text.eex:4 +#, elixir-format msgid "Go to event page" msgstr "Aller à la page de l'événement" #: lib/web/templates/email/report.text.eex:1 +#, elixir-format msgid "New report from %{reporter} on %{instance}" msgstr "Nouveau signalement sur %{instance}" #: lib/web/templates/email/event_participation_approved.text.eex:1 +#, elixir-format msgid "Participation approved" msgstr "Participation approuvée" -#: lib/web/templates/email/password_reset.html.eex:13 lib/web/templates/email/password_reset.text.eex:1 +#: lib/web/templates/email/password_reset.html.eex:13 +#: lib/web/templates/email/password_reset.text.eex:1 +#, elixir-format msgid "Password reset" msgstr "Réinitialisation du mot de passe" #: lib/web/templates/email/password_reset.text.eex:7 +#, elixir-format msgid "Resetting your password is easy. Just click the link below and follow the instructions. We'll have you up and running in no time." msgstr "Réinitialiser votre mot de passe est facile. Cliquez simplement sur le bouton et suivez les instructions. Vous serez opérationnel en un rien de temps." #: lib/web/templates/email/registration_confirmation.text.eex:5 +#, elixir-format msgid "You created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email." msgstr "Vous avez créé un compte sur %{host} avec cette adresse email. Vous êtes à un clic de l'activer." #: lib/web/email/participation.ex:112 +#, elixir-format msgid "Your participation to event %{title} has been approved" msgstr "Votre participation à l'événement %{title} a été approuvée" #: lib/web/email/participation.ex:70 +#, elixir-format msgid "Your participation to event %{title} has been rejected" msgstr "Votre participation à l'événement %{title} a été rejetée" #: lib/web/email/event.ex:37 +#, elixir-format msgid "Event %{title} has been updated" msgstr "L'événement %{title} a été mis à jour" #: lib/web/templates/email/event_updated.text.eex:15 +#, elixir-format msgid "New title: %{title}" msgstr "Nouveau titre : %{title}" #: lib/web/templates/email/password_reset.text.eex:5 +#, elixir-format msgid "You requested a new password for your account on %{instance}." msgstr "Vous avez demandé un nouveau mot de passe pour votre compte sur %{instance}." #: lib/web/templates/email/email.html.eex:85 +#, elixir-format msgid "Warning" msgstr "Attention" #: lib/web/email/participation.ex:135 +#, elixir-format msgid "Confirm your participation to event %{title}" msgstr "Confirmer ma participation à l'événement %{title}" #: lib/web/templates/api/privacy.html.eex:75 +#, elixir-format msgctxt "terms" msgid "An internal ID for your current selected identity" msgstr "Une identité interne pour l'identité sélectionnée actuellement" #: lib/web/templates/api/privacy.html.eex:74 +#, elixir-format msgctxt "terms" msgid "An internal user ID" msgstr "Une identité utilisateur·ice interne" #: lib/web/templates/api/privacy.html.eex:37 +#, elixir-format msgctxt "terms" msgid "Any of the information we collect from you may be used in the following ways:" msgstr "Les informations que nous vous nous fournissez pourront être utilisées ainsi :" #: lib/web/templates/api/privacy.html.eex:9 +#, elixir-format msgctxt "terms" msgid "Basic account information" msgstr "Informations basiques du compte" #: lib/web/templates/api/privacy.html.eex:25 +#, elixir-format msgctxt "terms" msgid "Do not share any dangerous information over Mobilizon." msgstr "Ne partagez aucune information sensible à l'aide de Mobilizon." #: lib/web/templates/api/privacy.html.eex:90 +#, elixir-format msgctxt "terms" msgid "Do we disclose any information to outside parties?" msgstr "Partageons-nous des informations à des tiers ?" #: lib/web/templates/api/privacy.html.eex:68 +#, elixir-format msgctxt "terms" msgid "Do we use cookies?" msgstr "Utilisons-nous des cookies ?" #: lib/web/templates/api/privacy.html.eex:51 +#, elixir-format msgctxt "terms" msgid "How do we protect your information?" msgstr "Comment protégeons-nous vos informations ?" #: lib/web/templates/api/privacy.html.eex:29 +#, elixir-format msgctxt "terms" msgid "IPs and other metadata" msgstr "Adresses IP et autres métadonnées" #: lib/web/templates/api/privacy.html.eex:17 +#, elixir-format msgctxt "terms" msgid "Published events and comments" msgstr "Événements publiés et commentaires" #: lib/web/templates/api/privacy.html.eex:64 +#, elixir-format msgctxt "terms" msgid "Retain the IP addresses associated with registered users no more than 12 months." msgstr "Ne pas conserver les adresses IP associées aux utilisateur·ices enregistrés pas plus de 12 mois." #: lib/web/templates/api/privacy.html.eex:76 +#, elixir-format msgctxt "terms" msgid "Tokens to authenticate you" msgstr "Jetons pour vous identifier" #: lib/web/templates/api/privacy.html.eex:31 +#, elixir-format msgctxt "terms" msgid "We also may retain server logs which include the IP address of every request to our server." msgstr "Nous pouvons également conserver les données d'authentification y compris les adresses IP de toutes les requêtes de notre serveur." #: lib/web/templates/api/privacy.html.eex:70 +#, elixir-format msgctxt "terms" msgid "We store the following information on your device when you connect:" msgstr "Nous conservons les informations suivantes sur votre appareil lorsque vous vous connectez :" #: lib/web/templates/api/privacy.html.eex:58 +#, elixir-format msgctxt "terms" msgid "We will make a good faith effort to:" msgstr "Nous mettrons tout en possible pour :" #: lib/web/templates/api/privacy.html.eex:35 +#, elixir-format msgctxt "terms" msgid "What do we use your information for?" msgstr "Comment utilisons-nous vos informations ?" #: lib/web/templates/api/privacy.html.eex:57 +#, elixir-format msgctxt "terms" msgid "What is our data retention policy?" msgstr "Quelle est notre politique de conservation des données ?" #: lib/web/templates/api/privacy.html.eex:67 +#, elixir-format msgctxt "terms" msgid "You may irreversibly delete your account at any time." msgstr "Vous pouvez supprimer votre compte à tout moment de façon irréversible." #: lib/web/templates/api/privacy.html.eex:115 +#, elixir-format msgctxt "terms" msgid "Changes to our Privacy Policy" msgstr "Modifications de notre politique de confidentialité" #: lib/web/templates/api/privacy.html.eex:106 +#, elixir-format msgctxt "terms" msgid "If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site." msgstr "Si ce serveur est dans l'Union Européenne ou dans l'Espace Economique Européen : nos sites, produits et services sont tous destinés aux personnes âgées de plus de 16 ans. Si vous avez moins de 16 ans, suivant le RGPD (Règlement général sur la protection des données), n'utilisez pas ce site." #: lib/web/templates/api/privacy.html.eex:109 +#, elixir-format msgctxt "terms" msgid "If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site." msgstr "Si le serveur est situé aux Etats-Unis : Notre site, nos produits et services sont tous à destination de personnes agées d'au moins 13 ans. Si vous avez moins de 13 ans, d'après les recommandations de COOPA (Children's Online Privacy Protection Act) n'utilisez pas ce site." #: lib/web/templates/api/privacy.html.eex:117 +#, elixir-format msgctxt "terms" msgid "If we decide to change our privacy policy, we will post those changes on this page." msgstr "Si nous décidons de changer notre politique de confidentialité, nous présenterons ces changements sur cette page." #: lib/web/templates/api/privacy.html.eex:112 +#, elixir-format msgctxt "terms" msgid "Law requirements can be different if this server is in another jurisdiction." msgstr "Les conditions juridiques peuvent différer si le serveur est sous une autre juridiction." #: lib/web/templates/api/privacy.html.eex:103 +#, elixir-format msgctxt "terms" msgid "Site usage by children" -msgstr "Utilisation du site par les enfants" +msgstr "Utilisation du site par des mineurs" #: lib/web/templates/api/privacy.html.eex:47 +#, elixir-format msgctxt "terms" -msgid "" -"The email address you provide may be used to send you information, updates and notifications about other people\n" -" interacting with your content or sending you messages and to respond to inquiries, and/or other requests or\n" -" questions." -msgstr "L'adresse électronique que vous fournissez peut être utilisée pour vous envoyer des informations, des mises à jour et des notifications concernant d'autres personnes qui interagissent avec votre contenu ou vous envoient des messages et pour répondre à des demandes, et/ou à d'autres requêtes ou questions." +msgid "The email address you provide may be used to send you information, updates and notifications about other people\n interacting with your content or sending you messages and to respond to inquiries, and/or other requests or\n questions." +msgstr "" +"L'adresse électronique que vous nous fournissez peut être utilisée pour vous " +"envoyer des informations, des mises à jour et des notifications concernant " +"d'autres personnes\n" +"qui interagissent avec vos contenus ou vous envoient des messages et pour " +"répondre à des demandes,\n" +"et/ou à d'autres requêtes ou questions." #: lib/web/templates/api/privacy.html.eex:45 +#, elixir-format msgctxt "terms" -msgid "" -"To aid moderation of the community, for example comparing your IP address with other known ones to determine ban\n" -" evasion or other violations." -msgstr "Pour aider à la modération de la communauté, par exemple en comparant votre adresse IP avec d'autres adresses connues afin de déterminer s'il y a contournement d'un bannissement ou d'autres violations." +msgid "To aid moderation of the community, for example comparing your IP address with other known ones to determine ban\n evasion or other violations." +msgstr "" +"Afin d'aider à la modération de la communauté, par exemple en comparant " +"votre adresse IP avec d'autres adresses connues\n" +"dans le but de détecter des tentatives de contournement d'un bannissement ou " +"d'autres violations." #: lib/web/templates/api/privacy.html.eex:43 +#, elixir-format msgctxt "terms" -msgid "" -"To provide the core functionality of Mobilizon. Depending on this instance's policy you may only be able to\n" -" interact with other people's content and post your own content if you are logged in." -msgstr "Fournir la fonctionnalité de base de Mobilizon. Selon la politique de cette instance, vous ne pourrez interagir avec le contenu d'autres personnes et publier votre propre contenu que si vous êtes connecté." +msgid "To provide the core functionality of Mobilizon. Depending on this instance's policy you may only be able to\n interact with other people's content and post your own content if you are logged in." +msgstr "" +"Fournir la fonctionnalité de base de Mobilizon. Selon la politique de cette " +"instance, vous ne pourrez interagir\n" +"avec le contenu d'autres personnes et publier votre propre contenu que si " +"vous êtes connecté." #: lib/web/templates/api/privacy.html.eex:6 +#, elixir-format msgctxt "terms" msgid "What information do we collect?" msgstr "Quelles informations collectons-nous ?" #: lib/web/email/user.ex:176 +#, elixir-format msgid "Mobilizon on %{instance}: confirm your email address" msgstr "Mobilizon sur %{instance} : confirmez votre adresse email" #: lib/web/email/user.ex:152 +#, elixir-format msgid "Mobilizon on %{instance}: email changed" msgstr "Mobilizon sur %{instance} : adresse email modifiée" #: lib/web/email/notification.ex:47 +#, elixir-format msgid "One event planned today" msgid_plural "%{nb_events} events planned today" msgstr[0] "Un événement prévu aujourd'hui" msgstr[1] "%{nb_events} événements prévus aujourd'hui" -#: lib/web/templates/email/on_day_notification.html.eex:38 lib/web/templates/email/on_day_notification.text.eex:4 +#: lib/web/templates/email/on_day_notification.html.eex:38 +#: lib/web/templates/email/on_day_notification.text.eex:4 +#, elixir-format msgid "You have one event today:" msgid_plural "You have %{total} events today:" msgstr[0] "Vous avez un événement aujourd'hui :" msgstr[1] "Vous avez %{total} événements aujourd'hui :" #: lib/web/templates/email/group_invite.text.eex:3 +#, elixir-format msgid "%{inviter} just invited you to join their group %{group}" msgstr "%{inviter} vient de vous inviter à rejoindre son groupe %{group}" -#: lib/web/templates/email/group_invite.html.eex:13 lib/web/templates/email/group_invite.text.eex:1 +#: lib/web/templates/email/group_invite.html.eex:13 +#: lib/web/templates/email/group_invite.text.eex:1 +#, elixir-format msgid "Come along!" msgstr "Rejoignez-nous !" #: lib/web/email/notification.ex:24 +#, elixir-format msgid "Don't forget to go to %{title}" msgstr "N'oubliez pas de vous rendre à %{title}" -#: lib/web/templates/email/before_event_notification.html.eex:38 lib/web/templates/email/before_event_notification.text.eex:3 +#: lib/web/templates/email/before_event_notification.html.eex:38 +#: lib/web/templates/email/before_event_notification.text.eex:3 +#, elixir-format msgid "Get ready for %{title}" msgstr "Préparez vous pour %{title}" #: lib/web/templates/email/group_invite.html.eex:59 +#, elixir-format msgid "See my groups" msgstr "Voir mes groupes" -#: lib/web/templates/email/group_invite.html.eex:45 lib/web/templates/email/group_invite.text.eex:5 +#: lib/web/templates/email/group_invite.html.eex:45 +#: lib/web/templates/email/group_invite.text.eex:5 +#, elixir-format msgid "To accept this invitation, head over to your groups." msgstr "Pour accepter cette invitation, rendez-vous dans vos groupes." #: lib/web/templates/email/before_event_notification.text.eex:5 +#, elixir-format msgid "View the event on: %{link}" msgstr "Voir l'événement mis à jour sur : %{link}" #: lib/web/email/group.ex:33 +#, elixir-format msgid "You have been invited by %{inviter} to join group %{group}" msgstr "Vous avez été invité par %{inviter} à rejoindre le groupe %{group}" #: lib/web/email/notification.ex:71 +#, elixir-format msgid "One event planned this week" msgid_plural "%{nb_events} events planned this week" msgstr[0] "Un événement prévu cette semaine" msgstr[1] "%{nb_events} événements prévus cette semaine" #: lib/web/email/notification.ex:93 +#, elixir-format msgid "One participation request for event %{title} to process" msgid_plural "%{number_participation_requests} participation requests for event %{title} to process" msgstr[0] "Une demande de participation à l'événement %{title} à traiter" msgstr[1] "%{number_participation_requests} demandes de participation à l'événement %{title} à traiter" -#: lib/web/templates/email/notification_each_week.html.eex:38 lib/web/templates/email/notification_each_week.text.eex:3 +#: lib/web/templates/email/notification_each_week.html.eex:38 +#: lib/web/templates/email/notification_each_week.text.eex:3 +#, elixir-format msgid "You have one event this week:" msgid_plural "You have %{total} events this week:" msgstr[0] "Vous avez un événement aujourd'hui :" msgstr[1] "Vous avez %{total} événements aujourd'hui :" #: lib/service/metadata/utils.ex:52 +#, elixir-format msgid "The event organizer didn't add any description." msgstr "L'organisateur·ice de l'événement n'a pas ajouté de description." #: lib/web/templates/api/privacy.html.eex:54 +#, elixir-format msgctxt "terms" msgid "We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL/TLS, and your password is hashed using a strong one-way algorithm." msgstr "Nous utilisons plusieurs mesures de sécurité pour assurer la confidentialité de vos informations personnelles lorsque vous soumettez ou accédez à vos informations. Entre autres, votre session de navigateur et la connexion entre vos applications et l'API sont sécurisés par SSL/TLS, et votre mot de passe est haché avec un algorithme fort à sens unique." #: lib/web/templates/api/privacy.html.eex:94 +#, elixir-format msgctxt "terms" msgid "No. We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety." msgstr "Non. Nous ne vendons, n’échangeons ou ne transférons d’une quelque manière que soit des informations permettant de vous identifier personnellement. Cela n’inclut pas les tierces parties de confiance qui nous aident à opérer ce site, à conduire nos activités commerciales ou à vous servir, tant qu’elles acceptent de garder ces informations confidentielles. Nous sommes également susceptibles de partager vos informations quand nous pensons que c’est nécessaire pour nous conformer à la loi, pour appliquer les politiques de notre site ainsi que pour défendre nos droits, notre propriété, notre sécurité et celles et ceux d’autres personnes." #: lib/web/templates/api/terms.html.eex:23 +#, elixir-format msgctxt "terms" msgid "Accepting these Terms" msgstr "Acceptation de ces Conditions" #: lib/web/templates/api/terms.html.eex:27 +#, elixir-format msgctxt "terms" msgid "Changes to these Terms" msgstr "Modifications de ces Conditions d'Utilisation" #: lib/web/templates/api/terms.html.eex:85 +#, elixir-format msgctxt "terms" msgid "A lot of the content on the Service is from you and others, and we don't review, verify or authenticate it, and it may include inaccuracies or false information. We make no representations, warranties, or guarantees relating to the quality, suitability, truth, accuracy or completeness of any content contained in the Service. You acknowledge sole responsibility for and assume all risk arising from your use of or reliance on any content." msgstr "Une grande partie du contenu du Service provient de vous et d'autres personnes, et nous ne l'examinons, ne le vérifions ni ne l'authentifions, et il peut contenir des inexactitudes ou de fausses informations. Nous ne faisons aucune déclaration, garantie ou assurance concernant la qualité, la pertinence, la véracité, l'exactitude ou l'exhaustivité de tout contenu du Service. Vous reconnaissez être seul responsable et assumez tous les risques découlant de votre utilisation ou de votre confiance dans tout contenu." #: lib/web/templates/api/terms.html.eex:60 +#, elixir-format msgctxt "terms" msgid "Also, you agree that you will not do any of the following in connection with the Service or other users:" msgstr "De plus, vous acceptez de ne pas faire ce qui suit en relation avec le Service ou les autres utilisateur·ices :" #: lib/web/templates/api/terms.html.eex:65 +#, elixir-format msgctxt "terms" msgid "Circumvent or attempt to circumvent any filtering, security measures, rate limits or other features designed to protect the Service, users of the Service, or third parties." msgstr "Contourner ou tenter de contourner tout filtrage, mesures de sécurité, limites d'accès ou autres caractéristiques destinées à protéger le Service, les utilisateur·ices du Service ou des tiers." #: lib/web/templates/api/terms.html.eex:64 +#, elixir-format msgctxt "terms" msgid "Collect any personal information about other users, or intimidate, threaten, stalk or otherwise harass other users of the Service;" msgstr "Recueillir des informations personnelles sur les autres utilisateur·ices, ou intimider, menacer, traquer ou harceler de toute autre manière les autres utilisateurs du Service ;" #: lib/web/templates/api/terms.html.eex:55 +#, elixir-format msgctxt "terms" msgid "Content that is illegal or unlawful, that would otherwise create liability;" msgstr "Du contenu qui est illégal ou illicite, qui autrement entraînerait une responsabilité ;" #: lib/web/templates/api/terms.html.eex:56 +#, elixir-format msgctxt "terms" msgid "Content that may infringe or violate any patent, trademark, trade secret, copyright, right of privacy, right of publicity or other intellectual or other right of any party;" msgstr "Du contenu susceptible d'enfreindre ou de violer un brevet, une marque de commerce, un secret commercial, un droit d'auteur, un droit à la vie privée, un droit de publicité ou tout autre droit intellectuel ou autre de toute partie ;" #: lib/web/templates/api/terms.html.eex:42 +#, elixir-format msgctxt "terms" msgid "Creating Accounts" msgstr "Création de compte" #: lib/web/templates/api/terms.html.eex:89 +#, elixir-format msgctxt "terms" msgid "Entire Agreement" msgstr "Accord complet" #: lib/web/templates/api/terms.html.eex:92 +#, elixir-format msgctxt "terms" msgid "Feedback" msgstr "Commentaires" #: lib/web/templates/api/terms.html.eex:83 +#, elixir-format msgctxt "terms" msgid "Hyperlinks and Third Party Content" msgstr "Liens hypertexte et contenu tiers" #: lib/web/templates/api/terms.html.eex:88 +#, elixir-format msgctxt "terms" msgid "If you breach any of these Terms, we have the right to suspend or disable your access to or use of the Service." msgstr "Si vous enfreignez l'une de ces Conditions, nous avons le droit de suspendre ou de désactiver votre accès ou votre utilisation du Service." #: lib/web/templates/api/terms.html.eex:63 +#, elixir-format msgctxt "terms" msgid "Impersonate or post on behalf of any person or entity or otherwise misrepresent your affiliation with a person or entity;" msgstr "Usurper l'identité d'une personne ou d'une entité ou afficher au nom d'une personne ou d'une entité, ou encore présenter de manière inexacte votre affiliation à une personne ou une entité ;" #: lib/web/templates/api/terms.html.eex:48 +#, elixir-format msgctxt "terms" msgid "Our Service allows you and other users to post, link and otherwise make available content. You are responsible for the content that you make available to the Service, including its legality, reliability, and appropriateness." msgstr "Notre Service vous permet, ainsi qu'à d'autres utilisateur·ices, de publier, d'établir des liens et de mettre à disposition du contenu. Vous êtes responsable du contenu que vous mettez à la disposition du service, y compris de sa légalité, de sa fiabilité et de sa pertinence." #: lib/web/templates/api/terms.html.eex:39 +#, elixir-format msgctxt "terms" msgid "Privacy Policy" msgstr "Politique de confidentialité" #: lib/web/templates/api/terms.html.eex:95 +#, elixir-format msgctxt "terms" msgid "Questions & Contact Information" msgstr "Questions et coordonnées" #: lib/web/templates/api/terms.html.eex:87 +#, elixir-format msgctxt "terms" msgid "Termination" msgstr "Résiliation" #: lib/web/templates/api/terms.html.eex:62 +#, elixir-format msgctxt "terms" msgid "Use the Service in any manner that could interfere with, disrupt, negatively affect or inhibit other users from fully enjoying the Service or that could damage, disable, overburden or impair the functioning of the Service;" msgstr "Utiliser le Service de toute manière qui pourrait interférer, perturber, affecter négativement ou empêcher d'autres utilisateur·ices de profiter pleinement du Service ou qui pourrait endommager, désactiver, surcharger ou altérer le fonctionnement du Service ;" #: lib/web/templates/api/terms.html.eex:47 +#, elixir-format msgctxt "terms" msgid "Your Content & Conduct" msgstr "Votre contenu et votre conduite" #: lib/web/templates/api/terms.html.eex:84 +#, elixir-format msgctxt "terms" msgid "%{instance_name} makes no claim or representation regarding, and accepts no responsibility for third party websites accessible by hyperlink from the Service or websites linking to the Service. When you leave the Service, you should be aware that these Terms and our policies no longer govern. The inclusion of any link does not imply endorsement by %{instance_name} of the site. Use of any such linked website is at the user's own risk." msgstr "%{instance_name} ne fait aucune revendication et n'accepte aucune responsabilité concernant les sites web de tiers accessibles par lien hypertexte depuis le Service ou les sites web liés au Service. Lorsque vous quittez le Service, vous devez savoir que les présentes Conditions et nos politiques de confidentialité ne sont plus applicables. L'inclusion d'un lien n'implique pas l'approbation par %{instance_name} du site. L'utilisation de tout site web lié est aux risques et périls de l'utilisateur·ice." #: lib/web/templates/api/terms.html.eex:68 +#, elixir-format msgctxt "terms" msgid "Finally, your use of the Service is also subject to acceptance of the instance's own specific rules regarding the code of conduct and moderation rules. Breaking those rules may also result in your account being disabled or suspended." msgstr "Enfin, votre utilisation du Service est également soumise à l'acceptation des règles spécifiques de l'instance concernant le code de conduite et les règles de modération. Le non-respect de ces règles peut également entraîner la désactivation ou la suspension de votre compte." #: lib/web/templates/api/terms.html.eex:81 +#, elixir-format msgctxt "terms" msgid "For full details about the Mobilizon software see here." msgstr "Pour plus de détails sur le logiciel Mobilizon voir ici." #: lib/web/templates/api/terms.html.eex:18 +#, elixir-format msgctxt "terms" msgid "Here are the important things you need to know about accessing and using the %{instance_name} (%{instance_url}) website and service (collectively, \"Service\"). These are our terms of service (\"Terms\"). Please read them carefully." msgstr "Voici les points importants que vous devez savoir sur l'accès et l'utilisation du site web et du Service %{instance_name} (%{instance_url}) (conjointement, \"Service\"). Ce sont nos conditions de service (\"Conditions\"). Veuillez les lire attentivement." #: lib/web/templates/api/terms.html.eex:33 +#, elixir-format msgctxt "terms" msgid "If we make major changes, we will notify our users in a clear and prominent manner. Minor changes may only be highlighted in the footer of our website. It is your responsibility to check the website regularly for changes to these Terms." msgstr "Si nous apportons des changements majeurs, nous en informerons nos utilisateur·ices de manière claire et visible. Il est possible que les changements mineurs ne soient mis en évidence que dans le pied de page de cette page. Il est de votre responsabilité de vérifier régulièrement sur le site web si des modifications ont été apportées aux présentes Conditions." #: lib/web/templates/api/terms.html.eex:53 +#, elixir-format msgctxt "terms" msgid "In order to make %{instance_name} a great place for all of us, please do not post, link and otherwise make available on or through the Service any of the following:" msgstr "Afin de faire de %{instance_name} un endroit idéal pour nous toutes et tous, nous vous prions de ne pas publier, relier ou rendre disponible sur ou par le biais du Service l'un des éléments suivants :" #: lib/web/templates/api/terms.html.eex:57 +#, elixir-format msgctxt "terms" msgid "Private information of any third party (e.g., addresses, phone numbers, email addresses, Social Security numbers and credit card numbers); and" msgstr "Les informations privées de toute personne tierce (par exemple, les adresses, les numéros de téléphone, les adresses électroniques, les numéros de sécurité sociale et les numéros de carte de crédit) ; et" #: lib/web/templates/api/terms.html.eex:52 +#, elixir-format msgctxt "terms" msgid "Since Mobilizon is a distributed network, it is possible, depending on the visibility rules set to your content, that your content has been distributed to other Mobilizon instances. When you delete your content, we will request those other instances to also delete the content. Our responsibility on the content being deleted from those other instances ends here. If for some reason, some other instance does not delete the content, we cannot be held responsible." msgstr "Mobilizon étant un réseau distribué, il est possible, en fonction des règles de visibilité définies pour votre contenu, que celui-ci ait été distribué à d'autres instances de Mobilizon. Lorsque vous supprimez votre contenu, nous demandons à ces autres instances de supprimer également le contenu. Notre responsabilité quant au contenu supprimé de ces autres instances s'arrête ici. Si, pour une raison quelconque, une autre instance ne supprime pas le contenu, nous ne pouvons être tenus responsables." #: lib/web/templates/api/terms.html.eex:90 +#, elixir-format msgctxt "terms" msgid "These Terms constitute the entire agreement between you and %{instance_name} regarding the use of the Service, superseding any prior agreements between you and %{instance_name} relating to your use of the Service." msgstr "Les présentes Conditions constituent l'intégralité de l'accord entre vous et %{instance_name} concernant l'utilisation du Service, remplaçant tout accord préalable entre vous et %{instance_name} relatif à votre utilisation du Service." #: lib/web/templates/api/terms.html.eex:80 +#, elixir-format msgctxt "terms" msgid "This Service runs on a Mobilizon instance. This source code is licensed under an AGPLv3 license which means you are allowed to and even encouraged to take the source code, modify it and use it." msgstr "Ce Service fonctionne sur une instance de Mobilizon. Ce code source est sous licence AGPLv3 ce qui signifie que vous êtes autorisé et même encouragé à prendre le code source, le modifier et l'utiliser." #: lib/web/templates/api/terms.html.eex:58 +#, elixir-format msgctxt "terms" msgid "Viruses, corrupted data or other harmful, disruptive or destructive files or code." msgstr "Virus, données corrompues ou autres fichiers ou codes nuisibles, perturbateurs ou destructeurs." #: lib/web/templates/api/terms.html.eex:51 +#, elixir-format msgctxt "terms" msgid "You can remove the content that you posted by deleting it. Once you delete your content, it will not appear on the Service, but copies of your deleted content may remain in our system or backups for some period of time. Web server access logs might also be stored for some time in the system." msgstr "Vous pouvez supprimer le contenu que vous avez publié en le supprimant. Une fois que vous avez supprimé votre contenu, il n'apparaîtra plus sur le Service, mais des copies de votre contenu supprimé peuvent rester dans notre système ou des sauvegardes pendant un certain temps. Les journaux d'accès au serveur web peuvent également être stockés pendant un certain temps dans le système." #: lib/web/templates/api/terms.html.eex:96 +#, elixir-format msgctxt "terms" msgid "Questions or comments about the Service may be directed to us at %{contact}" msgstr "Les questions ou commentaires concernant le Service peuvent nous être adressés à %{contact}" #: lib/web/templates/api/terms.html.eex:79 +#, elixir-format msgctxt "terms" msgid "Source code" msgstr "Code source" #: lib/web/templates/api/terms.html.eex:93 +#, elixir-format msgctxt "terms" msgid "We love feedback. Please let us know what you think of the Service, these Terms and, in general, %{instance_name}." msgstr "Nous aimons les retours d'information. N'hésitez pas à nous faire savoir ce que vous pensez du Service, des présentes Conditions et, en général, de %{instance_name}." #: lib/web/templates/api/terms.html.eex:74 +#, elixir-format msgctxt "terms" msgid "Instance administrators (and community moderators, given the relevant access) are responsible for monitoring and acting on flagged content and other user reports, and have the right and responsibility to remove or edit content that is not aligned to this Instance set of rules, or to suspend, block or ban (temporarily or permanently) any account, community, or instance for breaking these terms, or for other behaviours that they deem inappropriate, threatening, offensive, or harmful." msgstr "Les administrateurs d'instance (et les modérateurs de la communauté, sous réserve d'un accès approprié) sont chargés de surveiller et d'agir sur les contenus signalés et autres rapports d'utilisateur·ices, et ont le droit et la responsabilité de supprimer ou de modifier les contenus qui ne sont pas conformes aux règles de cette d'instance, ou de suspendre, bloquer ou interdire (temporairement ou définitivement) tout compte, communauté ou instance pour violation de ces conditions, ou pour d'autres comportements qu'ils jugent inappropriés, menaçants, offensants ou nuisibles." #: lib/web/templates/api/terms.html.eex:6 +#, elixir-format msgctxt "terms" msgid "%{instance_name} will not use or transmit or resell your personal data" msgstr "%{instance_name} n'utilisera pas ni ne transmettra ou revendra vos données" #: lib/web/templates/api/terms.html.eex:44 +#, elixir-format msgctxt "terms" msgid "If you discover or suspect any Service security breaches, please let us know as soon as possible. For security holes in the Mobilizon software itself, please contact its contributors directly." msgstr "Si vous découvrez ou soupçonnez des failles de sécurité du Service, veuillez nous en informer dès que possible. Pour les failles de sécurité dans le logiciel Mobilizon lui-même, veuillez contacter directement ses contributeur·ices." #: lib/web/templates/api/terms.html.eex:77 +#, elixir-format msgctxt "terms" msgid "Instance administrators should ensure that every community hosted on the instance is properly moderated according to the defined rules." msgstr "Les administrateur·ices d'instance doivent s'assurer que chaque communauté hébergée sur l'instance est correctement modérée conformément aux règles définies." #: lib/web/templates/api/terms.html.eex:98 +#, elixir-format msgctxt "terms" msgid "Originally adapted from the Diaspora* and App.net privacy policies, also licensed under CC BY-SA." msgstr "Adaptée à l'origine des politiques de confidentialité de Diaspora* et App.net, aussi sous licence CC BY-SA." #: lib/web/templates/api/privacy.html.eex:119 +#, elixir-format msgctxt "terms" msgid "Originally adapted from the Mastodon and Discourse privacy policies, also licensed under CC BY-SA." msgstr "Adaptée à l'origine des politiques de confidentialité de Mastodon et Discourse, aussi sous licence CC BY-SA." #: lib/web/templates/api/terms.html.eex:3 +#, elixir-format msgctxt "terms" msgid "Short version" msgstr "Version courte" #: lib/web/templates/api/terms.html.eex:9 +#, elixir-format msgctxt "terms" msgid "The service is provided without warranties and these terms may change in the future" msgstr "Le service est fourni sans garanties et ces conditions peuvent changer dans le futur" #: lib/web/templates/api/privacy.html.eex:118 +#, elixir-format msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 18, 2020." msgstr "Ce document est sous licence CC BY-SA. La dernière mise à jour date du 18 juin 2020." #: lib/web/templates/api/terms.html.eex:97 +#, elixir-format msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 22, 2020." msgstr "Ce document est sous licence CC BY-SA. La dernière mise à jour date du 22 juin 2020." #: lib/web/templates/api/terms.html.eex:8 +#, elixir-format msgctxt "terms" msgid "You must respect other people and %{instance_name}'s rules when using the service" msgstr "Vous devez respecter les autres et les règles de %{instance_name} lorsque vous utilisez le service" #: lib/web/templates/api/terms.html.eex:7 +#, elixir-format msgctxt "terms" msgid "You must respect the law when using %{instance_name}" msgstr "Vous devez respecter la loi lorsque vous utilisez %{instance_name}" #: lib/web/templates/api/terms.html.eex:5 +#, elixir-format msgctxt "terms" msgid "Your content is yours" msgstr "Votre contenu vous appartient" #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:51 +#, elixir-format msgid "Confirm my e-mail address" msgstr "Confirmer mon adresse email" -#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:13 lib/web/templates/email/anonymous_participation_confirmation.text.eex:1 +#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:13 +#: lib/web/templates/email/anonymous_participation_confirmation.text.eex:1 +#, elixir-format msgid "Confirm your e-mail" msgstr "Confirmez votre adresse email" #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:3 +#, elixir-format msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "Salut ! Vous venez de vous enregistrer pour rejoindre cet événement : « %{title} ». Merci de confirmer l'adresse email que vous avez fournie :" -#: lib/web/templates/email/email.html.eex:114 lib/web/templates/email/email.text.eex:8 +#: lib/web/templates/email/email.html.eex:114 +#: lib/web/templates/email/email.text.eex:8 +#, elixir-format msgid "Need help? Is something not working as expected?" msgstr "Besoin d'aide ? Quelque chose ne fonctionne pas correctement ?" #: lib/web/templates/email/registration_confirmation.html.eex:38 +#, elixir-format msgid "You created an account on %{host} with this email address. You are one click away from activating it." msgstr "Vous avez créé un compte sur %{host} avec cette adresse email. Vous êtes à un clic de l'activer." #: lib/web/templates/email/report.html.eex:13 +#, elixir-format msgid "New report on %{instance}" msgstr "Nouveau signalement sur %{instance}" #: lib/web/templates/email/email_changed_old.html.eex:38 +#, elixir-format msgid "The email address for your account on %{host} is being changed to:" msgstr "L'adresse email pour votre compte sur %{host} est en train d'être changée pour :" #: lib/web/templates/email/password_reset.html.eex:38 +#, elixir-format msgid "You requested a new password for your account on %{instance}." msgstr "Vous avez demandé un nouveau mot de passe pour votre compte sur %{instance}." #: lib/web/templates/email/email.text.eex:5 +#, elixir-format msgid "Please do not use it for real purposes." msgstr "Veuillez ne pas l'utiliser pour un cas réel." -#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:63 lib/web/templates/email/anonymous_participation_confirmation.text.eex:6 lib/web/templates/email/event_updated.html.eex:133 lib/web/templates/email/event_updated.text.eex:24 lib/web/templates/email/notification_each_week.html.eex:70 lib/web/templates/email/notification_each_week.text.eex:11 lib/web/templates/email/on_day_notification.html.eex:70 lib/web/templates/email/on_day_notification.text.eex:14 +#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:63 +#: lib/web/templates/email/anonymous_participation_confirmation.text.eex:6 lib/web/templates/email/event_updated.html.eex:133 +#: lib/web/templates/email/event_updated.text.eex:24 lib/web/templates/email/notification_each_week.html.eex:70 +#: lib/web/templates/email/notification_each_week.text.eex:11 lib/web/templates/email/on_day_notification.html.eex:70 +#: lib/web/templates/email/on_day_notification.text.eex:14 +#, elixir-format msgid "Would you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgid_plural "Would you wish to cancel your attendance to one or several events, visit the event pages through the links above and click the « Attending » button." msgstr[0] "Si vous avez besoin d'annuler votre participation, il suffit d'accéder à la page de l'événement à partir du lien ci-dessus et de cliquer sur le bouton « Je participe »." msgstr[1] "Si vous avez besoin d'annuler votre participation à un ou plusieurs événements, il suffit d'accéder aux pages des événement grâce aux liens ci-dessus et de cliquer sur le bouton « Je participe »." -#: lib/web/templates/email/pending_participation_notification.html.eex:38 lib/web/templates/email/pending_participation_notification.text.eex:4 +#: lib/web/templates/email/pending_participation_notification.html.eex:38 +#: lib/web/templates/email/pending_participation_notification.text.eex:4 +#, elixir-format msgid "You have one pending attendance request to process:" msgid_plural "You have %{number_participation_requests} attendance requests to process:" msgstr[0] "Vous avez une demande de participation en attente à traiter :" msgstr[1] "Vous avez %{number_participation_requests} demandes de participation en attente à traiter :" #: lib/web/templates/email/email.text.eex:11 +#, elixir-format msgid "%{instance} is powered by Mobilizon." msgstr "%{instance} est une instance Mobilizon." #: lib/web/templates/email/email.html.eex:142 +#, elixir-format msgid "%{instance} is powered by Mobilizon." msgstr "%{instance} est une instance Mobilizon." -#: lib/web/templates/email/pending_participation_notification.html.eex:13 lib/web/templates/email/pending_participation_notification.text.eex:1 +#: lib/web/templates/email/pending_participation_notification.html.eex:13 +#: lib/web/templates/email/pending_participation_notification.text.eex:1 +#, elixir-format msgid "A request is pending!" msgstr "Une requête est en attente !" -#: lib/web/templates/email/before_event_notification.html.eex:13 lib/web/templates/email/before_event_notification.text.eex:1 +#: lib/web/templates/email/before_event_notification.html.eex:13 +#: lib/web/templates/email/before_event_notification.text.eex:1 +#, elixir-format msgid "An event is upcoming!" msgstr "Un événement est à venir !" -#: lib/web/templates/email/email_changed_new.html.eex:13 lib/web/templates/email/email_changed_new.text.eex:1 +#: lib/web/templates/email/email_changed_new.html.eex:13 +#: lib/web/templates/email/email_changed_new.text.eex:1 +#, elixir-format msgid "Confirm new email" msgstr "Confirmez votre adresse email" #: lib/web/templates/email/event_updated.html.eex:84 +#, elixir-format msgid "End" msgstr "Fin" #: lib/web/templates/email/event_updated.text.eex:21 +#, elixir-format msgid "End %{ends_on}" msgstr "Fin %{ends_on}" -#: lib/web/templates/email/event_updated.html.eex:13 lib/web/templates/email/event_updated.text.eex:1 +#: lib/web/templates/email/event_updated.html.eex:13 +#: lib/web/templates/email/event_updated.text.eex:1 +#, elixir-format msgid "Event update!" msgstr "Événement mis à jour !" #: lib/web/templates/email/report.html.eex:88 +#, elixir-format msgid "Flagged comments" msgstr "Commentaires signalés" -#: lib/web/templates/email/event_participation_approved.html.eex:45 lib/web/templates/email/event_participation_approved.text.eex:7 +#: lib/web/templates/email/event_participation_approved.html.eex:45 +#: lib/web/templates/email/event_participation_approved.text.eex:7 +#, elixir-format msgid "Good news: one of the event organizers just approved your request. Update your calendar, because you're on the guest list now!" msgstr "Bonne nouvelle : un·e des organisateur·ices de l'événement vient d'approuver votre demande. Mettez à jour votre agenda, car vous êtes maintenant un·e participant·e !" -#: lib/web/templates/email/email_changed_new.html.eex:38 lib/web/templates/email/email_changed_new.text.eex:3 +#: lib/web/templates/email/email_changed_new.html.eex:38 +#: lib/web/templates/email/email_changed_new.text.eex:3 +#, elixir-format msgid "Hi there! It seems like you wanted to change the email address linked to your account on %{instance}. If you still wish to do so, please click the button below to confirm the change. You will then be able to log in to %{instance} with this new email address." msgstr "Salut ! Il semblerait que vous avez demandé la modification de l'adresse e-mail liée à votre compte sur %{instance}. Si vous voulez toujours effectuer ce changement, merci de cliquer sur le bouton ci-dessous pour confirmer la modification. Vous pourrez alors vous connecter à %{instance} avec cette nouvelle adresse." #: lib/web/templates/email/email_changed_old.text.eex:3 +#, elixir-format msgid "Hi there! Just a quick note to confirm that the email address linked to your account on %{host} has been changed from this one to:" msgstr "Salut ! Juste un petite note pour confirmer que l'adresse e-mail liée à votre compte sur %{host} a été changée depuis celle-ci à :" -#: lib/web/templates/email/email_changed_old.html.eex:41 lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 +#, elixir-format msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "Si vous n'avez pas effectué cette modification vous-même, il est probable que quelqu'un ait eu accès à votre compte %{host}. Veuillez vous connecter et changer immédiatement votre mot de passe. Si vous ne pouvez pas vous connecter, contactez l'administrateur·ice sur %{host}." #: lib/web/templates/email/password_reset.text.eex:12 +#, elixir-format msgid "If you didn't trigger the change yourself, please ignore this message. Your password won't be changed until you click the link above." msgstr "Si vous n'êtes pas à l'origine de cette modification, merci d'ignorer ce message. Votre mot de passe ne sera pas modifié tant que vous ne cliquerez pas le lien ci-dessus." -#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:70 lib/web/templates/email/anonymous_participation_confirmation.text.eex:4 lib/web/templates/email/registration_confirmation.html.eex:45 +#: lib/web/templates/email/anonymous_participation_confirmation.html.eex:70 +#: lib/web/templates/email/anonymous_participation_confirmation.text.eex:4 lib/web/templates/email/registration_confirmation.html.eex:45 +#, elixir-format msgid "If you didn't trigger this email, you may safely ignore it." msgstr "Si vous n'avez pas déclenché cette alerte, vous pouvez ignorer cet e-mail sans souci." -#: lib/web/templates/email/before_event_notification.html.eex:63 lib/web/templates/email/before_event_notification.text.eex:6 +#: lib/web/templates/email/before_event_notification.html.eex:63 +#: lib/web/templates/email/before_event_notification.text.eex:6 +#, elixir-format msgid "If you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgstr "Si vous avez besoin d'annuler votre participation, il suffit d'accéder à la page de l'événement à partir du lien ci-dessus et de cliquer sur le bouton « Je participe »." -#: lib/web/templates/email/email.html.eex:143 lib/web/templates/email/email.text.eex:11 +#: lib/web/templates/email/email.html.eex:143 +#: lib/web/templates/email/email.text.eex:11 +#, elixir-format msgid "Learn more about Mobilizon here!" msgstr "En apprendre plus à propos de Mobilizon ici !" #: lib/web/templates/email/event_updated.html.eex:94 +#, elixir-format msgid "Location" msgstr "Localisation" #: lib/web/templates/email/event_updated.html.eex:104 +#, elixir-format msgid "Location address was removed" msgstr "L'adresse physique a été enlevée" -#: lib/web/templates/email/pending_participation_notification.html.eex:51 lib/web/templates/email/pending_participation_notification.text.eex:6 +#: lib/web/templates/email/pending_participation_notification.html.eex:51 +#: lib/web/templates/email/pending_participation_notification.text.eex:6 +#, elixir-format msgid "Manage pending requests" msgstr "Gérer les demandes de participation en attente" -#: lib/web/templates/email/registration_confirmation.html.eex:13 lib/web/templates/email/registration_confirmation.text.eex:1 +#: lib/web/templates/email/registration_confirmation.html.eex:13 +#: lib/web/templates/email/registration_confirmation.text.eex:1 +#, elixir-format msgid "Nearly there!" msgstr "Vous y êtes presque !" -#: lib/web/templates/email/email_changed_old.html.eex:13 lib/web/templates/email/email_changed_old.text.eex:1 +#: lib/web/templates/email/email_changed_old.html.eex:13 +#: lib/web/templates/email/email_changed_old.text.eex:1 +#, elixir-format msgid "New email confirmation" msgstr "Confirmation de nouvel e-mail" #: lib/web/templates/email/report.html.eex:106 +#, elixir-format msgid "Reasons for report" msgstr "Raisons du signalement" #: lib/web/templates/email/report.html.eex:39 +#, elixir-format msgid "Someone on %{instance} reported the following content for you to analyze:" msgstr "Une personne de %{instance} a signalé le contenu suivant :" -#: lib/web/templates/email/event_participation_rejected.html.eex:13 lib/web/templates/email/event_participation_rejected.text.eex:1 +#: lib/web/templates/email/event_participation_rejected.html.eex:13 +#: lib/web/templates/email/event_participation_rejected.text.eex:1 +#, elixir-format msgid "Sorry! You're not going." msgstr "Désolé ! Vous n'y allez pas." #: lib/web/templates/email/event_updated.html.eex:74 +#, elixir-format msgid "Start" msgstr "Début" #: lib/web/templates/email/event_updated.text.eex:18 +#, elixir-format msgid "Start %{begins_on}" msgstr "Début %{begins_on}" #: lib/web/templates/email/event_updated.text.eex:3 +#, elixir-format msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "Il y a eu des changements pour %{title} donc nous avons pensé que nous vous le ferions savoir." -#: lib/web/templates/email/event_updated.html.eex:55 lib/web/templates/email/event_updated.text.eex:11 +#: lib/web/templates/email/event_updated.html.eex:55 +#: lib/web/templates/email/event_updated.text.eex:11 +#, elixir-format msgid "This event has been cancelled by its organizers. Sorry!" msgstr "Cet événement a été annulé par ses organisateur·ices. Désolé !" -#: lib/web/templates/email/event_updated.html.eex:51 lib/web/templates/email/event_updated.text.eex:7 +#: lib/web/templates/email/event_updated.html.eex:51 +#: lib/web/templates/email/event_updated.text.eex:7 +#, elixir-format msgid "This event has been confirmed" msgstr "L'événement a été confirmé" -#: lib/web/templates/email/event_updated.html.eex:53 lib/web/templates/email/event_updated.text.eex:9 +#: lib/web/templates/email/event_updated.html.eex:53 +#: lib/web/templates/email/event_updated.text.eex:9 +#, elixir-format msgid "This event has yet to be confirmed: organizers will let you know if they do confirm it." msgstr "Cet événement doit encore être confirmé : les organisateur·ices vous feront savoir si l'événement est confirmé." -#: lib/web/templates/email/event_participation_rejected.html.eex:45 lib/web/templates/email/event_participation_rejected.text.eex:7 +#: lib/web/templates/email/event_participation_rejected.html.eex:45 +#: lib/web/templates/email/event_participation_rejected.text.eex:7 +#, elixir-format msgid "Unfortunately, the organizers rejected your request." msgstr "Malheureusement, les organisateur⋅ices ont rejeté votre demande de participation." #: lib/web/templates/email/email_changed_new.html.eex:51 +#, elixir-format msgid "Verify your email address" msgstr "Vérifier l'adresse email" #: lib/web/templates/email/report.html.eex:126 +#, elixir-format msgid "View report" msgstr "Voir le signalement" #: lib/web/templates/email/report.text.eex:24 +#, elixir-format msgid "View report:" msgstr "Voir le signalement :" -#: lib/web/templates/email/event_participation_approved.html.eex:58 lib/web/templates/email/event_participation_confirmed.html.eex:58 +#: lib/web/templates/email/event_participation_approved.html.eex:58 +#: lib/web/templates/email/event_participation_confirmed.html.eex:58 +#, elixir-format msgid "Visit event page" msgstr "Voir la page de l'événement" #: lib/web/templates/email/event_updated.html.eex:121 +#, elixir-format msgid "Visit the updated event page" msgstr "Voir la page de l'événement mis à jour" #: lib/web/templates/email/event_updated.text.eex:23 +#, elixir-format msgid "Visit the updated event page: %{link}" msgstr "Voir l'événement mis à jour sur : %{link}" -#: lib/web/templates/email/notification_each_week.html.eex:13 lib/web/templates/email/notification_each_week.text.eex:1 +#: lib/web/templates/email/notification_each_week.html.eex:13 +#: lib/web/templates/email/notification_each_week.text.eex:1 +#, elixir-format msgid "What's up this week?" msgstr "Quoi de neuf cette semaine ?" -#: lib/web/templates/email/on_day_notification.html.eex:13 lib/web/templates/email/on_day_notification.text.eex:1 +#: lib/web/templates/email/on_day_notification.html.eex:13 +#: lib/web/templates/email/on_day_notification.text.eex:1 +#, elixir-format msgid "What's up today?" msgstr "Quoi de neuf aujourd'hui ?" -#: lib/web/templates/email/event_participation_approved.html.eex:70 lib/web/templates/email/event_participation_approved.text.eex:11 lib/web/templates/email/event_participation_confirmed.html.eex:70 lib/web/templates/email/event_participation_confirmed.text.eex:6 +#: lib/web/templates/email/event_participation_approved.html.eex:70 +#: lib/web/templates/email/event_participation_approved.text.eex:11 lib/web/templates/email/event_participation_confirmed.html.eex:70 +#: lib/web/templates/email/event_participation_confirmed.text.eex:6 +#, elixir-format msgid "Would you wish to update or cancel your attendance, simply access the event page through the link above and click on the Attending button." msgstr "Si vous souhaitez mettre à jour ou annuler votre participation, il vous suffit d'accéder à la page de l'événement par le lien ci-dessus et de cliquer sur le bouton Participer." -#: lib/web/templates/email/pending_participation_notification.html.eex:64 lib/web/templates/email/pending_participation_notification.text.eex:8 +#: lib/web/templates/email/pending_participation_notification.html.eex:64 +#: lib/web/templates/email/pending_participation_notification.text.eex:8 +#, elixir-format msgid "You are receiving this email because you chose to get notifications for pending attendance requests to your events. You can disable or change your notification settings in your user account settings under « Notifications »." msgstr "Vous recevez ce courriel parce que vous avez choisi de recevoir des notifications pour les demandes de participation en attente à vos événements. Vous pouvez désactiver ou modifier vos paramètres de notification dans les paramètres de votre compte utilisateur dans « Notifications »." #: lib/web/templates/email/event_participation_rejected.text.eex:5 +#, elixir-format msgid "You issued a request to attend %{title}." msgstr "Vous avez effectué une demande de participation à %{title}." -#: lib/web/templates/email/event_participation_approved.text.eex:5 lib/web/templates/email/event_participation_confirmed.text.eex:3 +#: lib/web/templates/email/event_participation_approved.text.eex:5 +#: lib/web/templates/email/event_participation_confirmed.text.eex:3 +#, elixir-format msgid "You recently requested to attend %{title}." msgstr "Vous avez demandé à participer à l'événement %{title}." -#: lib/web/templates/email/event_participation_approved.html.eex:13 lib/web/templates/email/event_participation_confirmed.html.eex:13 lib/web/templates/email/event_participation_confirmed.text.eex:1 +#: lib/web/templates/email/event_participation_approved.html.eex:13 +#: lib/web/templates/email/event_participation_confirmed.html.eex:13 lib/web/templates/email/event_participation_confirmed.text.eex:1 +#, elixir-format msgid "You're going!" msgstr "Vous y allez !" -#: lib/web/templates/email/email_changed_new.html.eex:64 lib/web/templates/email/email_changed_new.text.eex:5 +#: lib/web/templates/email/email_changed_new.html.eex:64 +#: lib/web/templates/email/email_changed_new.text.eex:5 +#, elixir-format msgid "If you didn't trigger the change yourself, please ignore this message." msgstr "Si vous n'êtes pas à l'origine de cette modification, merci d'ignorer ce message." #: lib/web/templates/email/email.html.eex:89 +#, elixir-format msgid "Please do not use it for real purposes." msgstr "Veuillez ne pas l'utiliser pour un cas réel." -#: lib/web/templates/email/group_member_removal.html.eex:45 lib/web/templates/email/group_member_removal.text.eex:5 +#: lib/web/templates/email/group_member_removal.html.eex:45 +#: lib/web/templates/email/group_member_removal.text.eex:5 +#, elixir-format msgid "If you feel this is an error, you may contact the group's administrators so that they can add you back." msgstr "Si vous pensez qu'il s'agit d'une erreur, vous pouvez contacter les administrateurs du groupe afin qu'ils vous réintègrent." -#: lib/web/templates/email/group_member_removal.html.eex:13 lib/web/templates/email/group_member_removal.text.eex:1 +#: lib/web/templates/email/group_member_removal.html.eex:13 +#: lib/web/templates/email/group_member_removal.text.eex:1 +#, elixir-format msgid "So long, and thanks for the fish!" msgstr "Salut, et encore merci pour le poisson !" #: lib/web/email/group.ex:63 +#, elixir-format msgid "You have been removed from group %{group}" msgstr "Vous avez été enlevé du groupe %{group}" #: lib/web/templates/email/group_member_removal.text.eex:3 +#, elixir-format msgid "You have been removed from group %{group}. You will not be able to access this group's private content anymore." msgstr "Vous avez été enlevé du groupe %{group}. Vous ne serez plus en mesure d'accéder au contenu privé du groupe." #: lib/web/templates/email/group_invite.html.eex:38 +#, elixir-format msgid "%{inviter} just invited you to join their group %{link_start}%{group}%{link_end}" msgstr "%{inviter} vient de vous inviter à rejoindre son groupe %{link_start}%{group}%{link_end}" #: lib/web/templates/email/group_member_removal.html.eex:38 +#, elixir-format msgid "You have been removed from group %{link_start}%{group}%{link_end}. You will not be able to access this group's private content anymore." msgstr "Vous avez été enlevé du groupe %{link_start}%{group}%{link_end}. Vous ne serez plus en mesure d'accéder au contenu privé du groupe." -#: lib/web/templates/email/group_suspension.html.eex:54 lib/web/templates/email/group_suspension.text.eex:7 +#: lib/web/templates/email/group_suspension.html.eex:54 +#: lib/web/templates/email/group_suspension.text.eex:7 +#, elixir-format msgid "As this group was located on another instance, it will continue to work for other instances than this one." msgstr "Comme ce groupe était originaire d'une autre instance, il continuera à fonctionner pour d'autres instances que celle-ci." -#: lib/web/templates/email/group_suspension.html.eex:46 lib/web/templates/email/group_suspension.text.eex:5 +#: lib/web/templates/email/group_suspension.html.eex:46 +#: lib/web/templates/email/group_suspension.text.eex:5 +#, elixir-format msgid "As this group was located on this instance, all of it's data has been irretrievably deleted." msgstr "Comme ce groupe était originaire de cette instance, toutes ses données ont été irrémédiablement détruites." -#: lib/web/templates/email/group_deletion.html.eex:38 lib/web/templates/email/group_deletion.text.eex:3 +#: lib/web/templates/email/group_deletion.html.eex:38 +#: lib/web/templates/email/group_deletion.text.eex:3 +#, elixir-format msgid "The administrator %{author} deleted group %{group}. All of the group's events, discussions, posts and todos have been deleted." msgstr "L'administrateur·ice %{author} a supprimé le groupe %{group}. Tous les événements, discussions, billets et todos du groupe ont été supprimés." -#: lib/web/templates/email/group_suspension.html.eex:13 lib/web/templates/email/group_suspension.text.eex:1 +#: lib/web/templates/email/group_suspension.html.eex:13 +#: lib/web/templates/email/group_suspension.text.eex:1 +#, elixir-format msgid "The group %{group} has been suspended on %{instance}!" msgstr "Le groupe %{group} a été suspendu sur %{instance} !" -#: lib/web/templates/email/group_deletion.html.eex:13 lib/web/templates/email/group_deletion.text.eex:1 +#: lib/web/templates/email/group_deletion.html.eex:13 +#: lib/web/templates/email/group_deletion.text.eex:1 +#, elixir-format msgid "The group %{group} was deleted on %{instance}!" msgstr "Le groupe %{group} a été supprimé sur %{instance} !" -#: lib/web/templates/email/group_suspension.html.eex:38 lib/web/templates/email/group_suspension.text.eex:3 +#: lib/web/templates/email/group_suspension.html.eex:38 +#: lib/web/templates/email/group_suspension.text.eex:3 +#, elixir-format msgid "Your instance's moderation team has decided to suspend %{group_name} (%{group_address}). You are no longer a member of this group." msgstr "L'équipe de modération de votre instance a décidé de suspendre %{group_name} (%{group_address}). Vous n'êtes désormais plus membre de ce groupe." #: lib/web/email/group.ex:136 +#, elixir-format msgid "The group %{group} has been deleted on %{instance}" msgstr "Le groupe %{group} a été supprimé sur %{instance}" #: lib/web/email/group.ex:97 +#, elixir-format msgid "The group %{group} has been suspended on %{instance}" msgstr "Le groupe %{group} a été suspendu sur %{instance}" #: lib/web/templates/api/terms.html.eex:24 +#, elixir-format msgctxt "terms" msgid "By accessing or using the Service, this means you agree to be bound by all the terms below. If these terms are in any way unclear, please let us know by contacting %{contact}." msgstr "Si vous accédez au Service ou utilisez le Service, cela signifie que vous acceptez d'être lié·e par toutes les Conditions ci-dessous. Si une condition n'a pas de sens pour vous, veuillez nous le faire savoir en contactant %{contact}." #: lib/web/templates/api/terms.html.eex:40 +#, elixir-format msgctxt "terms" msgid "For information about how we collect and use information about users of the Service, please check our privacy policy." msgstr "Pour savoir comment nous recueillons et utilisons les informations sur les utilisateur·ice·s du Service, veuillez consulter notre politique de confidentialité." #: lib/web/templates/api/terms.html.eex:36 +#, elixir-format msgctxt "terms" msgid "If you continue to use the Service after the revised Terms go into effect, you accept the revised Terms." msgstr "Si vous continuez à utiliser le Service après l'entrée en vigueur des Conditions révisées, vous acceptez les conditions révisées." #: lib/web/templates/api/privacy.html.eex:78 +#, elixir-format msgctxt "terms" msgid "If you delete this information, you need to login again." msgstr "Si vous supprimez ces informations, vous devrez vous connecter de nouveau." #: lib/web/templates/api/privacy.html.eex:80 +#, elixir-format msgctxt "terms" msgid "If you're not connected, we don't store any information on your device, unless you participate in an event anonymously. In this specific case we store the hash of an unique identifier for the event and participation status in your browser so that we may display participation status. Deleting this information will only stop displaying participation status in your browser." msgstr "Si vous n'êtes pas connecté·e, nous ne conserverons aucune information sur votre appareil, sauf si vous participez anonymement à un événement. Dans ce cas spécifique nous conservons le hash d'un identifiant unique pour l'événement et les statuts de participation dans votre navigateur pour pouvoir les afficher. Supprimer ces informations aura pour seule conséquence que votre participation ne sera plus affichée dans votre navigateur." #: lib/web/templates/api/privacy.html.eex:87 +#, elixir-format msgctxt "terms" msgid "Note: This information is stored in your localStorage and not your cookies." msgstr "Attention : Ces informations sont conservées dans votre stockage local et non vos cookies." #: lib/web/templates/api/terms.html.eex:71 +#, elixir-format msgctxt "terms" msgid "Our responsibility" msgstr "Notre responsabilité" #: lib/web/templates/api/privacy.html.eex:61 +#, elixir-format msgctxt "terms" msgid "Retain server logs containing the IP address of all requests to this server, insofar as such logs are kept, no more than 90 days." msgstr "Conserver les journaux du serveur contenant l'adresse IP de toutes les demandes adressées à ce serveur, dans la mesure où ces journaux sont conservés, pas plus de 90 jours." -#: lib/web/templates/api/privacy.html.eex:3 lib/web/templates/api/terms.html.eex:15 +#: lib/web/templates/api/privacy.html.eex:3 +#: lib/web/templates/api/terms.html.eex:15 +#, elixir-format msgctxt "terms" msgid "Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary to help you understand them better." msgstr "Certains termes, techniques ou non, utilisés dans le texte ci-dessous peuvent recouvrir des concepts difficiles à appréhender. Nous vous proposons un glossaire qui pourra vous aider à mieux les comprendre." #: lib/web/templates/api/terms.html.eex:45 +#, elixir-format msgctxt "terms" msgid "We are not liable for any loss you may incur as a result of someone else using your email or password, either with or without your knowledge." msgstr "Nous ne sommes pas responsables des pertes que vous pourriez subir si quelqu'un d'autre utilise votre adresse électronique ou votre mot de passe, à votre insu ou non." #: lib/web/templates/api/terms.html.eex:50 +#, elixir-format msgctxt "terms" msgid "We cannot be held responsible should a programming or administrative error make your content visible to a larger audience than intended. Aside from our limited right to your content, you retain all of your rights to the content you post, link and otherwise make available on or through the Service." msgstr "Nous ne pouvons être tenus responsables si une erreur de programmation ou d'administration rend votre contenu visible à un public plus large que celui que vous aviez prévu. Outre notre droit limité sur votre contenu, vous conservez tous vos droits sur le contenu que vous publiez, mettez en lien et rendez disponible sur ou via le Service." #: lib/web/templates/api/privacy.html.eex:10 +#, elixir-format msgctxt "terms" msgid "We collect information from you when you register on this instance and gather data when you participate in the platform by reading, writing, and interacting with content shared here. If you register on this instance, you will be asked to enter an email address, a password (hashed) and at least an username. Your email address will be verified by an email containing a unique link. Once the link is activated, we know you control that email address. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly. You may however visit this instance without registering." msgstr "" @@ -946,159 +1209,223 @@ msgstr "" "biographie, les images de profil et d'en-tête sont toujours publiques. Vous pouvez toutefois utiliser ce serveur sans vous inscrire." #: lib/web/templates/api/terms.html.eex:30 +#, elixir-format msgctxt "terms" msgid "We reserve the right to modify these Terms at any time. For instance, we may need to change these Terms if we come out with a new feature." msgstr "Nous nous réservons le droit de modifier ces Conditions à tout moment. Par exemple, nous pouvons être amenés à modifier ces Conditions si nous proposons une nouvelle fonctionnalité." #: lib/web/templates/api/terms.html.eex:20 +#, elixir-format msgctxt "terms" msgid "When we say “we”, “our”, or “us” in this document, we are referring to the owners, operators and administrators of this Mobilizon instance. The Mobilizon software is provided by the team of Mobilizon contributors, supported by Framasoft, a French not-for-profit organization advocating for Free/Libre Software. Unless explicitly stated, this Mobilizon instance is an independent service using Mobilizon's source code. You may find more information about this instance on the \"About this instance\" page." msgstr "Lorsque nous disons « nous », « notre » ou « nos » dans ce document, nous faisons référence aux propriétaires, opérateur·ices et administrateur·ices de cette instance de Mobilizon. Le logiciel Mobilizon est fourni par l'équipe des contributeur·ices de Mobilizon, soutenue par Framasoft, une organisation française d'éducation populaire à but non lucratif qui défend les logiciels libres. Sauf mention explicite, cette instance de Mobilizon est un service indépendant utilisant le code source de Mobilizon. Vous pouvez trouver plus d'informations sur cette instance sur la page « A propos de cette instance »." #: lib/web/templates/api/terms.html.eex:43 +#, elixir-format msgctxt "terms" msgid "When you create an account you agree to maintain the security and confidentiality of your password and accept all risks of unauthorized access to your account data and any other information you provide to %{instance_name}." msgstr "Lorsque vous créez un compte, vous acceptez également de maintenir la sécurité et la confidentialité de votre mot de passe et vous acceptez tous les risques d'accès non autorisé aux données de votre compte et à toute autre information que vous fournissez à %{instance_name}." #: lib/web/templates/api/terms.html.eex:49 +#, elixir-format msgctxt "terms" msgid "When you post, link or otherwise make available content to the Service, you grant us the right and license to display and distribute your content on or through the Service (including via applications). We may format your content for display throughout the Service, but we will not edit or revise the substance of your content itself. The displaying and distribution of your content happens only according to the visibility rules you have set for the content. We will not modify the visibility of the content you have set." msgstr "Lorsque vous publiez, liez ou mettez à disposition un contenu sur le Service, vous nous accordez le droit et la licence d'afficher et de distribuer votre contenu sur ou via le Service (y compris via des applications). Nous pouvons formater votre contenu pour l'afficher dans le Service, mais nous ne modifierons pas ou ne réviserons pas la substance de votre contenu lui-même. L'affichage et la distribution de votre contenu se fait strictement selon les règles de visibilité que vous avez définies pour le contenu. Nous ne modifierons pas la visibilité du contenu que vous avez défini." #: lib/web/templates/api/privacy.html.eex:19 +#, elixir-format msgctxt "terms" msgid "Your events and comments are delivered to other instances that follow your own, meaning they are delivered to different instances and copies are stored there. When you delete events or comments, this is likewise delivered to these other instances. All interactions related to event features - such as joining an event - or group features - such as managing resources - are federated as well. Please keep in mind that the operators of the instance and any receiving instances may view such messages and information, and that recipients may screenshot, copy or otherwise re-share them." msgstr "Vos événements et commentaires sont transmis aux instances qui suivent la vôtre, ce qui signifie que d'autres instances posséderont des copies de ces contenus. Lorsque vous supprimez un événement ou un commentaire, ceci est transmis de la même façon aux autres instances. Toutes les interactions liées aux fonctionnalités des événements - comme rejoindre un événement - ou bien aux fonctionnalités de groupes - comme gérer ses ressources - sont également fédérées. Veuillez noter que les administrateur·ices de cette instance et de toutes les instances fédérées peuvent voir ces messages, et que les destinataires peuvent les copier, en faire des captures d'écran et les repartager de différentes façons." #: lib/web/templates/api/privacy.html.eex:99 +#, elixir-format msgctxt "terms" msgid "Your content may be downloaded by other instances in the network. Your public events and comments are delivered to the instances following your own instance. Content created through a group is forwarded to all the instances of all the members of the group, insofar as these members reside on a different instance than this one." msgstr "Votre contenu peut être téléchargé par d'autres instances du réseau. Vos événements publics et commentaires sont transmis aux instances abonnées à votre instance. Le contenu créé à travers un groupe est transmis à toutes les instances de tous les membres du groupe, si celleux-ci sont inscrit·e·s sur une autre instance que la vôtre." #: lib/web/templates/email/event_participation_confirmed.text.eex:4 +#, elixir-format msgid "You have confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "Vous avez confirmé votre participation. Mettez à jour votre agenda, car vous êtes maintenant sur la liste des invités !" -#: lib/web/templates/email/event_participation_approved.html.eex:38 lib/web/templates/email/event_participation_confirmed.html.eex:38 +#: lib/web/templates/email/event_participation_approved.html.eex:38 +#: lib/web/templates/email/event_participation_confirmed.html.eex:38 +#, elixir-format msgid "You recently requested to attend %{title}." msgstr "Vous avez demandé à participer à l'événement %{title}." #: lib/web/email/participation.ex:91 +#, elixir-format msgid "Your participation to event %{title} has been confirmed" msgstr "Votre participation à l'événement %{title} a été approuvée" #: lib/web/templates/email/report.html.eex:41 +#, elixir-format msgid "%{reporter} reported the following content." msgstr "%{reporter} a signalé le contenu suivant." #: lib/web/templates/email/report.text.eex:5 +#, elixir-format msgid "Group %{group} was reported" msgstr "Le groupe %{group} a été signalé" #: lib/web/templates/email/report.html.eex:51 +#, elixir-format msgid "Group reported" msgstr "Groupe signalé" #: lib/web/templates/email/report.text.eex:7 +#, elixir-format msgid "Profile %{profile} was reported" msgstr "Le profil %{profile} a été signalé" #: lib/web/templates/email/report.html.eex:56 +#, elixir-format msgid "Profile reported" msgstr "Profil signalé" #: lib/web/templates/email/event_participation_confirmed.html.eex:45 +#, elixir-format msgid "You have now confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "Vous avez maintenant confirmé votre participation. Mettez à jour votre agenda, car vous êtes maintenant sur la liste des invités !" #: lib/mobilizon/posts/post.ex:94 +#, elixir-format msgid "A text is required for the post" msgstr "Un texte est requis pour le billet" #: lib/mobilizon/posts/post.ex:93 +#, elixir-format msgid "A title is required for the post" msgstr "Un titre est requis pour le billet" #: lib/web/templates/email/instance_follow.text.eex:3 +#, elixir-format msgid "%{name} (%{domain}) just requested to follow your instance." msgstr "%{name} (%{domain}) vient de demander à suivre votre instance." #: lib/web/email/follow.ex:54 +#, elixir-format msgid "%{name} requests to follow your instance" msgstr "%{name} demande à suivre votre instance" #: lib/web/templates/email/instance_follow.html.eex:38 +#, elixir-format msgid "%{name} (%{domain}) just requested to follow your instance. If you accept, this instance will receive all of your instance's public events." msgstr "%{name} (%{domain}) vient de demander à suivre votre instance. Si vous acceptez, leur instance recevra tous les événements publics de votre instance." #: lib/web/templates/email/instance_follow.text.eex:4 +#, elixir-format msgid "If you accept, this instance will receive all of your public events." msgstr "Si vous acceptez, leur instance recevra tous les événements publics de votre instance." #: lib/web/email/follow.ex:48 +#, elixir-format msgid "Instance %{name} (%{domain}) requests to follow your instance" msgstr "L'instance %{name} (%{domain}) demande à suivre votre instance" #: lib/web/templates/email/instance_follow.html.eex:66 +#, elixir-format msgid "See the federation settings" msgstr "Voir les paramètres de fédération" -#: lib/web/templates/email/instance_follow.html.eex:52 lib/web/templates/email/instance_follow.text.eex:6 +#: lib/web/templates/email/instance_follow.html.eex:52 +#: lib/web/templates/email/instance_follow.text.eex:6 +#, elixir-format msgid "To accept this invitation, head over to the instance's admin settings." msgstr "Pour accepter cette invitation, rendez-vous dans vos groupes." -#: lib/web/templates/email/instance_follow.html.eex:13 lib/web/templates/email/instance_follow.text.eex:1 +#: lib/web/templates/email/instance_follow.html.eex:13 +#: lib/web/templates/email/instance_follow.text.eex:1 +#, elixir-format msgid "Want to connect?" msgstr "Voulez-vous vous connecter ?" -#: lib/web/templates/email/instance_follow.html.eex:45 lib/web/templates/email/instance_follow.text.eex:5 +#: lib/web/templates/email/instance_follow.html.eex:45 +#: lib/web/templates/email/instance_follow.text.eex:5 +#, elixir-format msgid "Note: %{name} (%{domain}) following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too." msgstr "Note : le fait que %{name} (%{domain}) vous suive n'implique pas nécessairement que vous suivez cette instance, mais vous pouvez demander à les suivre également." #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:38 +#, elixir-format msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "Salut ! Vous venez de vous enregistrer pour rejoindre cet événement : « %{title} ». Merci de confirmer l'adresse email que vous avez fournie :" #: lib/web/templates/email/event_participation_rejected.html.eex:38 +#, elixir-format msgid "You issued a request to attend %{title}." msgstr "Vous avez effectué une demande de participation à %{title}." #: lib/web/templates/email/event_updated.html.eex:64 +#, elixir-format msgid "Event title" msgstr "Titre de l'événement" #: lib/web/templates/email/event_updated.html.eex:38 +#, elixir-format msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "Il y a eu des changements pour %{title} donc nous avons pensé que nous vous le ferions savoir." -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "Le serveur Mobilizon semble être temporairement hors-service." - #: lib/web/templates/error/500_page.html.eex:7 +#, elixir-format msgid "This page is not correct" msgstr "Cette page n’est pas correcte" -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 +#, elixir-format msgid "We're sorry, but something went wrong on our end." msgstr "Nous sommes désolé·e·s, mais quelque chose s’est mal passé de notre côté." -#: lib/web/templates/email/email.html.eex:88 lib/web/templates/email/email.text.eex:4 +#: lib/web/templates/email/email.html.eex:88 +#: lib/web/templates/email/email.text.eex:4 +#, elixir-format msgid "This is a demonstration site to test Mobilizon." msgstr "Ceci est un site de démonstration permettant de tester Mobilizon." #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 +#, elixir-format msgid "%{name}'s feed" msgstr "Flux de %{name}" -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 +#, elixir-format msgid "%{actor}'s private events feed on %{instance}" msgstr "Flux privé des événements de %{actor} sur %{instance}" -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 +#, elixir-format msgid "%{actor}'s public events feed on %{instance}" msgstr "Flux public des événements de %{actor} sur %{instance}" -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 +#, elixir-format msgid "Feed for %{email} on %{instance}" msgstr "Flux pour %{email} sur %{instance}" + +#: lib/web/templates/error/500_page.html.eex:57 +#, elixir-format +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "Si le problème persiste, vous pouvez contacter l'administrateur⋅ice du serveur à %{contact}." + +#: lib/web/templates/error/500_page.html.eex:55 +#, elixir-format +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "Si le problème persiste, vous pouvez essayer de contacter l'administrateur⋅ice du serveur." + +#: lib/web/templates/error/500_page.html.eex:68 +#, elixir-format +msgid "Technical details" +msgstr "Détails techniques" + +#: lib/web/templates/error/500_page.html.eex:52 +#, elixir-format +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "Le serveur Mobilizon %{instance} semble être temporairement hors-service." + +#: lib/service/export/feed.ex:73 +#, elixir-format +msgid "Public feed for %{instance}" +msgstr "Flux public pour %{instance}" diff --git a/priv/gettext/fr/LC_MESSAGES/errors.po b/priv/gettext/fr/LC_MESSAGES/errors.po index 5ed0d8478..ff5dc0037 100644 --- a/priv/gettext/fr/LC_MESSAGES/errors.po +++ b/priv/gettext/fr/LC_MESSAGES/errors.po @@ -8,18 +8,19 @@ # # to merge POT files into PO files. msgid "" msgstr "" -"PO-Revision-Date: 2020-11-20 12:22+0100\n" -"Last-Translator: Thomas Citharel \n" -"Language-Team: French \n" -"Language: fr\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Poedit 2.4.1\n" -"Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: \n" "POT-Creation-Date: \n" +"PO-Revision-Date: 2021-03-25 15:29+0100\n" +"Last-Translator: Vincent Finance \n" +"Language-Team: French \n" +"Language: fr\n" "MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Poedit 2.4.2\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "ne peut pas être vide" @@ -96,200 +97,201 @@ msgid "must be equal to %{number}" msgstr "doit être égal à %{number}" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "Impossible de rafraîchir le jeton" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "Le profil actuel n'est pas un membre de ce groupe" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "Le profil actuel n'est pas un·e administrateur·ice du groupe sélectionné" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "Erreur lors de la sauvegarde des paramètres utilisateur" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "Groupe non trouvé" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "Groupe avec l'ID %{id} non trouvé" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "Impossible de s'authentifier, votre adresse e-mail ou bien votre mot de passe sont invalides." #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "Membre non trouvé" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "Aucun profil trouvé pour l'utilisateur modérateur" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "Aucun·e utilisateur·ice à valider avec cet email n'a été trouvé·e" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "Aucun·e utilisateur·ice avec cette adresse e-mail n'a été trouvé·e" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "Le profil n'est pas possédé par l'utilisateur connecté" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "Les inscriptions ne sont pas ouvertes" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "Le mot de passe actuel est invalid" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "La nouvelle adresse e-mail ne semble pas être valide" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "La nouvelle adresse e-mail doit être différente" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "Le nouveau mot de passe doit être différent" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "Le mot de passe fourni est invalide" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" "Le mot de passe que vous avez choisi est trop court. Merci de vous assurer que votre mot de passe contienne au moins " "6 caractères." #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "Cet·te utilisateur·ice ne peut pas réinitialiser son mot de passe" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "Cet·te utilisateur·ice a été désactivé·e" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "Impossible de valider l'utilisateur·ice" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "L'utilisateur·ice est déjà désactivé·e" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "L'utilisateur·ice demandé·e n'est pas connecté·e" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "Vous êtes déjà membre de ce groupe" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "Vous ne pouvez pas quitter ce groupe car vous en êtes le ou la seul·e administrateur·ice" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "Vous ne pouvez pas rejoindre ce groupe" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "Vous ne pouvez pas lister les groupes sauf à être modérateur·ice." #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "Vous devez être connecté·e pour changer votre adresse e-mail" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "Vous devez être connecté·e pour changer votre mot de passe" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "Vous devez être connecté·e pour supprimer un groupe" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "Vous devez être connecté·e pour supprimer votre compte" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "Vous devez être connecté·e pour rejoindre un groupe" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "Vous devez être connecté·e pour quitter un groupe" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "Vous devez être connecté·e pour mettre à jour un groupe" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "Vous devez avoir un jeton existant pour obtenir un jeton de rafraîchissement" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "Vous avez à nouveau demandé un email de confirmation trop vite" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "Votre adresse e-mail n'est pas sur la liste d'autorisations" @@ -339,22 +341,22 @@ msgid "Anonymous participation is not enabled" msgstr "La participation anonyme n'est pas activée" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "Impossible de supprimer le ou la dernier·ère administrateur·ice d'un groupe" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "Impossible de supprimer le dernier profil d'un·e utilisateur·ice" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "Le commentaire est déjà supprimé" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "Discussion non trouvée" @@ -374,8 +376,8 @@ msgid "Event id not found" msgstr "ID de l'événement non trouvé" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "Événement non trouvé" @@ -391,7 +393,7 @@ msgid "Internal Error" msgstr "Erreur interne" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "Aucune discussion avec l'ID %{id}" @@ -401,7 +403,7 @@ msgid "No profile found for user" msgstr "Aucun profil trouvé pour l'utilisateur modérateur" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "Aucun jeton de flux correspondant" @@ -418,12 +420,12 @@ msgid "Participant not found" msgstr "Participant·e non trouvé·e" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "Personne avec l'ID %{id} non trouvé" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "Personne avec le nom %{name} non trouvé" @@ -449,30 +451,25 @@ msgstr "Ce profil est déjà membre de ce groupe" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "Le profil n'est pas un·e membre du groupe" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "Profile non trouvé" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "Le profil modérateur fourni n'a pas de permissions sur cet événement" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "Groupe non trouvé" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "La ressource n'existe pas" @@ -498,22 +495,22 @@ msgid "Todo list doesn't exist" msgstr "Cette todo-liste n'existe pas" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "Ce jeton n'existe pas" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "Ce jeton n'est pas un UUID valide" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "Utilisateur·ice non trouvé·e" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "Vous avez déjà un profil pour cet utilisateur" @@ -522,23 +519,18 @@ msgstr "Vous avez déjà un profil pour cet utilisateur" msgid "You are already a participant of this event" msgstr "Vous êtes déjà un·e participant·e à cet événement" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "Vous n'êtes pas un membre du groupe dans lequel se fait la discussion" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "Vous n'êtes pas membre de ce groupe" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "Vous n'êtes pas administrateur·ice ou modérateur·ice de ce groupe" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "Vous n'êtes pas autorisé·e à créer un commentaire si non connecté·e" @@ -548,17 +540,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "Vous n'êtes pas autorisé·e à créer un jeton de flux si non connecté·e" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "Vous n'êtes pas autorisé·e à supprimer un commentaire si non connecté·e" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "Vous n'êtes pas autorisé·e à supprimer un jeton de flux si non connecté·e" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "Vous n'êtes pas autorisé·e à mettre à jour un commentaire si non connecté·e" @@ -569,19 +561,19 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "Vous ne pouvez pas quitter cet événement car vous en êtes le ou la seule créateur·ice participant" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" "Vous ne pouvez pas vous définir avec un rôle de membre inférieur pour ce groupe car vous en êtes le ou la seul·e " "administrateur·ice" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "Vous ne pouvez pas supprimer ce commentaire" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "Vous ne pouvez pas supprimer cet événement" @@ -591,12 +583,12 @@ msgid "You cannot invite to this group" msgstr "Vous ne pouvez pas rejoindre ce groupe" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "Vous n'avez pas la permission de supprimer ce jeton" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "Vous devez être connecté·e et une modérateur·ice pour lister les journaux de modération" @@ -616,32 +608,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "Vous devez être connecté·e pour et une modérateur·ice pour visionner un signalement" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "Vous devez être connecté·e et un·e administrateur·ice pour accéder aux paramètres administrateur" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "Vous devez être connecté·e et un·e administrateur·ice pour accéder aux panneau de statistiques" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "Vous devez être connecté·e et un·e administrateur·ice pour sauvegarder les paramètres administrateur" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "Vous devez être connecté·e pour accéder aux discussions" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "Vous devez être connecté·e pour supprimer un groupe" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "Vous devez être connecté·e pour créer des événements" @@ -656,12 +648,12 @@ msgid "You need to be logged-in to create reports" msgstr "Vous devez être connecté·e pour quitter un groupe" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "Vous devez être connecté·e pour quitter un groupe" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "Vous devez être connecté·e pour supprimer un groupe" @@ -671,7 +663,7 @@ msgid "You need to be logged-in to delete posts" msgstr "Vous devez être connecté·e pour supprimer un groupe" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "Vous devez être connecté·e pour supprimer un groupe" @@ -686,7 +678,7 @@ msgid "You need to be logged-in to leave an event" msgstr "Vous devez être connecté·e pour quitter un groupe" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "Vous devez être connecté·e pour mettre à jour un groupe" @@ -696,17 +688,17 @@ msgid "You need to be logged-in to update posts" msgstr "Vous devez être connecté·e pour mettre à jour un groupe" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "Vous devez être connecté·e pour mettre à jour un groupe" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "Vous devez être connecté·e pour supprimer un groupe" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "La ressource parente n'appartient pas à ce groupe" @@ -751,7 +743,7 @@ msgid "Resource not found" msgstr "Ressource non trouvée" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "Quelque chose s'est mal passé" @@ -771,12 +763,12 @@ msgid "You need to be logged in" msgstr "Vous devez être connecté·e" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "Vous ne pouvez pas accepter cette invitation avec ce profil." #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "Vous ne pouvez pas rejeter cette invitation avec ce profil." @@ -786,32 +778,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "Le fichier n'a pas un type MIME autorisé." #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "Le profil n'est pas administrateur·ice pour le groupe" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "Vous ne pouvez pas éditer cet événement." #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "Vous ne pouvez pas attribuer cet événement à ce profil." #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "Cette invitation n'existe pas." #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "Ce·tte membre a déjà été rejetté·e." #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "Vous n'avez pas les droits pour supprimer ce·tte membre." @@ -821,12 +813,12 @@ msgid "This username is already taken." msgstr "Cet identifiant est déjà pris." #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "Vous devez fournir un ID ou bien un slug pour accéder à une discussion" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "Le profil de l'organisateur·ice n'appartient pas à l'utilisateur·ice" @@ -836,7 +828,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "L'ID du profil fourni n'est pas celui du profil anonyme" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" -msgstr "" +msgstr "L'image fournie est trop lourde" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "Fichier d'index non trouvé. Vous devez recompiler le front-end." + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "Erreur lors de la création de la resource" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "Jeton d'activation invalide" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "Impossible de récupérer les détails de la ressource depuis cette URL." + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "Le profil modérateur fourni n'a pas de permissions sur cet événement" diff --git a/priv/gettext/gl/LC_MESSAGES/default.po b/priv/gettext/gl/LC_MESSAGES/default.po index 0601617e7..951735a16 100644 --- a/priv/gettext/gl/LC_MESSAGES/default.po +++ b/priv/gettext/gl/LC_MESSAGES/default.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-10-18 04:49+0000\n" -"PO-Revision-Date: 2021-01-20 16:18+0000\n" +"PO-Revision-Date: 2021-05-01 10:59+0000\n" "Last-Translator: josé m. \n" "Language-Team: Galician \n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4\n" +"X-Generator: Weblate 4.6\n" #: lib/web/templates/email/password_reset.html.eex:48 #, elixir-format @@ -1013,8 +1013,8 @@ msgstr "" "Ola! Aquí un aviso para confirmar que o enderezo de email asociado á túa " "conta en %{host} cambiouse a:" -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 #, elixir-format msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1635,17 +1635,12 @@ msgstr "Título do evento" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "Houbo cambios en %{title} e cremos que debes sabelo." -#: lib/web/templates/error/500_page.html.eex:46 -#, elixir-format -msgid "The Mobilizon server seems to be temporarily down." -msgstr "O servidor Mobilizon semella estar temporalmente fóra de servizo." - #: lib/web/templates/error/500_page.html.eex:7 #, elixir-format msgid "This page is not correct" msgstr "Esta páxina non é correcta" -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 #, elixir-format msgid "We're sorry, but something went wrong on our end." msgstr "Lamentámolo, pero algo está a fallar pola nosa parte." @@ -1657,21 +1652,50 @@ msgid "This is a demonstration site to test Mobilizon." msgstr "Este é un sitio web de exemplo para probar Mobilizon." #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 #, elixir-format msgid "%{name}'s feed" msgstr "fonte de %{name}" -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 #, elixir-format msgid "%{actor}'s private events feed on %{instance}" msgstr "fonte dos eventos privados de %{actor} en %{instance}" -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 #, elixir-format msgid "%{actor}'s public events feed on %{instance}" msgstr "fonte dos eventos públicos de %{actor} en %{instance}" -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 #, elixir-format msgid "Feed for %{email} on %{instance}" msgstr "Fonte para %{email} en %{instance}" + +#: lib/web/templates/error/500_page.html.eex:57 +#, elixir-format +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" +"Se o problema persiste, contacta coa administración do servidor en " +"%{contact}." + +#: lib/web/templates/error/500_page.html.eex:55 +#, elixir-format +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "Se o problema persiste, contacta coa administración do servidor." + +#: lib/web/templates/error/500_page.html.eex:68 +#, elixir-format +msgid "Technical details" +msgstr "Detalles técnicos" + +#: lib/web/templates/error/500_page.html.eex:52 +#, elixir-format +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" +"O servidor Mobilizon %{instance} semella estar temporalmente fóra de servizo." + +#: lib/service/export/feed.ex:73 +#, elixir-format +msgid "Public feed for %{instance}" +msgstr "Fonte pública de %{instance}" diff --git a/priv/gettext/gl/LC_MESSAGES/errors.po b/priv/gettext/gl/LC_MESSAGES/errors.po index f703ccef3..cb9eed829 100644 --- a/priv/gettext/gl/LC_MESSAGES/errors.po +++ b/priv/gettext/gl/LC_MESSAGES/errors.po @@ -8,7 +8,7 @@ ## to merge POT files into PO files. msgid "" msgstr "" -"PO-Revision-Date: 2021-01-20 16:18+0000\n" +"PO-Revision-Date: 2021-03-27 07:14+0000\n" "Last-Translator: josé m. \n" "Language-Team: Galician \n" @@ -16,8 +16,9 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4\n" +"X-Generator: Weblate 4.5.1\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "non pode estar baleiro" @@ -93,759 +94,775 @@ msgstr "ten que ser maior ou igual a %{number}" msgid "must be equal to %{number}" msgstr "ten que ser igual a %{number}" -#: lib/graphql/resolvers/user.ex:103 #, elixir-format +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "Non puido actualizar o token" -#: lib/graphql/resolvers/group.ex:195 #, elixir-format +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "O perfil actual non é membro deste grupo" -#: lib/graphql/resolvers/group.ex:199 #, elixir-format +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "O perfil actual non é administrador do grupo seleccionado" -#: lib/graphql/resolvers/user.ex:512 #, elixir-format +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "Erro ó gardar os axustes de usuaria" -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 #, elixir-format +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "Grupo non atopado" -#: lib/graphql/resolvers/group.ex:63 #, elixir-format +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "Grupo con ID %{id} non atopado" -#: lib/graphql/resolvers/user.ex:83 #, elixir-format +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" "A autenticación non foi posible, o contrasinal ou o email non son correctos." -#: lib/graphql/resolvers/group.ex:255 #, elixir-format +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "Membro non atopado" -#: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 #, elixir-format +#: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "Non se atopou o perfil para a usuaria moderadora" -#: lib/graphql/resolvers/user.ex:195 #, elixir-format +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "Non se atopou unha usuaria con este email para validar" -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 #, elixir-format +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "Non se atopa ningunha usuaria con este email" +#, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 -#, elixir-format +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "O perfil non pertence a unha usuaria autenticada" -#: lib/graphql/resolvers/user.ex:125 #, elixir-format +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "O rexistro está pechado" -#: lib/graphql/resolvers/user.ex:330 #, elixir-format +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "O contrasinal actual non é válido" -#: lib/graphql/resolvers/user.ex:382 #, elixir-format +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "O novo email non semella ser válido" -#: lib/graphql/resolvers/user.ex:379 #, elixir-format +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "O novo email ten que ser diferente" -#: lib/graphql/resolvers/user.ex:333 #, elixir-format +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "O novo contrasinal ten que ser diferente" -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 #, elixir-format +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "O contrasinal escrito non é válido" -#: lib/graphql/resolvers/user.ex:337 #, elixir-format +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" "O contrasinal escollido é demasiado curto, ten que ter 6 caracteres polo " "menos." -#: lib/graphql/resolvers/user.ex:215 #, elixir-format +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "Esta usuaria non pode restablecer o seu contrasinal" -#: lib/graphql/resolvers/user.ex:79 #, elixir-format +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "Estab usuaria foi desactivada" -#: lib/graphql/resolvers/user.ex:179 #, elixir-format +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "Non se puido validar a usuaria" -#: lib/graphql/resolvers/user.ex:420 #, elixir-format +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "A usuaria xa está desactivada" -#: lib/graphql/resolvers/user.ex:487 #, elixir-format +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "A usuaria solicitada non está conectada" -#: lib/graphql/resolvers/group.ex:229 #, elixir-format +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "Xa es membro deste grupo" -#: lib/graphql/resolvers/group.ex:262 #, elixir-format +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "Non podes deixar este grupo porque es a única administradora" -#: lib/graphql/resolvers/group.ex:226 #, elixir-format +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "Non podes unirte a este grupo" -#: lib/graphql/resolvers/group.ex:91 #, elixir-format +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "Non podes facer listas de grupos porque non es moderadora." -#: lib/graphql/resolvers/user.ex:387 #, elixir-format +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "Tes que estar conectada para poder cambiar o email" -#: lib/graphql/resolvers/user.ex:345 #, elixir-format +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "Tes que estar conectada para poder cambiar o contrasinal" -#: lib/graphql/resolvers/group.ex:204 #, elixir-format +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "Tes que estar conectada para poder eleminar un grupo" -#: lib/graphql/resolvers/user.ex:447 #, elixir-format +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "Tes que estar conectada para poder eliminar a conta" -#: lib/graphql/resolvers/group.ex:234 #, elixir-format +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "Tes que estar conectada para poder unirte a un grupo" -#: lib/graphql/resolvers/group.ex:267 #, elixir-format +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "Tes que estar conectada para poder deixar un grupo" -#: lib/graphql/resolvers/group.ex:169 #, elixir-format +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "Tes que estar conectada para poder actualizar un grupo" -#: lib/graphql/resolvers/user.ex:108 #, elixir-format +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "Tes que ter un token existente para obter un token actualizado" -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 #, elixir-format +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "Solicitaches demasiado pronto un email de confirmación" -#: lib/graphql/resolvers/user.ex:128 #, elixir-format +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "O teu email non está na lista dos permitidos" -#: lib/graphql/resolvers/actor.ex:64 lib/graphql/resolvers/actor.ex:94 #, elixir-format +#: lib/graphql/resolvers/actor.ex:64 lib/graphql/resolvers/actor.ex:94 msgid "Error while performing background task" msgstr "Erro ó executar a tarefa en segundo plano" -#: lib/graphql/resolvers/actor.ex:27 #, elixir-format +#: lib/graphql/resolvers/actor.ex:27 msgid "No profile found with this ID" msgstr "Non se atopa o perfil con este ID" -#: lib/graphql/resolvers/actor.ex:54 lib/graphql/resolvers/actor.ex:91 #, elixir-format +#: lib/graphql/resolvers/actor.ex:54 lib/graphql/resolvers/actor.ex:91 msgid "No remote profile found with this ID" msgstr "Non se atopa o perfil remoto con este ID" -#: lib/graphql/resolvers/actor.ex:69 #, elixir-format +#: lib/graphql/resolvers/actor.ex:69 msgid "Only moderators and administrators can suspend a profile" msgstr "Só moderadoras e administradoras poden suspender un perfil" -#: lib/graphql/resolvers/actor.ex:99 #, elixir-format +#: lib/graphql/resolvers/actor.ex:99 msgid "Only moderators and administrators can unsuspend a profile" msgstr "Só moderadoras e administradoras pode restablecer un perfil" -#: lib/graphql/resolvers/actor.ex:24 #, elixir-format +#: lib/graphql/resolvers/actor.ex:24 msgid "Only remote profiles may be refreshed" msgstr "Só os perfís remotos poderían ser actualizdos" -#: lib/graphql/resolvers/actor.ex:61 #, elixir-format +#: lib/graphql/resolvers/actor.ex:61 msgid "Profile already suspended" msgstr "O perfil xa está suspendido" -#: lib/graphql/resolvers/participant.ex:92 #, elixir-format +#: lib/graphql/resolvers/participant.ex:92 msgid "A valid email is required by your instance" msgstr "A túa instancia require un email válido" -#: lib/graphql/resolvers/participant.ex:86 #, elixir-format +#: lib/graphql/resolvers/participant.ex:86 msgid "Anonymous participation is not enabled" msgstr "Non está permitida a participación ánonima" -#: lib/graphql/resolvers/person.ex:192 #, elixir-format +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "Non se pode eliminar a última administradora dun grupo" -#: lib/graphql/resolvers/person.ex:189 #, elixir-format +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "Non se pode eliminar a última identidade dunha usuaria" -#: lib/graphql/resolvers/comment.ex:105 #, elixir-format +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "O comentario xa foi eliminado" -#: lib/graphql/resolvers/discussion.ex:62 #, elixir-format +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "Non se atopa a conversa" -#: lib/graphql/resolvers/report.ex:58 lib/graphql/resolvers/report.ex:77 #, elixir-format +#: lib/graphql/resolvers/report.ex:58 lib/graphql/resolvers/report.ex:77 msgid "Error while saving report" msgstr "Erro ó gardar a denuncia" -#: lib/graphql/resolvers/report.ex:96 #, elixir-format +#: lib/graphql/resolvers/report.ex:96 msgid "Error while updating report" msgstr "Erro ó actualizar a denuncia" -#: lib/graphql/resolvers/participant.ex:127 #, elixir-format +#: lib/graphql/resolvers/participant.ex:127 msgid "Event id not found" msgstr "Non se atopou o ID do evento" -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 #, elixir-format +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "Evento non atopado" +#, elixir-format #: lib/graphql/resolvers/participant.ex:83 #: lib/graphql/resolvers/participant.ex:124 lib/graphql/resolvers/participant.ex:156 -#, elixir-format msgid "Event with this ID %{id} doesn't exist" msgstr "Non existe un evento co ID %{id}" -#: lib/graphql/resolvers/participant.ex:99 #, elixir-format +#: lib/graphql/resolvers/participant.ex:99 msgid "Internal Error" msgstr "Erro interno" -#: lib/graphql/resolvers/discussion.ex:186 #, elixir-format +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "Non hai conversa con ID %{id}" -#: lib/graphql/resolvers/todos.ex:78 lib/graphql/resolvers/todos.ex:168 #, elixir-format +#: lib/graphql/resolvers/todos.ex:78 lib/graphql/resolvers/todos.ex:168 msgid "No profile found for user" msgstr "Non se atopou o perfil da usuaria" -#: lib/graphql/resolvers/feed_token.ex:63 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "Non hai tal token da fonte" -#: lib/graphql/resolvers/participant.ex:237 #, elixir-format +#: lib/graphql/resolvers/participant.ex:237 msgid "Participant already has role %{role}" msgstr "A participante xa ten o rol %{role}" +#, elixir-format #: lib/graphql/resolvers/participant.ex:169 #: lib/graphql/resolvers/participant.ex:198 lib/graphql/resolvers/participant.ex:230 #: lib/graphql/resolvers/participant.ex:240 -#, elixir-format msgid "Participant not found" msgstr "Non se atopou a participante" -#: lib/graphql/resolvers/person.ex:29 #, elixir-format +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "Non se atopou a persoa con ID %{id}" -#: lib/graphql/resolvers/person.ex:51 #, elixir-format +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "Non se atopa a persoa con nome de usuaria %{username}" -#: lib/graphql/resolvers/post.ex:167 lib/graphql/resolvers/post.ex:200 #, elixir-format +#: lib/graphql/resolvers/post.ex:167 lib/graphql/resolvers/post.ex:200 msgid "Post ID is not a valid ID" msgstr "ID da publicación non é un ID válido" -#: lib/graphql/resolvers/post.ex:170 lib/graphql/resolvers/post.ex:203 #, elixir-format +#: lib/graphql/resolvers/post.ex:170 lib/graphql/resolvers/post.ex:203 msgid "Post doesn't exist" msgstr "Non existe a publicación" -#: lib/graphql/resolvers/member.ex:83 #, elixir-format +#: lib/graphql/resolvers/member.ex:83 msgid "Profile invited doesn't exist" msgstr "O perfil convidado non existe" -#: lib/graphql/resolvers/member.ex:92 lib/graphql/resolvers/member.ex:96 #, elixir-format +#: lib/graphql/resolvers/member.ex:92 lib/graphql/resolvers/member.ex:96 msgid "Profile is already a member of this group" msgstr "O perfil xa é membro deste grupo" +#, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 -#, elixir-format msgid "Profile is not member of group" msgstr "O perfil non é membro do grupo" -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 #, elixir-format +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "Perfil non atopado" -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 #, elixir-format -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "O perfil da moderadora proporcionado non ten permisos neste evento" - #: lib/graphql/resolvers/report.ex:36 -#, elixir-format msgid "Report not found" msgstr "Denuncia non atopada" -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 #, elixir-format +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "Non existe o recurso" -#: lib/graphql/resolvers/participant.ex:120 #, elixir-format +#: lib/graphql/resolvers/participant.ex:120 msgid "The event has already reached its maximum capacity" msgstr "Este evento xa acadou a súa capacidade máxima" -#: lib/graphql/resolvers/participant.ex:260 #, elixir-format +#: lib/graphql/resolvers/participant.ex:260 msgid "This token is invalid" msgstr "Este token non é válido" -#: lib/graphql/resolvers/todos.ex:165 lib/graphql/resolvers/todos.ex:219 #, elixir-format +#: lib/graphql/resolvers/todos.ex:165 lib/graphql/resolvers/todos.ex:219 msgid "Todo doesn't exist" msgstr "Lista de tarefas non existe" +#, elixir-format #: lib/graphql/resolvers/todos.ex:75 lib/graphql/resolvers/todos.ex:191 #: lib/graphql/resolvers/todos.ex:216 -#, elixir-format msgid "Todo list doesn't exist" msgstr "A lista de tarefas non existe" -#: lib/graphql/resolvers/feed_token.ex:69 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "Non existe o token" -#: lib/graphql/resolvers/feed_token.ex:66 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "O token non é un UUID válido" -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 #, elixir-format +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "Usuaria non atopada" -#: lib/graphql/resolvers/person.ex:252 #, elixir-format +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "Xa tes un perfil para esta usuaria" -#: lib/graphql/resolvers/participant.ex:130 #, elixir-format +#: lib/graphql/resolvers/participant.ex:130 msgid "You are already a participant of this event" msgstr "Xa es unha participante neste evento" -#: lib/graphql/resolvers/discussion.ex:190 #, elixir-format -msgid "You are not a member of the group the discussion belongs to" -msgstr "Non es membro do grupo ó que pertence a conversa" - #: lib/graphql/resolvers/member.ex:86 -#, elixir-format msgid "You are not a member of this group" msgstr "Non es membro deste grupo" -#: lib/graphql/resolvers/member.ex:151 #, elixir-format +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "Non es moderadora ou administradora deste grupo" -#: lib/graphql/resolvers/comment.ex:51 #, elixir-format +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "Non tes permiso para crear un comentario sen estar conectada" -#: lib/graphql/resolvers/feed_token.ex:41 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:41 msgid "You are not allowed to create a feed token if not connected" msgstr "Non tes permiso para crear un token da fonte se non estás conectada" -#: lib/graphql/resolvers/comment.ex:110 #, elixir-format +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "Non tes permiso para eliminar un comentario se non estás conectada" -#: lib/graphql/resolvers/feed_token.ex:78 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "Non tes permiso para eliminar o token da fonte se non estás conectada" -#: lib/graphql/resolvers/comment.ex:73 #, elixir-format +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "Non tes permiso para actualizar un comentario se non estás conectada" +#, elixir-format #: lib/graphql/resolvers/participant.ex:163 #: lib/graphql/resolvers/participant.ex:192 -#, elixir-format msgid "You can't leave event because you're the only event creator participant" msgstr "" "Non podes saír do evento porque es a única creadora do evento que participa" -#: lib/graphql/resolvers/member.ex:155 #, elixir-format +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" "Non podes adxudicarte un rol menor neste grupo porque es a única " "administradora" -#: lib/graphql/resolvers/comment.ex:101 #, elixir-format +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "Non podes eliminar este comentario" -#: lib/graphql/resolvers/event.ex:276 #, elixir-format +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "Non podes eliminar este evento" -#: lib/graphql/resolvers/member.ex:89 #, elixir-format +#: lib/graphql/resolvers/member.ex:89 msgid "You cannot invite to this group" msgstr "Non podes convidar a este grupo" -#: lib/graphql/resolvers/feed_token.ex:72 #, elixir-format +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "Non tes permiso para eliminar este token" -#: lib/graphql/resolvers/admin.ex:52 #, elixir-format +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" "Tes que estar conectada e ser moderadora para ver listas de rexistros de " "accións" -#: lib/graphql/resolvers/report.ex:26 #, elixir-format +#: lib/graphql/resolvers/report.ex:26 msgid "You need to be logged-in and a moderator to list reports" msgstr "Tes que estar conectada e ser moderadora para ver listas de denuncias" -#: lib/graphql/resolvers/report.ex:101 #, elixir-format +#: lib/graphql/resolvers/report.ex:101 msgid "You need to be logged-in and a moderator to update a report" msgstr "Tes que estas conectada e ser moderadora para actualizar unha denuncia" -#: lib/graphql/resolvers/report.ex:41 #, elixir-format +#: lib/graphql/resolvers/report.ex:41 msgid "You need to be logged-in and a moderator to view a report" msgstr "Tes que estar conectada e ser moderadora para ver unha denuncia" -#: lib/graphql/resolvers/admin.ex:236 #, elixir-format +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" "Tes que estar conectada e ser administradora para acceder ós axustes de " "administración" -#: lib/graphql/resolvers/admin.ex:221 #, elixir-format +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" "Tes que estar conectada e ser administradora para acceder ó taboleiro de " "estatísticas" -#: lib/graphql/resolvers/admin.ex:260 #, elixir-format +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" "Tes que estar conectada e ser administradora para gardar os axustes de " "administración" -#: lib/graphql/resolvers/discussion.ex:76 #, elixir-format +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "Tes que estar conectada para acceder ás conversas" -#: lib/graphql/resolvers/resource.ex:93 #, elixir-format +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "Tes que estar conectada para acceder ós recursos" -#: lib/graphql/resolvers/event.ex:211 #, elixir-format +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "Tes que estar conectada para crear eventos" -#: lib/graphql/resolvers/post.ex:140 #, elixir-format +#: lib/graphql/resolvers/post.ex:140 msgid "You need to be logged-in to create posts" msgstr "Tes que estar conectada para crear publicacións" -#: lib/graphql/resolvers/report.ex:74 #, elixir-format +#: lib/graphql/resolvers/report.ex:74 msgid "You need to be logged-in to create reports" msgstr "Tes que estar conectada para crear denuncias" -#: lib/graphql/resolvers/resource.ex:129 #, elixir-format +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "Tes que estar conectada para crear recursos" -#: lib/graphql/resolvers/event.ex:285 #, elixir-format +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "Tes que estar conectada para eliminar un evento" -#: lib/graphql/resolvers/post.ex:211 #, elixir-format +#: lib/graphql/resolvers/post.ex:211 msgid "You need to be logged-in to delete posts" msgstr "Tes que estar conectada para eliminar publicacións" -#: lib/graphql/resolvers/resource.ex:187 #, elixir-format +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "Tes que estar conectada para eliminar recursos" -#: lib/graphql/resolvers/participant.ex:104 #, elixir-format +#: lib/graphql/resolvers/participant.ex:104 msgid "You need to be logged-in to join an event" msgstr "Tes que estar conectada para unirte a un evento" -#: lib/graphql/resolvers/participant.ex:203 #, elixir-format +#: lib/graphql/resolvers/participant.ex:203 msgid "You need to be logged-in to leave an event" msgstr "Tes que estar conectada para saír dun evento" -#: lib/graphql/resolvers/event.ex:250 #, elixir-format +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "Tes que estar conectada para actualizar un evento" -#: lib/graphql/resolvers/post.ex:178 #, elixir-format +#: lib/graphql/resolvers/post.ex:178 msgid "You need to be logged-in to update posts" msgstr "Tes que estar conectada para actualizar publicacións" -#: lib/graphql/resolvers/resource.ex:158 #, elixir-format +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "Tes que estar conectada para actualizar recursos" -#: lib/graphql/resolvers/resource.ex:210 #, elixir-format +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "Tes que estar conectada para ver vista previa dun recurso" -#: lib/graphql/resolvers/resource.ex:121 #, elixir-format +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "O recurso relacionado non pertence a este grupo" -#: lib/mobilizon/users/user.ex:109 #, elixir-format +#: lib/mobilizon/users/user.ex:109 msgid "The chosen password is too short." msgstr "O contrasinal elexido é demasiado curto." -#: lib/mobilizon/users/user.ex:138 #, elixir-format +#: lib/mobilizon/users/user.ex:138 msgid "The registration token is already in use, this looks like an issue on our side." msgstr "" "O token de rexistro xa está a ser usado, semella un problema pola nosa parte." -#: lib/mobilizon/users/user.ex:104 #, elixir-format +#: lib/mobilizon/users/user.ex:104 msgid "This email is already used." msgstr "Este email xa se está a usar." -#: lib/graphql/error.ex:88 #, elixir-format +#: lib/graphql/error.ex:88 msgid "Post not found" msgstr "Non se atopa a publicación" -#: lib/graphql/error.ex:75 #, elixir-format +#: lib/graphql/error.ex:75 msgid "Invalid arguments passed" msgstr "Argumentos proporcionados non válidos" -#: lib/graphql/error.ex:81 #, elixir-format +#: lib/graphql/error.ex:81 msgid "Invalid credentials" msgstr "Credenciais non válidas" -#: lib/graphql/error.ex:79 #, elixir-format +#: lib/graphql/error.ex:79 msgid "Reset your password to login" msgstr "Restablece o teu contrasinal para conectar" -#: lib/graphql/error.ex:86 lib/graphql/error.ex:91 #, elixir-format +#: lib/graphql/error.ex:86 lib/graphql/error.ex:91 msgid "Resource not found" msgstr "Recurso non atopado" -#: lib/graphql/error.ex:92 #, elixir-format +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "Algo foi mal" -#: lib/graphql/error.ex:74 #, elixir-format +#: lib/graphql/error.ex:74 msgid "Unknown Resource" msgstr "Recurso descoñecido" -#: lib/graphql/error.ex:84 #, elixir-format +#: lib/graphql/error.ex:84 msgid "You don't have permission to do this" msgstr "Non tes permiso para facer isto" -#: lib/graphql/error.ex:76 #, elixir-format +#: lib/graphql/error.ex:76 msgid "You need to be logged in" msgstr "Tes que estar conectada" -#: lib/graphql/resolvers/member.ex:116 #, elixir-format +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "Non podes aceptar este convite con este perfil." -#: lib/graphql/resolvers/member.ex:134 #, elixir-format +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "Non podes rexeitar este convite con este perfil." -#: lib/graphql/resolvers/media.ex:62 #, elixir-format +#: lib/graphql/resolvers/media.ex:62 msgid "File doesn't have an allowed MIME type." msgstr "O ficheiro non ten un tipo MIME permitido." -#: lib/graphql/resolvers/group.ex:164 #, elixir-format +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "O perfil non é administrador do grupo" -#: lib/graphql/resolvers/event.ex:239 #, elixir-format +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "Non podes editar este evento." -#: lib/graphql/resolvers/event.ex:242 #, elixir-format +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "Non podes atribuír este evento a este perfil." -#: lib/graphql/resolvers/member.ex:137 #, elixir-format +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "O convite non existe." -#: lib/graphql/resolvers/member.ex:179 #, elixir-format +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "Este membro xa foi rexeitado." -#: lib/graphql/resolvers/member.ex:186 #, elixir-format +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "Non tes permiso para eliminar este membro." -#: lib/mobilizon/actors/actor.ex:351 #, elixir-format +#: lib/mobilizon/actors/actor.ex:351 msgid "This username is already taken." msgstr "Este nome de usuaria xa está pillado." -#: lib/graphql/resolvers/discussion.ex:73 #, elixir-format +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "Debes proporcionar ou ben un ID ou nome para acceder á conversa" -#: lib/graphql/resolvers/event.ex:200 #, elixir-format +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "O perfil da organización non pertence á usuaria" -#: lib/graphql/resolvers/participant.ex:89 #, elixir-format +#: lib/graphql/resolvers/participant.ex:89 msgid "Profile ID provided is not the anonymous profile one" msgstr "O ID do perfil proporcionado non é o perfil anónimo" -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 #, elixir-format +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "A imaxe proporcionada é demasiado grande (mb)" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "Non se atopa o ficheiro Index. Tes que recompilar o front-end." + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "Erro ao crear o recurso" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "O token de activación non é válido" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "Non se puideron obter os detalles do recurso desde o URL." + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "O perfil da moderadora proporcionado non ten permisos neste evento" diff --git a/priv/gettext/hu/LC_MESSAGES/default.po b/priv/gettext/hu/LC_MESSAGES/default.po index 5fed4fe36..bcd9cdf34 100644 --- a/priv/gettext/hu/LC_MESSAGES/default.po +++ b/priv/gettext/hu/LC_MESSAGES/default.po @@ -8,400 +8,451 @@ ## to merge POT files into PO files. msgid "" msgstr "" +"PO-Revision-Date: 2021-02-12 14:14+0000\n" +"Last-Translator: Balázs Meskó \n" +"Language-Team: Hungarian \n" "Language: hu\n" -"Plural-Forms: nplurals=2\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.4.2\n" +"Content-Transfer-Encoding: 8bit\n" #, elixir-format #: lib/web/templates/email/password_reset.html.eex:48 msgid "If you didn't request this, please ignore this email. Your password won't change until you access the link below and create a new one." msgstr "" +"Ha ezt nem Ön kérte, akkor hagyja figyelmen kívül ezt a levelet. A jelszava " +"addig nem fog megváltozni, amíg nem nyitja meg a lenti hivatkozást, és nem " +"hoz létre egy újat." #, elixir-format #: lib/web/templates/email/report.html.eex:74 msgid "%{title} by %{creator}" -msgstr "" +msgstr "%{title}, készítette: %{creator}" #, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:58 msgid "Activate my account" -msgstr "" +msgstr "Saját fiók aktiválása" #, elixir-format #: lib/web/templates/email/email.html.eex:117 #: lib/web/templates/email/email.text.eex:9 msgid "Ask the community on Framacolibri" -msgstr "" +msgstr "Kérdezze meg a közösséget a Framacolibrin" #, elixir-format #: lib/web/templates/email/report.text.eex:15 msgid "Comments" -msgstr "" +msgstr "Hozzászólások" #, elixir-format #: lib/web/templates/email/report.html.eex:72 #: lib/web/templates/email/report.text.eex:11 msgid "Event" -msgstr "" +msgstr "Esemény" #, elixir-format #: lib/web/email/user.ex:48 msgid "Instructions to reset your password on %{instance}" -msgstr "" +msgstr "Utasítások a jelszó visszaállításához a(z) %{instance} oldalon" #, elixir-format #: lib/web/templates/email/report.text.eex:21 msgid "Reason" -msgstr "" +msgstr "Ok" #, elixir-format #: lib/web/templates/email/password_reset.html.eex:61 msgid "Reset Password" -msgstr "" +msgstr "Jelszó visszaállítása" #, elixir-format #: lib/web/templates/email/password_reset.html.eex:41 msgid "Resetting your password is easy. Just press the button below and follow the instructions. We'll have you up and running in no time." msgstr "" +"A jelszó visszaállítása egyszerű. Csak nyomja meg az alábbi gombot, és " +"kövesse az utasításokat. Semmi perc alatt végezni fog." #, elixir-format #: lib/web/email/user.ex:28 msgid "Instructions to confirm your Mobilizon account on %{instance}" msgstr "" +"Utasítások a Mobilizon-fiókjának megerősítéséhez a(z) %{instance} oldalon" #, elixir-format #: lib/web/email/admin.ex:24 msgid "New report on Mobilizon instance %{instance}" -msgstr "" +msgstr "Új jelentés a(z) %{instance} Mobilizon-példányról" #, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:51 #: lib/web/templates/email/before_event_notification.text.eex:4 msgid "Go to event page" -msgstr "" +msgstr "Ugrás az események oldalhoz" #, elixir-format #: lib/web/templates/email/report.text.eex:1 msgid "New report from %{reporter} on %{instance}" -msgstr "" +msgstr "Új jelentés a(z) %{instance} példányon a következőtől: %{reporter}" #, elixir-format #: lib/web/templates/email/event_participation_approved.text.eex:1 msgid "Participation approved" -msgstr "" +msgstr "Részvétel jóváhagyva" #, elixir-format #: lib/web/templates/email/password_reset.html.eex:13 #: lib/web/templates/email/password_reset.text.eex:1 msgid "Password reset" -msgstr "" +msgstr "Jelszóvisszaállítás" #, elixir-format #: lib/web/templates/email/password_reset.text.eex:7 msgid "Resetting your password is easy. Just click the link below and follow the instructions. We'll have you up and running in no time." msgstr "" +"A jelszó visszaállítása egyszerű. Csak kattintson az alábbi hivatkozásra, és " +"kövesse az utasításokat. Semmi perc alatt végezni fog." #, elixir-format #: lib/web/templates/email/registration_confirmation.text.eex:5 msgid "You created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email." msgstr "" +"Új fiókot hozott létre a(z) %{host} oldalon ezzel az e-mail-címmel. Egy " +"kattintásnyira van az aktiválástól. Ha ez nem Ön volt, hagyja figyelmen " +"kívül a levelet." #, elixir-format #: lib/web/email/participation.ex:112 msgid "Your participation to event %{title} has been approved" -msgstr "" +msgstr "Jóváhagyták a részvételét a(z) %{title} eseményen" #, elixir-format #: lib/web/email/participation.ex:70 msgid "Your participation to event %{title} has been rejected" -msgstr "" +msgstr "Elutasították a részvételét a(z) %{title} eseményen" #, elixir-format #: lib/web/email/event.ex:37 msgid "Event %{title} has been updated" -msgstr "" +msgstr "A(z) %{title} esemény frissítésre került" #, elixir-format #: lib/web/templates/email/event_updated.text.eex:15 msgid "New title: %{title}" -msgstr "" +msgstr "Új cím: %{title}" #, elixir-format #: lib/web/templates/email/password_reset.text.eex:5 msgid "You requested a new password for your account on %{instance}." -msgstr "" +msgstr "Új jelszót kért a(z) %{instance} példányon lévő fiókjához." #, elixir-format #: lib/web/templates/email/email.html.eex:85 msgid "Warning" -msgstr "" +msgstr "Figyelmeztetés" #, elixir-format #: lib/web/email/participation.ex:135 msgid "Confirm your participation to event %{title}" -msgstr "" +msgstr "Erősítse meg a részvételét a(z) %{title} eseményen" #, elixir-format #: lib/web/templates/api/privacy.html.eex:75 msgctxt "terms" msgid "An internal ID for your current selected identity" -msgstr "" +msgstr "Belső azonosító a jelenleg kiválasztott személyazonosságához" #, elixir-format #: lib/web/templates/api/privacy.html.eex:74 msgctxt "terms" msgid "An internal user ID" -msgstr "" +msgstr "Belső felhasználói azonosító" #, elixir-format #: lib/web/templates/api/privacy.html.eex:37 msgctxt "terms" msgid "Any of the information we collect from you may be used in the following ways:" msgstr "" +"Minden általunk gyűjtött információ a következő módokon lehet felhasználva:" #, elixir-format #: lib/web/templates/api/privacy.html.eex:9 msgctxt "terms" msgid "Basic account information" -msgstr "" +msgstr "Alapvető fiókinformációk" #, elixir-format #: lib/web/templates/api/privacy.html.eex:25 msgctxt "terms" msgid "Do not share any dangerous information over Mobilizon." -msgstr "" +msgstr "Ne osszon meg veszélyes információkat a Mobilizonon." #, elixir-format #: lib/web/templates/api/privacy.html.eex:90 msgctxt "terms" msgid "Do we disclose any information to outside parties?" -msgstr "" +msgstr "Osztunk-e meg információkat külső felekkel?" #, elixir-format #: lib/web/templates/api/privacy.html.eex:68 msgctxt "terms" msgid "Do we use cookies?" -msgstr "" +msgstr "Használunk-e sütiket?" #, elixir-format #: lib/web/templates/api/privacy.html.eex:51 msgctxt "terms" msgid "How do we protect your information?" -msgstr "" +msgstr "Hogyan védjük meg az információit?" #, elixir-format #: lib/web/templates/api/privacy.html.eex:29 msgctxt "terms" msgid "IPs and other metadata" -msgstr "" +msgstr "IP-k és egyéb metaadatok" #, elixir-format #: lib/web/templates/api/privacy.html.eex:17 msgctxt "terms" msgid "Published events and comments" -msgstr "" +msgstr "Közzétett események és hozzászólások" #, elixir-format #: lib/web/templates/api/privacy.html.eex:64 msgctxt "terms" msgid "Retain the IP addresses associated with registered users no more than 12 months." msgstr "" +"Legfeljebb 12 hónapig megőrizzük a regisztrált felhasználókhoz kötődő IP-" +"címeket." #, elixir-format #: lib/web/templates/api/privacy.html.eex:76 msgctxt "terms" msgid "Tokens to authenticate you" -msgstr "" +msgstr "Az Ön hitelesítéséhez használt tokenek" #, elixir-format #: lib/web/templates/api/privacy.html.eex:31 msgctxt "terms" msgid "We also may retain server logs which include the IP address of every request to our server." msgstr "" +"Olyan kiszolgáló-naplófájlokat is megtarthatunk, amelyek a kiszolgálónak " +"küldött kéréseiben szereplő IP-címét tartalmazzák." #, elixir-format #: lib/web/templates/api/privacy.html.eex:70 msgctxt "terms" msgid "We store the following information on your device when you connect:" -msgstr "" +msgstr "A következő információkat tároljuk az eszközén, ha kapcsolódik:" #, elixir-format #: lib/web/templates/api/privacy.html.eex:58 msgctxt "terms" msgid "We will make a good faith effort to:" -msgstr "" +msgstr "Jóhiszemű erőfeszítéseket teszünk, hogy:" #, elixir-format #: lib/web/templates/api/privacy.html.eex:35 msgctxt "terms" msgid "What do we use your information for?" -msgstr "" +msgstr "Mire használjuk az információit?" #, elixir-format #: lib/web/templates/api/privacy.html.eex:57 msgctxt "terms" msgid "What is our data retention policy?" -msgstr "" +msgstr "Mi az adatmegőrzési házirendünk?" #, elixir-format #: lib/web/templates/api/privacy.html.eex:67 msgctxt "terms" msgid "You may irreversibly delete your account at any time." -msgstr "" +msgstr "Bármikor visszavonhatatlanul törölhetjük a fiókját." #, elixir-format #: lib/web/templates/api/privacy.html.eex:115 msgctxt "terms" msgid "Changes to our Privacy Policy" -msgstr "" +msgstr "Változások az adatvédelmi irányelvekben" #, elixir-format #: lib/web/templates/api/privacy.html.eex:106 msgctxt "terms" msgid "If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site." msgstr "" +"Ha ez a kiszolgáló az EU vagy az EGT területén található: Az oldalunk, " +"termékeink és szolgáltatásaink legalább 16 éves személyeket céloznak. Ha " +"nincs 16 éves, akkor a GDPR (Általános adatvédelmi " +"rendelet) követelményeinek megfelelően, ne használja az oldalt." #, elixir-format #: lib/web/templates/api/privacy.html.eex:109 msgctxt "terms" msgid "If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site." msgstr "" +"Ha ez a kiszolgáló az USA területén található: Az oldalunk, termékeink és " +"szolgáltatásaink legalább 13 éves személyeket céloznak. Ha nincs 13 éves, " +"akkor a COPPA (Children's Online Privacy Protection " +"Act) követelményeinek megfelelően, ne használja az oldalt." #, elixir-format #: lib/web/templates/api/privacy.html.eex:117 msgctxt "terms" msgid "If we decide to change our privacy policy, we will post those changes on this page." msgstr "" +"Ha úgy döntünk, hogy módosítjuk az adatvédelmi irányelveinket, akkor ezen az " +"oldalon fogjuk közzétenni ezeket a változásokat." #, elixir-format #: lib/web/templates/api/privacy.html.eex:112 msgctxt "terms" msgid "Law requirements can be different if this server is in another jurisdiction." msgstr "" +"A jogi követelmények eltérők lehetnek, ha a kiszolgáló más joghatósághoz " +"tartozik." #, elixir-format #: lib/web/templates/api/privacy.html.eex:103 msgctxt "terms" msgid "Site usage by children" -msgstr "" +msgstr "Gyermekek oldalhasználata" #, elixir-format #: lib/web/templates/api/privacy.html.eex:47 msgctxt "terms" msgid "The email address you provide may be used to send you information, updates and notifications about other people\n interacting with your content or sending you messages and to respond to inquiries, and/or other requests or\n questions." msgstr "" +"A megadott e-mail-címet arra használhatjuk, hogy információkat, híreket és " +"értesítéseket küldjünk más emberek,\n" +" az Ön tartalmával kapcsolatos interakcióiról, vagy üzeneteket " +"küldhessünk és válaszolhasson a megkeresésekre,\n" +" kérésekre vagy kérdésekre." #, elixir-format #: lib/web/templates/api/privacy.html.eex:45 msgctxt "terms" msgid "To aid moderation of the community, for example comparing your IP address with other known ones to determine ban\n evasion or other violations." msgstr "" +"Segítsen nekünk a közösség moderációjában, például összehasonlíthassuk az IP-" +"címét másokéval, hogy\n" +" kiszűrjük a tiltáselkerülést vagy más visszaéléseket." #, elixir-format #: lib/web/templates/api/privacy.html.eex:43 msgctxt "terms" msgid "To provide the core functionality of Mobilizon. Depending on this instance's policy you may only be able to\n interact with other people's content and post your own content if you are logged in." msgstr "" +"Biztosítsa a Mobilizon fő funkcióit. A példány házirendjétől függően lehet, " +"hogy csak akkor tud más emberek\n" +" tartalmával interakcióba lépni vagy saját tartalmat megosztani, ha be " +"van jelentkezve." #, elixir-format #: lib/web/templates/api/privacy.html.eex:6 msgctxt "terms" msgid "What information do we collect?" -msgstr "" +msgstr "Milyen információkat gyűjtünk?" #, elixir-format #: lib/web/email/user.ex:176 msgid "Mobilizon on %{instance}: confirm your email address" -msgstr "" +msgstr "Mobilizon itt: %{instance}: erősítse meg az e-mail-címét" #, elixir-format #: lib/web/email/user.ex:152 msgid "Mobilizon on %{instance}: email changed" -msgstr "" +msgstr "Mobilizon itt: %{instance}: e-mail-cím megváltozott" #, elixir-format #: lib/web/email/notification.ex:47 msgid "One event planned today" msgid_plural "%{nb_events} events planned today" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Egy tervezett esemény ma" +msgstr[1] "%{nb_events} tervezett esemény ma" #, elixir-format #: lib/web/templates/email/on_day_notification.html.eex:38 #: lib/web/templates/email/on_day_notification.text.eex:4 msgid "You have one event today:" msgid_plural "You have %{total} events today:" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Egy eseménye van ma:" +msgstr[1] "%{total} eseménye van ma:" #, elixir-format #: lib/web/templates/email/group_invite.text.eex:3 msgid "%{inviter} just invited you to join their group %{group}" -msgstr "" +msgstr "%{inviter} meghívta, hogy csatlakozzon a csoportjába: %{group}" #, elixir-format #: lib/web/templates/email/group_invite.html.eex:13 #: lib/web/templates/email/group_invite.text.eex:1 msgid "Come along!" -msgstr "" +msgstr "Jöjjön!" #, elixir-format #: lib/web/email/notification.ex:24 msgid "Don't forget to go to %{title}" -msgstr "" +msgstr "Ne felejtsen elmenni erre: %{title}" #, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:38 #: lib/web/templates/email/before_event_notification.text.eex:3 msgid "Get ready for %{title}" -msgstr "" +msgstr "Készüljön fel erre: %{title}" #, elixir-format #: lib/web/templates/email/group_invite.html.eex:59 msgid "See my groups" -msgstr "" +msgstr "Saját csoportok megtekintése" #, elixir-format #: lib/web/templates/email/group_invite.html.eex:45 #: lib/web/templates/email/group_invite.text.eex:5 msgid "To accept this invitation, head over to your groups." -msgstr "" +msgstr "A meghívás elfogadásához ugorjon a csoportjaihoz." #, elixir-format #: lib/web/templates/email/before_event_notification.text.eex:5 msgid "View the event on: %{link}" -msgstr "" +msgstr "Esemény megtekintése itt: %{link}" #, elixir-format #: lib/web/email/group.ex:33 msgid "You have been invited by %{inviter} to join group %{group}" -msgstr "" +msgstr "%{inviter} meghívta, hogy csatlakozzon a(z) %{group} csoporthoz" #, elixir-format #: lib/web/email/notification.ex:71 msgid "One event planned this week" msgid_plural "%{nb_events} events planned this week" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Egy esemény tervezve a héten" +msgstr[1] "%{nb_events} esemény tervezve a héten" #, elixir-format #: lib/web/email/notification.ex:93 msgid "One participation request for event %{title} to process" msgid_plural "%{number_participation_requests} participation requests for event %{title} to process" -msgstr[0] "" +msgstr[0] "Egy feldolgozandó részvételi kérés a következő eseménynél: %{title}" msgstr[1] "" +"%{number_participation_requests} feldolgozandó részvételi kérés a következő " +"eseménynél: %{title}" #, elixir-format #: lib/web/templates/email/notification_each_week.html.eex:38 #: lib/web/templates/email/notification_each_week.text.eex:3 msgid "You have one event this week:" msgid_plural "You have %{total} events this week:" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Egy eseménye van a héten:" +msgstr[1] "%{total} eseménye van a héten:" #, elixir-format #: lib/service/metadata/utils.ex:52 msgid "The event organizer didn't add any description." -msgstr "" +msgstr "Az eseményszervező nem adott meg leírást." #, elixir-format #: lib/web/templates/api/privacy.html.eex:54 @@ -479,7 +530,7 @@ msgstr "" #: lib/web/templates/api/terms.html.eex:92 msgctxt "terms" msgid "Feedback" -msgstr "" +msgstr "Visszajelzés" #, elixir-format #: lib/web/templates/api/terms.html.eex:83 @@ -617,7 +668,7 @@ msgstr "" #: lib/web/templates/api/terms.html.eex:79 msgctxt "terms" msgid "Source code" -msgstr "" +msgstr "Forráskód" #, elixir-format #: lib/web/templates/api/terms.html.eex:93 @@ -795,28 +846,28 @@ msgstr "" #: lib/web/templates/email/email_changed_new.html.eex:13 #: lib/web/templates/email/email_changed_new.text.eex:1 msgid "Confirm new email" -msgstr "" +msgstr "Új e-mail-cím megerősítése" #, elixir-format #: lib/web/templates/email/event_updated.html.eex:84 msgid "End" -msgstr "" +msgstr "Befejezés" #, elixir-format #: lib/web/templates/email/event_updated.text.eex:21 msgid "End %{ends_on}" -msgstr "" +msgstr "Befejezés: %{ends_on}" #, elixir-format #: lib/web/templates/email/event_updated.html.eex:13 #: lib/web/templates/email/event_updated.text.eex:1 msgid "Event update!" -msgstr "" +msgstr "Eseményfrissítés!" #, elixir-format #: lib/web/templates/email/report.html.eex:88 msgid "Flagged comments" -msgstr "" +msgstr "Megjelölt hozzászólások" #, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:45 @@ -836,8 +887,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -867,56 +918,58 @@ msgstr "" #, elixir-format #: lib/web/templates/email/event_updated.html.eex:94 msgid "Location" -msgstr "" +msgstr "Hely" #, elixir-format #: lib/web/templates/email/event_updated.html.eex:104 msgid "Location address was removed" -msgstr "" +msgstr "A hely eltávolításra került" #, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:51 #: lib/web/templates/email/pending_participation_notification.text.eex:6 msgid "Manage pending requests" -msgstr "" +msgstr "Függő kérések kezelése" #, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:13 #: lib/web/templates/email/registration_confirmation.text.eex:1 msgid "Nearly there!" -msgstr "" +msgstr "Majdnem kész!" #, elixir-format #: lib/web/templates/email/email_changed_old.html.eex:13 #: lib/web/templates/email/email_changed_old.text.eex:1 msgid "New email confirmation" -msgstr "" +msgstr "Új e-mail-cím megerősítés" #, elixir-format #: lib/web/templates/email/report.html.eex:106 msgid "Reasons for report" -msgstr "" +msgstr "Jelentés okai" #, elixir-format #: lib/web/templates/email/report.html.eex:39 msgid "Someone on %{instance} reported the following content for you to analyze:" msgstr "" +"Valaki a(z) %{instance} példányon jelentette a következő tartalmat, " +"hogy megvizsgálja:" #, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:13 #: lib/web/templates/email/event_participation_rejected.text.eex:1 msgid "Sorry! You're not going." -msgstr "" +msgstr "Sajnáljuk! Ön nem megy." #, elixir-format #: lib/web/templates/email/event_updated.html.eex:74 msgid "Start" -msgstr "" +msgstr "Kezdés" #, elixir-format #: lib/web/templates/email/event_updated.text.eex:18 msgid "Start %{begins_on}" -msgstr "" +msgstr "Kezdés: %{begins_on}" #, elixir-format #: lib/web/templates/email/event_updated.text.eex:3 @@ -950,45 +1003,45 @@ msgstr "" #, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:51 msgid "Verify your email address" -msgstr "" +msgstr "E-mail cím ellenőrzése" #, elixir-format #: lib/web/templates/email/report.html.eex:126 msgid "View report" -msgstr "" +msgstr "Jelentés megtekintése" #, elixir-format #: lib/web/templates/email/report.text.eex:24 msgid "View report:" -msgstr "" +msgstr "Jelentés megtekintése:" #, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:58 #: lib/web/templates/email/event_participation_confirmed.html.eex:58 msgid "Visit event page" -msgstr "" +msgstr "Eseményoldal felkeresése" #, elixir-format #: lib/web/templates/email/event_updated.html.eex:121 msgid "Visit the updated event page" -msgstr "" +msgstr "A frissített eseményoldal felkeresése" #, elixir-format #: lib/web/templates/email/event_updated.text.eex:23 msgid "Visit the updated event page: %{link}" -msgstr "" +msgstr "A frissített eseményoldal felkeresése: %{link}" #, elixir-format #: lib/web/templates/email/notification_each_week.html.eex:13 #: lib/web/templates/email/notification_each_week.text.eex:1 msgid "What's up this week?" -msgstr "" +msgstr "Mi lesz a héten?" #, elixir-format #: lib/web/templates/email/on_day_notification.html.eex:13 #: lib/web/templates/email/on_day_notification.text.eex:1 msgid "What's up today?" -msgstr "" +msgstr "Mi lesz ma?" #, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:70 @@ -1342,18 +1395,13 @@ msgstr "" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1365,20 +1413,46 @@ msgstr "" #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/hu/LC_MESSAGES/errors.po b/priv/gettext/hu/LC_MESSAGES/errors.po index ddd92c9a6..4bed746a2 100644 --- a/priv/gettext/hu/LC_MESSAGES/errors.po +++ b/priv/gettext/hu/LC_MESSAGES/errors.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-11-06 00:33+0000\n" -"PO-Revision-Date: 2020-11-27 06:34+0000\n" +"PO-Revision-Date: 2021-03-30 07:47+0000\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.1\n" +"X-Generator: Weblate 4.5.1\n" ## This file is a PO Template file. ## @@ -24,6 +24,7 @@ msgstr "" ## date. Leave `msgstr`s empty as changing them here as no ## effect: edit them in PO (`.po`) files instead. ## From Ecto.Changeset.cast/4 +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "nem lehet üres" @@ -110,200 +111,201 @@ msgid "must be equal to %{number}" msgstr "egyenlőnek kell lennie ezzel: %{number}" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "Nem lehet frissíteni a tokent" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "A jelenlegi profil nem tagja ennek a csoportnak" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "A jelenlegi profil nem adminisztrátora a kijelölt csoportnak" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "Hiba a felhasználói beállítások mentésekor" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "Nem található a csoport" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "Nem található %{id} azonosítóval rendelkező csoport" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "Lehetetlen hitelesíteni, vagy az e-mail, vagy a jelszó érvénytelen." #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "Nem található a tag" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "Nem található profil a moderátor felhasználóhoz" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "Nem található ezzel az e-mail-címmel ellenőrzendő felhasználó" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "Nem található ezzel az e-mail-címmel rendelkező felhasználó" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "A profilt nem hitelesített felhasználó birtokolja" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "A regisztrációk nincsenek nyitva" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "A jelenlegi jelszó érvénytelen" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "Az új e-mail-cím nem tűnik érvényesnek" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "Az új e-mail-címnek eltérőnek kell lennie" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "Az új jelszónak eltérőnek kell lennie" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "A megadott jelszó érvénytelen" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" "A választott jelszó túl rövid. Győződjön meg arról, hogy a jelszava " "tartalmazzon legalább 6 karaktert." #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "Ez a felhasználó nem tudja visszaállítani a jelszavát" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "Ez a felhasználó le lett tiltva" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "Nem lehet ellenőrizni a felhasználót" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "A felhasználó már le van tiltva" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "A kért felhasználó nincs bejelentkezve" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "Már tagja ennek a csoportnak" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "Nem hagyhatja el ezt a csoportot, mert Ön az egyedüli adminisztrátor" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "Nem csatlakozhat ehhez a csoporthoz" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "Lehet, hogy nem sorolhatja fel a csoportokat, hacsak nem moderátor." #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "Bejelentkezve kell lennie az e-mail-címe megváltoztatásához" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "Bejelentkezve kell lennie a jelszava megváltoztatásához" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "Bejelentkezve kell lennie egy csoport törléséhez" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "Bejelentkezve kell lennie a fiókja törléséhez" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "Bejelentkezve kell lennie egy csoporthoz való csatlakozáshoz" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "Bejelentkezve kell lennie egy csoportból való kilépéshez" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "Bejelentkezve kell lennie egy csoport frissítéséhez" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "Szüksége van egy meglévő tokenre egy frissítési token beszerzéséhez" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "Túl hamar kért újra egy megerősítő e-mailt" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "Az e-mail-címe nincs rajta az engedélyezési listán" @@ -355,22 +357,22 @@ msgid "Anonymous participation is not enabled" msgstr "A névtelen részvétel nincs engedélyezve" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "Nem lehet eltávolítani egy csoport utolsó adminisztrátorát" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "Nem lehet eltávolítani egy felhasználó utolsó személyazonosságát" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "A hozzászólást már törölték" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "Nem található a megbeszélés" @@ -390,8 +392,8 @@ msgid "Event id not found" msgstr "Nem található az eseményazonosító" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "Nem található az esemény" @@ -407,7 +409,7 @@ msgid "Internal Error" msgstr "Belső hiba" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "Nincs %{id} azonosítóval rendelkező megbeszélés" @@ -417,7 +419,7 @@ msgid "No profile found for user" msgstr "Nem található profil a felhasználóhoz" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "Nincs ilyen hírforrástoken" @@ -434,12 +436,12 @@ msgid "Participant not found" msgstr "Nem található a résztvevő" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "Nem található %{id} azonosítóval rendelkező személy" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "Nem található %{username} felhasználónévvel rendelkező személy" @@ -465,30 +467,25 @@ msgstr "A profil már tagja ennek a csoportnak" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "A profil nem tagja a csoportnak" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "Nem található a profil" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "A megadott moderátorprofilnak nincs jogosultsága ezen az eseményen" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "Nem található a jelentés" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "Az erőforrás nem létezik" @@ -514,22 +511,22 @@ msgid "Todo list doesn't exist" msgstr "A tennivalólista nem létezik" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "A token nem létezik" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "A token nem érvényes UUID" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "Nem található a felhasználó" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "Már rendelkezik profillal ehhez a felhasználóhoz" @@ -538,23 +535,18 @@ msgstr "Már rendelkezik profillal ehhez a felhasználóhoz" msgid "You are already a participant of this event" msgstr "Már résztvevője ennek az eseménynek" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "Nem tagja annak a csoportnak, amelyhez a megbeszélés tartozik" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "Nem tagja ennek a csoportnak" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "Nem moderátor vagy adminisztrátor ennél a csoportnál" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "Nem hozhat létre hozzászólást, ha nincs kapcsolódva" @@ -564,17 +556,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "Nem hozhat létre hírforrástokent, ha nincs kapcsolódva" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "Nem törölhet hozzászólást, ha nincs kapcsolódva" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "Nem törölhet hírforrástokent, ha nincs kapcsolódva" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "Nem frissíthet hozzászólást, ha nincs kapcsolódva" @@ -586,19 +578,19 @@ msgstr "" "Nem hagyhatja el az eseményt, mert Ön az egyedüli eseménylétrehozó résztvevő" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" "Nem állíthatja magát alacsonyabb tagszerepre ennél a csoportnál, mert Ön az " "egyedüli adminisztrátor" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "Nem tudja törölni ezt a hozzászólást" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "Nem tudja törölni ezt az eseményt" @@ -608,12 +600,12 @@ msgid "You cannot invite to this group" msgstr "Nem tud meghívni ebbe a csoportba" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "Nincs jogosultsága a token törléséhez" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" "Bejelentkezve kell lennie és moderátornak kell lennie a műveletnaplók " @@ -641,38 +633,38 @@ msgstr "" "megtekintéséhez" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" "Bejelentkezve kell lennie és adminisztrátornak kell lennie az " "adminisztrátori beállításokhoz való hozzáféréshez" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" "Bejelentkezve kell lennie és adminisztrátornak kell lennie a vezérlőpulti " "statisztikákhoz való hozzáféréshez" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" "Bejelentkezve kell lennie és adminisztrátornak kell lennie az " "adminisztrátori beállítások mentéséhez" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "Bejelentkezve kell lennie a megbeszélésekhez való hozzáféréshez" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "Bejelentkezve kell lennie az erőforrásokhoz való hozzáféréshez" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "Bejelentkezve kell lennie az események létrehozásához" @@ -687,12 +679,12 @@ msgid "You need to be logged-in to create reports" msgstr "Bejelentkezve kell lennie a jelentések létrehozásához" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "Bejelentkezve kell lennie az erőforrások létrehozásához" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "Bejelentkezve kell lennie egy esemény törléséhez" @@ -702,7 +694,7 @@ msgid "You need to be logged-in to delete posts" msgstr "Bejelentkezve kell lennie a hozzászólások törléséhez" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "Bejelentkezve kell lennie az erőforrások törléséhez" @@ -717,7 +709,7 @@ msgid "You need to be logged-in to leave an event" msgstr "Bejelentkezve kell lennie egy esemény elhagyásához" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "Bejelentkezve kell lennie egy esemény frissítéséhez" @@ -727,17 +719,17 @@ msgid "You need to be logged-in to update posts" msgstr "Bejelentkezve kell lennie a hozzászólások frissítéséhez" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "Bejelentkezve kell lennie az erőforrások frissítéséhez" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "Bejelentkezve kell lennie egy erőforrás előnézetének megtekintéséhez" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "A szülőerőforrás nem tartozik ehhez a csoporthoz" @@ -783,7 +775,7 @@ msgid "Resource not found" msgstr "Nem található az erőforrás" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "Valami elromlott" @@ -803,12 +795,12 @@ msgid "You need to be logged in" msgstr "Bejelentkezve kell lennie" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "Nem tudja elfogadni ezt a meghívást ezzel a profillal." #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "Nem tudja visszautasítani ezt a meghívást ezzel a profillal." @@ -818,32 +810,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "A fájl nem rendelkezik engedélyezett MIME-típussal." #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "A profil nem adminisztrátor ennél a csoportnál" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "Nem tudja szerkeszteni ezt az eseményt." #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "Nem tudja ezt az eseményt ennek a profilnak tulajdonítani." #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "Ez a meghívás nem létezik." #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "Ez a tag már vissza lett utasítva." #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "Nincs meg a jogosultsága a tag eltávolításához." @@ -853,14 +845,14 @@ msgid "This username is already taken." msgstr "Ez a felhasználónév már foglalt." #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" "Meg kell adnia vagy egy azonosítót, vagy egy keresőbarát URL-t egy " "megbeszéléshez való hozzáféréshez" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "A szervező profilját nem a felhasználó birtokolja" @@ -870,7 +862,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "A megadott profilazonosító nem a névtelen profil" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" -msgstr "" +msgstr "A megadott fénykép túl nehéz" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "Indexfájl nem található. Újra kell fordítania az előtétprogramot." + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "Hiba az erőforrás létrehozáskor" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "Érvénytelen aktiválási token" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "Nem lehet lekérni az erőforrás részleteit erről az URL-ről." + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "A megadott moderátorprofilnak nincs jogosultsága ezen az eseményen" diff --git a/priv/gettext/it/LC_MESSAGES/default.po b/priv/gettext/it/LC_MESSAGES/default.po index 8458137d3..62c5f9c70 100644 --- a/priv/gettext/it/LC_MESSAGES/default.po +++ b/priv/gettext/it/LC_MESSAGES/default.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-24 14:40+0000\n" -"PO-Revision-Date: 2020-11-05 10:29+0000\n" -"Last-Translator: x \n" +"PO-Revision-Date: 2021-05-17 16:22+0000\n" +"Last-Translator: Leo Durruti \n" "Language-Team: Italian \n" "Language: it\n" @@ -12,268 +12,268 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.1\n" +"X-Generator: Weblate 4.6\n" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:48 +#, elixir-format msgid "If you didn't request this, please ignore this email. Your password won't change until you access the link below and create a new one." msgstr "" "Se non l'hai richiesta tu, ignora questa mail. La tua password non sarà " "cambiata fino a che non accederai al link sotto per crearne una nuova." -#, elixir-format #: lib/web/templates/email/report.html.eex:74 +#, elixir-format msgid "%{title} by %{creator}" msgstr "%{title} di %{creator}" -#, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:58 +#, elixir-format msgid "Activate my account" msgstr "Attiva il mio account" -#, elixir-format #: lib/web/templates/email/email.html.eex:117 #: lib/web/templates/email/email.text.eex:9 +#, elixir-format msgid "Ask the community on Framacolibri" msgstr "Chiedi alla comunità su Framacolibri" -#, elixir-format #: lib/web/templates/email/report.text.eex:15 +#, elixir-format msgid "Comments" msgstr "Commenti" -#, elixir-format #: lib/web/templates/email/report.html.eex:72 #: lib/web/templates/email/report.text.eex:11 +#, elixir-format msgid "Event" msgstr "Evento" -#, elixir-format #: lib/web/email/user.ex:48 +#, elixir-format msgid "Instructions to reset your password on %{instance}" msgstr "Istruzioni per reimpostare la tua password su %{instance}" -#, elixir-format #: lib/web/templates/email/report.text.eex:21 +#, elixir-format msgid "Reason" msgstr "Spiegazione" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:61 +#, elixir-format msgid "Reset Password" msgstr "Resetta la password" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:41 +#, elixir-format msgid "Resetting your password is easy. Just press the button below and follow the instructions. We'll have you up and running in no time." msgstr "" "Resettare la tua password è semplice. Premi il pulsante sotto e segui le " "istruzioni. Potrai riutilizzare Mobilizon in pochissimo tempo." -#, elixir-format #: lib/web/email/user.ex:28 +#, elixir-format msgid "Instructions to confirm your Mobilizon account on %{instance}" msgstr "Istruzioni per confermare il tuo account Mobilizon su %{instance}" -#, elixir-format #: lib/web/email/admin.ex:24 +#, elixir-format msgid "New report on Mobilizon instance %{instance}" msgstr "Nuovo rapporto sull'istanza di Mobilizion %{instance}" -#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:51 #: lib/web/templates/email/before_event_notification.text.eex:4 +#, elixir-format msgid "Go to event page" msgstr "Vai alla pagina dell'evento" -#, elixir-format #: lib/web/templates/email/report.text.eex:1 +#, elixir-format msgid "New report from %{reporter} on %{instance}" msgstr "Nuovo rapporto da %{reporter} su %{instance}" -#, elixir-format #: lib/web/templates/email/event_participation_approved.text.eex:1 +#, elixir-format msgid "Participation approved" msgstr "Partecipazione approvata" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:13 #: lib/web/templates/email/password_reset.text.eex:1 -msgid "Password reset" -msgstr "Reset della password" - #, elixir-format +msgid "Password reset" +msgstr "Resettare la password" + #: lib/web/templates/email/password_reset.text.eex:7 +#, elixir-format msgid "Resetting your password is easy. Just click the link below and follow the instructions. We'll have you up and running in no time." msgstr "" "Resettare la tua password è semplice. Seleziona il link sotto e segui le " "istruzioni. Potrai riutilizzare Mobilizon in pochissimo tempo." -#, elixir-format #: lib/web/templates/email/registration_confirmation.text.eex:5 +#, elixir-format msgid "You created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email." msgstr "" "Hai creato un account su %{host} con questa email. Sei ad un click " "dall'attivarlo. Se non sei tu ignora questo messaggio." -#, elixir-format #: lib/web/email/participation.ex:112 +#, elixir-format msgid "Your participation to event %{title} has been approved" msgstr "La tua partecipazione all'evento %{title} è stata approvata" -#, elixir-format #: lib/web/email/participation.ex:70 +#, elixir-format msgid "Your participation to event %{title} has been rejected" msgstr "La tua partecipazione all'evento %{title} è stata rifiutata" -#, elixir-format #: lib/web/email/event.ex:37 +#, elixir-format msgid "Event %{title} has been updated" msgstr "L'evento %{title} è stato aggiornato" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:15 +#, elixir-format msgid "New title: %{title}" msgstr "Nuovo titolo: %{title}" -#, elixir-format #: lib/web/templates/email/password_reset.text.eex:5 +#, elixir-format msgid "You requested a new password for your account on %{instance}." msgstr "Hai richiesto una nuova password per il tuo account su %{instance}." -#, elixir-format #: lib/web/templates/email/email.html.eex:85 -msgid "Warning" -msgstr "Attenzione" - #, elixir-format +msgid "Warning" +msgstr "Avviso" + #: lib/web/email/participation.ex:135 +#, elixir-format msgid "Confirm your participation to event %{title}" msgstr "Conferma la tua partecipazione all'evento %{title}" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:75 +#, elixir-format msgctxt "terms" msgid "An internal ID for your current selected identity" msgstr "Un ID interno per l'identità attualmente selezionata" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:74 +#, elixir-format msgctxt "terms" msgid "An internal user ID" msgstr "Un ID utente interno" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:37 +#, elixir-format msgctxt "terms" msgid "Any of the information we collect from you may be used in the following ways:" msgstr "" "Qualsiasi informazione che raccogliamo da te può essere utilizzata nel " "seguenti modi:" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:9 +#, elixir-format msgctxt "terms" msgid "Basic account information" msgstr "Informazioni di base sull'account" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:25 +#, elixir-format msgctxt "terms" msgid "Do not share any dangerous information over Mobilizon." msgstr "Non condividere informazioni pericolose su Mobilizon." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:90 +#, elixir-format msgctxt "terms" msgid "Do we disclose any information to outside parties?" msgstr "Divulghiamo informazioni a terzi?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:68 +#, elixir-format msgctxt "terms" msgid "Do we use cookies?" msgstr "Usiamo i cookies?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:51 +#, elixir-format msgctxt "terms" msgid "How do we protect your information?" msgstr "Come proteggiamo le tue informazioni?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:29 +#, elixir-format msgctxt "terms" msgid "IPs and other metadata" msgstr "IPs e altri metadati" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:17 +#, elixir-format msgctxt "terms" msgid "Published events and comments" msgstr "Eventi e commenti pubblicati" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:64 +#, elixir-format msgctxt "terms" msgid "Retain the IP addresses associated with registered users no more than 12 months." msgstr "" "Conserva gli indirizzi IP associati agli utenti registrati per non più di 12 " "mesi." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:76 +#, elixir-format msgctxt "terms" msgid "Tokens to authenticate you" msgstr "Tokens per autenticarti" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:31 +#, elixir-format msgctxt "terms" msgid "We also may retain server logs which include the IP address of every request to our server." msgstr "" "Possiamo anche conservare i registri del server che includono l'indirizzo IP " "di ogni richiesta al nostro server." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:70 +#, elixir-format msgctxt "terms" msgid "We store the following information on your device when you connect:" msgstr "" "Memorizziamo le seguenti informazioni sul tuo dispositivo quando ti connetti:" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:58 +#, elixir-format msgctxt "terms" msgid "We will make a good faith effort to:" msgstr "Facciamo tutto il possibile per:" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:35 +#, elixir-format msgctxt "terms" msgid "What do we use your information for?" msgstr "Per cosa usiamo le tue informazioni?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:57 +#, elixir-format msgctxt "terms" msgid "What is our data retention policy?" msgstr "Qual'è la nostra politica di conservazione dei dati?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:67 +#, elixir-format msgctxt "terms" msgid "You may irreversibly delete your account at any time." msgstr "Puoi eliminare irreversibilmente il tuo account in qualsiasi momento." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:115 +#, elixir-format msgctxt "terms" msgid "Changes to our Privacy Policy" msgstr "Modifiche alla nostra politica sulla privacy" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:106 +#, elixir-format msgctxt "terms" msgid "If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site." msgstr "" @@ -283,8 +283,8 @@ msgstr "" "General_Data_Protection_Regulation\">General Data Protection Regulation) " "non usare questo sito." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:109 +#, elixir-format msgctxt "terms" msgid "If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site." msgstr "" @@ -294,30 +294,30 @@ msgstr "" "27s_Online_Privacy_Protection_Act\">Children's Online Privacy Protection " "Act) non usare questo sito." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:117 +#, elixir-format msgctxt "terms" msgid "If we decide to change our privacy policy, we will post those changes on this page." msgstr "" "Se decidiamo di modificare la politica sulla privacy, pubblicheremo i " "cambiamenti su questa pagina." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:112 +#, elixir-format msgctxt "terms" msgid "Law requirements can be different if this server is in another jurisdiction." msgstr "" "I requisiti di legge possono essere diversi se questo server si trova in " "un'altra giurisdizione." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:103 +#, elixir-format msgctxt "terms" msgid "Site usage by children" msgstr "Utilizzo del sito da parte dei bambini" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:47 +#, elixir-format msgctxt "terms" msgid "The email address you provide may be used to send you information, updates and notifications about other people\n interacting with your content or sending you messages and to respond to inquiries, and/or other requests or\n questions." msgstr "" @@ -327,8 +327,8 @@ msgstr "" "rispondere a indagini, e/o altre richieste o\n" "…domande." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:45 +#, elixir-format msgctxt "terms" msgid "To aid moderation of the community, for example comparing your IP address with other known ones to determine ban\n evasion or other violations." msgstr "" @@ -336,8 +336,8 @@ msgstr "" "indirizzo IP con altri noti per determinare \n" "…l'evasione del divieto o altre violazioni." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:43 +#, elixir-format msgctxt "terms" msgid "To provide the core functionality of Mobilizon. Depending on this instance's policy you may only be able to\n interact with other people's content and post your own content if you are logged in." msgstr "" @@ -346,89 +346,89 @@ msgstr "" "…interagire con i contenuti di altre persone e pubblicare i tuoi contenuti " "solo se hai effettuato l'accesso." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:6 +#, elixir-format msgctxt "terms" msgid "What information do we collect?" msgstr "Quali informazioni raccogliamo?" -#, elixir-format #: lib/web/email/user.ex:176 +#, elixir-format msgid "Mobilizon on %{instance}: confirm your email address" msgstr "Mobilizon su %{instance}: conferma il tuo indirizzo email" -#, elixir-format #: lib/web/email/user.ex:152 +#, elixir-format msgid "Mobilizon on %{instance}: email changed" msgstr "Mobilizon su %{instance}: email modificata" -#, elixir-format #: lib/web/email/notification.ex:47 +#, elixir-format msgid "One event planned today" msgid_plural "%{nb_events} events planned today" msgstr[0] "Un evento programmato oggi" msgstr[1] "%{nb_events} eventi programmati oggi" -#, elixir-format #: lib/web/templates/email/on_day_notification.html.eex:38 #: lib/web/templates/email/on_day_notification.text.eex:4 +#, elixir-format msgid "You have one event today:" msgid_plural "You have %{total} events today:" msgstr[0] "Hai un evento oggi:" msgstr[1] "Hai %{total} eventi oggi:" -#, elixir-format #: lib/web/templates/email/group_invite.text.eex:3 +#, elixir-format msgid "%{inviter} just invited you to join their group %{group}" msgstr "%{inviter} ti ha appena invitato a unirti al suo gruppo %{group}" -#, elixir-format #: lib/web/templates/email/group_invite.html.eex:13 #: lib/web/templates/email/group_invite.text.eex:1 +#, elixir-format msgid "Come along!" msgstr "Sbrigati!" -#, elixir-format #: lib/web/email/notification.ex:24 +#, elixir-format msgid "Don't forget to go to %{title}" msgstr "Non dimenticare di andare a %{title}" -#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:38 #: lib/web/templates/email/before_event_notification.text.eex:3 +#, elixir-format msgid "Get ready for %{title}" msgstr "Tenersi pronti per %{title}" -#, elixir-format #: lib/web/templates/email/group_invite.html.eex:59 +#, elixir-format msgid "See my groups" msgstr "Visualizza i miei gruppi" -#, elixir-format #: lib/web/templates/email/group_invite.html.eex:45 #: lib/web/templates/email/group_invite.text.eex:5 +#, elixir-format msgid "To accept this invitation, head over to your groups." msgstr "Per accettare questo invito, vai ai tuoi gruppi." -#, elixir-format #: lib/web/templates/email/before_event_notification.text.eex:5 +#, elixir-format msgid "View the event on: %{link}" msgstr "Visualizza l'evento su: %{link}" -#, elixir-format #: lib/web/email/group.ex:33 +#, elixir-format msgid "You have been invited by %{inviter} to join group %{group}" msgstr "Sei stato invitato da %{inviter} per partecipare al gruppo %{group}" -#, elixir-format #: lib/web/email/notification.ex:71 +#, elixir-format msgid "One event planned this week" msgid_plural "%{nb_events} events planned this week" msgstr[0] "Un evento in programma questa settimana" msgstr[1] "%{nb_events} eventi in programma questa settimana" -#, elixir-format #: lib/web/email/notification.ex:93 +#, elixir-format msgid "One participation request for event %{title} to process" msgid_plural "%{number_participation_requests} participation requests for event %{title} to process" msgstr[0] "Una richiesta di partecipazione per l'evento %{title} da elaborare" @@ -436,21 +436,21 @@ msgstr[1] "" "%{number_participation_requests} richieste di partecipazione per l'evento " "%{title} da elaborare" -#, elixir-format #: lib/web/templates/email/notification_each_week.html.eex:38 #: lib/web/templates/email/notification_each_week.text.eex:3 +#, elixir-format msgid "You have one event this week:" msgid_plural "You have %{total} events this week:" msgstr[0] "Hai un evento questa settimana:" msgstr[1] "Hai %{total} eventi questa settimana:" -#, elixir-format #: lib/service/metadata/utils.ex:52 +#, elixir-format msgid "The event organizer didn't add any description." msgstr "L'organizzatore dell'evento non ha aggiunto alcuna descrizione." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:54 +#, elixir-format msgctxt "terms" msgid "We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL/TLS, and your password is hashed using a strong one-way algorithm." msgstr "" @@ -461,8 +461,8 @@ msgstr "" "la password viene sottoposta ad hashing utilizzando un potente algoritmo " "unidirezionale." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:94 +#, elixir-format msgctxt "terms" msgid "No. We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety." msgstr "" @@ -475,20 +475,20 @@ msgstr "" "appropriato per rispettare la legge, far rispettare le politiche del nostro " "sito o proteggere i nostri o altri diritti, proprietà o sicurezza." -#, elixir-format #: lib/web/templates/api/terms.html.eex:23 +#, elixir-format msgctxt "terms" msgid "Accepting these Terms" msgstr "Accettazione di queste Condizioni" -#, elixir-format #: lib/web/templates/api/terms.html.eex:27 +#, elixir-format msgctxt "terms" msgid "Changes to these Terms" msgstr "Modifiche a queste Condizioni d'Utilizzo" -#, elixir-format #: lib/web/templates/api/terms.html.eex:85 +#, elixir-format msgctxt "terms" msgid "A lot of the content on the Service is from you and others, and we don't review, verify or authenticate it, and it may include inaccuracies or false information. We make no representations, warranties, or guarantees relating to the quality, suitability, truth, accuracy or completeness of any content contained in the Service. You acknowledge sole responsibility for and assume all risk arising from your use of or reliance on any content." msgstr "" @@ -501,16 +501,16 @@ msgstr "" "assumere tutti i rischi sull'uso che ne fai e sulla fiducia che attribuisci " "ad essi." -#, elixir-format #: lib/web/templates/api/terms.html.eex:60 +#, elixir-format msgctxt "terms" msgid "Also, you agree that you will not do any of the following in connection with the Service or other users:" msgstr "" "inoltre accetti di non essere in nessun modo relazionato col Servizio o con " "altri utenti se farai una delle seguenti azioni:" -#, elixir-format #: lib/web/templates/api/terms.html.eex:65 +#, elixir-format msgctxt "terms" msgid "Circumvent or attempt to circumvent any filtering, security measures, rate limits or other features designed to protect the Service, users of the Service, or third parties." msgstr "" @@ -518,24 +518,24 @@ msgstr "" "o altre funzionalità progettate per proteggere il Servizio, gli utenti del " "Servizio o terze parti." -#, elixir-format #: lib/web/templates/api/terms.html.eex:64 +#, elixir-format msgctxt "terms" msgid "Collect any personal information about other users, or intimidate, threaten, stalk or otherwise harass other users of the Service;" msgstr "" "Raccogliere informazioni personali su altri utenti o intimidire, minacciare, " "perseguitare o molestare in altro modo altri utenti del Servizio;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:55 +#, elixir-format msgctxt "terms" msgid "Content that is illegal or unlawful, that would otherwise create liability;" msgstr "" "Creare contenuti che sono illegali o illeciti o che possono dare luogo a " "responsabilità penali;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:56 +#, elixir-format msgctxt "terms" msgid "Content that may infringe or violate any patent, trademark, trade secret, copyright, right of privacy, right of publicity or other intellectual or other right of any party;" msgstr "" @@ -543,48 +543,48 @@ msgstr "" "commerciali, copyright, diritti alla privacy, diritti di pubblicità o altri " "diritti intellettuali o di altro tipo di qualsiasi parte;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:42 +#, elixir-format msgctxt "terms" msgid "Creating Accounts" msgstr "Creazione degli Accounts" -#, elixir-format #: lib/web/templates/api/terms.html.eex:89 +#, elixir-format msgctxt "terms" msgid "Entire Agreement" msgstr "Intero Accordo" -#, elixir-format #: lib/web/templates/api/terms.html.eex:92 +#, elixir-format msgctxt "terms" msgid "Feedback" msgstr "Opinione" -#, elixir-format #: lib/web/templates/api/terms.html.eex:83 +#, elixir-format msgctxt "terms" msgid "Hyperlinks and Third Party Content" msgstr "Collegamenti ipertestuali e contenuti di terze parti" -#, elixir-format #: lib/web/templates/api/terms.html.eex:88 +#, elixir-format msgctxt "terms" msgid "If you breach any of these Terms, we have the right to suspend or disable your access to or use of the Service." msgstr "" "Se infrangete uno di questi Termini avete il diritto di sospendere o " "disabilitare l'accesso al Servizio o il suo uso." -#, elixir-format #: lib/web/templates/api/terms.html.eex:63 +#, elixir-format msgctxt "terms" msgid "Impersonate or post on behalf of any person or entity or otherwise misrepresent your affiliation with a person or entity;" msgstr "" "Impersonare o pubblicare per conto di qualsiasi persona o entità o " "altrimenti travisare la propria affiliazione con una persona o entità;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:48 +#, elixir-format msgctxt "terms" msgid "Our Service allows you and other users to post, link and otherwise make available content. You are responsible for the content that you make available to the Service, including its legality, reliability, and appropriateness." msgstr "" @@ -593,26 +593,26 @@ msgstr "" "che metti a disposizione del Servizio, inclusa la sua legalità, affidabilità " "e adeguatezza." -#, elixir-format #: lib/web/templates/api/terms.html.eex:39 +#, elixir-format msgctxt "terms" msgid "Privacy Policy" -msgstr "Politica sulla Privacy (Privacy Policy)" +msgstr "Politica sulla Privacy" -#, elixir-format #: lib/web/templates/api/terms.html.eex:95 +#, elixir-format msgctxt "terms" msgid "Questions & Contact Information" msgstr "Domande e Informazioni di Contatto" -#, elixir-format #: lib/web/templates/api/terms.html.eex:87 +#, elixir-format msgctxt "terms" msgid "Termination" msgstr "Termine" -#, elixir-format #: lib/web/templates/api/terms.html.eex:62 +#, elixir-format msgctxt "terms" msgid "Use the Service in any manner that could interfere with, disrupt, negatively affect or inhibit other users from fully enjoying the Service or that could damage, disable, overburden or impair the functioning of the Service;" msgstr "" @@ -621,14 +621,14 @@ msgstr "" "appieno del Servizio o che potrebbe danneggiare, disabilitare, " "sovraccaricare o compromettere il funzionamento del Servizio;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:47 +#, elixir-format msgctxt "terms" msgid "Your Content & Conduct" msgstr "I tuoi Contenuti e la tua Condotta" -#, elixir-format #: lib/web/templates/api/terms.html.eex:84 +#, elixir-format msgctxt "terms" msgid "%{instance_name} makes no claim or representation regarding, and accepts no responsibility for third party websites accessible by hyperlink from the Service or websites linking to the Service. When you leave the Service, you should be aware that these Terms and our policies no longer govern. The inclusion of any link does not imply endorsement by %{instance_name} of the site. Use of any such linked website is at the user's own risk." msgstr "" @@ -641,8 +641,8 @@ msgstr "" "di % {instance_name} del sito. L'utilizzo di tali siti Web collegati " "è a rischio dell'utente." -#, elixir-format #: lib/web/templates/api/terms.html.eex:68 +#, elixir-format msgctxt "terms" msgid "Finally, your use of the Service is also subject to acceptance of the instance's own specific rules regarding the code of conduct and moderation rules. Breaking those rules may also result in your account being disabled or suspended." msgstr "" @@ -651,16 +651,16 @@ msgstr "" "condotta e alle regole di moderazione. La violazione di queste regole può " "anche comportare la disattivazione o la sospensione del tuo account." -#, elixir-format #: lib/web/templates/api/terms.html.eex:81 +#, elixir-format msgctxt "terms" msgid "For full details about the Mobilizon software see here." msgstr "" "Per i dettagli completi sul software Mobilizon vedi qui ." -#, elixir-format #: lib/web/templates/api/terms.html.eex:18 +#, elixir-format msgctxt "terms" msgid "Here are the important things you need to know about accessing and using the %{instance_name} (%{instance_url}) website and service (collectively, \"Service\"). These are our terms of service (\"Terms\"). Please read them carefully." msgstr "" @@ -669,8 +669,8 @@ msgstr "" ") sito web e servizio (collettivamente, \"Servizio\"). Questi sono i " "nostri termini di servizio (\"Termini\"). Si prega di leggerli attentamente." -#, elixir-format #: lib/web/templates/api/terms.html.eex:33 +#, elixir-format msgctxt "terms" msgid "If we make major changes, we will notify our users in a clear and prominent manner. Minor changes may only be highlighted in the footer of our website. It is your responsibility to check the website regularly for changes to these Terms." msgstr "" @@ -679,8 +679,8 @@ msgstr "" "piè di pagina del nostro sito web. È tua responsabilità controllare " "regolarmente il sito web per eventuali modifiche ai presenti Termini." -#, elixir-format #: lib/web/templates/api/terms.html.eex:53 +#, elixir-format msgctxt "terms" msgid "In order to make %{instance_name} a great place for all of us, please do not post, link and otherwise make available on or through the Service any of the following:" msgstr "" @@ -688,8 +688,8 @@ msgstr "" "preghiamo di non pubblicare, linkare, o rendere disponibile sul nostro " "Servizio o attraverso esso uno dei seguenti elementi:" -#, elixir-format #: lib/web/templates/api/terms.html.eex:57 +#, elixir-format msgctxt "terms" msgid "Private information of any third party (e.g., addresses, phone numbers, email addresses, Social Security numbers and credit card numbers); and" msgstr "" @@ -697,8 +697,8 @@ msgstr "" "indirizzi e-mail, numeri di previdenza sociale e numeri di carte di credito);" " e" -#, elixir-format #: lib/web/templates/api/terms.html.eex:52 +#, elixir-format msgctxt "terms" msgid "Since Mobilizon is a distributed network, it is possible, depending on the visibility rules set to your content, that your content has been distributed to other Mobilizon instances. When you delete your content, we will request those other instances to also delete the content. Our responsibility on the content being deleted from those other instances ends here. If for some reason, some other instance does not delete the content, we cannot be held responsible." msgstr "" @@ -710,8 +710,8 @@ msgstr "" "quelle altre istanze termina qui. Se per qualche motivo, qualche altra " "istanza non elimina il contenuto, non possiamo essere ritenuti responsabili." -#, elixir-format #: lib/web/templates/api/terms.html.eex:90 +#, elixir-format msgctxt "terms" msgid "These Terms constitute the entire agreement between you and %{instance_name} regarding the use of the Service, superseding any prior agreements between you and %{instance_name} relating to your use of the Service." msgstr "" @@ -720,8 +720,8 @@ msgstr "" "sostituendo qualsiasi accordo precedente tra te e % {instance_name} " "relativo al tuo utilizzo di il servizio." -#, elixir-format #: lib/web/templates/api/terms.html.eex:80 +#, elixir-format msgctxt "terms" msgid "This Service runs on a Mobilizon instance. This source code is licensed under an AGPLv3 license which means you are allowed to and even encouraged to take the source code, modify it and use it." msgstr "" @@ -731,16 +731,16 @@ msgstr "" "significa che sei autorizzato e persino incoraggiato a prendere il codice " "sorgente, modificarlo e usarlo." -#, elixir-format #: lib/web/templates/api/terms.html.eex:58 +#, elixir-format msgctxt "terms" msgid "Viruses, corrupted data or other harmful, disruptive or destructive files or code." msgstr "" "Virus, dati corrotti o altri file o codice dannosi, disturbanti o " "distruttivi." -#, elixir-format #: lib/web/templates/api/terms.html.eex:51 +#, elixir-format msgctxt "terms" msgid "You can remove the content that you posted by deleting it. Once you delete your content, it will not appear on the Service, but copies of your deleted content may remain in our system or backups for some period of time. Web server access logs might also be stored for some time in the system." msgstr "" @@ -750,30 +750,30 @@ msgstr "" "un certo periodo di tempo. I registri di accesso al server Web potrebbero " "anche essere archiviati per qualche tempo nel sistema." -#, elixir-format #: lib/web/templates/api/terms.html.eex:96 +#, elixir-format msgctxt "terms" msgid "Questions or comments about the Service may be directed to us at %{contact}" msgstr "" "Domande o commenti sul Servizio possono essere indirizzati a noi " "all'indirizzo %{contact}" -#, elixir-format #: lib/web/templates/api/terms.html.eex:79 +#, elixir-format msgctxt "terms" msgid "Source code" msgstr "Codice sorgente" -#, elixir-format #: lib/web/templates/api/terms.html.eex:93 +#, elixir-format msgctxt "terms" msgid "We love feedback. Please let us know what you think of the Service, these Terms and, in general, %{instance_name}." msgstr "" "Adoriamo i feedback. Fateci sapere cosa ne pensate del Servizio, dei " "presenti Termini e, in generale,%{instance_name}." -#, elixir-format #: lib/web/templates/api/terms.html.eex:74 +#, elixir-format msgctxt "terms" msgid "Instance administrators (and community moderators, given the relevant access) are responsible for monitoring and acting on flagged content and other user reports, and have the right and responsibility to remove or edit content that is not aligned to this Instance set of rules, or to suspend, block or ban (temporarily or permanently) any account, community, or instance for breaking these terms, or for other behaviours that they deem inappropriate, threatening, offensive, or harmful." msgstr "" @@ -786,16 +786,16 @@ msgstr "" "violazione dei presenti termini o per altri comportamenti che ritengono " "inappropriati, minacciosi, offensivi o dannosi." -#, elixir-format #: lib/web/templates/api/terms.html.eex:6 +#, elixir-format msgctxt "terms" msgid "%{instance_name} will not use or transmit or resell your personal data" msgstr "" "%{instance_name} non utilizzerà, trasmetterà o rivenderà i tuoi dati " "personali" -#, elixir-format #: lib/web/templates/api/terms.html.eex:44 +#, elixir-format msgctxt "terms" msgid "If you discover or suspect any Service security breaches, please let us know as soon as possible. For security holes in the Mobilizon software itself, please contact its contributors directly." msgstr "" @@ -804,8 +804,8 @@ msgstr "" "contatta direttamente " "i suoi contributori ." -#, elixir-format #: lib/web/templates/api/terms.html.eex:77 +#, elixir-format msgctxt "terms" msgid "Instance administrators should ensure that every community hosted on the instance is properly moderated according to the defined rules." msgstr "" @@ -813,8 +813,8 @@ msgstr "" "ospitata sull'istanza sia adeguatamente moderata in base alle regole " "definite." -#, elixir-format #: lib/web/templates/api/terms.html.eex:98 +#, elixir-format msgctxt "terms" msgid "Originally adapted from the Diaspora* and App.net privacy policies, also licensed under CC BY-SA." msgstr "" @@ -823,8 +823,8 @@ msgstr "" "appdotnet/terms-of-service\"> App .net , anch'esse concesse in licenza " " CC BY-SA ." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:119 +#, elixir-format msgctxt "terms" msgid "Originally adapted from the Mastodon and Discourse privacy policies, also licensed under CC BY-SA." msgstr "" @@ -833,22 +833,22 @@ msgstr "" "discourse/discourse\"> Discourse , anch'esse concesse in licenza CC BY-SA ." -#, elixir-format #: lib/web/templates/api/terms.html.eex:3 +#, elixir-format msgctxt "terms" msgid "Short version" msgstr "Versione breve" -#, elixir-format #: lib/web/templates/api/terms.html.eex:9 +#, elixir-format msgctxt "terms" msgid "The service is provided without warranties and these terms may change in the future" msgstr "" "Il servizio è fornito senza garanzie e questi termini possono cambiare in " "futuro" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:118 +#, elixir-format msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 18, 2020." msgstr "" @@ -856,8 +856,8 @@ msgstr "" "licenses/by-sa/4.0/\">CC BY-SA. È stato aggiornato l'ultima volta il 18 " "giugno 2020." -#, elixir-format #: lib/web/templates/api/terms.html.eex:97 +#, elixir-format msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 22, 2020." msgstr "" @@ -865,85 +865,85 @@ msgstr "" "licenses/by-sa/4.0/\"> CC BY-SA . È stato aggiornato l'ultima volta il " "22 giugno 2020." -#, elixir-format #: lib/web/templates/api/terms.html.eex:8 +#, elixir-format msgctxt "terms" msgid "You must respect other people and %{instance_name}'s rules when using the service" msgstr "" "Devi rispettare le altre persone e le regole di % {instance_name} " "quando utilizzi il servizio" -#, elixir-format #: lib/web/templates/api/terms.html.eex:7 +#, elixir-format msgctxt "terms" msgid "You must respect the law when using %{instance_name}" msgstr "Devi rispettare la legge quando utilizzi % {instance_name} " -#, elixir-format #: lib/web/templates/api/terms.html.eex:5 +#, elixir-format msgctxt "terms" msgid "Your content is yours" msgstr "I tuoi dati ti appartengono" -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:51 +#, elixir-format msgid "Confirm my e-mail address" msgstr "Conferma il mio indirizzo e-mail" -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:13 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:1 +#, elixir-format msgid "Confirm your e-mail" msgstr "Conferma il tuo indirizzo e-mail" -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:3 +#, elixir-format msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" "Ciao! Ti sei appena registrato per partecipare a questo evento: «% {title}». " "Conferma l'indirizzo e-mail che hai fornito:" -#, elixir-format #: lib/web/templates/email/email.html.eex:114 #: lib/web/templates/email/email.text.eex:8 +#, elixir-format msgid "Need help? Is something not working as expected?" msgstr "Bisogno di aiuto? Qualcosa non funziona correttamente?" -#, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:38 +#, elixir-format msgid "You created an account on %{host} with this email address. You are one click away from activating it." msgstr "" "Hai creato un account su % {host} con questo indirizzo email. Sei a " "un clic di distanza dall'attivarlo." -#, elixir-format #: lib/web/templates/email/report.html.eex:13 +#, elixir-format msgid "New report on %{instance}" msgstr "Nuova segnalazione sull'istanza %{instance}" -#, elixir-format #: lib/web/templates/email/email_changed_old.html.eex:38 +#, elixir-format msgid "The email address for your account on %{host} is being changed to:" msgstr "" "L'indirizzo email del tuo account su % {host} verrà modificato in:" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:38 +#, elixir-format msgid "You requested a new password for your account on %{instance}." msgstr "" "Hai richiesto una nuova password per il tuo account su % {instance} ." -#, elixir-format #: lib/web/templates/email/email.text.eex:5 +#, elixir-format msgid "Please do not use it for real purposes." msgstr "Si prega di non usarlo per scopi reali." -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:63 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:6 lib/web/templates/email/event_updated.html.eex:133 #: lib/web/templates/email/event_updated.text.eex:24 lib/web/templates/email/notification_each_week.html.eex:70 #: lib/web/templates/email/notification_each_week.text.eex:11 lib/web/templates/email/on_day_notification.html.eex:70 #: lib/web/templates/email/on_day_notification.text.eex:14 +#, elixir-format msgid "Would you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgid_plural "Would you wish to cancel your attendance to one or several events, visit the event pages through the links above and click the « Attending » button." msgstr[0] "" @@ -954,9 +954,9 @@ msgstr[1] "" "pagine dell'evento attraverso il links sotto e seleziona il pulsante " "'Partecipo'." -#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:38 #: lib/web/templates/email/pending_participation_notification.text.eex:4 +#, elixir-format msgid "You have one pending attendance request to process:" msgid_plural "You have %{number_participation_requests} attendance requests to process:" msgstr[0] "Hai una richiesta di partecipazione in sospeso da esaminare:" @@ -964,67 +964,67 @@ msgstr[1] "" "Hai %{number_participation_requests} richieste di partecipazione in sospeso " "da esaminare:" -#, elixir-format #: lib/web/templates/email/email.text.eex:11 +#, elixir-format msgid "%{instance} is powered by Mobilizon." msgstr "% {instance} è alimentata da Mobilizon." -#, elixir-format #: lib/web/templates/email/email.html.eex:142 +#, elixir-format msgid "%{instance} is powered by Mobilizon." msgstr "%{instance} è alimentata da Mobilizon." -#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:13 #: lib/web/templates/email/pending_participation_notification.text.eex:1 +#, elixir-format msgid "A request is pending!" msgstr "Una richiesta in sospeso!" -#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:13 #: lib/web/templates/email/before_event_notification.text.eex:1 +#, elixir-format msgid "An event is upcoming!" msgstr "Un evento è in arrivo!" -#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:13 #: lib/web/templates/email/email_changed_new.text.eex:1 +#, elixir-format msgid "Confirm new email" msgstr "Conferma il nuovo indirizzo e-mail" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:84 +#, elixir-format msgid "End" msgstr "Fine" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:21 +#, elixir-format msgid "End %{ends_on}" msgstr "Fine %{ends_on}" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:13 #: lib/web/templates/email/event_updated.text.eex:1 +#, elixir-format msgid "Event update!" msgstr "Evento aggiornato!" -#, elixir-format #: lib/web/templates/email/report.html.eex:88 +#, elixir-format msgid "Flagged comments" msgstr "Commenti contrassegnati" -#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:45 #: lib/web/templates/email/event_participation_approved.text.eex:7 +#, elixir-format msgid "Good news: one of the event organizers just approved your request. Update your calendar, because you're on the guest list now!" msgstr "" "Buone notizie: uno degli organizzatori dell'evento ha appena approvato la " "tua richiesta. Aggiorna il tuo calendario, perché ora sei nella lista degli " "invitati!" -#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:38 #: lib/web/templates/email/email_changed_new.text.eex:3 +#, elixir-format msgid "Hi there! It seems like you wanted to change the email address linked to your account on %{instance}. If you still wish to do so, please click the button below to confirm the change. You will then be able to log in to %{instance} with this new email address." msgstr "" "Ciao! Sembra che tu volessi modificare l'indirizzo email collegato al tuo " @@ -1032,16 +1032,16 @@ msgstr "" "pulsante in basso per confermare la modifica. Potrai quindi accedere a% " "{instance} con questo nuovo indirizzo email." -#, elixir-format #: lib/web/templates/email/email_changed_old.text.eex:3 +#, elixir-format msgid "Hi there! Just a quick note to confirm that the email address linked to your account on %{host} has been changed from this one to:" msgstr "" "Ciao! Solo una breve nota per confermare che l'indirizzo email collegato al " "tuo account su% {host} è stato cambiato da questo a:" +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" "Se non hai attivato tu stesso questa modifica, è probabile che qualcuno " @@ -1049,179 +1049,179 @@ msgstr "" "modifica immediatamente la password. Se non riesci ad accedere, contatta " "l'amministratore su% {host}." -#, elixir-format #: lib/web/templates/email/password_reset.text.eex:12 +#, elixir-format msgid "If you didn't trigger the change yourself, please ignore this message. Your password won't be changed until you click the link above." msgstr "" "Se non hai attivato tu stesso la modifica, ignora questo messaggio. La tua " "password non verrà modificata finché non fai clic sul collegamento sopra." -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:70 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:4 lib/web/templates/email/registration_confirmation.html.eex:45 +#, elixir-format msgid "If you didn't trigger this email, you may safely ignore it." msgstr "Se non hai attivato questa email, puoi tranquillamente ignorarla." -#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:63 #: lib/web/templates/email/before_event_notification.text.eex:6 +#, elixir-format msgid "If you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgstr "" "Se desideri annullare la tua partecipazione, visita la pagina dell'evento " "tramite il link in alto e fai clic sul pulsante «Partecipanti»." -#, elixir-format #: lib/web/templates/email/email.html.eex:143 #: lib/web/templates/email/email.text.eex:11 +#, elixir-format msgid "Learn more about Mobilizon here!" msgstr "Scopri di più su Mobilizon qui!" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:94 -msgid "Location" -msgstr "Luogo" - #, elixir-format +msgid "Location" +msgstr "Posizione" + #: lib/web/templates/email/event_updated.html.eex:104 +#, elixir-format msgid "Location address was removed" msgstr "L'indirizzo del luogo è stato rimosso" -#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:51 #: lib/web/templates/email/pending_participation_notification.text.eex:6 +#, elixir-format msgid "Manage pending requests" msgstr "Gestisci le richieste in sospeso" -#, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:13 #: lib/web/templates/email/registration_confirmation.text.eex:1 +#, elixir-format msgid "Nearly there!" msgstr "Ci sei quasi!" -#, elixir-format #: lib/web/templates/email/email_changed_old.html.eex:13 #: lib/web/templates/email/email_changed_old.text.eex:1 +#, elixir-format msgid "New email confirmation" msgstr "Conferma del nuovo indirizzo e-mail" -#, elixir-format #: lib/web/templates/email/report.html.eex:106 +#, elixir-format msgid "Reasons for report" msgstr "Ragioni della segnalazione" -#, elixir-format #: lib/web/templates/email/report.html.eex:39 +#, elixir-format msgid "Someone on %{instance} reported the following content for you to analyze:" msgstr "" "Qualcuno su % {instance} ha segnalato i seguenti contenuti da " "analizzare:" -#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:13 #: lib/web/templates/email/event_participation_rejected.text.eex:1 +#, elixir-format msgid "Sorry! You're not going." msgstr "Peccato! Non ci sei andato." -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:74 +#, elixir-format msgid "Start" msgstr "Inizio" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:18 +#, elixir-format msgid "Start %{begins_on}" msgstr "Inizio %{begins_on}" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:3 +#, elixir-format msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" "Ci sono stati cambiamenti in %{title}, così abbiamo pensato di fartelo " "sapere." -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:55 #: lib/web/templates/email/event_updated.text.eex:11 +#, elixir-format msgid "This event has been cancelled by its organizers. Sorry!" msgstr "Questo evento è stato annullato dai suoi organizzatori. Spiacente!" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:51 #: lib/web/templates/email/event_updated.text.eex:7 +#, elixir-format msgid "This event has been confirmed" msgstr "L'evento è stato confermato" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:53 #: lib/web/templates/email/event_updated.text.eex:9 +#, elixir-format msgid "This event has yet to be confirmed: organizers will let you know if they do confirm it." msgstr "" "Questo evento deve ancora essere confermato: gli organizzatori ti faranno " "sapere se lo confermano." -#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:45 #: lib/web/templates/email/event_participation_rejected.text.eex:7 +#, elixir-format msgid "Unfortunately, the organizers rejected your request." msgstr "" "Purtroppo gli organizzatori hanno rifiutato la tua domanda di partecipazione." -#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:51 +#, elixir-format msgid "Verify your email address" msgstr "Verifica il tuo indirizzo e-mail" -#, elixir-format #: lib/web/templates/email/report.html.eex:126 +#, elixir-format msgid "View report" msgstr "Visualizza la segnalazione" -#, elixir-format #: lib/web/templates/email/report.text.eex:24 +#, elixir-format msgid "View report:" msgstr "Visualizza la segnalazione:" -#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:58 #: lib/web/templates/email/event_participation_confirmed.html.eex:58 +#, elixir-format msgid "Visit event page" msgstr "Visualizza la pagina dell'evento" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:121 +#, elixir-format msgid "Visit the updated event page" msgstr "Visita la pagina dell'evento aggiornata" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:23 +#, elixir-format msgid "Visit the updated event page: %{link}" msgstr "Visita la pagina dell'evento aggiornata:% {link}" -#, elixir-format #: lib/web/templates/email/notification_each_week.html.eex:13 #: lib/web/templates/email/notification_each_week.text.eex:1 +#, elixir-format msgid "What's up this week?" msgstr "Che succede questa settimana?" -#, elixir-format #: lib/web/templates/email/on_day_notification.html.eex:13 #: lib/web/templates/email/on_day_notification.text.eex:1 +#, elixir-format msgid "What's up today?" msgstr "Cosa succede oggi?" -#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:70 #: lib/web/templates/email/event_participation_approved.text.eex:11 lib/web/templates/email/event_participation_confirmed.html.eex:70 #: lib/web/templates/email/event_participation_confirmed.text.eex:6 +#, elixir-format msgid "Would you wish to update or cancel your attendance, simply access the event page through the link above and click on the Attending button." msgstr "" "Desideri aggiornare o annullare la tua partecipazione, è sufficiente " "accedere alla pagina dell'evento tramite il link in alto e fare clic sul " "pulsante Partecipanti." -#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:64 #: lib/web/templates/email/pending_participation_notification.text.eex:8 +#, elixir-format msgid "You are receiving this email because you chose to get notifications for pending attendance requests to your events. You can disable or change your notification settings in your user account settings under « Notifications »." msgstr "" "Hai ricevuto questa email perché hai scelto di ricevere notifiche per " @@ -1229,130 +1229,130 @@ msgstr "" "disabilitare o modificare le impostazioni di notifica nelle impostazioni " "dell'account utente in «Notifiche»." -#, elixir-format #: lib/web/templates/email/event_participation_rejected.text.eex:5 +#, elixir-format msgid "You issued a request to attend %{title}." msgstr "Hai effettuato una domanda di partecipazione a %{title}." -#, elixir-format #: lib/web/templates/email/event_participation_approved.text.eex:5 #: lib/web/templates/email/event_participation_confirmed.text.eex:3 -msgid "You recently requested to attend %{title}." -msgstr "Di recente hai richiesto di partecipare a% {title}." - #, elixir-format +msgid "You recently requested to attend %{title}." +msgstr "Di recente hai richiesto di partecipare a %{title}." + #: lib/web/templates/email/event_participation_approved.html.eex:13 #: lib/web/templates/email/event_participation_confirmed.html.eex:13 lib/web/templates/email/event_participation_confirmed.text.eex:1 +#, elixir-format msgid "You're going!" msgstr "Ce l'hai fatta!" -#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:64 #: lib/web/templates/email/email_changed_new.text.eex:5 +#, elixir-format msgid "If you didn't trigger the change yourself, please ignore this message." msgstr "Se non hai attivato tu stesso la modifica, ignora questo messaggio." -#, elixir-format #: lib/web/templates/email/email.html.eex:89 +#, elixir-format msgid "Please do not use it for real purposes." msgstr " Si prega di non utilizzarlo per scopi reali. " -#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:45 #: lib/web/templates/email/group_member_removal.text.eex:5 +#, elixir-format msgid "If you feel this is an error, you may contact the group's administrators so that they can add you back." msgstr "" "Se ritieni che si tratti di un errore, puoi contattare gli amministratori " "del gruppo in modo che possano aggiungerti di nuovo." -#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:13 #: lib/web/templates/email/group_member_removal.text.eex:1 +#, elixir-format msgid "So long, and thanks for the fish!" msgstr "Addio, e grazie per il pesce!" -#, elixir-format #: lib/web/email/group.ex:63 +#, elixir-format msgid "You have been removed from group %{group}" msgstr "Sei stato rimosso dal gruppo %{group}" -#, elixir-format #: lib/web/templates/email/group_member_removal.text.eex:3 +#, elixir-format msgid "You have been removed from group %{group}. You will not be able to access this group's private content anymore." msgstr "" "Sei stato rimosso dal gruppo %{group}. Non potrai più accedere al contenuto " "privato di questo gruppo." -#, elixir-format #: lib/web/templates/email/group_invite.html.eex:38 +#, elixir-format msgid "%{inviter} just invited you to join their group %{link_start}%{group}%{link_end}" msgstr "" "%{inviter} ti ha appena invitato a partecipare al suo gruppo " "%{link_start}%{group}%{link_end}" -#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:38 +#, elixir-format msgid "You have been removed from group %{link_start}%{group}%{link_end}. You will not be able to access this group's private content anymore." msgstr "" "Sei stato rimosso dal gruppo %{link_start}%{group}%{link_end}. Non " "potrai più accedere al contenuto privato di questo gruppo." -#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:54 #: lib/web/templates/email/group_suspension.text.eex:7 +#, elixir-format msgid "As this group was located on another instance, it will continue to work for other instances than this one." msgstr "" "Poiché questo gruppo era posizionato su un'altra istanza, continuerà a " "funzionare per altre istanze tranne questa." -#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:46 #: lib/web/templates/email/group_suspension.text.eex:5 +#, elixir-format msgid "As this group was located on this instance, all of it's data has been irretrievably deleted." msgstr "" "Poiché questo gruppo si trovava su questa istanza, tutti i suoi dati sono " "stati irrimediabilmente cancellati." -#, elixir-format #: lib/web/templates/email/group_deletion.html.eex:38 #: lib/web/templates/email/group_deletion.text.eex:3 +#, elixir-format msgid "The administrator %{author} deleted group %{group}. All of the group's events, discussions, posts and todos have been deleted." msgstr "" "L'amministratore %{author} ha eliminato il gruppo %{group}. Tutti gli " "eventi, le discussioni, i post e gli impegni del gruppo sono stati eliminati." -#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:13 #: lib/web/templates/email/group_suspension.text.eex:1 +#, elixir-format msgid "The group %{group} has been suspended on %{instance}!" msgstr "Il gruppo %{group} è stato sospeso su %{instance}!" -#, elixir-format #: lib/web/templates/email/group_deletion.html.eex:13 #: lib/web/templates/email/group_deletion.text.eex:1 +#, elixir-format msgid "The group %{group} was deleted on %{instance}!" msgstr "Il gruppo %{group} è stato eliminato su %{instance}!" -#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:38 #: lib/web/templates/email/group_suspension.text.eex:3 +#, elixir-format msgid "Your instance's moderation team has decided to suspend %{group_name} (%{group_address}). You are no longer a member of this group." msgstr "" "Il team di moderazione della tua istanza ha deciso di sospendere " "%{group_name} (%{group_address}). Non sei più un membro di questo gruppo." -#, elixir-format #: lib/web/email/group.ex:136 +#, elixir-format msgid "The group %{group} has been deleted on %{instance}" msgstr "Il gruppo %{group} è stato eliminato su %{instance}" -#, elixir-format #: lib/web/email/group.ex:97 +#, elixir-format msgid "The group %{group} has been suspended on %{instance}" msgstr "Il gruppo %{group} è stato sospeso su %{instance}" -#, elixir-format #: lib/web/templates/api/terms.html.eex:24 +#, elixir-format msgctxt "terms" msgid "By accessing or using the Service, this means you agree to be bound by all the terms below. If these terms are in any way unclear, please let us know by contacting %{contact}." msgstr "" @@ -1360,8 +1360,8 @@ msgstr "" "termini sotto. Se questi non ti sono chiari a sufficienza, per favore " "faccelo sapere contattando %{contact}." -#, elixir-format #: lib/web/templates/api/terms.html.eex:40 +#, elixir-format msgctxt "terms" msgid "For information about how we collect and use information about users of the Service, please check our privacy policy." msgstr "" @@ -1369,22 +1369,22 @@ msgstr "" "utenti del Servizio, consultare la nostra politica " "sulla privacy." -#, elixir-format #: lib/web/templates/api/terms.html.eex:36 +#, elixir-format msgctxt "terms" msgid "If you continue to use the Service after the revised Terms go into effect, you accept the revised Terms." msgstr "" "Se continui a utilizzare il Servizio dopo l'entrata in vigore dei Termini " "modificati, accetti i Termini modificati." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:78 +#, elixir-format msgctxt "terms" msgid "If you delete this information, you need to login again." msgstr "Se elimini queste informazioni, devi accedere di nuovo." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:80 +#, elixir-format msgctxt "terms" msgid "If you're not connected, we don't store any information on your device, unless you participate in an event anonymously. In this specific case we store the hash of an unique identifier for the event and participation status in your browser so that we may display participation status. Deleting this information will only stop displaying participation status in your browser." msgstr "" @@ -1396,22 +1396,22 @@ msgstr "" "informazioni interromperà solo la visualizzazione dello stato di " "partecipazione nel tuo browser." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:87 +#, elixir-format msgctxt "terms" msgid "Note: This information is stored in your localStorage and not your cookies." msgstr "" "Nota: queste informazioni sono memorizzate nel tuo localStorage e non nei " "tuoi cookie." -#, elixir-format #: lib/web/templates/api/terms.html.eex:71 +#, elixir-format msgctxt "terms" msgid "Our responsibility" msgstr "La nostra responsabilità" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:61 +#, elixir-format msgctxt "terms" msgid "Retain server logs containing the IP address of all requests to this server, insofar as such logs are kept, no more than 90 days." msgstr "" @@ -1419,9 +1419,9 @@ msgstr "" "richieste a questo server, nella misura in cui tali registri vengono " "conservati, per non più di 90 giorni." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:3 #: lib/web/templates/api/terms.html.eex:15 +#, elixir-format msgctxt "terms" msgid "Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary to help you understand them better." msgstr "" @@ -1429,8 +1429,8 @@ msgstr "" "possono coprire concetti difficili da comprendere. Abbiamo fornito un glossario per aiutarti a capirli meglio." -#, elixir-format #: lib/web/templates/api/terms.html.eex:45 +#, elixir-format msgctxt "terms" msgid "We are not liable for any loss you may incur as a result of someone else using your email or password, either with or without your knowledge." msgstr "" @@ -1438,8 +1438,8 @@ msgstr "" "dell'utilizzo da parte di qualcun altro della tua email o password, con o " "senza la tua conoscenza." -#, elixir-format #: lib/web/templates/api/terms.html.eex:50 +#, elixir-format msgctxt "terms" msgid "We cannot be held responsible should a programming or administrative error make your content visible to a larger audience than intended. Aside from our limited right to your content, you retain all of your rights to the content you post, link and otherwise make available on or through the Service." msgstr "" @@ -1449,8 +1449,8 @@ msgstr "" "contenuto, mantieni tutti i tuoi diritti sul contenuto che pubblichi, " "colleghi e rendi disponibile in altro modo sul o tramite il Servizio." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:10 +#, elixir-format msgctxt "terms" msgid "We collect information from you when you register on this instance and gather data when you participate in the platform by reading, writing, and interacting with content shared here. If you register on this instance, you will be asked to enter an email address, a password (hashed) and at least an username. Your email address will be verified by an email containing a unique link. Once the link is activated, we know you control that email address. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly. You may however visit this instance without registering." msgstr "" @@ -1468,8 +1468,8 @@ msgstr "" "elencati pubblicamente. Puoi tuttavia visitare questa istanza senza " "registrarti." -#, elixir-format #: lib/web/templates/api/terms.html.eex:30 +#, elixir-format msgctxt "terms" msgid "We reserve the right to modify these Terms at any time. For instance, we may need to change these Terms if we come out with a new feature." msgstr "" @@ -1477,8 +1477,8 @@ msgstr "" "momento. Ad esempio, potrebbe essere necessario modificare questi Termini se " "pubblichiamo una nuova funzionalità." -#, elixir-format #: lib/web/templates/api/terms.html.eex:20 +#, elixir-format msgctxt "terms" msgid "When we say “we”, “our”, or “us” in this document, we are referring to the owners, operators and administrators of this Mobilizon instance. The Mobilizon software is provided by the team of Mobilizon contributors, supported by Framasoft, a French not-for-profit organization advocating for Free/Libre Software. Unless explicitly stated, this Mobilizon instance is an independent service using Mobilizon's source code. You may find more information about this instance on the \"About this instance\" page." msgstr "" @@ -1487,13 +1487,13 @@ msgstr "" "software Mobilizon è fornito dal team di collaboratori di Mobilizon, " "supportato da Framasoft, " "un'organizzazione francese senza scopo di lucro che sostiene il software " -"libero / libero. Se non diversamente specificato, questa istanza di " +"gratuito/libero. Se non diversamente specificato, questa istanza di " "Mobilizon è un servizio indipendente che utilizza il codice sorgente di " "Mobilizon. Puoi trovare ulteriori informazioni su questa istanza nella " "pagina \"Informazioni su questa istanza\"." -#, elixir-format #: lib/web/templates/api/terms.html.eex:43 +#, elixir-format msgctxt "terms" msgid "When you create an account you agree to maintain the security and confidentiality of your password and accept all risks of unauthorized access to your account data and any other information you provide to %{instance_name}." msgstr "" @@ -1502,8 +1502,8 @@ msgstr "" "dati del tuo account e a qualsiasi altra informazione che fornisci a " "%{instance_name}." -#, elixir-format #: lib/web/templates/api/terms.html.eex:49 +#, elixir-format msgctxt "terms" msgid "When you post, link or otherwise make available content to the Service, you grant us the right and license to display and distribute your content on or through the Service (including via applications). We may format your content for display throughout the Service, but we will not edit or revise the substance of your content itself. The displaying and distribution of your content happens only according to the visibility rules you have set for the content. We will not modify the visibility of the content you have set." msgstr "" @@ -1516,8 +1516,8 @@ msgstr "" "solo in base alle regole di visibilità che hai impostato per il contenuto. " "Non modificheremo la visibilità del contenuto che hai impostato." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:19 +#, elixir-format msgctxt "terms" msgid "Your events and comments are delivered to other instances that follow your own, meaning they are delivered to different instances and copies are stored there. When you delete events or comments, this is likewise delivered to these other instances. All interactions related to event features - such as joining an event - or group features - such as managing resources - are federated as well. Please keep in mind that the operators of the instance and any receiving instances may view such messages and information, and that recipients may screenshot, copy or otherwise re-share them." msgstr "" @@ -1531,8 +1531,8 @@ msgstr "" "istanza ricevente possono visualizzare tali messaggi e informazioni e che i " "destinatari possono fare screenshot, copiarli o ricondividerli in altro modo." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:99 +#, elixir-format msgctxt "terms" msgid "Your content may be downloaded by other instances in the network. Your public events and comments are delivered to the instances following your own instance. Content created through a group is forwarded to all the instances of all the members of the group, insofar as these members reside on a different instance than this one." msgstr "" @@ -1542,181 +1542,204 @@ msgstr "" "le istanze di tutti i membri del gruppo, nella misura in cui questi membri " "risiedono su un'istanza diversa da questa." -#, elixir-format #: lib/web/templates/email/event_participation_confirmed.text.eex:4 +#, elixir-format msgid "You have confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "" "Hai confermato la tua partecipazione. Aggiorna il tuo calendario, perché ora " "sei nella lista degli invitati!" -#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:38 #: lib/web/templates/email/event_participation_confirmed.html.eex:38 +#, elixir-format msgid "You recently requested to attend %{title}." msgstr "Eecentemente hai richiesto di partecipare %{title}." -#, elixir-format #: lib/web/email/participation.ex:91 +#, elixir-format msgid "Your participation to event %{title} has been confirmed" msgstr "La tua partecipazione all'evento %{title} è stata confermata" -#, elixir-format #: lib/web/templates/email/report.html.eex:41 +#, elixir-format msgid "%{reporter} reported the following content." msgstr "%{reporter} ha segnalato il seguente contenuto." -#, elixir-format #: lib/web/templates/email/report.text.eex:5 +#, elixir-format msgid "Group %{group} was reported" msgstr "Il gruppo %{group} è stato segnalato" -#, elixir-format #: lib/web/templates/email/report.html.eex:51 +#, elixir-format msgid "Group reported" msgstr "Gruppo segnalato" -#, elixir-format #: lib/web/templates/email/report.text.eex:7 +#, elixir-format msgid "Profile %{profile} was reported" msgstr "Il profilo %{profile} è stato segnalato" -#, elixir-format #: lib/web/templates/email/report.html.eex:56 +#, elixir-format msgid "Profile reported" msgstr "Profilo segnalato" -#, elixir-format #: lib/web/templates/email/event_participation_confirmed.html.eex:45 +#, elixir-format msgid "You have now confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "" "Hai ora confermato la tua partecipazione. Aggiorna il tuo calendario, perché " "ora sei nella lista degli invitati!" -#, elixir-format #: lib/mobilizon/posts/post.ex:94 +#, elixir-format msgid "A text is required for the post" msgstr "È richiesto un testo per il post" -#, elixir-format #: lib/mobilizon/posts/post.ex:93 +#, elixir-format msgid "A title is required for the post" msgstr "È richiesto un titolo per il post" -#, elixir-format #: lib/web/templates/email/instance_follow.text.eex:3 +#, elixir-format msgid "%{name} (%{domain}) just requested to follow your instance." msgstr "%{name} (%{domain}) ha appena richiesto di seguire la tua istanza." -#, elixir-format #: lib/web/email/follow.ex:54 +#, elixir-format msgid "%{name} requests to follow your instance" msgstr "%{name} richiede di seguire la tua istanza" -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:38 +#, elixir-format msgid "%{name} (%{domain}) just requested to follow your instance. If you accept, this instance will receive all of your instance's public events." msgstr "" "%{name} (%{domain}) ha appena richiesto di seguire la tua istanza. Se " "accetti, questa istanza riceverà tutti gli eventi pubblici della tua istanza." -#, elixir-format #: lib/web/templates/email/instance_follow.text.eex:4 +#, elixir-format msgid "If you accept, this instance will receive all of your public events." msgstr "Se accetti, questa istanza riceverà tutti i tuoi eventi pubblici." -#, elixir-format #: lib/web/email/follow.ex:48 +#, elixir-format msgid "Instance %{name} (%{domain}) requests to follow your instance" msgstr "L'istanza %{name} (%{domain}) richiede di seguire la tua istanza" -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:66 +#, elixir-format msgid "See the federation settings" msgstr "Vedi le impostazioni della federazione" -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:52 #: lib/web/templates/email/instance_follow.text.eex:6 +#, elixir-format msgid "To accept this invitation, head over to the instance's admin settings." msgstr "" "Per accettare questo invito, vai alle impostazioni di amministrazione " "dell'istanza." -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:13 #: lib/web/templates/email/instance_follow.text.eex:1 +#, elixir-format msgid "Want to connect?" msgstr "Vuoi connetterti?" -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:45 #: lib/web/templates/email/instance_follow.text.eex:5 +#, elixir-format msgid "Note: %{name} (%{domain}) following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too." msgstr "" "Nota: %{name} (%{domain}) che ti segue non implica necessariamente che segui " "questa istanza, ma puoi anche chiedere di seguirli." -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:38 +#, elixir-format msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" "Ciao! Ti sei appena registrato per partecipare a questo evento: « " "%{title} ». Conferma l'indirizzo e-mail che hai fornito:" -#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:38 +#, elixir-format msgid "You issued a request to attend %{title}." msgstr "Hai chiesto di partecipare %{title}." -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:64 +#, elixir-format msgid "Event title" msgstr "Titolo dell'evento" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:38 +#, elixir-format msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" "Sono state apportate modifiche a %{title}, quindi abbiamo pensato di " "informarti." -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "Il server Mobilizon sembra essere temporaneamente inattivo." - -#, elixir-format #: lib/web/templates/error/500_page.html.eex:7 +#, elixir-format msgid "This page is not correct" msgstr "Questa pagina non è corretta" +#: lib/web/templates/error/500_page.html.eex:50 #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 msgid "We're sorry, but something went wrong on our end." msgstr "Siamo spiacenti, ma qualcosa è andato storto da parte nostra." -#, elixir-format #: lib/web/templates/email/email.html.eex:88 #: lib/web/templates/email/email.text.eex:4 +#, elixir-format msgid "This is a demonstration site to test Mobilizon." -msgstr "Questo è un sito dimostrativo per testare Mobilizon." +msgstr "Questo è un sito di prova per testare Mobilizon." -#, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" -msgstr "" +msgstr "Flusso di %{name}" +#: lib/service/export/feed.ex:120 #, elixir-format -#: lib/service/export/feed.ex:77 msgid "%{actor}'s private events feed on %{instance}" -msgstr "" +msgstr "Flusso privato degli eventi di %{actor} su %{instance}" +#: lib/service/export/feed.ex:115 #, elixir-format -#: lib/service/export/feed.ex:72 msgid "%{actor}'s public events feed on %{instance}" -msgstr "" +msgstr "Flusso pubblico degli eventi di %{actor} su %{instance}" +#: lib/service/export/feed.ex:220 #, elixir-format -#: lib/service/export/feed.ex:203 msgid "Feed for %{email} on %{instance}" +msgstr "Flusso per %{email} su %{instance}" + +#: lib/web/templates/error/500_page.html.eex:57 +#, elixir-format +msgid "If the issue persists, you may contact the server administrator at %{contact}." msgstr "" +"Se il problema persiste contatta l'amministratore del server a %{contact}." + +#: lib/web/templates/error/500_page.html.eex:55 +#, elixir-format +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" +"Se il problema persiste puoi provare a contattare l'amministratore del " +"server." + +#: lib/web/templates/error/500_page.html.eex:68 +#, elixir-format +msgid "Technical details" +msgstr "Dettagli tecnici" + +#: lib/web/templates/error/500_page.html.eex:52 +#, elixir-format +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "Il server Mobilizon sembra essere temporaneamente inattivo." + +#: lib/service/export/feed.ex:73 +#, elixir-format +msgid "Public feed for %{instance}" +msgstr "Feed pubblico per %{instance}" diff --git a/priv/gettext/it/LC_MESSAGES/errors.po b/priv/gettext/it/LC_MESSAGES/errors.po index 454289aa1..80607dd9c 100644 --- a/priv/gettext/it/LC_MESSAGES/errors.po +++ b/priv/gettext/it/LC_MESSAGES/errors.po @@ -8,16 +8,17 @@ ## to merge POT files into PO files. msgid "" msgstr "" -"PO-Revision-Date: 2020-12-07 15:13+0000\n" -"Last-Translator: diorama \n" +"PO-Revision-Date: 2021-05-17 16:22+0000\n" +"Last-Translator: Leo Durruti \n" "Language-Team: Italian \n" "Language: it\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.1\n" +"X-Generator: Weblate 4.6\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "non può essere vuoto" @@ -93,761 +94,778 @@ msgstr "dev'essere maggiore o uguale di %{number}" msgid "must be equal to %{number}" msgstr "dev'essere uguale a %{number}" +#: lib/graphql/resolvers/user.ex:100 #, elixir-format -#: lib/graphql/resolvers/user.ex:103 msgid "Cannot refresh the token" msgstr "Il token non può essere aggiornato" +#: lib/graphql/resolvers/group.ex:206 #, elixir-format -#: lib/graphql/resolvers/group.ex:195 msgid "Current profile is not a member of this group" msgstr "Il profilo corrente non è membro di questo gruppo" +#: lib/graphql/resolvers/group.ex:210 #, elixir-format -#: lib/graphql/resolvers/group.ex:199 msgid "Current profile is not an administrator of the selected group" msgstr "Il profilo corrente non è amministratore del gruppo selezionato" +#: lib/graphql/resolvers/user.ex:501 #, elixir-format -#: lib/graphql/resolvers/user.ex:512 msgid "Error while saving user settings" msgstr "Errore nel salvare le preferenze utente" +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "Gruppo non trovato" +#: lib/graphql/resolvers/group.ex:68 #, elixir-format -#: lib/graphql/resolvers/group.ex:63 msgid "Group with ID %{id} not found" msgstr "Gruppo con ID %{id} non trovato" +#: lib/graphql/resolvers/user.ex:80 #, elixir-format -#: lib/graphql/resolvers/user.ex:83 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "Impossibile autenticarsi: email e/o password non validi." +#: lib/graphql/resolvers/group.ex:266 #, elixir-format -#: lib/graphql/resolvers/group.ex:255 msgid "Member not found" msgstr "Membro non trovato" -#, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 +#, elixir-format msgid "No profile found for the moderator user" msgstr "Nessun profilo trovato per l'utente moderatore" +#: lib/graphql/resolvers/user.ex:193 #, elixir-format -#: lib/graphql/resolvers/user.ex:195 msgid "No user to validate with this email was found" msgstr "Nessun utente da convalidare trovato con questa email" +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 msgid "No user with this email was found" msgstr "Nessun utente con questa email" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "L'utente autenticato non è propietario di questo profilo" +#: lib/graphql/resolvers/user.ex:123 #, elixir-format -#: lib/graphql/resolvers/user.ex:125 msgid "Registrations are not open" msgstr "Le registrazioni non sono aperte" +#: lib/graphql/resolvers/user.ex:331 #, elixir-format -#: lib/graphql/resolvers/user.ex:330 msgid "The current password is invalid" msgstr "la password corrente non è valida" +#: lib/graphql/resolvers/user.ex:376 #, elixir-format -#: lib/graphql/resolvers/user.ex:382 msgid "The new email doesn't seem to be valid" msgstr "La nuova email sembra non valida" +#: lib/graphql/resolvers/user.ex:373 #, elixir-format -#: lib/graphql/resolvers/user.ex:379 msgid "The new email must be different" msgstr "La nuova email dev'essere diversa" +#: lib/graphql/resolvers/user.ex:334 #, elixir-format -#: lib/graphql/resolvers/user.ex:333 msgid "The new password must be different" msgstr "La nuova password deve essere diversa" +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 msgid "The password provided is invalid" msgstr "La password assegnata non è valida" +#: lib/graphql/resolvers/user.ex:338 #, elixir-format -#: lib/graphql/resolvers/user.ex:337 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "la password scelta è troppo corta, deve avere almeno 6 caratteri." +#: lib/graphql/resolvers/user.ex:214 #, elixir-format -#: lib/graphql/resolvers/user.ex:215 msgid "This user can't reset their password" msgstr "Questo utente non può resettare la password" +#: lib/graphql/resolvers/user.ex:76 #, elixir-format -#: lib/graphql/resolvers/user.ex:79 msgid "This user has been disabled" msgstr "L'utente è stato disabilitato" +#: lib/graphql/resolvers/user.ex:177 #, elixir-format -#: lib/graphql/resolvers/user.ex:179 msgid "Unable to validate user" msgstr "Impossibile convalidare l'utente" +#: lib/graphql/resolvers/user.ex:409 #, elixir-format -#: lib/graphql/resolvers/user.ex:420 msgid "User already disabled" msgstr "Utente già disabilitato" +#: lib/graphql/resolvers/user.ex:476 #, elixir-format -#: lib/graphql/resolvers/user.ex:487 msgid "User requested is not logged-in" msgstr "L'utente richiesto non è loggato" +#: lib/graphql/resolvers/group.ex:240 #, elixir-format -#: lib/graphql/resolvers/group.ex:229 msgid "You are already a member of this group" msgstr "Sei già un membro di questo gruppo" +#: lib/graphql/resolvers/group.ex:273 #, elixir-format -#: lib/graphql/resolvers/group.ex:262 msgid "You can't leave this group because you are the only administrator" msgstr "Non puoi lasciare questo gruppo perchè sei l'unico amministratore" +#: lib/graphql/resolvers/group.ex:237 #, elixir-format -#: lib/graphql/resolvers/group.ex:226 msgid "You cannot join this group" msgstr "Non puoi unirti a questo gruppo" +#: lib/graphql/resolvers/group.ex:96 #, elixir-format -#: lib/graphql/resolvers/group.ex:91 msgid "You may not list groups unless moderator." msgstr "Non è possibile elencare i gruppi a meno che non sia un moderatore." +#: lib/graphql/resolvers/user.ex:381 #, elixir-format -#: lib/graphql/resolvers/user.ex:387 msgid "You need to be logged-in to change your email" msgstr "È necessario effettuare il login per modificare la tua email" +#: lib/graphql/resolvers/user.ex:346 #, elixir-format -#: lib/graphql/resolvers/user.ex:345 msgid "You need to be logged-in to change your password" msgstr "È necessario effettuare il login per modificare la tua password" +#: lib/graphql/resolvers/group.ex:215 #, elixir-format -#: lib/graphql/resolvers/group.ex:204 msgid "You need to be logged-in to delete a group" msgstr "È necessario effettuare il login per eliminare un gruppo" +#: lib/graphql/resolvers/user.ex:436 #, elixir-format -#: lib/graphql/resolvers/user.ex:447 msgid "You need to be logged-in to delete your account" msgstr "È necessario effettuare il login per eliminare il tuo account" +#: lib/graphql/resolvers/group.ex:245 #, elixir-format -#: lib/graphql/resolvers/group.ex:234 msgid "You need to be logged-in to join a group" msgstr "È necessario effettuare il login per entrare a far parte di un gruppo" +#: lib/graphql/resolvers/group.ex:278 #, elixir-format -#: lib/graphql/resolvers/group.ex:267 msgid "You need to be logged-in to leave a group" msgstr "È necessario effettuare il login per lasciare un gruppo" +#: lib/graphql/resolvers/group.ex:180 #, elixir-format -#: lib/graphql/resolvers/group.ex:169 msgid "You need to be logged-in to update a group" msgstr "È necessario effettuare il login per aggiornare un gruppo" +#: lib/graphql/resolvers/user.ex:105 #, elixir-format -#: lib/graphql/resolvers/user.ex:108 msgid "You need to have an existing token to get a refresh token" msgstr "" "È necessario disporre di un token esistente per ottenere un token di " "aggiornamento" +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 msgid "You requested again a confirmation email too soon" msgstr "Hai richiesto di nuovo un'e-mail di conferma troppo presto" +#: lib/graphql/resolvers/user.ex:126 #, elixir-format -#: lib/graphql/resolvers/user.ex:128 msgid "Your email is not on the allowlist" msgstr "La tua mail non è nella lista delle autorizzazioni" -#, elixir-format #: lib/graphql/resolvers/actor.ex:64 lib/graphql/resolvers/actor.ex:94 +#, elixir-format msgid "Error while performing background task" msgstr "Errore nell'eseguire un processo in background" -#, elixir-format #: lib/graphql/resolvers/actor.ex:27 +#, elixir-format msgid "No profile found with this ID" msgstr "Nessun profilo trovato con questo ID" -#, elixir-format #: lib/graphql/resolvers/actor.ex:54 lib/graphql/resolvers/actor.ex:91 +#, elixir-format msgid "No remote profile found with this ID" msgstr "Nessun profilo remoto trovato con questo ID" -#, elixir-format #: lib/graphql/resolvers/actor.ex:69 +#, elixir-format msgid "Only moderators and administrators can suspend a profile" msgstr "Solo i moderatori e gli amministratori possono sospendere un profilo" -#, elixir-format #: lib/graphql/resolvers/actor.ex:99 +#, elixir-format msgid "Only moderators and administrators can unsuspend a profile" msgstr "Solo i moderatori e gli amministratori possono riattivare un profilo" -#, elixir-format #: lib/graphql/resolvers/actor.ex:24 +#, elixir-format msgid "Only remote profiles may be refreshed" msgstr "È possibile aggiornare solo i profili remoti" -#, elixir-format #: lib/graphql/resolvers/actor.ex:61 +#, elixir-format msgid "Profile already suspended" msgstr "Profilo già sospeso" -#, elixir-format #: lib/graphql/resolvers/participant.ex:92 +#, elixir-format msgid "A valid email is required by your instance" msgstr "Un'email valida è richiesta dalla vostra istanza" -#, elixir-format #: lib/graphql/resolvers/participant.ex:86 +#, elixir-format msgid "Anonymous participation is not enabled" msgstr "La partecipazione anonima non è abilitata" +#: lib/graphql/resolvers/person.ex:196 #, elixir-format -#: lib/graphql/resolvers/person.ex:192 msgid "Cannot remove the last administrator of a group" msgstr "Impossibile rimuovere l'ultimo amministratore di un gruppo" +#: lib/graphql/resolvers/person.ex:193 #, elixir-format -#: lib/graphql/resolvers/person.ex:189 msgid "Cannot remove the last identity of a user" msgstr "Impossibile rimuovere l'ultima identità di un utente" +#: lib/graphql/resolvers/comment.ex:108 #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 msgid "Comment is already deleted" msgstr "Commento già cancellato" +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "Discussione non trovata" -#, elixir-format #: lib/graphql/resolvers/report.ex:58 lib/graphql/resolvers/report.ex:77 +#, elixir-format msgid "Error while saving report" msgstr "Errore nel salvare la segnalazione" -#, elixir-format #: lib/graphql/resolvers/report.ex:96 +#, elixir-format msgid "Error while updating report" msgstr "Errore durante l'aggiornamento del rapporto" -#, elixir-format #: lib/graphql/resolvers/participant.ex:127 +#, elixir-format msgid "Event id not found" msgstr "ID evento non trovato" +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 msgid "Event not found" msgstr "Evento non trovato" -#, elixir-format #: lib/graphql/resolvers/participant.ex:83 #: lib/graphql/resolvers/participant.ex:124 lib/graphql/resolvers/participant.ex:156 +#, elixir-format msgid "Event with this ID %{id} doesn't exist" msgstr "L'evento con questo ID %{id} non esiste" -#, elixir-format #: lib/graphql/resolvers/participant.ex:99 +#, elixir-format msgid "Internal Error" msgstr "Errore Interno" +#: lib/graphql/resolvers/discussion.ex:202 #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 msgid "No discussion with ID %{id}" msgstr "Nessuna discussione con l'ID %{id}" -#, elixir-format #: lib/graphql/resolvers/todos.ex:78 lib/graphql/resolvers/todos.ex:168 +#, elixir-format msgid "No profile found for user" msgstr "Nessuno profilo trovato per l'utente" +#: lib/graphql/resolvers/feed_token.ex:64 #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 msgid "No such feed token" msgstr "Nessun token di rifornimento corrispondente" -#, elixir-format #: lib/graphql/resolvers/participant.ex:237 +#, elixir-format msgid "Participant already has role %{role}" msgstr "Il partecipante ha già il ruolo %{role}" -#, elixir-format #: lib/graphql/resolvers/participant.ex:169 #: lib/graphql/resolvers/participant.ex:198 lib/graphql/resolvers/participant.ex:230 #: lib/graphql/resolvers/participant.ex:240 +#, elixir-format msgid "Participant not found" msgstr "Partecipante non trovato" +#: lib/graphql/resolvers/person.ex:30 #, elixir-format -#: lib/graphql/resolvers/person.ex:29 msgid "Person with ID %{id} not found" msgstr "La persona con l'ID %{id} non è stata trovata" +#: lib/graphql/resolvers/person.ex:52 #, elixir-format -#: lib/graphql/resolvers/person.ex:51 msgid "Person with username %{username} not found" msgstr "La persona con il nome utente %{username} non è stata trovata" -#, elixir-format #: lib/graphql/resolvers/post.ex:167 lib/graphql/resolvers/post.ex:200 +#, elixir-format msgid "Post ID is not a valid ID" msgstr "L'ID del post non è un ID valido" -#, elixir-format #: lib/graphql/resolvers/post.ex:170 lib/graphql/resolvers/post.ex:203 +#, elixir-format msgid "Post doesn't exist" msgstr "Il post non esiste" -#, elixir-format #: lib/graphql/resolvers/member.ex:83 +#, elixir-format msgid "Profile invited doesn't exist" msgstr "Il profilo invitato non esiste" -#, elixir-format #: lib/graphql/resolvers/member.ex:92 lib/graphql/resolvers/member.ex:96 +#, elixir-format msgid "Profile is already a member of this group" msgstr "Il profilo è già un membro diquesto gruppo" -#, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 +#, elixir-format msgid "Profile is not member of group" msgstr "Il profilo non è membro del gruppo" +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 msgid "Profile not found" msgstr "Profilo non trovato" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" -"Il profilo del moderatore fornito non dispone dell'autorizzazione per questo " -"evento" - -#, elixir-format #: lib/graphql/resolvers/report.ex:36 +#, elixir-format +#, elixir-format msgid "Report not found" msgstr "Segnalazione non trovata" +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 msgid "Resource doesn't exist" msgstr "La risorsa non esiste" -#, elixir-format #: lib/graphql/resolvers/participant.ex:120 +#, elixir-format msgid "The event has already reached its maximum capacity" msgstr "L'evento ha già raggiunto la sua massima capacità" -#, elixir-format #: lib/graphql/resolvers/participant.ex:260 +#, elixir-format msgid "This token is invalid" msgstr "Questo token non è valido" -#, elixir-format #: lib/graphql/resolvers/todos.ex:165 lib/graphql/resolvers/todos.ex:219 +#, elixir-format msgid "Todo doesn't exist" msgstr "L'elemento to-do non esiste" -#, elixir-format #: lib/graphql/resolvers/todos.ex:75 lib/graphql/resolvers/todos.ex:191 #: lib/graphql/resolvers/todos.ex:216 +#, elixir-format msgid "Todo list doesn't exist" msgstr "la lista non esiste" +#: lib/graphql/resolvers/feed_token.ex:73 #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 msgid "Token does not exist" msgstr "Il token non esiste" +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 msgid "Token is not a valid UUID" msgstr "Il token non è un UUID valido" +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 msgid "User not found" msgstr "Utente non trovato" +#: lib/graphql/resolvers/person.ex:257 #, elixir-format -#: lib/graphql/resolvers/person.ex:252 msgid "You already have a profile for this user" msgstr "Hai già un profilo per questo utente" -#, elixir-format #: lib/graphql/resolvers/participant.ex:130 +#, elixir-format msgid "You are already a participant of this event" msgstr "Se già un partecipante di questo evento" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "Non sei membro del gruppo a cui la discussione appartiene" - -#, elixir-format #: lib/graphql/resolvers/member.ex:86 +#, elixir-format msgid "You are not a member of this group" msgstr "Non sei un membro di questo gruppo" +#: lib/graphql/resolvers/member.ex:149 #, elixir-format -#: lib/graphql/resolvers/member.ex:151 msgid "You are not a moderator or admin for this group" msgstr "Non sei un moderatore o amministratore di questo gruppo" +#: lib/graphql/resolvers/comment.ex:54 #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 msgid "You are not allowed to create a comment if not connected" msgstr "Non è consentito creare un commento se non si è collegati" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:41 +#, elixir-format msgid "You are not allowed to create a feed token if not connected" msgstr "Non puoi creare un token di rifornimento senza connessione" +#: lib/graphql/resolvers/comment.ex:113 #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 msgid "You are not allowed to delete a comment if not connected" msgstr "Non è consentito eliminare un commento se non si è collegati" +#: lib/graphql/resolvers/feed_token.ex:82 #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 msgid "You are not allowed to delete a feed token if not connected" msgstr "Non puoi eliminare un token di rifornimento senza connettersi" +#: lib/graphql/resolvers/comment.ex:76 #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 msgid "You are not allowed to update a comment if not connected" msgstr "Non è consentito aggiornare un commento se non si è collegati" -#, elixir-format #: lib/graphql/resolvers/participant.ex:163 #: lib/graphql/resolvers/participant.ex:192 +#, elixir-format msgid "You can't leave event because you're the only event creator participant" msgstr "" "Non puoi lasciare l'evento perchè sei l'unico partecipante creatore di eventi" +#: lib/graphql/resolvers/member.ex:153 #, elixir-format -#: lib/graphql/resolvers/member.ex:155 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" "Non puoi impostare te stesso per un ruolo di membro inferiore per questo " "gruppo perché sei l'unico amministratore" +#: lib/graphql/resolvers/comment.ex:104 #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 msgid "You cannot delete this comment" msgstr "Non puoi eliminare questo commento" +#: lib/graphql/resolvers/event.ex:321 #, elixir-format -#: lib/graphql/resolvers/event.ex:276 msgid "You cannot delete this event" msgstr "Non puoi eliminare questo evento" -#, elixir-format #: lib/graphql/resolvers/member.ex:89 +#, elixir-format msgid "You cannot invite to this group" msgstr "Non puoi invitare in questo gruppo" +#: lib/graphql/resolvers/feed_token.ex:76 #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 msgid "You don't have permission to delete this token" msgstr "Non hai il permesso di cancellare questo token" +#: lib/graphql/resolvers/admin.ex:53 #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 msgid "You need to be logged-in and a moderator to list action logs" msgstr "Devi essere connesso e un moderatore per elencare i log delle azioni" -#, elixir-format #: lib/graphql/resolvers/report.ex:26 +#, elixir-format msgid "You need to be logged-in and a moderator to list reports" msgstr "Devi essere connesso e un moderatore per elencare i rapporti" -#, elixir-format #: lib/graphql/resolvers/report.ex:101 +#, elixir-format msgid "You need to be logged-in and a moderator to update a report" msgstr "Devi essere connesso e un moderatore per aggiornare un rapporto" -#, elixir-format #: lib/graphql/resolvers/report.ex:41 +#, elixir-format msgid "You need to be logged-in and a moderator to view a report" msgstr "Devi essere connesso e un moderatore per visualizzare un rapporto" +#: lib/graphql/resolvers/admin.ex:237 #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" "Devi essere connesso e un moderatore per accedere alle opzioni " "dell'amministratore" +#: lib/graphql/resolvers/admin.ex:222 #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" "Devi essere connesso e un moderatore per accedere alle statistiche del " "dashboard" +#: lib/graphql/resolvers/admin.ex:261 #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" "Devi essere connesso e un moderatore per salvare le impostazioni " "dell'amministratore" +#: lib/graphql/resolvers/discussion.ex:77 #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 msgid "You need to be logged-in to access discussions" msgstr "Devi essere connesso per accedere alle discussioni" +#: lib/graphql/resolvers/resource.ex:94 #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 msgid "You need to be logged-in to access resources" msgstr "Devi essere connesso per accedere alle risorse" +#: lib/graphql/resolvers/event.ex:256 #, elixir-format -#: lib/graphql/resolvers/event.ex:211 msgid "You need to be logged-in to create events" msgstr "Devi essere connesso per creare eventi" -#, elixir-format #: lib/graphql/resolvers/post.ex:140 +#, elixir-format msgid "You need to be logged-in to create posts" msgstr "Devi essere connesso per creare dei post" -#, elixir-format #: lib/graphql/resolvers/report.ex:74 +#, elixir-format msgid "You need to be logged-in to create reports" msgstr "Devi essere connesso per creare rapporti" +#: lib/graphql/resolvers/resource.ex:133 #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 msgid "You need to be logged-in to create resources" msgstr "Devi essere connesso per creare risorse" +#: lib/graphql/resolvers/event.ex:330 #, elixir-format -#: lib/graphql/resolvers/event.ex:285 msgid "You need to be logged-in to delete an event" msgstr "Devi essere connesso per eliminare un evento" -#, elixir-format #: lib/graphql/resolvers/post.ex:211 +#, elixir-format msgid "You need to be logged-in to delete posts" msgstr "Devi essere connesso per eliminare dei post" +#: lib/graphql/resolvers/resource.ex:191 #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 msgid "You need to be logged-in to delete resources" msgstr "Devi essere connesso per eliminare risorse" -#, elixir-format #: lib/graphql/resolvers/participant.ex:104 +#, elixir-format msgid "You need to be logged-in to join an event" msgstr "Devi essere connesso per partecipare a un evento" -#, elixir-format #: lib/graphql/resolvers/participant.ex:203 +#, elixir-format msgid "You need to be logged-in to leave an event" msgstr "Devi essere connesso per lasciare un evento" +#: lib/graphql/resolvers/event.ex:295 #, elixir-format -#: lib/graphql/resolvers/event.ex:250 msgid "You need to be logged-in to update an event" msgstr "Devi essere connesso per aggiornare un evento" -#, elixir-format #: lib/graphql/resolvers/post.ex:178 +#, elixir-format msgid "You need to be logged-in to update posts" msgstr "Devi essere connesso per aggiornare dei post" +#: lib/graphql/resolvers/resource.ex:162 #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 msgid "You need to be logged-in to update resources" msgstr "Devi essere connesso per aggiornare le risorse" +#: lib/graphql/resolvers/resource.ex:218 #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 msgid "You need to be logged-in to view a resource preview" msgstr "Devi essere connesso per visualizzare l'anteprima di una risorsa" +#: lib/graphql/resolvers/resource.ex:125 #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 msgid "Parent resource doesn't belong to this group" msgstr "La risorsa principale non appartiene a questo gruppo" -#, elixir-format #: lib/mobilizon/users/user.ex:109 +#, elixir-format msgid "The chosen password is too short." msgstr "La password scelta è troppo corta." -#, elixir-format #: lib/mobilizon/users/user.ex:138 +#, elixir-format msgid "The registration token is already in use, this looks like an issue on our side." msgstr "" "Il token di registrazione è già in uso, questo sembra un problema dalla " "nostra parte." -#, elixir-format #: lib/mobilizon/users/user.ex:104 +#, elixir-format msgid "This email is already used." msgstr "Questa email è già in uso." -#, elixir-format #: lib/graphql/error.ex:88 +#, elixir-format msgid "Post not found" msgstr "Post non trovato" -#, elixir-format #: lib/graphql/error.ex:75 +#, elixir-format msgid "Invalid arguments passed" msgstr "Sono stati trasmessi argomenti non validi" -#, elixir-format #: lib/graphql/error.ex:81 +#, elixir-format msgid "Invalid credentials" msgstr "Credenziali non valide" -#, elixir-format #: lib/graphql/error.ex:79 +#, elixir-format msgid "Reset your password to login" msgstr "Reimposta la tua password per connetterti" -#, elixir-format #: lib/graphql/error.ex:86 lib/graphql/error.ex:91 +#, elixir-format msgid "Resource not found" msgstr "Segnalazione non trovata" +#: lib/graphql/error.ex:93 #, elixir-format -#: lib/graphql/error.ex:92 msgid "Something went wrong" msgstr "Qualcosa è andato storto" -#, elixir-format #: lib/graphql/error.ex:74 +#, elixir-format msgid "Unknown Resource" msgstr "Risorsa sconosciuta" -#, elixir-format #: lib/graphql/error.ex:84 +#, elixir-format msgid "You don't have permission to do this" msgstr "Non hai il permesso di farlo" -#, elixir-format #: lib/graphql/error.ex:76 +#, elixir-format msgid "You need to be logged in" msgstr "Devi essere connesso" +#: lib/graphql/resolvers/member.ex:114 #, elixir-format -#: lib/graphql/resolvers/member.ex:116 msgid "You can't accept this invitation with this profile." msgstr "Non puoi accettare l'invito con questo profilo." +#: lib/graphql/resolvers/member.ex:132 #, elixir-format -#: lib/graphql/resolvers/member.ex:134 msgid "You can't reject this invitation with this profile." msgstr "Non puoi rifiutare l'invito con questo profilo." -#, elixir-format #: lib/graphql/resolvers/media.ex:62 +#, elixir-format msgid "File doesn't have an allowed MIME type." msgstr "Il file non ha un tipo MIME consentito." +#: lib/graphql/resolvers/group.ex:175 #, elixir-format -#: lib/graphql/resolvers/group.ex:164 msgid "Profile is not administrator for the group" msgstr "Il profilo non è amministratore del gruppo" +#: lib/graphql/resolvers/event.ex:284 #, elixir-format -#: lib/graphql/resolvers/event.ex:239 msgid "You can't edit this event." msgstr "Non puoi modificare questo evento." +#: lib/graphql/resolvers/event.ex:287 #, elixir-format -#: lib/graphql/resolvers/event.ex:242 msgid "You can't attribute this event to this profile." msgstr "Non puo iattribuire questo evento a questo profilo." +#: lib/graphql/resolvers/member.ex:135 #, elixir-format -#: lib/graphql/resolvers/member.ex:137 msgid "This invitation doesn't exist." msgstr "Questo invito non esiste." +#: lib/graphql/resolvers/member.ex:177 #, elixir-format -#: lib/graphql/resolvers/member.ex:179 msgid "This member already has been rejected." msgstr "Questo memebro è già stato rifiutato." +#: lib/graphql/resolvers/member.ex:184 #, elixir-format -#: lib/graphql/resolvers/member.ex:186 msgid "You don't have the right to remove this member." msgstr "Non hai il diritto di rimuovere questo membro." -#, elixir-format #: lib/mobilizon/actors/actor.ex:351 +#, elixir-format msgid "This username is already taken." msgstr "Questo nome utente è già in uso." +#: lib/graphql/resolvers/discussion.ex:74 #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" "Devi fornire un ID o la stringa utente (ad es. utente@mobilizon.sm) " "per accedere ad una discussione" +#: lib/graphql/resolvers/event.ex:245 #, elixir-format -#: lib/graphql/resolvers/event.ex:200 msgid "Organizer profile is not owned by the user" msgstr "Il profilo dell'organizzatore non è di proprietà dell'utente" -#, elixir-format #: lib/graphql/resolvers/participant.ex:89 +#, elixir-format msgid "Profile ID provided is not the anonymous profile one" msgstr "L'ID profilo fornito non è quello del profilo anonimo" +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 msgid "The provided picture is too heavy" +msgstr "L'immagine inserita è troppo pesante" + +#: lib/web/views/utils.ex:33 +#, elixir-format +msgid "Index file not found. You need to recompile the front-end." +msgstr "Il file di indice non è stato trovato. Devi ricompilare il front-end." + +#: lib/graphql/resolvers/resource.ex:122 +#, elixir-format +#, elixir-format +msgid "Error while creating resource" +msgstr "Errore durante la creazione della risorsa" + +#: lib/graphql/resolvers/user.ex:390 +#, elixir-format +msgid "Invalid activation token" +msgstr "Token di attivazione non valido" + +#: lib/graphql/resolvers/resource.ex:208 +#, elixir-format +msgid "Unable to fetch resource details from this URL." +msgstr "Impossibile recuperare i dettagli della risorsa da questa URL." + +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +#, elixir-format +msgid "Provided profile doesn't have moderator permissions on this event" msgstr "" +"Il profilo del moderatore fornito non dispone dell'autorizzazione per questo " +"evento" diff --git a/priv/gettext/ja/LC_MESSAGES/default.po b/priv/gettext/ja/LC_MESSAGES/default.po index ebf788dcc..9ef615c0c 100644 --- a/priv/gettext/ja/LC_MESSAGES/default.po +++ b/priv/gettext/ja/LC_MESSAGES/default.po @@ -832,8 +832,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1338,18 +1338,13 @@ msgstr "イベント" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1361,20 +1356,46 @@ msgstr "" #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/ja/LC_MESSAGES/errors.po b/priv/gettext/ja/LC_MESSAGES/errors.po index edd3241c0..a9fd66f74 100644 --- a/priv/gettext/ja/LC_MESSAGES/errors.po +++ b/priv/gettext/ja/LC_MESSAGES/errors.po @@ -11,6 +11,7 @@ msgstr "" "Language: ja\n" "Plural-Forms: nplurals=1\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "" @@ -81,198 +82,199 @@ msgid "must be equal to %{number}" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "" @@ -322,22 +324,22 @@ msgid "Anonymous participation is not enabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "" @@ -357,8 +359,8 @@ msgid "Event id not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "" @@ -374,7 +376,7 @@ msgid "Internal Error" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "" @@ -384,7 +386,7 @@ msgid "No profile found for user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "" @@ -401,12 +403,12 @@ msgid "Participant not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "" @@ -432,30 +434,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -481,22 +478,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -505,23 +502,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -531,17 +523,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -552,17 +544,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -572,12 +564,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -597,32 +589,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -637,12 +629,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -652,7 +644,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -667,7 +659,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -677,17 +669,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -732,7 +724,7 @@ msgid "Resource not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -752,12 +744,12 @@ msgid "You need to be logged in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -767,32 +759,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -802,12 +794,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -817,7 +809,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/gettext/nl/LC_MESSAGES/default.po b/priv/gettext/nl/LC_MESSAGES/default.po index aa6dc53ea..562e6e680 100644 --- a/priv/gettext/nl/LC_MESSAGES/default.po +++ b/priv/gettext/nl/LC_MESSAGES/default.po @@ -854,8 +854,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1363,18 +1363,13 @@ msgstr "Evenement" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1386,20 +1381,46 @@ msgstr "Dit is een demosite om de bètaversie van Mobilizon te testen." #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/nl/LC_MESSAGES/errors.po b/priv/gettext/nl/LC_MESSAGES/errors.po index 5d519a16d..bdb41f567 100644 --- a/priv/gettext/nl/LC_MESSAGES/errors.po +++ b/priv/gettext/nl/LC_MESSAGES/errors.po @@ -11,6 +11,7 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "" @@ -87,198 +88,199 @@ msgid "must be equal to %{number}" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "" @@ -328,22 +330,22 @@ msgid "Anonymous participation is not enabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "" @@ -363,8 +365,8 @@ msgid "Event id not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "" @@ -380,7 +382,7 @@ msgid "Internal Error" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "" @@ -390,7 +392,7 @@ msgid "No profile found for user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "" @@ -407,12 +409,12 @@ msgid "Participant not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "" @@ -438,30 +440,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -487,22 +484,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -511,23 +508,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -537,17 +529,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -558,17 +550,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -578,12 +570,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -603,32 +595,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -643,12 +635,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -658,7 +650,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -673,7 +665,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -683,17 +675,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -738,7 +730,7 @@ msgid "Resource not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -758,12 +750,12 @@ msgid "You need to be logged in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -773,32 +765,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -808,12 +800,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -823,7 +815,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/gettext/nn/LC_MESSAGES/default.po b/priv/gettext/nn/LC_MESSAGES/default.po index 15e916662..9c5c62c2c 100644 --- a/priv/gettext/nn/LC_MESSAGES/default.po +++ b/priv/gettext/nn/LC_MESSAGES/default.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-11-02 22:03+0000\n" -"PO-Revision-Date: 2020-11-14 11:53+0000\n" +"PO-Revision-Date: 2021-04-14 19:15+0000\n" "Last-Translator: Eivind Ødegård \n" "Language-Team: Norwegian Nynorsk \n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.1\n" +"X-Generator: Weblate 4.5.1\n" #, elixir-format #: lib/web/templates/email/password_reset.html.eex:48 @@ -1009,8 +1009,8 @@ msgstr "" "på %{host} er endra frå denne til:" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" "Viss du ikkje gjorde denne endringa sjølv, er det sannsynleg at nokon har " @@ -1636,18 +1636,13 @@ msgstr "Namn på hendinga" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "%{title} har vorte endra, så me tenkte du ville vita det." -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "Mobilizon-tenaren ser ut til å vera nede i augeblinken." - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "Denne sida er feil" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "Orsak, det skjedde noko feil hjå oss." @@ -1659,20 +1654,49 @@ msgstr "Dette er ei demoside for å prøva ut Mobilizon." #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" -msgstr "" +msgstr "Straumen til %{name}" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" -msgstr "" +msgstr "Den private hendingsstraumen til %{actor} på %{instance}" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" -msgstr "" +msgstr "Den offentlege hendingsstraumen til %{actor} på %{instance}" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" +msgstr "Straum for %{email} på %{instance}" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" +"Viss feilen held fram, kan du kontakta styraren for denne tenaren på " +"%{contact}." + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" +"Viss feilen held fram, kan du prøva å kontakta styraren på denne tenaren." + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "Tekniske opplysingar" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "Mobilizon-tenaren ser ut til å vera nede i augeblinken." + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" msgstr "" diff --git a/priv/gettext/nn/LC_MESSAGES/errors.po b/priv/gettext/nn/LC_MESSAGES/errors.po index e67e84b84..4cb5e014c 100644 --- a/priv/gettext/nn/LC_MESSAGES/errors.po +++ b/priv/gettext/nn/LC_MESSAGES/errors.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-11-14 11:02+0000\n" -"PO-Revision-Date: 2020-12-09 08:52+0000\n" +"PO-Revision-Date: 2021-04-14 19:15+0000\n" "Last-Translator: Eivind Ødegård \n" "Language-Team: Norwegian Nynorsk \n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.1\n" +"X-Generator: Weblate 4.5.1\n" ## This file is a PO Template file. ## @@ -24,6 +24,7 @@ msgstr "" ## date. Leave `msgstr`s empty as changing them here as no ## effect: edit them in PO (`.po`) files instead. ## From Ecto.Changeset.cast/4 +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "kan ikkje vera tom" @@ -110,198 +111,199 @@ msgid "must be equal to %{number}" msgstr "må vera lik %{number}" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "Kan ikkje fornya teiknet" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "Denne brukaren er ikkje medlem av gruppa" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "Denne brukaren er ikkje styrar av gruppa" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "Greidde ikkje lagra brukarinnstillingane" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "Fann ikkje gruppa" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "Fann ikkje gruppa med ID %{id}" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "Greier ikkje å logga inn. Epostadressa eller passordet ditt er feil." #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "Fann ikkje medlemen" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "Fann ingen profil for moderator-brukaren" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "Fann ingen brukar med denne eposten å godkjenna" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "Fann ingen brukar med denne eposten" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "Ingen godkjent brukar eig denne profilen" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "Det er ikkje opna for å registrera seg" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "Dette passordet er ugyldig" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "Den nye epostadressa ser ut til å vera feil" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "Den nye epostadressa må vera annleis" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "Det nye passordet må vera annleis" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "Dette passordet er ugyldig" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "Dette passordet er for kort. Passord må ha minst 6 teikn." #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "Denne brukaren kan ikkje nullstilla passordet sitt" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "Denne brukaren er avskrudd" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "Greier ikkje godkjenna brukaren" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "Brukaren er allereie inaktiv" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "Den førespurte brukaren er ikkje innlogga" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "Du er allereie medlem av denne gruppa" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "Du kan ikkje forlata denne gruppa, fordi du er den einaste styraren" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "Du kan ikkje bli med i denne gruppa" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "Du kan ikkje lista opp grupper med mindre du er moderator." #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "Du må vera innlogga for å endra epostadressa di" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "Du må vera innlogga for å endra passordet ditt" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "Du må vera innlogga for å sletta ei gruppe" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "Du må vera innlogga for å sletta kontoen din" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "Du må vera innlogga for å bli med i ei gruppe" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "Du må vera innlogga for å forlata ei gruppe" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "Du må vera innlogga for å oppdatera ei gruppe" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "Du treng eit eksisterande teikn for å få eit fornyingsteikn" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "Du ba om ny stadfestingsepost for snøgt" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "Epostadressa di er ikkje på lista over godkjende adresser" @@ -351,22 +353,22 @@ msgid "Anonymous participation is not enabled" msgstr "Det er ikkje høve til å vera med anonymt" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "Kan ikkje fjerna den siste styraren i gruppa" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "Kan ikkje fjerna den siste identiteten til ein brukar" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "Kommentaren er allereie sletta" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "Fann ikkje ordskiftet" @@ -386,8 +388,8 @@ msgid "Event id not found" msgstr "Fann ikkje ID-en til hendinga" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "Fann ikkje hendinga" @@ -403,7 +405,7 @@ msgid "Internal Error" msgstr "Intern feil" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "Ikkje noko ordskifte med ID-en %{id}" @@ -413,7 +415,7 @@ msgid "No profile found for user" msgstr "Fann ingen profil for brukaren" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "Det finst ikkje noko slikt teikn for kjelda" @@ -430,12 +432,12 @@ msgid "Participant not found" msgstr "Fann ikkje deltakaren" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "Fann ingen person med ID-en %{id}" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "Fann ingen person med brukarnamnet %{username}" @@ -461,30 +463,25 @@ msgstr "Profilen er allereie medlem i denne gruppa" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "Profilen er ikkje medlem i gruppa" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "Fann ikkje profilen" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "Moderatorprofilen har ikkje tilgang til denne hendinga" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "Fann ikkje rapporten" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "Ressursen finst ikkje" @@ -510,22 +507,22 @@ msgid "Todo list doesn't exist" msgstr "Gjeremålslista finst ikkje" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "Teiknet finst ikkje" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "Teiknet er ikkje ein gyldig UUID" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "Fann ikkje brukaren" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "Du har allereie ein profil for denne brukaren" @@ -534,23 +531,18 @@ msgstr "Du har allereie ein profil for denne brukaren" msgid "You are already a participant of this event" msgstr "Du er allereie deltakar på denne hendinga" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "Du er ikkje medlem i den gruppa der dei diskuterer dette" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "Du er ikkje medlem i denne gruppa" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "Du er ikkje styrar eller administrator for denne gruppa" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "Du har ikkje løyve til å skriva kommentarar viss du ikkje er kopla til" @@ -560,17 +552,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "Du har ikkje løyve til å laga eit straumteikn når du ikkje er kopla til" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "Du har ikkje løyve til å sletta ein kommentar når du ikkje er kopla til" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "Du har ikkje løyve til å sletta straumteikn når du ikkje er kopla til" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" "Du har ikkje løyve til å oppdatera kommentarar når du ikkje er kopla til" @@ -584,19 +576,19 @@ msgstr "" "oppretta hendinga" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" "Du kan ikkje gje deg sjølv ei deltakarrolle i denne gruppa, fordi du er den " "einaste administratoren" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "Du kan ikkje sletta denne kommentaren" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "Du kan ikkje sletta denne hendinga" @@ -606,12 +598,12 @@ msgid "You cannot invite to this group" msgstr "Du kan ikkje invitera til denne gruppa" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "Du har ikkje løyve til å sletta dette teiknet" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" "Du må vera innlogga og ha ei moderatorrolle for å lista opp hendingsloggar" @@ -632,38 +624,38 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "Du må vera innlogga og ha ei moderatorrolle for å lesa rapportar" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" "Du må vera innlogga og ha ei administratorrolle for å sjå admin-" "innstillingane" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" "Du må vera innlogga og ha ei administratorrolle for å sjå statistikk på " "styringspanelet" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" "Du må vera innlogga og ha ei administratorrolle for å lagra admin-" "innstillingar" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "Du må vera innlogga for å sjå ordskifte" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "Du må vera innlogga for å sjå ressursane" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "Du må vera innlogga for å laga hendingar" @@ -678,12 +670,12 @@ msgid "You need to be logged-in to create reports" msgstr "Du må vera innlogga for å rapportera" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "Du må vera innlogga for å laga ressursar" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "Du må vera innlogga for å sletta ei hending" @@ -693,7 +685,7 @@ msgid "You need to be logged-in to delete posts" msgstr "Du må vera innlogga for å sletta innlegg" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "Du må vera innlogga for å sletta ressursar" @@ -708,7 +700,7 @@ msgid "You need to be logged-in to leave an event" msgstr "Du må vera innlogga for å melda deg av ei hending" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "Du må vera innlogga for å oppdatera hendingar" @@ -718,17 +710,17 @@ msgid "You need to be logged-in to update posts" msgstr "Du må vera innlogga for å oppdatera innlegg" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "Du må vera innlogga for å oppdatera ressursar" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "Du må vera innlogga for å førehandsvisa ressursar" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "Opphavsressursen høyrer ikkje til denne gruppa" @@ -775,7 +767,7 @@ msgid "Resource not found" msgstr "Fann ikkje ressursen" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "Noko gjekk gale" @@ -795,12 +787,12 @@ msgid "You need to be logged in" msgstr "Du må vera innlogga" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "Du kan ikkje ta imot invitasjonar med denne profilen." #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "Du kan ikkje avslå invitasjonen med denne profilen." @@ -810,32 +802,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "Fila har ingen tillaten MIME-type." #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "Profilen er ikkje administrator for gruppa" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "Du kan ikkje endra denne hendinga." #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "Du kan ikkje kopla denne hendinga til denne profilen." #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "Invitasjonen finst ikkje." #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "Denne medlemen har allereie fått avslag." #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "Du har ikkje løyve til å fjerna denne medlemen." @@ -845,13 +837,13 @@ msgid "This username is already taken." msgstr "Dette brukarnamnet er oppteke." #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" "Du må gje anten ein ID eller ei stuttadresse for å få tilgang til ordskiftet" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "Brukaren eig ikkje arrangørprofilen" @@ -861,7 +853,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "Denne profil-IDen er ikkje den anonyme profilen" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" -msgstr "" +msgstr "Dette biletet er for stort" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "Fann ikkje indeksfila. Du må kompilera framsida på nytt." + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "Greidde ikkje laga ressursen" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "Ugyldig aktiveringslykjel" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "Greidde ikkje henta ressursdetaljane frå denne adressa." + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "Moderatorprofilen har ikkje tilgang til denne hendinga" diff --git a/priv/gettext/oc/LC_MESSAGES/default.po b/priv/gettext/oc/LC_MESSAGES/default.po index 2c5a78e46..31b13a439 100644 --- a/priv/gettext/oc/LC_MESSAGES/default.po +++ b/priv/gettext/oc/LC_MESSAGES/default.po @@ -926,8 +926,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1447,18 +1447,13 @@ msgstr "Eveniment" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1471,20 +1466,46 @@ msgstr "" #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/oc/LC_MESSAGES/errors.po b/priv/gettext/oc/LC_MESSAGES/errors.po index f2303e86e..b9176f188 100644 --- a/priv/gettext/oc/LC_MESSAGES/errors.po +++ b/priv/gettext/oc/LC_MESSAGES/errors.po @@ -18,6 +18,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.1\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "pòt pas èsser void" @@ -94,202 +95,203 @@ msgid "must be equal to %{number}" msgstr "deu èsser egal a %{number}" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "Actualizacion impossibla del geton" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "Lo perfil actual es pas un membre d’aqueste grop" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "Lo perfil actual es pas administrator del grop seleccionat" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "Error en salvagardant los paramètres utilizaire" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "Grop pas trobat" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "Grop amb l’ID %{id} pas trobat" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" "Autentificacion impossibla, vòstra adreça electronica o lo vòstre senhal es " "invalid." #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "Membre pas trobat" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "Cap de perfil pas trobat per l’utilizaire moderator" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "Cap d’utilizaire de validar amb aqueste email pas trobat" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "Degun trobat d'amb aquesta email" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "Lo perhiu es pas proprietat del utilizator autenticat" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "Las inscripciones sèn pas obèrtas" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "Lo mòt de santa clara actuau es invalid" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "Lo email nau sèm invalid" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "Lo email nau deb esser different" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "Lo mòt de santa clara nau deb esser different" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "Lo mòt de santa clara aprovedit es invalid" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" "Lo mòt de santa clara que avetz causit es tròp cort. Merci de vos assegurar " "que vostre mòt de santa clara contienga au mèns 6 caracteres." #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "Aquest utilizator pod pas reinicializar lo sèn mòt de santa clara" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "Aquest utilizator a essat dasactivat" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "Es impossible de validar l'utilizator" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "Utilizator déjà desactivat" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "L'utilizator demandat es pas conectat" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "Essetz déjà membre d'aquest grop" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "Podetz pas quitar aquest grop perque essetz lo sol administrator" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "Podetz pas rejónher aquest grop" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "Podetz listar los grops sonque se essetz moderator." #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "Debetz esser conectat per cambiar lo voste email" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "Debetz d'esser conectat per cambiar lo voste mòt de santa clara" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "Debetz d'esser conectat per suprimir un grop" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "Devetz d'esser conectat per suprimir lo voste compte" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "Devetz d'esser conectat per rejónher un grop" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "Devetz d'esser conectat per quitar un grop" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "Devetz d'esser conectat per metre à jorn un grop" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "Devetz aver un senhau existant per obtiéner un senhau nau" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "Demandatz de nau un email de confirmacion tròp lèu" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "Vòstre email es pas en la lista d'autorizacions" @@ -340,22 +342,22 @@ msgid "Anonymous participation is not enabled" msgstr "Ua participacion anonima es pas permetuda" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "Pòden pas suprimir lo darrièr administrator d'un grop" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "Pòden pas suprimir la darrièra identitat d'un utilizator" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "Comentari déjà suprimit" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "Discussion non trobada" @@ -375,8 +377,8 @@ msgid "Event id not found" msgstr "ID d'eveniment non trobat" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "Eveniment non trobat" @@ -392,7 +394,7 @@ msgid "Internal Error" msgstr "Error interna" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "Cap de discussion d'amb aquesta ID %{id}" @@ -402,7 +404,7 @@ msgid "No profile found for user" msgstr "Cap de profiu trobat per l'utilizator" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "Cap de senhau d'alimentacion" @@ -419,12 +421,12 @@ msgid "Participant not found" msgstr "Participant non trobat" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "Degun trobat d'amb ID %{id}" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "Degun trobat d'amb l'utilizator %{username}" @@ -450,30 +452,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -499,22 +496,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -523,23 +520,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -549,17 +541,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -570,17 +562,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -590,12 +582,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -615,32 +607,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -655,12 +647,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -670,7 +662,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -685,7 +677,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -695,17 +687,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -750,7 +742,7 @@ msgid "Resource not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -770,12 +762,12 @@ msgid "You need to be logged in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -785,32 +777,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -820,12 +812,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -835,7 +827,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "Error mentre que sauvant lo rapòrt" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/gettext/pl/LC_MESSAGES/default.po b/priv/gettext/pl/LC_MESSAGES/default.po index 389ae3d0a..ca9b1186b 100644 --- a/priv/gettext/pl/LC_MESSAGES/default.po +++ b/priv/gettext/pl/LC_MESSAGES/default.po @@ -934,8 +934,8 @@ msgstr "" "powiązany z Twoim kontem na %{host} został zmieniony z tego na:" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" "Jeżeli to nie Ty dokonałeś(-aś) tej zmiany, prawdopodobnie ktoś uzyskał " @@ -1464,18 +1464,13 @@ msgid "There have been changes for %{title} so we'd thought we'd let you msgstr "" "Nastąpiły zmiany w %{title}, więc postanowiliśmy Cię poinformować." -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "Serwer Mobilizon wydaje się tymczasowo nie działać." - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "Ta strona jest nieprawidłowa" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "Przepraszamy, ale coś poszło nie tak po naszej stronie." @@ -1487,20 +1482,46 @@ msgstr "To jest strona demonstracyjna pozwalająca na przetestowanie Mobilizon." #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "Serwer Mobilizon wydaje się tymczasowo nie działać." + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/pl/LC_MESSAGES/errors.po b/priv/gettext/pl/LC_MESSAGES/errors.po index 61be8ddfd..1faef75e7 100644 --- a/priv/gettext/pl/LC_MESSAGES/errors.po +++ b/priv/gettext/pl/LC_MESSAGES/errors.po @@ -19,6 +19,7 @@ msgstr "" "|| n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.1\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "nie może być pusty" @@ -101,203 +102,204 @@ msgid "must be equal to %{number}" msgstr "musi być równy %{number}" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "Nie można odświeżyć tokenu" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "Obency profil nie jest członkiem tej grupy" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "Obecny profil nie jest administratorem zaznaczonej grupy" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "Błąd zapisywania ustawień użytkownika" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "Nie odnaleziono grupy" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "Nie odnaleziono grupy o ID %{id}" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" "Nie udało się uwierzytelnić. Adres e-mail bądź hasło jest nieprawidłowe." #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "Nie odnaleziono użytkownika" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "Nie znaleziono profilu dla konta moderatora" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" "Nie znaleziono użytkownika do zatwierdzenia z użyciem tego adresu e-mail" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "Nie znaleziono użytkownika o tym adresie e-mail" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "Profil nie należy do uwierzytelnionego użytkownika" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "Rejestracje nie są otwarte" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "Obecne hasło jest nieprawidłowe" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "Nowy adres e-mail nie wydaje się być prawidłowy" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "Nowy adres e-mail musi się różnić od obecnego" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "Nowe hasło musi różnić się od obecnego" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "Wprowadzone hasło jest nieprawidłowe" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" "Wprowadzone hasło jest zbyt krótkie. Upewnij się, że Twoje hasło składa się " "z przynajmniej 6 znaków." #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "Ten użytkownik nie może resetować swojego hasła" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "Ten użytkownik jest wyłączony" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "Nie udało się zwalidować użytkownika" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "Użytkownik jest już wyłączony" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "Żądany użytkownik nie jest zalogowany" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "Już jesteś członkiem tej grupy" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" "Nie możesz opuścić tej grupy, ponieważ jesteś jej jedynym administratorem" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "Nie możesz dołączyć do tej grupy" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "Nie masz dostępu do listy grup, jeżeli nie jesteś moderatorem." #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "Musisz być zalogowany(-a), aby zmienić adres e-mail" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "Musisz być zalogowany(-a), aby zmienić hasło" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "Musisz być zalogowany(-a), aby usunąć grupę" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "Musisz być zalogowany(-a), aby usunąć konto" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "Musisz być zalogowany(-a), aby dołączyć do grupy" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "Musisz być zalogowany(-a), aby opuścić grupę" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "Musisz być zalogowany(-a), aby zaktualizować grupę" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "Musisz mieć istniejący token, aby uzyskać token odświeżający" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "Zbyt wcześnie poprosiłeś(-aś) o nową wiadomość potwierdzającą" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "Twój adres e-mail nie jest na białej liście" @@ -347,22 +349,22 @@ msgid "Anonymous participation is not enabled" msgstr "Anonimowe uczestnictwa nie są włączone" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "Nie można usunać jedynego administratora grupy" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "Nie można usunąć jedynej tożsamości użytkownika" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "Komentarz jest już usunięty" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "Nie znaleziono dyskusji" @@ -382,8 +384,8 @@ msgid "Event id not found" msgstr "Nie znaleziono id wydarzenia" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "Nie znaleziono wydarzenia" @@ -399,7 +401,7 @@ msgid "Internal Error" msgstr "Wewnętrzny błąd" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "Nie znaleziono dyskusji o ID ${id}" @@ -409,7 +411,7 @@ msgid "No profile found for user" msgstr "Nie znaleziono profilu dla użytkownika" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "Nie ma takiego tokenu strumienia" @@ -426,12 +428,12 @@ msgid "Participant not found" msgstr "Nie znaleziono uczestnika" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "Osoba o ID %{id} nie istnieje" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "Nie znaleziono osoby o nazwie użytkownika %{username}" @@ -457,30 +459,25 @@ msgstr "Profil jest już członkiem tej grupy" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "Profil nie jest członkiem grupy" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "Nie znaleziono profilu" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "Wskazany profil moderatora nie ma uprawnień dla tego wydarzenia" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "Nie znaleziono zgłoszenia" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "Zasób nie istnieje" @@ -506,22 +503,22 @@ msgid "Todo list doesn't exist" msgstr "Lista do zrobienia nie istnieje" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "Token nie istnieje" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "Token nie jest prawidłowym UUID" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "Nie znaleziono użytkownika" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "Już masz profil dla tego użytkownika" @@ -530,23 +527,18 @@ msgstr "Już masz profil dla tego użytkownika" msgid "You are already a participant of this event" msgstr "Już jesteś uczestnikiem tego wydarzenia" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "Nie jesteś członkiem grupy do której należy ta dyskusja" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "Nie jesteś członkiem tej grupy" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "Nie jesteś moderatorem ani administratorem tej grupy" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -556,17 +548,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -577,19 +569,19 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" "Nie możesz przydzielić sobie niższej rangi grupy, ponieważ jesteś jedynym " "administratorem" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "Nie możesz usunąć tego komentarza" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "Nie możesz usunąć tego wydarzenia" @@ -599,12 +591,12 @@ msgid "You cannot invite to this group" msgstr "Nie możesz zaprosić do tej grupy" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "Nie masz uprawnień do usunięcia tego tokenu" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "Musisz być zalogowanym moderatorem, aby mieć dostęp do dzennika działań" @@ -624,38 +616,38 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "Musisz być zalogowanym moderatorem, aby wyświetlić zgłoszenie" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" "Musisz być zalogowanym moderatorem, aby uzyskać dostęp do ustawień " "administratora" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" "Musisz być zalogowanym administratorem, aby uzyskać dostęp do statystyk w " "panelu" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" "Musisz być zalogowanym administratorem, aby zapisywać ustawienia " "administratora" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "Musisz być zalogowany(-a), aby uzyskać dostęp do dyskusji" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "Musisz być zalogowany(-a), aby uzyskać dostęp do zasobów" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "Musisz być zalogowany(-a), aby móc utworzyć wydarzenia" @@ -670,12 +662,12 @@ msgid "You need to be logged-in to create reports" msgstr "Musisz być zalogowany(-a), aby utworzyć zgłoszenie" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "Musisz być zalogowany(-a), aby utworzyć zasób" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "Musisz być zalogowany(-a), aby usunąć wydarzenie" @@ -685,7 +677,7 @@ msgid "You need to be logged-in to delete posts" msgstr "Musisz być zalogowany(-a), aby usunąć wpis" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "Musisz być zalogowany(-a), aby usunąć zasób" @@ -700,7 +692,7 @@ msgid "You need to be logged-in to leave an event" msgstr "Musisz być zalogowany(-a), aby opuścić wydarzenie" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "Musisz być zalogowany(-a), aby zaktualizować wydarzenie" @@ -710,17 +702,17 @@ msgid "You need to be logged-in to update posts" msgstr "Musisz być zalogowany(-a), aby zaktualizować wpis" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "Musisz być zalogowany(-a), aby zaktualizować zasób" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "Musisz być zalogowany(-a), aby zobaczyć podgląd zasobu" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "Nadrzędny zasób nie należy do tej grupy" @@ -767,7 +759,7 @@ msgid "Resource not found" msgstr "Nie znaleziono zasobu" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "Coś poszło nie tak" @@ -787,12 +779,12 @@ msgid "You need to be logged in" msgstr "Musisz być zalogowany(-a)" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "Nie możesz zaakceptować tego zaproszenia z tego profilu." #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "Nie możesz odrzucić tego zaproszenia z tego profilu." @@ -802,32 +794,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "Plik nie ma dozwolonego typu MIME." #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "Profil nie jest administratorem grupy" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "Nie możesz edytować tego wydarzenia." #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "Nie możesz przypisać tego wydarzenia do tego profilu." #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "To zaproszenie nie istnieje." #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "Ten członek już został odrzucony." #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "Nie masz uprawnień do usunięcia tego członka." @@ -837,12 +829,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -852,7 +844,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "Wystąpił błąd podczas zapisywania zgłoszenia" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "Wskazany profil moderatora nie ma uprawnień dla tego wydarzenia" diff --git a/priv/gettext/pt/LC_MESSAGES/default.po b/priv/gettext/pt/LC_MESSAGES/default.po index 4f4a55a6e..c79a35bd5 100644 --- a/priv/gettext/pt/LC_MESSAGES/default.po +++ b/priv/gettext/pt/LC_MESSAGES/default.po @@ -837,8 +837,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1343,18 +1343,13 @@ msgstr "" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1366,20 +1361,46 @@ msgstr "" #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/pt/LC_MESSAGES/errors.po b/priv/gettext/pt/LC_MESSAGES/errors.po index 9a07c6072..4cc4c6f7a 100644 --- a/priv/gettext/pt/LC_MESSAGES/errors.po +++ b/priv/gettext/pt/LC_MESSAGES/errors.po @@ -11,6 +11,7 @@ msgstr "" "Language: pt\n" "Plural-Forms: nplurals=2\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "" @@ -87,198 +88,199 @@ msgid "must be equal to %{number}" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "" @@ -328,22 +330,22 @@ msgid "Anonymous participation is not enabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "" @@ -363,8 +365,8 @@ msgid "Event id not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "" @@ -380,7 +382,7 @@ msgid "Internal Error" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "" @@ -390,7 +392,7 @@ msgid "No profile found for user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "" @@ -407,12 +409,12 @@ msgid "Participant not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "" @@ -438,30 +440,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -487,22 +484,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -511,23 +508,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -537,17 +529,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -558,17 +550,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -578,12 +570,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -603,32 +595,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -643,12 +635,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -658,7 +650,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -673,7 +665,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -683,17 +675,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -738,7 +730,7 @@ msgid "Resource not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -758,12 +750,12 @@ msgid "You need to be logged in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -773,32 +765,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -808,12 +800,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -823,7 +815,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/gettext/pt_BR/LC_MESSAGES/default.po b/priv/gettext/pt_BR/LC_MESSAGES/default.po index b8ffe2578..b077d9baa 100644 --- a/priv/gettext/pt_BR/LC_MESSAGES/default.po +++ b/priv/gettext/pt_BR/LC_MESSAGES/default.po @@ -912,8 +912,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1455,18 +1455,13 @@ msgstr "Evento" msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1478,20 +1473,46 @@ msgstr "Este é um site de demonstração para testar a versão beta do Mobilizo #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/pt_BR/LC_MESSAGES/errors.po b/priv/gettext/pt_BR/LC_MESSAGES/errors.po index 38a20cfcb..538063b08 100644 --- a/priv/gettext/pt_BR/LC_MESSAGES/errors.po +++ b/priv/gettext/pt_BR/LC_MESSAGES/errors.po @@ -11,6 +11,7 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "" @@ -87,198 +88,199 @@ msgid "must be equal to %{number}" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "" @@ -328,22 +330,22 @@ msgid "Anonymous participation is not enabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "" @@ -363,8 +365,8 @@ msgid "Event id not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "" @@ -380,7 +382,7 @@ msgid "Internal Error" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "" @@ -390,7 +392,7 @@ msgid "No profile found for user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "" @@ -407,12 +409,12 @@ msgid "Participant not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "" @@ -438,30 +440,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -487,22 +484,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -511,23 +508,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -537,17 +529,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -558,17 +550,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -578,12 +570,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -603,32 +595,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -643,12 +635,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -658,7 +650,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -673,7 +665,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -683,17 +675,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -738,7 +730,7 @@ msgid "Resource not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -758,12 +750,12 @@ msgid "You need to be logged in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -773,32 +765,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -808,12 +800,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -823,7 +815,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/gettext/ru/LC_MESSAGES/default.po b/priv/gettext/ru/LC_MESSAGES/default.po index 73f447072..c256130af 100644 --- a/priv/gettext/ru/LC_MESSAGES/default.po +++ b/priv/gettext/ru/LC_MESSAGES/default.po @@ -3,1401 +3,1741 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-24 14:40+0000\n" -"PO-Revision-Date: 2019-12-19 20:13+0000\n" -"Last-Translator: Dzmitry K. \n" +"PO-Revision-Date: 2021-05-01 10:59+0000\n" +"Last-Translator: deadmorose \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=" -"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 3.9.1\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.6\n" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:48 +#, elixir-format msgid "If you didn't request this, please ignore this email. Your password won't change until you access the link below and create a new one." msgstr "" "Если вы не оставляли такой запрос, проигнорируйте данное письмо. Пароль не " "изменится, если не перейти по приведённой ссылке и не указать новый." -#, elixir-format #: lib/web/templates/email/report.html.eex:74 +#, elixir-format msgid "%{title} by %{creator}" msgstr "%{title} от %{creator}" -#, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:58 +#, elixir-format msgid "Activate my account" msgstr "Активировать мою учётную запись" -#, elixir-format #: lib/web/templates/email/email.html.eex:117 #: lib/web/templates/email/email.text.eex:9 +#, elixir-format msgid "Ask the community on Framacolibri" msgstr "Обратиться к сообществу на Framacolibri" -#, elixir-format #: lib/web/templates/email/report.text.eex:15 +#, elixir-format msgid "Comments" msgstr "Комментарии" -#, elixir-format #: lib/web/templates/email/report.html.eex:72 #: lib/web/templates/email/report.text.eex:11 -msgid "Event" -msgstr "Событие" - #, elixir-format +msgid "Event" +msgstr "Мероприятие" + #: lib/web/email/user.ex:48 +#, elixir-format msgid "Instructions to reset your password on %{instance}" msgstr "Инструкции по сбросу пароля на %{instance}" -#, elixir-format #: lib/web/templates/email/report.text.eex:21 +#, elixir-format msgid "Reason" msgstr "Причина" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:61 +#, elixir-format msgid "Reset Password" msgstr "Сбросить пароль" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:41 +#, elixir-format msgid "Resetting your password is easy. Just press the button below and follow the instructions. We'll have you up and running in no time." msgstr "" "Сбросить пароль легко. Просто нажмите на кнопку ниже и следуйте инструкциям. " "Это быстро." -#, elixir-format #: lib/web/email/user.ex:28 +#, elixir-format msgid "Instructions to confirm your Mobilizon account on %{instance}" msgstr "Инструкции по подтверждению учётной записи Mobilizon на %{instance}" -#, elixir-format #: lib/web/email/admin.ex:24 -msgid "New report on Mobilizon instance %{instance}" -msgstr "Новое сообщение о проблемах на сервере Mobilizon %{instance}" - #, elixir-format +msgid "New report on Mobilizon instance %{instance}" +msgstr "Новый отчёт на Mobilizon узле %{instance}" + #: lib/web/templates/email/before_event_notification.html.eex:51 #: lib/web/templates/email/before_event_notification.text.eex:4 +#, elixir-format msgid "Go to event page" -msgstr "Перейти на страницу события" +msgstr "Перейти на страницу мероприятия" -#, elixir-format #: lib/web/templates/email/report.text.eex:1 +#, elixir-format msgid "New report from %{reporter} on %{instance}" -msgstr "" +msgstr "Новый отчёт от %{reporter} на %{instance}" -#, elixir-format #: lib/web/templates/email/event_participation_approved.text.eex:1 -msgid "Participation approved" -msgstr "" - #, elixir-format +msgid "Participation approved" +msgstr "Участие одобрено" + #: lib/web/templates/email/password_reset.html.eex:13 #: lib/web/templates/email/password_reset.text.eex:1 -msgid "Password reset" -msgstr "" - #, elixir-format +msgid "Password reset" +msgstr "Сброс пароля" + #: lib/web/templates/email/password_reset.text.eex:7 +#, elixir-format msgid "Resetting your password is easy. Just click the link below and follow the instructions. We'll have you up and running in no time." msgstr "" +"Сбросить пароль легко. Просто нажмите на ссылку ниже и следуйте инструкциям. " +"Это быстро." -#, elixir-format #: lib/web/templates/email/registration_confirmation.text.eex:5 +#, elixir-format msgid "You created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email." msgstr "" +"Вы создали аккаунт на% {host}, используя этот адрес электронной почты. Вы в " +"одном клике от его активации. Если это сделали не вы, просто проигнорируйте " +"это письмо." -#, elixir-format #: lib/web/email/participation.ex:112 +#, elixir-format msgid "Your participation to event %{title} has been approved" -msgstr "" +msgstr "Ваше участие в мероприятии %{title} было одобрено" -#, elixir-format #: lib/web/email/participation.ex:70 +#, elixir-format msgid "Your participation to event %{title} has been rejected" -msgstr "" +msgstr "Ваш запрос на участие в %{title} был отклонен" -#, elixir-format #: lib/web/email/event.ex:37 +#, elixir-format msgid "Event %{title} has been updated" -msgstr "" +msgstr "Мероприятие %{title} было обновлено" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:15 +#, elixir-format msgid "New title: %{title}" -msgstr "" +msgstr "Новый заголовок: %{title}" -#, elixir-format #: lib/web/templates/email/password_reset.text.eex:5 +#, elixir-format msgid "You requested a new password for your account on %{instance}." -msgstr "" +msgstr "Вы запросили новый пароль для своей учетной записи на %{instance}." -#, elixir-format #: lib/web/templates/email/email.html.eex:85 +#, elixir-format msgid "Warning" -msgstr "" +msgstr "Внимание" -#, elixir-format #: lib/web/email/participation.ex:135 -msgid "Confirm your participation to event %{title}" -msgstr "" - #, elixir-format +msgid "Confirm your participation to event %{title}" +msgstr "Подтвердите свое участие в мероприятии %{title}" + #: lib/web/templates/api/privacy.html.eex:75 +#, elixir-format msgctxt "terms" msgid "An internal ID for your current selected identity" -msgstr "" +msgstr "Внутренний ID для выбранного идентификатора" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:74 +#, elixir-format msgctxt "terms" msgid "An internal user ID" -msgstr "" +msgstr "Внутренний пользовательский ID" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:37 +#, elixir-format msgctxt "terms" msgid "Any of the information we collect from you may be used in the following ways:" msgstr "" +"Любая информация, которую мы собираем, может быть использована следующим " +"образом:" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:9 +#, elixir-format msgctxt "terms" msgid "Basic account information" -msgstr "" +msgstr "Основная информация об аккаунте" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:25 +#, elixir-format msgctxt "terms" msgid "Do not share any dangerous information over Mobilizon." -msgstr "" +msgstr "Не передавайте через Mobilizon какую-либо небезопасную информацию." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:90 +#, elixir-format msgctxt "terms" msgid "Do we disclose any information to outside parties?" -msgstr "" +msgstr "Передаем ли мы какую-либо информацию третьим лицам?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:68 +#, elixir-format msgctxt "terms" msgid "Do we use cookies?" -msgstr "" +msgstr "Мы используем файлы cookie?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:51 +#, elixir-format msgctxt "terms" msgid "How do we protect your information?" -msgstr "" +msgstr "Как мы защищаем вашу информацию?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:29 +#, elixir-format msgctxt "terms" msgid "IPs and other metadata" -msgstr "" +msgstr "IP-адреса и другие метаданные" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:17 +#, elixir-format msgctxt "terms" msgid "Published events and comments" -msgstr "" +msgstr "Опубликованные мероприятия и комментарии" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:64 +#, elixir-format msgctxt "terms" msgid "Retain the IP addresses associated with registered users no more than 12 months." msgstr "" +"Не храните IP-адреса, присвоенные зарегистрированным пользователям более 12 " +"месяцев." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:76 +#, elixir-format msgctxt "terms" msgid "Tokens to authenticate you" -msgstr "" +msgstr "Токены для аутентификации вас" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:31 +#, elixir-format msgctxt "terms" msgid "We also may retain server logs which include the IP address of every request to our server." msgstr "" +"Мы также можем хранить логи сервера, которые включают IP-адрес каждого " +"запроса к нашему серверу." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:70 +#, elixir-format msgctxt "terms" msgid "We store the following information on your device when you connect:" msgstr "" +"Мы храним следующую информацию об устройстве, с которого вы подключаетесь:" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:58 +#, elixir-format msgctxt "terms" msgid "We will make a good faith effort to:" -msgstr "" +msgstr "Мы приложим все усилия, чтобы:" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:35 +#, elixir-format msgctxt "terms" msgid "What do we use your information for?" -msgstr "" +msgstr "Для чего мы используем ваши данные?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:57 +#, elixir-format msgctxt "terms" msgid "What is our data retention policy?" -msgstr "" +msgstr "Какова наша политика хранения данных?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:67 +#, elixir-format msgctxt "terms" msgid "You may irreversibly delete your account at any time." -msgstr "" +msgstr "Вы можете в любой момент безвозвратно удалить свою учетную запись." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:115 +#, elixir-format msgctxt "terms" msgid "Changes to our Privacy Policy" -msgstr "" +msgstr "Изменения в нашей Политике конфиденциальности" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:106 +#, elixir-format msgctxt "terms" msgid "If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site." msgstr "" +"Если этот сервер находится в ЕС или ЕЭЗ - наш сайт, продукты и услуги " +"предназначены для людей старше 16 лет. Если вам меньше 16 лет, в " +"соответствии с требованиями GDPR (Общие правила защиты данных) не " +"используйте этот сайт." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:109 +#, elixir-format msgctxt "terms" msgid "If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site." msgstr "" +"Если этот сервер находится в США - наш сайт, продукты и услуги предназначены " +"для людей старше 13 лет. Если вам меньше 13 лет, в соответствии с " +"требованиями COPPA (Закон о защите конфиденциальности детей " +"в Интернете) не используйте этот сайт." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:117 +#, elixir-format msgctxt "terms" msgid "If we decide to change our privacy policy, we will post those changes on this page." msgstr "" +"Если мы решим изменить нашу политику конфиденциальности, то опубликуем " +"изменения на этой странице." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:112 +#, elixir-format msgctxt "terms" msgid "Law requirements can be different if this server is in another jurisdiction." msgstr "" +"Требования закона могут отличаться, если этот сервер находится в другой " +"юрисдикции." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:103 +#, elixir-format msgctxt "terms" msgid "Site usage by children" -msgstr "" +msgstr "Использование сайта детьми" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:47 +#, elixir-format msgctxt "terms" msgid "The email address you provide may be used to send you information, updates and notifications about other people\n interacting with your content or sending you messages and to respond to inquiries, and/or other requests or\n questions." msgstr "" +"Предоставленный вами адрес электронной почты может использоваться для " +"отправки вам информации, обновлений и уведомлений о других людях,\n" +" взаимодействующих с вашим контентом или отправляющих вам сообщения, а " +"также для ответа на запросы, просьбы или\n" +" вопросы." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:45 +#, elixir-format msgctxt "terms" msgid "To aid moderation of the community, for example comparing your IP address with other known ones to determine ban\n evasion or other violations." msgstr "" +"Для облегчения модерации сообщества, например, для сравнения вашего IP-" +"адреса с другими известными, чтобы обнаружить обход бана\n" +" или другие нарушения." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:43 +#, elixir-format msgctxt "terms" msgid "To provide the core functionality of Mobilizon. Depending on this instance's policy you may only be able to\n interact with other people's content and post your own content if you are logged in." msgstr "" +"Для обеспечения основных функций Mobilizon. В зависимости от политики этого " +"узла, вы можете\n" +" взаимодействовать с контентом других людей и размещать собственный " +"контент, если вы вошли в систему." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:6 +#, elixir-format msgctxt "terms" msgid "What information do we collect?" -msgstr "" +msgstr "Какую информацию мы собираем?" -#, elixir-format #: lib/web/email/user.ex:176 +#, elixir-format msgid "Mobilizon on %{instance}: confirm your email address" -msgstr "" +msgstr "Mobilizon на %{instance}: подтвердите свой адрес электронной почты" -#, elixir-format #: lib/web/email/user.ex:152 -msgid "Mobilizon on %{instance}: email changed" -msgstr "" - #, elixir-format +msgid "Mobilizon on %{instance}: email changed" +msgstr "Mobilizon на %{instance}: адрес электронной почты изменен" + #: lib/web/email/notification.ex:47 +#, elixir-format msgid "One event planned today" msgid_plural "%{nb_events} events planned today" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Сегодня запланировано одно мероприятие" +msgstr[1] "Сегодня запланировано %{nb_events} мероприятия" +msgstr[2] "Сегодня запланировано %{nb_events} мероприятий" -#, elixir-format #: lib/web/templates/email/on_day_notification.html.eex:38 #: lib/web/templates/email/on_day_notification.text.eex:4 +#, elixir-format msgid "You have one event today:" msgid_plural "You have %{total} events today:" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "У вас сегодня одно мероприятие:" +msgstr[1] "У вас сегодня %{total} мероприятия:" +msgstr[2] "У вас сегодня %{total} мероприятий:" -#, elixir-format #: lib/web/templates/email/group_invite.text.eex:3 -msgid "%{inviter} just invited you to join their group %{group}" -msgstr "" - #, elixir-format +msgid "%{inviter} just invited you to join their group %{group}" +msgstr "%{inviter} только что пригласил вас присоединиться к их группе %{group}" + #: lib/web/templates/email/group_invite.html.eex:13 #: lib/web/templates/email/group_invite.text.eex:1 +#, elixir-format msgid "Come along!" -msgstr "" +msgstr "Присоединяйтесь к нам!" -#, elixir-format #: lib/web/email/notification.ex:24 -msgid "Don't forget to go to %{title}" -msgstr "" - #, elixir-format +msgid "Don't forget to go to %{title}" +msgstr "Не забудь об участии в %{title}" + #: lib/web/templates/email/before_event_notification.html.eex:38 #: lib/web/templates/email/before_event_notification.text.eex:3 +#, elixir-format msgid "Get ready for %{title}" -msgstr "" +msgstr "Будь готов к %{title}" -#, elixir-format #: lib/web/templates/email/group_invite.html.eex:59 -msgid "See my groups" -msgstr "" - #, elixir-format +msgid "See my groups" +msgstr "Посмотреть мои группы" + #: lib/web/templates/email/group_invite.html.eex:45 #: lib/web/templates/email/group_invite.text.eex:5 +#, elixir-format msgid "To accept this invitation, head over to your groups." -msgstr "" +msgstr "Чтобы принять это приглашение, зайдите в свои группы." -#, elixir-format #: lib/web/templates/email/before_event_notification.text.eex:5 +#, elixir-format msgid "View the event on: %{link}" -msgstr "" +msgstr "Посмотреть мероприятие на: %{link}" -#, elixir-format #: lib/web/email/group.ex:33 -msgid "You have been invited by %{inviter} to join group %{group}" -msgstr "" - #, elixir-format +msgid "You have been invited by %{inviter} to join group %{group}" +msgstr "%{Inviter} пригласил вас присоединиться к группе %{group}" + #: lib/web/email/notification.ex:71 +#, elixir-format msgid "One event planned this week" msgid_plural "%{nb_events} events planned this week" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "На этой неделе запланировано одно мероприятие" +msgstr[1] "На этой неделе запланировано %{nb_events} мероприятия" +msgstr[2] "На этой неделе запланировано %{nb_events} мероприятий" -#, elixir-format #: lib/web/email/notification.ex:93 +#, elixir-format msgid "One participation request for event %{title} to process" msgid_plural "%{number_participation_requests} participation requests for event %{title} to process" -msgstr[0] "" +msgstr[0] "Одна заявка на участие в мероприятии %{title} ожидает одобрения" msgstr[1] "" +"%{number_participation_requests} заявки на участие в мероприятии %{title} " +"ожидают одобрения" msgstr[2] "" +"%{number_participation_requests} заявок на участие в мероприятии %{title} " +"ожидают одобрения" -#, elixir-format #: lib/web/templates/email/notification_each_week.html.eex:38 #: lib/web/templates/email/notification_each_week.text.eex:3 +#, elixir-format msgid "You have one event this week:" msgid_plural "You have %{total} events this week:" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "У вас одно мероприятие на этой неделе:" +msgstr[1] "На этой неделе у вас запланировано %{total} мероприятия:" +msgstr[2] "На этой неделе у вас запланировано %{total} мероприятий:" -#, elixir-format #: lib/service/metadata/utils.ex:52 -msgid "The event organizer didn't add any description." -msgstr "" - #, elixir-format +msgid "The event organizer didn't add any description." +msgstr "Организатор мероприятия не добавил описания." + #: lib/web/templates/api/privacy.html.eex:54 +#, elixir-format msgctxt "terms" msgid "We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL/TLS, and your password is hashed using a strong one-way algorithm." msgstr "" +"Мы применяем различные меры безопасности для обеспечения конфиденциальности " +"вашей личной информации, когда вы вводите, отправляете или получаете доступ " +"к своим личным данным. Помимо прочего, сеанс вашего браузера, а также трафик " +"между вашими приложениями и API защищены с помощью SSL/TLS, а ваш пароль " +"хешируется с использованием надежного одностороннего алгоритма." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:94 +#, elixir-format msgctxt "terms" msgid "No. We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety." msgstr "" +"Нет. Мы не продаем, не обмениваем или иным образом не передаем вашу личную " +"информацию третьим лицам. Сюда не входят доверенные третьи стороны, которые " +"помогают нам управлять нашим сайтом, вести наш бизнес или обслуживать вас, " +"при условии, что эти стороны согласились сохранять конфиденциальность этой " +"информации. Мы также можем раскрыть вашу информацию, если считаем, что это " +"необходимо для соблюдения закона, обеспечения соблюдения политики нашего " +"сайта или защиты наших или других прав, собственности или безопасности." -#, elixir-format #: lib/web/templates/api/terms.html.eex:23 +#, elixir-format msgctxt "terms" msgid "Accepting these Terms" -msgstr "" +msgstr "Принятие настоящих Условий" -#, elixir-format #: lib/web/templates/api/terms.html.eex:27 +#, elixir-format msgctxt "terms" msgid "Changes to these Terms" -msgstr "" +msgstr "Изменения в настоящих Условиях" -#, elixir-format #: lib/web/templates/api/terms.html.eex:85 +#, elixir-format msgctxt "terms" msgid "A lot of the content on the Service is from you and others, and we don't review, verify or authenticate it, and it may include inaccuracies or false information. We make no representations, warranties, or guarantees relating to the quality, suitability, truth, accuracy or completeness of any content contained in the Service. You acknowledge sole responsibility for and assume all risk arising from your use of or reliance on any content." msgstr "" +"Большая часть содержимого Сервиса принадлежит вам и другим лицам, и мы не " +"просматриваем, не проверяем и не подтверждаем его подлинность, и он может " +"содержать неточности или ложную информацию. Мы не делаем никаких заявлений и " +"не даем никаких гарантий относительно качества, актуальности, достоверности, " +"точности или полноты любого контента, содержащегося в Сервисе. Вы признаете, " +"что несете единоличную ответственность и принимаете на себя все риски, " +"возникающие в связи с использованием вами любого контента или вашего доверия " +"к нему." -#, elixir-format #: lib/web/templates/api/terms.html.eex:60 +#, elixir-format msgctxt "terms" msgid "Also, you agree that you will not do any of the following in connection with the Service or other users:" msgstr "" +"Кроме того, вы соглашаетесь с тем, что не будете делать ничего из следующего " +"в отношении Сервиса или других пользователей:" -#, elixir-format #: lib/web/templates/api/terms.html.eex:65 +#, elixir-format msgctxt "terms" msgid "Circumvent or attempt to circumvent any filtering, security measures, rate limits or other features designed to protect the Service, users of the Service, or third parties." msgstr "" +"Обходить или пытаться обойти любую фильтрацию, меры безопасности, " +"ограничения скорости или другие функции, предназначенные для защиты Сервиса, " +"пользователей Сервиса или третьих лиц." -#, elixir-format #: lib/web/templates/api/terms.html.eex:64 +#, elixir-format msgctxt "terms" msgid "Collect any personal information about other users, or intimidate, threaten, stalk or otherwise harass other users of the Service;" msgstr "" +"Собирать любую личную информацию о других пользователях или запугивать, " +"угрожать, преследовать или иным образом беспокоить других пользователей " +"Сервиса;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:55 +#, elixir-format msgctxt "terms" msgid "Content that is illegal or unlawful, that would otherwise create liability;" msgstr "" +"Контент, который является незаконным или повлечет за собой уголовную " +"ответственность;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:56 +#, elixir-format msgctxt "terms" msgid "Content that may infringe or violate any patent, trademark, trade secret, copyright, right of privacy, right of publicity or other intellectual or other right of any party;" msgstr "" +"Контент, который может нарушать какой-либо патент, товарный знак, " +"коммерческую тайну, авторское право, конфиденциальность, право на гласность " +"или другие интеллектуальные и прочие права любой стороны;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:42 +#, elixir-format msgctxt "terms" msgid "Creating Accounts" -msgstr "" +msgstr "Создание учётных записей" -#, elixir-format #: lib/web/templates/api/terms.html.eex:89 +#, elixir-format msgctxt "terms" msgid "Entire Agreement" -msgstr "" +msgstr "Полное согласие" -#, elixir-format #: lib/web/templates/api/terms.html.eex:92 +#, elixir-format msgctxt "terms" msgid "Feedback" -msgstr "" +msgstr "Обратная связь" -#, elixir-format #: lib/web/templates/api/terms.html.eex:83 +#, elixir-format msgctxt "terms" msgid "Hyperlinks and Third Party Content" -msgstr "" +msgstr "Гиперссылки и сторонний контент" -#, elixir-format #: lib/web/templates/api/terms.html.eex:88 +#, elixir-format msgctxt "terms" msgid "If you breach any of these Terms, we have the right to suspend or disable your access to or use of the Service." msgstr "" +"Если вы нарушите какое-либо из этих Условий, мы имеем право временно " +"приостановить или полностью заблокировать вам доступ к Сервису." -#, elixir-format #: lib/web/templates/api/terms.html.eex:63 +#, elixir-format msgctxt "terms" msgid "Impersonate or post on behalf of any person or entity or otherwise misrepresent your affiliation with a person or entity;" msgstr "" +"Выдавать себя за другое лицо или публиковать сообщения от имени любого " +"физического или юридического лица или иным образом искажать свою " +"принадлежность к физическому или юридическому лицу;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:48 +#, elixir-format msgctxt "terms" msgid "Our Service allows you and other users to post, link and otherwise make available content. You are responsible for the content that you make available to the Service, including its legality, reliability, and appropriateness." msgstr "" +"Наш Сервис позволяет вам и другим пользователям публиковать, размещать " +"ссылки и иным образом делать контент доступным. Вы несете ответственность за " +"контент, который вы предоставляете Сервису, включая его законность, " +"правдивость и адекватность." -#, elixir-format #: lib/web/templates/api/terms.html.eex:39 +#, elixir-format msgctxt "terms" msgid "Privacy Policy" -msgstr "" +msgstr "Политика конфиденциальности" -#, elixir-format #: lib/web/templates/api/terms.html.eex:95 +#, elixir-format msgctxt "terms" msgid "Questions & Contact Information" -msgstr "" +msgstr "Вопросы и контактная информация" -#, elixir-format #: lib/web/templates/api/terms.html.eex:87 +#, elixir-format msgctxt "terms" msgid "Termination" -msgstr "" +msgstr "Завершение" -#, elixir-format #: lib/web/templates/api/terms.html.eex:62 +#, elixir-format msgctxt "terms" msgid "Use the Service in any manner that could interfere with, disrupt, negatively affect or inhibit other users from fully enjoying the Service or that could damage, disable, overburden or impair the functioning of the Service;" msgstr "" +"Использовать Сервис любым способом, который может нарушить, отрицательно " +"повлиять или помешать другим пользователям в полной мере пользоваться " +"Сервисом или который может повредить, вывести из строя, перегрузить или " +"нарушить работу Сервиса;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:47 +#, elixir-format msgctxt "terms" msgid "Your Content & Conduct" -msgstr "" +msgstr "Ваш контент и ваши действия" -#, elixir-format #: lib/web/templates/api/terms.html.eex:84 +#, elixir-format msgctxt "terms" msgid "%{instance_name} makes no claim or representation regarding, and accepts no responsibility for third party websites accessible by hyperlink from the Service or websites linking to the Service. When you leave the Service, you should be aware that these Terms and our policies no longer govern. The inclusion of any link does not imply endorsement by %{instance_name} of the site. Use of any such linked website is at the user's own risk." msgstr "" +"%{instance_name} не претендует, не представляет и не принимает на " +"себя ответственность за любые сторонние веб-сайты, доступные по гиперссылкам " +"с Сервиса, или сайты, которые ссылаются на Сервис. Вы должны знать, что " +"Условия обслуживания применяются только к домену Сервиса. Включение внешних " +"ссылок не означает поддержки со стороны %{instance_name} для целевого " +"сайта. Ответственность за использование таких ссылок лежит на каждом " +"пользователе." -#, elixir-format #: lib/web/templates/api/terms.html.eex:68 +#, elixir-format msgctxt "terms" msgid "Finally, your use of the Service is also subject to acceptance of the instance's own specific rules regarding the code of conduct and moderation rules. Breaking those rules may also result in your account being disabled or suspended." msgstr "" +"Наконец, использование Сервиса также требует принятия правил конкретного узла, касающихся кодекса поведения и правил " +"модерации. Нарушение этих правил также может привести к приостановке или " +"блокировки вашей учетной записи." -#, elixir-format #: lib/web/templates/api/terms.html.eex:81 +#, elixir-format msgctxt "terms" msgid "For full details about the Mobilizon software see here." msgstr "" +"Для получения полной информации о Mobilizon смотреть тут." -#, elixir-format #: lib/web/templates/api/terms.html.eex:18 +#, elixir-format msgctxt "terms" msgid "Here are the important things you need to know about accessing and using the %{instance_name} (%{instance_url}) website and service (collectively, \"Service\"). These are our terms of service (\"Terms\"). Please read them carefully." msgstr "" +"Вот важные вещи, которые вам нужно знать о доступе и использовании " +"%{instance_name} (%{instance_url}) веб-сайта и сервиса (вместе именуемые \"Сервис\"). Это " +"наши условия обслуживания (\"Условия\"). Пожалуйста, прочтите их внимательно." -#, elixir-format #: lib/web/templates/api/terms.html.eex:33 +#, elixir-format msgctxt "terms" msgid "If we make major changes, we will notify our users in a clear and prominent manner. Minor changes may only be highlighted in the footer of our website. It is your responsibility to check the website regularly for changes to these Terms." msgstr "" +"Если мы внесем значительные изменения, то известим наших пользователей ясным " +"и заметным образом. Незначительные изменения могут быть выделены только в " +"подвале нашего веб-сайта. Вы обязаны регулярно проверять веб-сайт на предмет " +"изменений в настоящих Условиях." -#, elixir-format #: lib/web/templates/api/terms.html.eex:53 +#, elixir-format msgctxt "terms" msgid "In order to make %{instance_name} a great place for all of us, please do not post, link and otherwise make available on or through the Service any of the following:" msgstr "" +"Чтобы сделать %{instance_name} идеальным местом для всех, пожалуйста, " +"не публикуйте, не размещайте ссылки и не делайте доступными иным образом в " +"нашем Сервисе любое из следующего:" -#, elixir-format #: lib/web/templates/api/terms.html.eex:57 +#, elixir-format msgctxt "terms" msgid "Private information of any third party (e.g., addresses, phone numbers, email addresses, Social Security numbers and credit card numbers); and" msgstr "" +"Личная информация третьих лиц (например, адреса, номера телефонов, адреса " +"электронной почты, номера социального страхования и номера кредитных карт); и" -#, elixir-format #: lib/web/templates/api/terms.html.eex:52 +#, elixir-format msgctxt "terms" msgid "Since Mobilizon is a distributed network, it is possible, depending on the visibility rules set to your content, that your content has been distributed to other Mobilizon instances. When you delete your content, we will request those other instances to also delete the content. Our responsibility on the content being deleted from those other instances ends here. If for some reason, some other instance does not delete the content, we cannot be held responsible." msgstr "" +"Поскольку Mobilizon является распределенной сетью, возможно, в зависимости " +"от правил видимости, установленных для вашего контента, ваш контент был " +"распространен на другие узлы Mobilizon. Когда вы удаляете свой контент, мы " +"просим другие узлы также удалить его. Наша ответственность за удаление " +"контента на других узлах на этом заканчивается. Если по какой-то причине " +"какой-либо другой узел не удаляет его, то мы не несем ответственности за это." -#, elixir-format #: lib/web/templates/api/terms.html.eex:90 +#, elixir-format msgctxt "terms" msgid "These Terms constitute the entire agreement between you and %{instance_name} regarding the use of the Service, superseding any prior agreements between you and %{instance_name} relating to your use of the Service." msgstr "" +"Настоящие Условия представляют собой полное соглашение между вами и " +"%{instance_name} в отношении использования Сервиса, заменяя все " +"предыдущие соглашения между вами и %{instance_name}, касающиеся " +"использования Сервиса." -#, elixir-format #: lib/web/templates/api/terms.html.eex:80 +#, elixir-format msgctxt "terms" msgid "This Service runs on a Mobilizon instance. This source code is licensed under an AGPLv3 license which means you are allowed to and even encouraged to take the source code, modify it and use it." msgstr "" +"Этот Сервис работает на узле Mobilizon. Его исходный код находится под " +"лицензией AGPLv3, следовательно, вам разрешено и даже " +"рекомендуется брать, изменять и использовать его." -#, elixir-format #: lib/web/templates/api/terms.html.eex:58 +#, elixir-format msgctxt "terms" msgid "Viruses, corrupted data or other harmful, disruptive or destructive files or code." -msgstr "" +msgstr "Вирусы, трояны или другие вредоносные файлы или их исходный код." -#, elixir-format #: lib/web/templates/api/terms.html.eex:51 +#, elixir-format msgctxt "terms" msgid "You can remove the content that you posted by deleting it. Once you delete your content, it will not appear on the Service, but copies of your deleted content may remain in our system or backups for some period of time. Web server access logs might also be stored for some time in the system." msgstr "" +"Вы можете удалить опубликованный вами контент. После удаления он не будет " +"отображаться в Сервисе, но копии удаленного контента могут оставаться в " +"нашей системе или резервной копии в течение некоторого времени. Логи веб-" +"сервера также могут некоторое время храниться в системе." -#, elixir-format #: lib/web/templates/api/terms.html.eex:96 +#, elixir-format msgctxt "terms" msgid "Questions or comments about the Service may be directed to us at %{contact}" msgstr "" +"Вопросы и отзывы о нашем Сервисе можно направлять нам по адресу %{contact}" -#, elixir-format #: lib/web/templates/api/terms.html.eex:79 +#, elixir-format msgctxt "terms" msgid "Source code" -msgstr "" +msgstr "Исходный код" -#, elixir-format #: lib/web/templates/api/terms.html.eex:93 +#, elixir-format msgctxt "terms" msgid "We love feedback. Please let us know what you think of the Service, these Terms and, in general, %{instance_name}." msgstr "" +"Нам нравятся отзывы! Не стесняйтесь говорить, что вы думаете о Сервисе, " +"настоящих Условиях и в целом о %{instance_name}." -#, elixir-format #: lib/web/templates/api/terms.html.eex:74 +#, elixir-format msgctxt "terms" msgid "Instance administrators (and community moderators, given the relevant access) are responsible for monitoring and acting on flagged content and other user reports, and have the right and responsibility to remove or edit content that is not aligned to this Instance set of rules, or to suspend, block or ban (temporarily or permanently) any account, community, or instance for breaking these terms, or for other behaviours that they deem inappropriate, threatening, offensive, or harmful." msgstr "" +"Администраторы узла (и модераторы сообщества, имеющие соответствующий доступ)" +" несут ответственность за мониторинг помеченного контента и других " +"пользовательских отчётов и действия с ними, а также имеют право и обязаны " +"удалять или редактировать контент, который не соответствует правилам узла, " +"или приостановить, заблокировать (временно или навсегда) любую учетную " +"запись, сообщество или узел за нарушение этих условий или другое поведение, " +"которое они считают неуместным, угрожающим, оскорбительным или вредным." -#, elixir-format #: lib/web/templates/api/terms.html.eex:6 +#, elixir-format msgctxt "terms" msgid "%{instance_name} will not use or transmit or resell your personal data" msgstr "" +"%{instance_name} не будет использовать, передавать или продавать ваши " +"личные данные" -#, elixir-format #: lib/web/templates/api/terms.html.eex:44 +#, elixir-format msgctxt "terms" msgid "If you discover or suspect any Service security breaches, please let us know as soon as possible. For security holes in the Mobilizon software itself, please contact its contributors directly." msgstr "" +"Если вы обнаружите или заподозрите какие-либо нарушения безопасности на " +"нашем Сервисе, сообщите нам об этом как можно скорее. По вопросам " +"уязвимостей в самом программном обеспечении Mobilizon обращайтесь напрямую " +"к её разработчикам." -#, elixir-format #: lib/web/templates/api/terms.html.eex:77 +#, elixir-format msgctxt "terms" msgid "Instance administrators should ensure that every community hosted on the instance is properly moderated according to the defined rules." msgstr "" +"Администраторы узла должны убедиться, что каждое сообщество, размещенное на " +"узле, адекватно модерируется в соответствии с определенными правилами." -#, elixir-format #: lib/web/templates/api/terms.html.eex:98 +#, elixir-format msgctxt "terms" msgid "Originally adapted from the Diaspora* and App.net privacy policies, also licensed under CC BY-SA." msgstr "" +"Изначально взято из политик конфиденциальности Diaspora* и App.net, которые находятся под лицензией CC BY-SA." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:119 +#, elixir-format msgctxt "terms" msgid "Originally adapted from the Mastodon and Discourse privacy policies, also licensed under CC BY-SA." msgstr "" +"Изначально взято из политик конфиденциальности Mastodon и Discourse, которые находятся под лицензией CC BY-SA." -#, elixir-format #: lib/web/templates/api/terms.html.eex:3 +#, elixir-format msgctxt "terms" msgid "Short version" -msgstr "" +msgstr "Сокращённая версия" -#, elixir-format #: lib/web/templates/api/terms.html.eex:9 +#, elixir-format msgctxt "terms" msgid "The service is provided without warranties and these terms may change in the future" msgstr "" +"Услуги предоставляется без гарантий, и эти условия могут измениться в будущем" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:118 +#, elixir-format msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 18, 2020." msgstr "" +"Этот документ находится под лицензией CC BY-SA. Последний раз обновлялся 18 июня 2020." -#, elixir-format #: lib/web/templates/api/terms.html.eex:97 +#, elixir-format msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 22, 2020." msgstr "" +"Этот документ находится под лицензиейCC BY-SA. Последний раз обновлялся 22 июня 2020." -#, elixir-format #: lib/web/templates/api/terms.html.eex:8 +#, elixir-format msgctxt "terms" msgid "You must respect other people and %{instance_name}'s rules when using the service" msgstr "" +"Вы должны уважать других людей и правила %{instance_name} используя " +"этот сервис" -#, elixir-format #: lib/web/templates/api/terms.html.eex:7 +#, elixir-format msgctxt "terms" msgid "You must respect the law when using %{instance_name}" -msgstr "" +msgstr "Вы должны соблюдать законы при использовании %{instance_name}" -#, elixir-format #: lib/web/templates/api/terms.html.eex:5 +#, elixir-format msgctxt "terms" msgid "Your content is yours" -msgstr "" +msgstr "Ваши данные принадлежат вам" -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:51 -msgid "Confirm my e-mail address" -msgstr "" - #, elixir-format +msgid "Confirm my e-mail address" +msgstr "Подтвердите мой адрес электронной почты" + #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:13 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:1 -msgid "Confirm your e-mail" -msgstr "" - #, elixir-format +msgid "Confirm your e-mail" +msgstr "Подтвердите ваш адрес электронной почты" + #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:3 +#, elixir-format msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" +"Привет! Вы только что зарегистрировались, чтобы присоединиться к мероприятию:" +" « % {title} ». Пожалуйста, подтвердите адрес электронной почты, который вы " +"указали:" -#, elixir-format #: lib/web/templates/email/email.html.eex:114 #: lib/web/templates/email/email.text.eex:8 +#, elixir-format msgid "Need help? Is something not working as expected?" msgstr "Нужна помощь? Что-то не работает?" -#, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:38 +#, elixir-format msgid "You created an account on %{host} with this email address. You are one click away from activating it." msgstr "" -"Вы создали на %{host} учётную запись с данным адресом электронной почты. " -"Осталось её активировать." +"Вы создали на %{host} учётную запись с данным адресом электронной " +"почты. Вы в одном клике от его активации." -#, elixir-format #: lib/web/templates/email/report.html.eex:13 -msgid "New report on %{instance}" -msgstr "Новое сообщение о проблемах на %{instance}" - #, elixir-format +msgid "New report on %{instance}" +msgstr "Новый отчёт на %{instance}" + #: lib/web/templates/email/email_changed_old.html.eex:38 +#, elixir-format msgid "The email address for your account on %{host} is being changed to:" msgstr "" +"Адрес электронной почты вашего аккаунта на %{host} будет изменен на:" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:38 +#, elixir-format msgid "You requested a new password for your account on %{instance}." msgstr "" +"Вы запросили новый пароль для своей учетной записи на %{instance}." -#, elixir-format #: lib/web/templates/email/email.text.eex:5 -msgid "Please do not use it for real purposes." -msgstr "" - #, elixir-format +msgid "Please do not use it for real purposes." +msgstr "Пожалуйста, используйте это только для тестовых целей." + #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:63 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:6 lib/web/templates/email/event_updated.html.eex:133 #: lib/web/templates/email/event_updated.text.eex:24 lib/web/templates/email/notification_each_week.html.eex:70 #: lib/web/templates/email/notification_each_week.text.eex:11 lib/web/templates/email/on_day_notification.html.eex:70 #: lib/web/templates/email/on_day_notification.text.eex:14 +#, elixir-format msgid "Would you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgid_plural "Would you wish to cancel your attendance to one or several events, visit the event pages through the links above and click the « Attending » button." msgstr[0] "" +"Если вы хотите отменить свое участие, просто перейдите на страницу " +"мероприятия по ссылке выше и нажмите кнопку « Я участвую »." msgstr[1] "" +"Если вы хотите отменить свое участие в одном или нескольких мероприятиях, " +"просто перейдите на страницы мероприятий по указанным выше ссылкам и нажмите " +"кнопку « Я участвую »." msgstr[2] "" +"Если вы хотите отменить свое участие в одном или нескольких мероприятиях, " +"просто перейдите на страницы мероприятий по указанным выше ссылкам и нажмите " +"кнопку « Я участвую »." -#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:38 #: lib/web/templates/email/pending_participation_notification.text.eex:4 +#, elixir-format msgid "You have one pending attendance request to process:" msgid_plural "You have %{number_participation_requests} attendance requests to process:" -msgstr[0] "" +msgstr[0] "У вас есть ожидающий рассмотрения запрос на участие:" msgstr[1] "" +"У вас есть %{number_participation_requests} ожидающих рассмотрения запроса " +"на участие:" msgstr[2] "" +"У вас есть %{number_participation_requests} ожидающих рассмотрения запросов " +"на участие:" -#, elixir-format #: lib/web/templates/email/email.text.eex:11 +#, elixir-format msgid "%{instance} is powered by Mobilizon." -msgstr "%{instance} — это сервер Mobilizon." +msgstr "%{instance} работает на платформе Mobilizon." -#, elixir-format #: lib/web/templates/email/email.html.eex:142 -msgid "%{instance} is powered by Mobilizon." -msgstr "%{instance} — это сервер Mobilizon." - #, elixir-format +msgid "%{instance} is powered by Mobilizon." +msgstr "%{instance} работает на платформе Mobilizon." + #: lib/web/templates/email/pending_participation_notification.html.eex:13 #: lib/web/templates/email/pending_participation_notification.text.eex:1 -msgid "A request is pending!" -msgstr "" - #, elixir-format +msgid "A request is pending!" +msgstr "Заявка находится на рассмотрении!" + #: lib/web/templates/email/before_event_notification.html.eex:13 #: lib/web/templates/email/before_event_notification.text.eex:1 -msgid "An event is upcoming!" -msgstr "" - #, elixir-format +msgid "An event is upcoming!" +msgstr "Скоро начало мероприятия!" + #: lib/web/templates/email/email_changed_new.html.eex:13 #: lib/web/templates/email/email_changed_new.text.eex:1 +#, elixir-format msgid "Confirm new email" -msgstr "" +msgstr "Подтвердите новый адрес электронной почты" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:84 +#, elixir-format msgid "End" -msgstr "" +msgstr "Конец" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:21 -msgid "End %{ends_on}" -msgstr "" - #, elixir-format +msgid "End %{ends_on}" +msgstr "Конец %{ends_on}" + #: lib/web/templates/email/event_updated.html.eex:13 #: lib/web/templates/email/event_updated.text.eex:1 +#, elixir-format msgid "Event update!" -msgstr "" +msgstr "Мероприятие обновлено!" -#, elixir-format #: lib/web/templates/email/report.html.eex:88 -msgid "Flagged comments" -msgstr "" - #, elixir-format +msgid "Flagged comments" +msgstr "Помеченные комментарии" + #: lib/web/templates/email/event_participation_approved.html.eex:45 #: lib/web/templates/email/event_participation_approved.text.eex:7 +#, elixir-format msgid "Good news: one of the event organizers just approved your request. Update your calendar, because you're on the guest list now!" msgstr "" +"Хорошие новости: один из организаторов мероприятия только что одобрил вашу " +"заявку. Обновите свой календарь, потому что теперь вы в списке гостей!" -#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:38 #: lib/web/templates/email/email_changed_new.text.eex:3 +#, elixir-format msgid "Hi there! It seems like you wanted to change the email address linked to your account on %{instance}. If you still wish to do so, please click the button below to confirm the change. You will then be able to log in to %{instance} with this new email address." msgstr "" +"Привет! Похоже, вы хотели изменить адрес электронной почты, связанный с " +"вашей учетной записью на %{instance}. Если вы все еще хотите сделать " +"это, нажмите кнопку ниже, чтобы подтвердить изменение. После этого вы " +"сможете войти в %{instance} с новым адресом электронной почты." -#, elixir-format #: lib/web/templates/email/email_changed_old.text.eex:3 +#, elixir-format msgid "Hi there! Just a quick note to confirm that the email address linked to your account on %{host} has been changed from this one to:" msgstr "" +"Привет! Мы просто хотели сообщить вам, что адрес электронной почты, который " +"ранее был связан с вашей учетной записью на %{host}, был изменен с этого на:" +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" +"Если вы не активировали это изменение самостоятельно, вероятно, кто-то " +"получил доступ к вашей учетной записи на %{host}. Войдите в систему и " +"немедленно измените свой пароль. Если вам не удается войти в систему, " +"обратитесь к администратору %{host}." -#, elixir-format #: lib/web/templates/email/password_reset.text.eex:12 +#, elixir-format msgid "If you didn't trigger the change yourself, please ignore this message. Your password won't be changed until you click the link above." msgstr "" +"Если вы не активировали это изменение самостоятельно, проигнорируйте это " +"сообщение. Ваш пароль не будет изменен, пока вы не нажмете ссылку выше." -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:70 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:4 lib/web/templates/email/registration_confirmation.html.eex:45 -msgid "If you didn't trigger this email, you may safely ignore it." -msgstr "Если вы не оставляли запрос, пожалуйста, проигнорируйте данное письмо." - #, elixir-format +msgid "If you didn't trigger this email, you may safely ignore it." +msgstr "" +"Если вы не оставляли этот запрос, пожалуйста, проигнорируйте данное письмо." + #: lib/web/templates/email/before_event_notification.html.eex:63 #: lib/web/templates/email/before_event_notification.text.eex:6 +#, elixir-format msgid "If you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgstr "" +"Если вы хотите отменить свое участие, просто перейдите на страницу " +"мероприятия по ссылке выше и нажмите кнопку « Я участвую »." -#, elixir-format #: lib/web/templates/email/email.html.eex:143 #: lib/web/templates/email/email.text.eex:11 +#, elixir-format msgid "Learn more about Mobilizon here!" -msgstr "Узнать больше о Mobilizon." +msgstr "Узнайте больше о Mobilizon!" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:94 +#, elixir-format msgid "Location" -msgstr "" +msgstr "Место расположения" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:104 -msgid "Location address was removed" -msgstr "" - #, elixir-format +msgid "Location address was removed" +msgstr "Адрес местоположения был удален" + #: lib/web/templates/email/pending_participation_notification.html.eex:51 #: lib/web/templates/email/pending_participation_notification.text.eex:6 -msgid "Manage pending requests" -msgstr "" - #, elixir-format +msgid "Manage pending requests" +msgstr "Управление запросами в ожидании" + #: lib/web/templates/email/registration_confirmation.html.eex:13 #: lib/web/templates/email/registration_confirmation.text.eex:1 +#, elixir-format msgid "Nearly there!" msgstr "Почти готово!" -#, elixir-format #: lib/web/templates/email/email_changed_old.html.eex:13 #: lib/web/templates/email/email_changed_old.text.eex:1 +#, elixir-format msgid "New email confirmation" -msgstr "" +msgstr "Подтверждение нового адреса электронной почты" -#, elixir-format #: lib/web/templates/email/report.html.eex:106 +#, elixir-format msgid "Reasons for report" -msgstr "" +msgstr "Причина жалобы" -#, elixir-format #: lib/web/templates/email/report.html.eex:39 -msgid "Someone on %{instance} reported the following content for you to analyze:" -msgstr "" - #, elixir-format +msgid "Someone on %{instance} reported the following content for you to analyze:" +msgstr "Кто-то на %{instance} сообщил вам о следующем содержимом:" + #: lib/web/templates/email/event_participation_rejected.html.eex:13 #: lib/web/templates/email/event_participation_rejected.text.eex:1 +#, elixir-format msgid "Sorry! You're not going." -msgstr "" +msgstr "Очень жаль! Вы не будете участвовать." -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:74 +#, elixir-format msgid "Start" -msgstr "" +msgstr "Начало" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:18 +#, elixir-format msgid "Start %{begins_on}" -msgstr "" +msgstr "Начало %{begins_on}" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:3 -msgid "There have been changes for %{title} so we'd thought we'd let you know." -msgstr "" - #, elixir-format +msgid "There have been changes for %{title} so we'd thought we'd let you know." +msgstr "В %{title} произошли изменения, поэтому мы решили сообщить вам об этом." + #: lib/web/templates/email/event_updated.html.eex:55 #: lib/web/templates/email/event_updated.text.eex:11 -msgid "This event has been cancelled by its organizers. Sorry!" -msgstr "" - #, elixir-format +msgid "This event has been cancelled by its organizers. Sorry!" +msgstr "Мероприятие отменено организаторами. Очень жаль!" + #: lib/web/templates/email/event_updated.html.eex:51 #: lib/web/templates/email/event_updated.text.eex:7 -msgid "This event has been confirmed" -msgstr "" - #, elixir-format +msgid "This event has been confirmed" +msgstr "Мероприятие подтверждено" + #: lib/web/templates/email/event_updated.html.eex:53 #: lib/web/templates/email/event_updated.text.eex:9 +#, elixir-format msgid "This event has yet to be confirmed: organizers will let you know if they do confirm it." msgstr "" +"Это мероприятие еще не подтверждено: организаторы сообщат вам, если " +"подтвердят его." -#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:45 #: lib/web/templates/email/event_participation_rejected.text.eex:7 +#, elixir-format msgid "Unfortunately, the organizers rejected your request." -msgstr "" +msgstr "К сожалению, организаторы отклонили ваше участие." -#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:51 +#, elixir-format msgid "Verify your email address" -msgstr "" +msgstr "Проверьте свой адрес электронной почты" -#, elixir-format #: lib/web/templates/email/report.html.eex:126 +#, elixir-format msgid "View report" -msgstr "Показать сообщение о проблеме" +msgstr "Смотреть отчёт" -#, elixir-format #: lib/web/templates/email/report.text.eex:24 -msgid "View report:" -msgstr "Показать сообщение о проблеме" - #, elixir-format +msgid "View report:" +msgstr "Смотреть отчёт:" + #: lib/web/templates/email/event_participation_approved.html.eex:58 #: lib/web/templates/email/event_participation_confirmed.html.eex:58 +#, elixir-format msgid "Visit event page" -msgstr "" +msgstr "Посетите страницу мероприятия" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:121 +#, elixir-format msgid "Visit the updated event page" -msgstr "" +msgstr "Посетите обновленную страницу мероприятия" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:23 -msgid "Visit the updated event page: %{link}" -msgstr "" - #, elixir-format +msgid "Visit the updated event page: %{link}" +msgstr "Посетите обновленную страницу мероприятия: %{link}" + #: lib/web/templates/email/notification_each_week.html.eex:13 #: lib/web/templates/email/notification_each_week.text.eex:1 -msgid "What's up this week?" -msgstr "" - #, elixir-format +msgid "What's up this week?" +msgstr "Что будет на этой неделе?" + #: lib/web/templates/email/on_day_notification.html.eex:13 #: lib/web/templates/email/on_day_notification.text.eex:1 -msgid "What's up today?" -msgstr "" - #, elixir-format +msgid "What's up today?" +msgstr "Что будет сегодня?" + #: lib/web/templates/email/event_participation_approved.html.eex:70 #: lib/web/templates/email/event_participation_approved.text.eex:11 lib/web/templates/email/event_participation_confirmed.html.eex:70 #: lib/web/templates/email/event_participation_confirmed.text.eex:6 +#, elixir-format msgid "Would you wish to update or cancel your attendance, simply access the event page through the link above and click on the Attending button." msgstr "" +"Если вы хотите обновить или отменить свое участие, просто перейдите на " +"страницу мероприятия по ссылке выше и нажмите кнопку « Я участвую »." -#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:64 #: lib/web/templates/email/pending_participation_notification.text.eex:8 +#, elixir-format msgid "You are receiving this email because you chose to get notifications for pending attendance requests to your events. You can disable or change your notification settings in your user account settings under « Notifications »." msgstr "" +"Вы получили это письмо, потому что выбрали получение уведомлений об " +"ожидающих запросах на участие в ваших мероприятиях. Вы можете отключить или " +"изменить настройки уведомлений в настройках своей учетной записи в разделе « " +"Уведомления »." -#, elixir-format #: lib/web/templates/email/event_participation_rejected.text.eex:5 -msgid "You issued a request to attend %{title}." -msgstr "" - #, elixir-format +msgid "You issued a request to attend %{title}." +msgstr "Вы подали заявку на участие в %{title}." + #: lib/web/templates/email/event_participation_approved.text.eex:5 #: lib/web/templates/email/event_participation_confirmed.text.eex:3 -msgid "You recently requested to attend %{title}." -msgstr "" - #, elixir-format +msgid "You recently requested to attend %{title}." +msgstr "Вы недавно подали заявку на присоединение к %{title}." + #: lib/web/templates/email/event_participation_approved.html.eex:13 #: lib/web/templates/email/event_participation_confirmed.html.eex:13 lib/web/templates/email/event_participation_confirmed.text.eex:1 -msgid "You're going!" -msgstr "" - #, elixir-format +msgid "You're going!" +msgstr "Вы примете участие!" + #: lib/web/templates/email/email_changed_new.html.eex:64 #: lib/web/templates/email/email_changed_new.text.eex:5 +#, elixir-format msgid "If you didn't trigger the change yourself, please ignore this message." msgstr "" +"Если вы не активировали изменение самостоятельно, проигнорируйте это " +"сообщение." -#, elixir-format #: lib/web/templates/email/email.html.eex:89 -msgid "Please do not use it for real purposes." -msgstr "" - #, elixir-format +msgid "Please do not use it for real purposes." +msgstr "Пожалуйста, используйте это только для тестовых целей." + #: lib/web/templates/email/group_member_removal.html.eex:45 #: lib/web/templates/email/group_member_removal.text.eex:5 +#, elixir-format msgid "If you feel this is an error, you may contact the group's administrators so that they can add you back." msgstr "" +"Если вы считаете, что это ошибка, вы можете связаться с администраторами " +"группы, чтобы они добавили вас обратно." -#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:13 #: lib/web/templates/email/group_member_removal.text.eex:1 +#, elixir-format msgid "So long, and thanks for the fish!" -msgstr "" +msgstr "Всего хорошего, и спасибо за рыбу!" -#, elixir-format #: lib/web/email/group.ex:63 -msgid "You have been removed from group %{group}" -msgstr "" - #, elixir-format +msgid "You have been removed from group %{group}" +msgstr "Вас исключили из группы %{group}" + #: lib/web/templates/email/group_member_removal.text.eex:3 +#, elixir-format msgid "You have been removed from group %{group}. You will not be able to access this group's private content anymore." msgstr "" +"Вас исключили из группы %{group}. Вы больше не сможете получить доступ к " +"приватному контенту этой группы." -#, elixir-format #: lib/web/templates/email/group_invite.html.eex:38 +#, elixir-format msgid "%{inviter} just invited you to join their group %{link_start}%{group}%{link_end}" msgstr "" +"%{inviter} только что пригласил вас присоединиться к их группе " +"%{link_start}%{group}%{link_end}" -#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:38 +#, elixir-format msgid "You have been removed from group %{link_start}%{group}%{link_end}. You will not be able to access this group's private content anymore." msgstr "" +"Вас исключили из группы %{link_start}%{group}%{link_end}. Вы больше " +"не сможете получить доступ к приватному контенту этой группы." -#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:54 #: lib/web/templates/email/group_suspension.text.eex:7 +#, elixir-format msgid "As this group was located on another instance, it will continue to work for other instances than this one." msgstr "" +"Поскольку эта группа находилась на другом узле, она все равно будет работать " +"на других узлах, кроме этого." -#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:46 #: lib/web/templates/email/group_suspension.text.eex:5 +#, elixir-format msgid "As this group was located on this instance, all of it's data has been irretrievably deleted." msgstr "" +"Поскольку эта группа находилась на этом узле, все её содержимое было " +"безвозвратно удалено." -#, elixir-format #: lib/web/templates/email/group_deletion.html.eex:38 #: lib/web/templates/email/group_deletion.text.eex:3 +#, elixir-format msgid "The administrator %{author} deleted group %{group}. All of the group's events, discussions, posts and todos have been deleted." msgstr "" +"Администратор %{author} удалил группу %{group}. Все мероприятия, обсуждения, " +"сообщения и записи связанные с ней были удалены." -#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:13 #: lib/web/templates/email/group_suspension.text.eex:1 -msgid "The group %{group} has been suspended on %{instance}!" -msgstr "" - #, elixir-format +msgid "The group %{group} has been suspended on %{instance}!" +msgstr "Группа %{group} заблокирована на %{instance}!" + #: lib/web/templates/email/group_deletion.html.eex:13 #: lib/web/templates/email/group_deletion.text.eex:1 -msgid "The group %{group} was deleted on %{instance}!" -msgstr "" - #, elixir-format +msgid "The group %{group} was deleted on %{instance}!" +msgstr "Группа %{group} удалена на %{instance}!" + #: lib/web/templates/email/group_suspension.html.eex:38 #: lib/web/templates/email/group_suspension.text.eex:3 +#, elixir-format msgid "Your instance's moderation team has decided to suspend %{group_name} (%{group_address}). You are no longer a member of this group." msgstr "" +"Команда модераторов вашего узла приняла решение приостановить работу " +"%{group_name} (%{group_address}). Вы больше не являетесь участником этой " +"группы." -#, elixir-format #: lib/web/email/group.ex:136 +#, elixir-format msgid "The group %{group} has been deleted on %{instance}" -msgstr "" +msgstr "Группа %{group} удалена на %{instance}" -#, elixir-format #: lib/web/email/group.ex:97 -msgid "The group %{group} has been suspended on %{instance}" -msgstr "" - #, elixir-format +msgid "The group %{group} has been suspended on %{instance}" +msgstr "Группа %{group} заблокирована на %{instance}" + #: lib/web/templates/api/terms.html.eex:24 +#, elixir-format msgctxt "terms" msgid "By accessing or using the Service, this means you agree to be bound by all the terms below. If these terms are in any way unclear, please let us know by contacting %{contact}." msgstr "" +"Посещая или используя этот Сервис, вы соглашаетесь со всеми приведенными " +"ниже условиями. Если некоторые из этих условий вам неясны, сообщите нам об " +"этом, связавшись с %{contact}." -#, elixir-format #: lib/web/templates/api/terms.html.eex:40 +#, elixir-format msgctxt "terms" msgid "For information about how we collect and use information about users of the Service, please check our privacy policy." msgstr "" +"Для получения информации о том, как мы собираем и используем данные о " +"пользователях Сервиса, ознакомьтесь с нашей политикой " +"конфиденциальности." -#, elixir-format #: lib/web/templates/api/terms.html.eex:36 +#, elixir-format msgctxt "terms" msgid "If you continue to use the Service after the revised Terms go into effect, you accept the revised Terms." msgstr "" +"Если вы продолжите использовать Сервис после вступления в силу измененных " +"Условий, значит вы соглашаетесь с ними." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:78 +#, elixir-format msgctxt "terms" msgid "If you delete this information, you need to login again." -msgstr "" +msgstr "Если вы удалите эту информацию, вам придётся снова войти в систему." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:80 +#, elixir-format msgctxt "terms" msgid "If you're not connected, we don't store any information on your device, unless you participate in an event anonymously. In this specific case we store the hash of an unique identifier for the event and participation status in your browser so that we may display participation status. Deleting this information will only stop displaying participation status in your browser." msgstr "" +"Если вы не вошли в систему, мы не храним никакой информации на вашем " +"устройстве, за исключением случая, когда вы участвуете в мероприятии " +"анонимно. В этом конкретном случае в вашем браузере хранится хэш уникального " +"идентификатора мероприятия и статус участия. Удаление этой информации " +"приведет только к прекращению отображения статуса участия в браузере." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:87 +#, elixir-format msgctxt "terms" msgid "Note: This information is stored in your localStorage and not your cookies." msgstr "" +"Примечание: Эта информация хранится в вашем локальном хранилище, а не в " +"куках." -#, elixir-format #: lib/web/templates/api/terms.html.eex:71 +#, elixir-format msgctxt "terms" msgid "Our responsibility" -msgstr "" +msgstr "Наша ответственность" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:61 +#, elixir-format msgctxt "terms" msgid "Retain server logs containing the IP address of all requests to this server, insofar as such logs are kept, no more than 90 days." msgstr "" +"Хранить логи сервера, содержащие IP-адреса всех запросов к этому серверу, " +"если таковые имеются, не более 90 дней." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:3 #: lib/web/templates/api/terms.html.eex:15 +#, elixir-format msgctxt "terms" msgid "Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary to help you understand them better." msgstr "" +"Некоторые термины, технические или иные, используемые в приведенном ниже " +"тексте, могут охватывать трудные для понимания концепции. Мы подготовили глоссарий, чтобы помочь вам лучше их освоить." -#, elixir-format #: lib/web/templates/api/terms.html.eex:45 +#, elixir-format msgctxt "terms" msgid "We are not liable for any loss you may incur as a result of someone else using your email or password, either with or without your knowledge." msgstr "" +"Мы не несем ответственности за любые убытки, которые вы можете понести в " +"результате использования кем-либо вашего адреса электронной почты или " +"пароля, с вашего ведома или без него." -#, elixir-format #: lib/web/templates/api/terms.html.eex:50 +#, elixir-format msgctxt "terms" msgid "We cannot be held responsible should a programming or administrative error make your content visible to a larger audience than intended. Aside from our limited right to your content, you retain all of your rights to the content you post, link and otherwise make available on or through the Service." msgstr "" +"Мы не несем ответственности, если программная или административная ошибка " +"сделает ваш контент видимым для более широкой аудитории, чем предполагалось. " +"Помимо нашего ограниченного права на ваш контент, вы сохраняете все свои " +"права на контент, который вы публикуете, ссылаетесь или иным образом делаете " +"доступным на Сервисе или через него." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:10 +#, elixir-format msgctxt "terms" msgid "We collect information from you when you register on this instance and gather data when you participate in the platform by reading, writing, and interacting with content shared here. If you register on this instance, you will be asked to enter an email address, a password (hashed) and at least an username. Your email address will be verified by an email containing a unique link. Once the link is activated, we know you control that email address. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly. You may however visit this instance without registering." msgstr "" +"Мы собираем информацию о вас, когда вы регистрируетесь на этом узле, и " +"собираем данные, когда вы используете эту платформе, читая, создавая или " +"взаимодействуя с публичным контентом. Если вы зарегистрируетесь на этом " +"узле, вам будет предложено ввести адрес электронной почты, пароль (" +"хранится в хешированном виде) и, как минимум, имя пользователя. Ваш " +"адрес электронной почты будет подтвержден электронным письмом, содержащим " +"уникальную ссылку. Переход по этой ссылке будет являться свидетельством " +"того, что вы контролируете этот почтовый ящик. Вы также можете добавить в " +"свой профиль дополнительную информацию, такую как отображаемое имя и " +"биографию, и загрузить аватарку и логотип. Имя пользователя, " +"отображаемое имя, биография, аватарка и логотип всегда общедоступны. " +"Однако вы можете пользоваться этим узел без регистрации." -#, elixir-format #: lib/web/templates/api/terms.html.eex:30 +#, elixir-format msgctxt "terms" msgid "We reserve the right to modify these Terms at any time. For instance, we may need to change these Terms if we come out with a new feature." msgstr "" +"Мы оставляем за собой право изменять эти Условия в любое время. Например, " +"нам может потребоваться сделать это при добавлении новой функции." -#, elixir-format #: lib/web/templates/api/terms.html.eex:20 +#, elixir-format msgctxt "terms" msgid "When we say “we”, “our”, or “us” in this document, we are referring to the owners, operators and administrators of this Mobilizon instance. The Mobilizon software is provided by the team of Mobilizon contributors, supported by Framasoft, a French not-for-profit organization advocating for Free/Libre Software. Unless explicitly stated, this Mobilizon instance is an independent service using Mobilizon's source code. You may find more information about this instance on the \"About this instance\" page." msgstr "" +"Когда мы говорим «мы», «наш» или «нас» в этом документе, то имеем в виду " +"владельцев, операторов и администраторов данного узла Mobilizon. Программное " +"обеспечение Mobilizon предоставляется командой разработчиков Mobilizon при " +"поддержке Framasoft, французской " +"некоммерческой организации, выступающей за Открытое / Свободное ПО. Если " +"явно не указано иное, этот узел Mobilizon является независимой службой, " +"использующей исходный код Mobilizon. Дополнительную информацию об этом узле " +"можно найти на странице «Об этом узле»." -#, elixir-format #: lib/web/templates/api/terms.html.eex:43 +#, elixir-format msgctxt "terms" msgid "When you create an account you agree to maintain the security and confidentiality of your password and accept all risks of unauthorized access to your account data and any other information you provide to %{instance_name}." msgstr "" +"Создавая учетную запись, вы соглашаетесь обеспечивать безопасность и " +"конфиденциальность своего пароля и принимаете все риски несанкционированного " +"доступа к данным вашей учетной записи и любой другой информации, которую вы " +"предоставляете %{instance_name}." -#, elixir-format #: lib/web/templates/api/terms.html.eex:49 +#, elixir-format msgctxt "terms" msgid "When you post, link or otherwise make available content to the Service, you grant us the right and license to display and distribute your content on or through the Service (including via applications). We may format your content for display throughout the Service, but we will not edit or revise the substance of your content itself. The displaying and distribution of your content happens only according to the visibility rules you have set for the content. We will not modify the visibility of the content you have set." msgstr "" +"Когда вы публикуете, даёте ссылку или иным образом делаете доступным контент " +"для Сервиса, вы предоставляете нам право и лицензию на отображение и " +"распространение вашего контента в Сервисе или через Сервис (в том числе " +"через приложения). Мы можем форматировать ваш контент для отображения в " +"рамках Сервиса, но мы не будем редактировать или пересматривать его " +"содержимое. Отображение и распространение вашего контента происходит только " +"в соответствии с правилами видимости, которые вы установили для него. Мы не " +"будем изменять видимость установленного вами контента." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:19 +#, elixir-format msgctxt "terms" msgid "Your events and comments are delivered to other instances that follow your own, meaning they are delivered to different instances and copies are stored there. When you delete events or comments, this is likewise delivered to these other instances. All interactions related to event features - such as joining an event - or group features - such as managing resources - are federated as well. Please keep in mind that the operators of the instance and any receiving instances may view such messages and information, and that recipients may screenshot, copy or otherwise re-share them." msgstr "" +"Ваши мероприятия и комментарии отправляются на другие узлы, " +"которые подписаны на вас. Это означает, что эти узлы хранят их копии. Когда " +"вы удаляете мероприятия или комментарии, то эти действия также передаются " +"этим узлам. Все взаимодействия, связанные с мероприятиями - например, " +"участие в мероприятии; или групповые функции, такие как управление " +"ресурсами, распространяются аналогично. Имейте в виду, что операторы узла и " +"любые принимающие узлы могут просматривать такие сообщения и информацию, и " +"что получатели могут делать снимки экрана, копировать или иным образом " +"повторно делиться ими." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:99 +#, elixir-format msgctxt "terms" msgid "Your content may be downloaded by other instances in the network. Your public events and comments are delivered to the instances following your own instance. Content created through a group is forwarded to all the instances of all the members of the group, insofar as these members reside on a different instance than this one." msgstr "" +"Ваш контент может быть загружен другими узлами в сети. Ваши публичные " +"мероприятия и комментарии отправляются на узлы, подписанные на этот узел. " +"Групповой контент, отправляется на узлы всех участников группы, если эти " +"участники находятся на отличном от этого узле." -#, elixir-format #: lib/web/templates/email/event_participation_confirmed.text.eex:4 +#, elixir-format msgid "You have confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "" +"Вы подтвердили свое участие. Обновите свой календарь, потому что теперь вы в " +"списке гостей!" -#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:38 #: lib/web/templates/email/event_participation_confirmed.html.eex:38 +#, elixir-format msgid "You recently requested to attend %{title}." -msgstr "" +msgstr "Вы недавно запросили участие в мероприятии %{title}." -#, elixir-format #: lib/web/email/participation.ex:91 +#, elixir-format msgid "Your participation to event %{title} has been confirmed" -msgstr "" +msgstr "Ваше участие в мероприятии %{title} одобрено" -#, elixir-format #: lib/web/templates/email/report.html.eex:41 +#, elixir-format msgid "%{reporter} reported the following content." -msgstr "" -"%{reporter_name} (%{reporter_username}) сообщает о возможных проблемах со " -"следующей информацией." +msgstr "%{reporter} сообщил о следующем содержимом." -#, elixir-format #: lib/web/templates/email/report.text.eex:5 +#, elixir-format msgid "Group %{group} was reported" -msgstr "" +msgstr "Группа %{group} сообщила" -#, elixir-format #: lib/web/templates/email/report.html.eex:51 +#, elixir-format msgid "Group reported" -msgstr "" +msgstr "Группа сообщила" -#, elixir-format #: lib/web/templates/email/report.text.eex:7 +#, elixir-format msgid "Profile %{profile} was reported" -msgstr "" +msgstr "Профиль %{profile} сообщил" -#, elixir-format #: lib/web/templates/email/report.html.eex:56 -msgid "Profile reported" -msgstr "" - #, elixir-format +msgid "Profile reported" +msgstr "Профиль сообщил" + #: lib/web/templates/email/event_participation_confirmed.html.eex:45 +#, elixir-format msgid "You have now confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "" +"Вы подтвердили свое участие. Обновите свой календарь, потому что теперь вы в " +"списке гостей!" -#, elixir-format #: lib/mobilizon/posts/post.ex:94 +#, elixir-format msgid "A text is required for the post" -msgstr "" +msgstr "Для публикации требуется текст" -#, elixir-format #: lib/mobilizon/posts/post.ex:93 +#, elixir-format msgid "A title is required for the post" -msgstr "" +msgstr "Для публикации требуется заголовок" -#, elixir-format #: lib/web/templates/email/instance_follow.text.eex:3 +#, elixir-format msgid "%{name} (%{domain}) just requested to follow your instance." -msgstr "" +msgstr "%{name} (%{domain}) только что попросил подписаться на ваш узел." -#, elixir-format #: lib/web/email/follow.ex:54 -msgid "%{name} requests to follow your instance" -msgstr "" - #, elixir-format +msgid "%{name} requests to follow your instance" +msgstr "%{name} просит подписаться на ваш узел" + #: lib/web/templates/email/instance_follow.html.eex:38 +#, elixir-format msgid "%{name} (%{domain}) just requested to follow your instance. If you accept, this instance will receive all of your instance's public events." msgstr "" +"%{name} (%{domain}) только что просил подписаться на ваш узел. Если " +"вы согласитесь, то этот узел будет получать все публичные события вашего " +"узла." -#, elixir-format #: lib/web/templates/email/instance_follow.text.eex:4 +#, elixir-format msgid "If you accept, this instance will receive all of your public events." msgstr "" +"Если вы согласитесь, то этот узел будет получать все публичные события " +"вашего узла." -#, elixir-format #: lib/web/email/follow.ex:48 +#, elixir-format msgid "Instance %{name} (%{domain}) requests to follow your instance" -msgstr "" +msgstr "Узел %{name} (%{domain}) просит подписаться на ваш узел" -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:66 -msgid "See the federation settings" -msgstr "" - #, elixir-format +msgid "See the federation settings" +msgstr "Смотри настройки федерализации" + #: lib/web/templates/email/instance_follow.html.eex:52 #: lib/web/templates/email/instance_follow.text.eex:6 -msgid "To accept this invitation, head over to the instance's admin settings." -msgstr "" - #, elixir-format +msgid "To accept this invitation, head over to the instance's admin settings." +msgstr "Чтобы принять это приглашение, перейдите в админку узла." + #: lib/web/templates/email/instance_follow.html.eex:13 #: lib/web/templates/email/instance_follow.text.eex:1 -msgid "Want to connect?" -msgstr "" - #, elixir-format +msgid "Want to connect?" +msgstr "Вы хотите подключиться?" + #: lib/web/templates/email/instance_follow.html.eex:45 #: lib/web/templates/email/instance_follow.text.eex:5 +#, elixir-format msgid "Note: %{name} (%{domain}) following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too." msgstr "" +"Примечание: Подписка %{name} (%{domain}) на вас не обязательно означает, что " +"вы подписаны на этот узел, но вы также можете запросить подписку на него." -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:38 +#, elixir-format msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" +"Привет! Вы только что зарегистрировались для участия в этом мероприятии: « " +"%{title} ». Пожалуйста, подтвердите адрес электронной почты, который " +"вы указали:" -#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:38 +#, elixir-format msgid "You issued a request to attend %{title}." -msgstr "" +msgstr "Вы отправили запрос на участие в %{title}." -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:64 -msgid "Event title" -msgstr "Событие" - #, elixir-format +msgid "Event title" +msgstr "Название мероприятия" + #: lib/web/templates/email/event_updated.html.eex:38 +#, elixir-format msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" +"В %{title} были внесены изменения, поэтому мы решили сообщить вам об " +"этом." -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - -#, elixir-format #: lib/web/templates/error/500_page.html.eex:7 +#, elixir-format msgid "This page is not correct" -msgstr "" +msgstr "Эта страница недействительна" +#: lib/web/templates/error/500_page.html.eex:50 #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 msgid "We're sorry, but something went wrong on our end." -msgstr "" +msgstr "Сожалеем, но с нашей стороны что-то пошло не так." -#, elixir-format #: lib/web/templates/email/email.html.eex:88 #: lib/web/templates/email/email.text.eex:4 +#, elixir-format msgid "This is a demonstration site to test Mobilizon." -msgstr "" +msgstr "Это демонстрационный сайт, на котором вы можете опробовать Mobilizon." -#, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 +#, elixir-format msgid "%{name}'s feed" -msgstr "" +msgstr "Лента %{name}" +#: lib/service/export/feed.ex:120 #, elixir-format -#: lib/service/export/feed.ex:77 msgid "%{actor}'s private events feed on %{instance}" -msgstr "" +msgstr "Лента приватных мероприятий от %{actor} на %{instance}" +#: lib/service/export/feed.ex:115 #, elixir-format -#: lib/service/export/feed.ex:72 msgid "%{actor}'s public events feed on %{instance}" -msgstr "" +msgstr "Лента публичных мероприятий от %{actor} на %{instance}" +#: lib/service/export/feed.ex:220 #, elixir-format -#: lib/service/export/feed.ex:203 msgid "Feed for %{email} on %{instance}" +msgstr "Лента для %{email} на %{instance}" + +#: lib/web/templates/error/500_page.html.eex:57 +#, elixir-format +msgid "If the issue persists, you may contact the server administrator at %{contact}." msgstr "" +"Если проблема не исчезнет, вы можете связаться с администратором сервера по " +"адресу %{contact}." + +#: lib/web/templates/error/500_page.html.eex:55 +#, elixir-format +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" +"Если проблема не исчезнет, вы можете попытаться связаться с администратором " +"сервера." + +#: lib/web/templates/error/500_page.html.eex:68 +#, elixir-format +msgid "Technical details" +msgstr "Технические детали" + +#: lib/web/templates/error/500_page.html.eex:52 +#, elixir-format +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "Сервер Mobilizon %{instance} временно недоступен." + +#: lib/service/export/feed.ex:73 +#, elixir-format +msgid "Public feed for %{instance}" +msgstr "Публичная лента для %{instance}" diff --git a/priv/gettext/ru/LC_MESSAGES/errors.po b/priv/gettext/ru/LC_MESSAGES/errors.po index 89e386b17..f33f46ed0 100644 --- a/priv/gettext/ru/LC_MESSAGES/errors.po +++ b/priv/gettext/ru/LC_MESSAGES/errors.po @@ -8,828 +8,889 @@ ## to merge POT files into PO files. msgid "" msgstr "" +"PO-Revision-Date: 2021-03-31 16:01+0000\n" +"Last-Translator: deadmorose \n" +"Language-Team: Russian \n" "Language: ru\n" -"Plural-Forms: nplurals=3\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.5.1\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" -msgstr "" +msgstr "не может быть пустым" msgid "has already been taken" -msgstr "" +msgstr "уже занято" msgid "is invalid" -msgstr "" +msgstr "является недействительным" msgid "must be accepted" -msgstr "" +msgstr "должен быть принят" msgid "has invalid format" -msgstr "" +msgstr "имеет недопустимый формат" msgid "has an invalid entry" -msgstr "" +msgstr "имеет недопустимую запись" msgid "is reserved" -msgstr "" +msgstr "зарезервировано" msgid "does not match confirmation" -msgstr "" +msgstr "не соответствует подтверждению" msgid "is still associated with this entry" -msgstr "" +msgstr "все еще связан с этой записью" msgid "are still associated with this entry" -msgstr "" +msgstr "все еще связаны с этой записью" msgid "should be %{count} character(s)" msgid_plural "should be %{count} character(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должен содержать %{count} символ" +msgstr[1] "должен содержать %{count} символа" +msgstr[2] "должен содержать %{count} символов" msgid "should have %{count} item(s)" msgid_plural "should have %{count} item(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должен содержать %{count} элемент" +msgstr[1] "должен содержать %{count} элемента" +msgstr[2] "должен содержать %{count} элементов" msgid "should be at least %{count} character(s)" msgid_plural "should be at least %{count} character(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должен содержать как минимум %{count} символ" +msgstr[1] "должен содержать как минимум %{count} символа" +msgstr[2] "должен содержать как минимум %{count} символов" msgid "should have at least %{count} item(s)" msgid_plural "should have at least %{count} item(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должен содержать как минимум %{count} элемент" +msgstr[1] "должен содержать как минимум %{count} элемента" +msgstr[2] "должен содержать как минимум %{count} элементов" msgid "should be at most %{count} character(s)" msgid_plural "should be at most %{count} character(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должен содержать не более %{count} символа" +msgstr[1] "должен содержать не более %{count} символов" +msgstr[2] "должен содержать не более %{count} символов" msgid "should have at most %{count} item(s)" msgid_plural "should have at most %{count} item(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должен содержать не более %{count} элемента" +msgstr[1] "должен содержать не более %{count} элементов" +msgstr[2] "должен содержать не более %{count} элементов" msgid "must be less than %{number}" -msgstr "" +msgstr "должно быть меньше чем %{number}" msgid "must be greater than %{number}" -msgstr "" +msgstr "должно быть больше чем %{number}" msgid "must be less than or equal to %{number}" -msgstr "" +msgstr "должно быть меньше или равно %{number}" msgid "must be greater than or equal to %{number}" -msgstr "" +msgstr "должно быть больше или равно %{number}" msgid "must be equal to %{number}" -msgstr "" +msgstr "должно быть равно %{number}" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" -msgstr "" +msgstr "Токен не может быть обновлен" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" -msgstr "" +msgstr "Текущий профиль не является участником этой группы" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" -msgstr "" +msgstr "Текущий профиль не является администратором выбранной группы" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" -msgstr "" +msgstr "Ошибка при сохранении пользовательских настроек" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" -msgstr "" +msgstr "Группа не найдена" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" -msgstr "" +msgstr "Группа с ID %{id} не найдена" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" +"Не удалось пройти аутентификацию. Неверный адрес электронной почты или " +"пароль." #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" -msgstr "" +msgstr "Участник не найден" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" -msgstr "" +msgstr "Профиль модератора не найден" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" +"Не найдено ни одного пользователя для подтверждения с этим адресом " +"электронной почты" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" -msgstr "" +msgstr "Пользователя с этим адресом электронной почты не найдено" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" -msgstr "" +msgstr "Профиль не принадлежит аутентифицированному пользователю" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" -msgstr "" +msgstr "Регистрация не открыта" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" -msgstr "" +msgstr "Текущий пароль неверен" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" -msgstr "" +msgstr "Новый адрес электронной почты недействителен" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" -msgstr "" +msgstr "Новый адрес электронной почты должен отличаться от текущего" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" -msgstr "" +msgstr "Новый пароль должен отличаться от текущего" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" -msgstr "" +msgstr "Введён неверный пароль" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" +"Введенный пароль слишком короткий. Убедитесь, что ваш пароль состоит не " +"менее чем из 6 символов." #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" -msgstr "" +msgstr "Этот пользователь не может сбросить свой пароль" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" -msgstr "" +msgstr "Этот пользователь отключен" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" -msgstr "" +msgstr "Невозможно проверить пользователя" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" -msgstr "" +msgstr "Пользователь уже отключен" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" -msgstr "" +msgstr "Запрошенный пользователь не авторизован" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" -msgstr "" +msgstr "Вы уже являетесь участником этой группы" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" +"Вы не можете покинуть эту группу, потому что вы её единственный администратор" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" -msgstr "" +msgstr "Вы не можете присоединиться к этой группе" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." -msgstr "" +msgstr "Только модератор может просматривать список групп." #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" +"Вам необходимо войти в систему, чтобы изменить свой адрес электронной почты" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы изменить свой пароль" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы удалить группу" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы удалить свою учетную запись" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы присоединиться к группе" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы покинуть группу" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы обновить группу" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" -msgstr "" +msgstr "У вас должен быть существующий токен, чтобы получить токен обновления" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" -msgstr "" +msgstr "Вы слишком рано запросили новое письмо с подтверждением" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" -msgstr "" +msgstr "Ваш адрес электронной почты отсутствует в белом списке" #, elixir-format #: lib/graphql/resolvers/actor.ex:64 lib/graphql/resolvers/actor.ex:94 msgid "Error while performing background task" -msgstr "" +msgstr "Ошибка при выполнении фоновой задачи" #, elixir-format #: lib/graphql/resolvers/actor.ex:27 msgid "No profile found with this ID" -msgstr "" +msgstr "Профиль с этим ID не найден" #, elixir-format #: lib/graphql/resolvers/actor.ex:54 lib/graphql/resolvers/actor.ex:91 msgid "No remote profile found with this ID" -msgstr "" +msgstr "Удалённый профиль с этим ID не найден" #, elixir-format #: lib/graphql/resolvers/actor.ex:69 msgid "Only moderators and administrators can suspend a profile" -msgstr "" +msgstr "Только модераторы и администраторы могут заблокировать профиль" #, elixir-format #: lib/graphql/resolvers/actor.ex:99 msgid "Only moderators and administrators can unsuspend a profile" -msgstr "" +msgstr "Только модераторы и администраторы могут разблокировать профиль" #, elixir-format #: lib/graphql/resolvers/actor.ex:24 msgid "Only remote profiles may be refreshed" -msgstr "" +msgstr "Обновлять можно только удаленные профили" #, elixir-format #: lib/graphql/resolvers/actor.ex:61 msgid "Profile already suspended" -msgstr "" +msgstr "Профиль уже заблокирован" #, elixir-format #: lib/graphql/resolvers/participant.ex:92 msgid "A valid email is required by your instance" -msgstr "" +msgstr "Вашему узлу требуется действующий адрес электронной почты" #, elixir-format #: lib/graphql/resolvers/participant.ex:86 msgid "Anonymous participation is not enabled" -msgstr "" +msgstr "Анонимное участие не разрешено" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" -msgstr "" +msgstr "Невозможно удалить последнего администратора группы" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" -msgstr "" +msgstr "Единственный идентификатор пользователя не может быть удален" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" -msgstr "" +msgstr "Комментарий уже удалён" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" -msgstr "" +msgstr "Обсуждение не найдено" #, elixir-format #: lib/graphql/resolvers/report.ex:58 lib/graphql/resolvers/report.ex:77 msgid "Error while saving report" -msgstr "" +msgstr "При сохранении отчёта произошла ошибка" #, elixir-format #: lib/graphql/resolvers/report.ex:96 msgid "Error while updating report" -msgstr "" +msgstr "При обновлении отчёта произошла ошибка" #, elixir-format #: lib/graphql/resolvers/participant.ex:127 msgid "Event id not found" -msgstr "" +msgstr "Не найден id мероприятия" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" -msgstr "" +msgstr "Мероприятие не найдено" #, elixir-format #: lib/graphql/resolvers/participant.ex:83 #: lib/graphql/resolvers/participant.ex:124 lib/graphql/resolvers/participant.ex:156 msgid "Event with this ID %{id} doesn't exist" -msgstr "" +msgstr "Мероприятия с ID %{id} не существует" #, elixir-format #: lib/graphql/resolvers/participant.ex:99 msgid "Internal Error" -msgstr "" +msgstr "Внутренняя ошибка" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" -msgstr "" +msgstr "Обсуждения с ID %{id} нет" #, elixir-format #: lib/graphql/resolvers/todos.ex:78 lib/graphql/resolvers/todos.ex:168 msgid "No profile found for user" -msgstr "" +msgstr "Профиль пользователя не найден" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" -msgstr "" +msgstr "Такого токена ленты не существует" #, elixir-format #: lib/graphql/resolvers/participant.ex:237 msgid "Participant already has role %{role}" -msgstr "" +msgstr "У участника уже есть роль %{role}" #, elixir-format #: lib/graphql/resolvers/participant.ex:169 #: lib/graphql/resolvers/participant.ex:198 lib/graphql/resolvers/participant.ex:230 #: lib/graphql/resolvers/participant.ex:240 msgid "Participant not found" -msgstr "" +msgstr "Участник не найден" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" -msgstr "" +msgstr "Человек с ID %{id} не найден" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" -msgstr "" +msgstr "Не найдено человека с именем пользователя %{username}" #, elixir-format #: lib/graphql/resolvers/post.ex:167 lib/graphql/resolvers/post.ex:200 msgid "Post ID is not a valid ID" -msgstr "" +msgstr "ID поста имеет недопустимое значение" #, elixir-format #: lib/graphql/resolvers/post.ex:170 lib/graphql/resolvers/post.ex:203 msgid "Post doesn't exist" -msgstr "" +msgstr "Пост не существует" #, elixir-format #: lib/graphql/resolvers/member.ex:83 msgid "Profile invited doesn't exist" -msgstr "" +msgstr "Приглашенный профиль не существует" #, elixir-format #: lib/graphql/resolvers/member.ex:92 lib/graphql/resolvers/member.ex:96 msgid "Profile is already a member of this group" -msgstr "" +msgstr "Профиль уже является участником этой группы" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" -msgstr "" +msgstr "Профиль не является членом группы" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" -msgstr "" - -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" +msgstr "Профиль не найден" #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" -msgstr "" +msgstr "Отчёт не найден" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" -msgstr "" +msgstr "Ресурс не существует" #, elixir-format #: lib/graphql/resolvers/participant.ex:120 msgid "The event has already reached its maximum capacity" msgstr "" +"В мероприятии уже зарегистрировано максимально разрешённое количество " +"участников" #, elixir-format #: lib/graphql/resolvers/participant.ex:260 msgid "This token is invalid" -msgstr "" +msgstr "Этот токен недействителен" #, elixir-format #: lib/graphql/resolvers/todos.ex:165 lib/graphql/resolvers/todos.ex:219 msgid "Todo doesn't exist" -msgstr "" +msgstr "Такого пункта в списке дел не существует" #, elixir-format #: lib/graphql/resolvers/todos.ex:75 lib/graphql/resolvers/todos.ex:191 #: lib/graphql/resolvers/todos.ex:216 msgid "Todo list doesn't exist" -msgstr "" +msgstr "Списка дел не существует" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" -msgstr "" +msgstr "Токен не существует" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" -msgstr "" +msgstr "Токен не является допустимым UUID" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" -msgstr "" +msgstr "Пользователь не найден" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" -msgstr "" +msgstr "У вас уже есть профиль для этого пользователя" #, elixir-format #: lib/graphql/resolvers/participant.ex:130 msgid "You are already a participant of this event" -msgstr "" - -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" +msgstr "Вы уже являетесь участником этого мероприятия" #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" -msgstr "" +msgstr "Вы не состоите в этой группе" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" -msgstr "" +msgstr "Вы не модератор и не администратор этой группы" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" -msgstr "" +msgstr "Вы не можете создать комментарий при отсутствии подключения" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:41 msgid "You are not allowed to create a feed token if not connected" -msgstr "" +msgstr "Вы не можете создать токен ленты при отсутствии подключения" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" -msgstr "" +msgstr "Вы не можете удалить комментарий при отсутствии подключения" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" -msgstr "" +msgstr "Вы не можете удалить токен ленты при отсутствии подключения" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" -msgstr "" +msgstr "Вы не можете обновить комментарий при отсутствии подключения" #, elixir-format #: lib/graphql/resolvers/participant.ex:163 #: lib/graphql/resolvers/participant.ex:192 msgid "You can't leave event because you're the only event creator participant" msgstr "" +"Вы не можете покинуть мероприятие, потому что являетесь единственным " +"участником, создавшим его" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" +"Вы не можете назначить себе роль с меньшими правами для этой группы, потому " +"что вы единственный администратор" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" -msgstr "" +msgstr "Вы не можете удалить этот комментарий" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" -msgstr "" +msgstr "Вы не можете удалить это мероприятие" #, elixir-format #: lib/graphql/resolvers/member.ex:89 msgid "You cannot invite to this group" -msgstr "" +msgstr "Вы не можете приглашать в эту группу" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" -msgstr "" +msgstr "У вас нет прав на удаление этого токена" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" +"Для доступа к журналу активности вы должны войти в систему и иметь права " +"модератора" #, elixir-format #: lib/graphql/resolvers/report.ex:26 msgid "You need to be logged-in and a moderator to list reports" msgstr "" +"Для доступа к списку отчётов вы должны войти в систему и иметь права " +"модератора" #, elixir-format #: lib/graphql/resolvers/report.ex:101 msgid "You need to be logged-in and a moderator to update a report" msgstr "" +"Для обновления отчёта вы должны войти в систему и иметь права модератора" #, elixir-format #: lib/graphql/resolvers/report.ex:41 msgid "You need to be logged-in and a moderator to view a report" -msgstr "" +msgstr "Для просмотра отчёта вы должны войти в систему и иметь права модератора" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" +"Для доступа в админку вы должны войти в систему и иметь права администратора" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" +"Для доступа к панели со статистикой вы должны войти в систему и иметь права " +"администратора" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" +"Для сохранения настроек в админке вы должны войти в систему и иметь права " +"администратора" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы получить доступ к обсуждениям" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы получить доступ к ресурсам" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" +"Вам необходимо войти в систему, чтобы иметь возможность создавать мероприятия" #, elixir-format #: lib/graphql/resolvers/post.ex:140 msgid "You need to be logged-in to create posts" msgstr "" +"Вам необходимо войти в систему, чтобы иметь возможность создавать публикации" #, elixir-format #: lib/graphql/resolvers/report.ex:74 msgid "You need to be logged-in to create reports" msgstr "" +"Вам необходимо войти в систему, чтобы иметь возможность создавать отчёты" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" +"Вам необходимо войти в систему, чтобы иметь возможность создавать ресурсы" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" +"Вам необходимо войти в систему, чтобы иметь возможность удалить мероприятие" #, elixir-format #: lib/graphql/resolvers/post.ex:211 msgid "You need to be logged-in to delete posts" msgstr "" +"Вам необходимо войти в систему, чтобы иметь возможность удалять публикации" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы иметь возможность удалять ресурсы" #, elixir-format #: lib/graphql/resolvers/participant.ex:104 msgid "You need to be logged-in to join an event" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы присоединиться к мероприятию" #, elixir-format #: lib/graphql/resolvers/participant.ex:203 msgid "You need to be logged-in to leave an event" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы покинуть мероприятие" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" -msgstr "" +msgstr "Вам необходимо войти в систему, чтобы обновить мероприятие" #, elixir-format #: lib/graphql/resolvers/post.ex:178 msgid "You need to be logged-in to update posts" msgstr "" +"Вам необходимо войти в систему, чтобы иметь возможность обновлять публикации" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" +"Вам необходимо войти в систему, чтобы иметь возможность обновлять ресурсы" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" +"Вам необходимо войти в систему, чтобы получить доступ к предпросмотру " +"ресурсов" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" -msgstr "" +msgstr "Родительский ресурс не принадлежит к этой группе" #, elixir-format #: lib/mobilizon/users/user.ex:109 msgid "The chosen password is too short." -msgstr "" +msgstr "Выбран слишком короткий пароль." #, elixir-format #: lib/mobilizon/users/user.ex:138 msgid "The registration token is already in use, this looks like an issue on our side." msgstr "" +"Регистрационный токен уже используется. Похоже, что проблема с нашей стороны." #, elixir-format #: lib/mobilizon/users/user.ex:104 msgid "This email is already used." -msgstr "" +msgstr "Этот электронный адрес уже используется." #, elixir-format #: lib/graphql/error.ex:88 msgid "Post not found" -msgstr "" +msgstr "Пост не найден" #, elixir-format #: lib/graphql/error.ex:75 msgid "Invalid arguments passed" -msgstr "" +msgstr "Переданы неверные аргументы" #, elixir-format #: lib/graphql/error.ex:81 msgid "Invalid credentials" -msgstr "" +msgstr "Неверные учётные данные" #, elixir-format #: lib/graphql/error.ex:79 msgid "Reset your password to login" -msgstr "" +msgstr "Сбросьте пароль для входа в систему" #, elixir-format #: lib/graphql/error.ex:86 lib/graphql/error.ex:91 msgid "Resource not found" -msgstr "" +msgstr "Ресурс не найден" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" -msgstr "" +msgstr "Что-то пошло не так" #, elixir-format #: lib/graphql/error.ex:74 msgid "Unknown Resource" -msgstr "" +msgstr "Неизвестный ресурс" #, elixir-format #: lib/graphql/error.ex:84 msgid "You don't have permission to do this" -msgstr "" +msgstr "У вас недостаточно для этого прав" #, elixir-format #: lib/graphql/error.ex:76 msgid "You need to be logged in" -msgstr "" +msgstr "Вам необходимо войти в систему" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." -msgstr "" +msgstr "Вы не можете принять это приглашение из этого профиля." #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." -msgstr "" +msgstr "Вы не можете отклонить это приглашение из этого профиля." #, elixir-format #: lib/graphql/resolvers/media.ex:62 msgid "File doesn't have an allowed MIME type." -msgstr "" +msgstr "Файл не имеет разрешенного MIME-типа." #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" -msgstr "" +msgstr "Профиль не является администратором группы" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." -msgstr "" +msgstr "Вы не можете редактировать это мероприятие." #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." -msgstr "" +msgstr "Вы не можете назначить это мероприятие этому профилю." #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." -msgstr "" +msgstr "Такого приглашения не существует." #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." -msgstr "" +msgstr "Этот участник уже был отклонён." #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." -msgstr "" +msgstr "У вас нет прав на удаление этого участника." #, elixir-format #: lib/mobilizon/actors/actor.ex:351 msgid "This username is already taken." -msgstr "" +msgstr "Это имя пользователя уже занято." #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" +"Вы должны предоставить либо ID, либо короткое имя для доступа к обсуждению" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" -msgstr "" +msgstr "Профиль организатора не принадлежит пользователю" #, elixir-format #: lib/graphql/resolvers/participant.ex:89 msgid "Profile ID provided is not the anonymous profile one" -msgstr "" +msgstr "Указанный ID профиля не является анонимным" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" -msgstr "" +msgstr "Предоставленное изображение слишком большое" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "Индексный файл не найден. Вам нужно пересобрать фронтенд." + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "При создании ресурса произошла ошибка" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "Неверный токен активации" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "Невозможно получить сведения о ресурсе по этому URL-адресу." + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "Указанный профиль модератора не имеет доступа к этому событию" diff --git a/priv/gettext/sv/LC_MESSAGES/default.po b/priv/gettext/sv/LC_MESSAGES/default.po index 871d34f37..4053509fb 100644 --- a/priv/gettext/sv/LC_MESSAGES/default.po +++ b/priv/gettext/sv/LC_MESSAGES/default.po @@ -859,8 +859,8 @@ msgid "Hi there! Just a quick note to confirm that the email address linked to y msgstr "" #, elixir-format -#: lib/web/templates/email/email_changed_old.html.eex:41 -#: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#: lib/web/templates/email/email_changed_old.html.eex:62 +#: lib/web/templates/email/email_changed_old.text.eex:5 msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" @@ -1370,18 +1370,13 @@ msgid "There have been changes for %{title} so we'd thought we'd let you msgstr "Det har skett ändringar kring %{title} som vi misstänker att du vill " "känna till." -#, elixir-format -#: lib/web/templates/error/500_page.html.eex:46 -msgid "The Mobilizon server seems to be temporarily down." -msgstr "" - #, elixir-format #: lib/web/templates/error/500_page.html.eex:7 msgid "This page is not correct" msgstr "" #, elixir-format -#: lib/web/templates/error/500_page.html.eex:45 +#: lib/web/templates/error/500_page.html.eex:50 msgid "We're sorry, but something went wrong on our end." msgstr "" @@ -1394,20 +1389,46 @@ msgstr "" #, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 msgid "%{name}'s feed" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:77 +#: lib/service/export/feed.ex:120 msgid "%{actor}'s private events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:72 +#: lib/service/export/feed.ex:115 msgid "%{actor}'s public events feed on %{instance}" msgstr "" #, elixir-format -#: lib/service/export/feed.ex:203 +#: lib/service/export/feed.ex:220 msgid "Feed for %{email} on %{instance}" msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:57 +msgid "If the issue persists, you may contact the server administrator at %{contact}." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:55 +msgid "If the issue persists, you may try to contact the server administrator." +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:68 +msgid "Technical details" +msgstr "" + +#, elixir-format +#: lib/web/templates/error/500_page.html.eex:52 +msgid "The Mobilizon server %{instance} seems to be temporarily down." +msgstr "" + +#, elixir-format +#: lib/service/export/feed.ex:73 +msgid "Public feed for %{instance}" +msgstr "" diff --git a/priv/gettext/sv/LC_MESSAGES/errors.po b/priv/gettext/sv/LC_MESSAGES/errors.po index 1e98d7cb2..9b9c6db76 100644 --- a/priv/gettext/sv/LC_MESSAGES/errors.po +++ b/priv/gettext/sv/LC_MESSAGES/errors.po @@ -18,6 +18,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.1\n" +#: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" msgstr "får inte lämnas tomt" @@ -94,198 +95,199 @@ msgid "must be equal to %{number}" msgstr "måste vara lika med %{number}" #, elixir-format -#: lib/graphql/resolvers/user.ex:103 +#: lib/graphql/resolvers/user.ex:100 msgid "Cannot refresh the token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:195 +#: lib/graphql/resolvers/group.ex:206 msgid "Current profile is not a member of this group" msgstr "Den nuvarande profilen är inte med i den här gruppen" #, elixir-format -#: lib/graphql/resolvers/group.ex:199 +#: lib/graphql/resolvers/group.ex:210 msgid "Current profile is not an administrator of the selected group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:512 +#: lib/graphql/resolvers/user.ex:501 msgid "Error while saving user settings" msgstr "Ett fel uppstod när användarinställningarna skulle sparas" #, elixir-format -#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192 -#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80 +#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:203 +#: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 msgid "Group not found" msgstr "Gruppen kunde inte hittas" #, elixir-format -#: lib/graphql/resolvers/group.ex:63 +#: lib/graphql/resolvers/group.ex:68 msgid "Group with ID %{id} not found" msgstr "Gruppen med %{id} kunde inte hittas" #, elixir-format -#: lib/graphql/resolvers/user.ex:83 +#: lib/graphql/resolvers/user.ex:80 msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:255 +#: lib/graphql/resolvers/group.ex:266 msgid "Member not found" msgstr "" #, elixir-format #: lib/graphql/resolvers/actor.ex:58 lib/graphql/resolvers/actor.ex:88 -#: lib/graphql/resolvers/user.ex:417 +#: lib/graphql/resolvers/user.ex:406 msgid "No profile found for the moderator user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:195 +#: lib/graphql/resolvers/user.ex:193 msgid "No user to validate with this email was found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219 +#: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:218 msgid "No user with this email was found" msgstr "" #, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 -#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195 -#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315 +#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 +#: lib/graphql/resolvers/person.ex:278 lib/graphql/resolvers/person.ex:307 lib/graphql/resolvers/person.ex:334 +#: lib/graphql/resolvers/person.ex:346 msgid "Profile is not owned by authenticated user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:125 +#: lib/graphql/resolvers/user.ex:123 msgid "Registrations are not open" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:330 +#: lib/graphql/resolvers/user.ex:331 msgid "The current password is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:382 +#: lib/graphql/resolvers/user.ex:376 msgid "The new email doesn't seem to be valid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:379 +#: lib/graphql/resolvers/user.ex:373 msgid "The new email must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:333 +#: lib/graphql/resolvers/user.ex:334 msgid "The new password must be different" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:376 lib/graphql/resolvers/user.ex:439 -#: lib/graphql/resolvers/user.ex:442 +#: lib/graphql/resolvers/user.ex:370 lib/graphql/resolvers/user.ex:428 +#: lib/graphql/resolvers/user.ex:431 msgid "The password provided is invalid" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:337 +#: lib/graphql/resolvers/user.ex:338 msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:215 +#: lib/graphql/resolvers/user.ex:214 msgid "This user can't reset their password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:79 +#: lib/graphql/resolvers/user.ex:76 msgid "This user has been disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:179 +#: lib/graphql/resolvers/user.ex:177 msgid "Unable to validate user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:420 +#: lib/graphql/resolvers/user.ex:409 msgid "User already disabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:487 +#: lib/graphql/resolvers/user.ex:476 msgid "User requested is not logged-in" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:229 +#: lib/graphql/resolvers/group.ex:240 msgid "You are already a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:262 +#: lib/graphql/resolvers/group.ex:273 msgid "You can't leave this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:226 +#: lib/graphql/resolvers/group.ex:237 msgid "You cannot join this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:91 +#: lib/graphql/resolvers/group.ex:96 msgid "You may not list groups unless moderator." msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:387 +#: lib/graphql/resolvers/user.ex:381 msgid "You need to be logged-in to change your email" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:345 +#: lib/graphql/resolvers/user.ex:346 msgid "You need to be logged-in to change your password" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:204 +#: lib/graphql/resolvers/group.ex:215 msgid "You need to be logged-in to delete a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:447 +#: lib/graphql/resolvers/user.ex:436 msgid "You need to be logged-in to delete your account" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:234 +#: lib/graphql/resolvers/group.ex:245 msgid "You need to be logged-in to join a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:267 +#: lib/graphql/resolvers/group.ex:278 msgid "You need to be logged-in to leave a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/group.ex:180 msgid "You need to be logged-in to update a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:108 +#: lib/graphql/resolvers/user.ex:105 msgid "You need to have an existing token to get a refresh token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:198 lib/graphql/resolvers/user.ex:222 +#: lib/graphql/resolvers/user.ex:196 lib/graphql/resolvers/user.ex:221 msgid "You requested again a confirmation email too soon" msgstr "" #, elixir-format -#: lib/graphql/resolvers/user.ex:128 +#: lib/graphql/resolvers/user.ex:126 msgid "Your email is not on the allowlist" msgstr "" @@ -335,22 +337,22 @@ msgid "Anonymous participation is not enabled" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:192 +#: lib/graphql/resolvers/person.ex:196 msgid "Cannot remove the last administrator of a group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:189 +#: lib/graphql/resolvers/person.ex:193 msgid "Cannot remove the last identity of a user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:105 +#: lib/graphql/resolvers/comment.ex:108 msgid "Comment is already deleted" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:62 +#: lib/graphql/error.ex:92 lib/graphql/resolvers/discussion.ex:62 msgid "Discussion not found" msgstr "" @@ -370,8 +372,8 @@ msgid "Event id not found" msgstr "" #, elixir-format -#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236 -#: lib/graphql/resolvers/event.ex:280 +#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:281 +#: lib/graphql/resolvers/event.ex:325 msgid "Event not found" msgstr "" @@ -387,7 +389,7 @@ msgid "Internal Error" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:186 +#: lib/graphql/resolvers/discussion.ex:202 msgid "No discussion with ID %{id}" msgstr "" @@ -397,7 +399,7 @@ msgid "No profile found for user" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:63 +#: lib/graphql/resolvers/feed_token.ex:64 msgid "No such feed token" msgstr "" @@ -414,12 +416,12 @@ msgid "Participant not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:29 +#: lib/graphql/resolvers/person.ex:30 msgid "Person with ID %{id} not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:51 +#: lib/graphql/resolvers/person.ex:52 msgid "Person with username %{username} not found" msgstr "" @@ -445,30 +447,25 @@ msgstr "" #, elixir-format #: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173 -#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124 -#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 lib/graphql/resolvers/todos.ex:57 +#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 +#: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 msgid "Profile is not member of group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186 +#: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 msgid "Profile not found" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234 -msgid "Provided moderator profile doesn't have permission on this event" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/report.ex:36 msgid "Report not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:150 lib/graphql/resolvers/resource.ex:179 +#: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 msgid "Resource doesn't exist" msgstr "" @@ -494,22 +491,22 @@ msgid "Todo list doesn't exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:69 +#: lib/graphql/resolvers/feed_token.ex:73 msgid "Token does not exist" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:66 +#: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 msgid "Token is not a valid UUID" msgstr "" #, elixir-format -#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331 +#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:362 msgid "User not found" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:252 +#: lib/graphql/resolvers/person.ex:257 msgid "You already have a profile for this user" msgstr "" @@ -518,23 +515,18 @@ msgstr "" msgid "You are already a participant of this event" msgstr "" -#, elixir-format -#: lib/graphql/resolvers/discussion.ex:190 -msgid "You are not a member of the group the discussion belongs to" -msgstr "" - #, elixir-format #: lib/graphql/resolvers/member.ex:86 msgid "You are not a member of this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:151 +#: lib/graphql/resolvers/member.ex:149 msgid "You are not a moderator or admin for this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:51 +#: lib/graphql/resolvers/comment.ex:54 msgid "You are not allowed to create a comment if not connected" msgstr "" @@ -544,17 +536,17 @@ msgid "You are not allowed to create a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:110 +#: lib/graphql/resolvers/comment.ex:113 msgid "You are not allowed to delete a comment if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:78 +#: lib/graphql/resolvers/feed_token.ex:82 msgid "You are not allowed to delete a feed token if not connected" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:73 +#: lib/graphql/resolvers/comment.ex:76 msgid "You are not allowed to update a comment if not connected" msgstr "" @@ -565,17 +557,17 @@ msgid "You can't leave event because you're the only event creator participant" msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:155 +#: lib/graphql/resolvers/member.ex:153 msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" #, elixir-format -#: lib/graphql/resolvers/comment.ex:101 +#: lib/graphql/resolvers/comment.ex:104 msgid "You cannot delete this comment" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:276 +#: lib/graphql/resolvers/event.ex:321 msgid "You cannot delete this event" msgstr "" @@ -585,12 +577,12 @@ msgid "You cannot invite to this group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/feed_token.ex:72 +#: lib/graphql/resolvers/feed_token.ex:76 msgid "You don't have permission to delete this token" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:52 +#: lib/graphql/resolvers/admin.ex:53 msgid "You need to be logged-in and a moderator to list action logs" msgstr "" @@ -610,32 +602,32 @@ msgid "You need to be logged-in and a moderator to view a report" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:236 +#: lib/graphql/resolvers/admin.ex:237 msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:221 +#: lib/graphql/resolvers/admin.ex:222 msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" #, elixir-format -#: lib/graphql/resolvers/admin.ex:260 +#: lib/graphql/resolvers/admin.ex:261 msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:76 +#: lib/graphql/resolvers/discussion.ex:77 msgid "You need to be logged-in to access discussions" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:93 +#: lib/graphql/resolvers/resource.ex:94 msgid "You need to be logged-in to access resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:211 +#: lib/graphql/resolvers/event.ex:256 msgid "You need to be logged-in to create events" msgstr "" @@ -650,12 +642,12 @@ msgid "You need to be logged-in to create reports" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:129 +#: lib/graphql/resolvers/resource.ex:133 msgid "You need to be logged-in to create resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:285 +#: lib/graphql/resolvers/event.ex:330 msgid "You need to be logged-in to delete an event" msgstr "" @@ -665,7 +657,7 @@ msgid "You need to be logged-in to delete posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:187 +#: lib/graphql/resolvers/resource.ex:191 msgid "You need to be logged-in to delete resources" msgstr "" @@ -680,7 +672,7 @@ msgid "You need to be logged-in to leave an event" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:250 +#: lib/graphql/resolvers/event.ex:295 msgid "You need to be logged-in to update an event" msgstr "" @@ -690,17 +682,17 @@ msgid "You need to be logged-in to update posts" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:158 +#: lib/graphql/resolvers/resource.ex:162 msgid "You need to be logged-in to update resources" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:210 +#: lib/graphql/resolvers/resource.ex:218 msgid "You need to be logged-in to view a resource preview" msgstr "" #, elixir-format -#: lib/graphql/resolvers/resource.ex:121 +#: lib/graphql/resolvers/resource.ex:125 msgid "Parent resource doesn't belong to this group" msgstr "" @@ -745,7 +737,7 @@ msgid "Resource not found" msgstr "Resursen kunde inte hittas" #, elixir-format -#: lib/graphql/error.ex:92 +#: lib/graphql/error.ex:93 msgid "Something went wrong" msgstr "" @@ -765,12 +757,12 @@ msgid "You need to be logged in" msgstr "Du måste vara inloggad" #, elixir-format -#: lib/graphql/resolvers/member.ex:116 +#: lib/graphql/resolvers/member.ex:114 msgid "You can't accept this invitation with this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:134 +#: lib/graphql/resolvers/member.ex:132 msgid "You can't reject this invitation with this profile." msgstr "" @@ -780,32 +772,32 @@ msgid "File doesn't have an allowed MIME type." msgstr "" #, elixir-format -#: lib/graphql/resolvers/group.ex:164 +#: lib/graphql/resolvers/group.ex:175 msgid "Profile is not administrator for the group" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:239 +#: lib/graphql/resolvers/event.ex:284 msgid "You can't edit this event." msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:242 +#: lib/graphql/resolvers/event.ex:287 msgid "You can't attribute this event to this profile." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:137 +#: lib/graphql/resolvers/member.ex:135 msgid "This invitation doesn't exist." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:179 +#: lib/graphql/resolvers/member.ex:177 msgid "This member already has been rejected." msgstr "" #, elixir-format -#: lib/graphql/resolvers/member.ex:186 +#: lib/graphql/resolvers/member.ex:184 msgid "You don't have the right to remove this member." msgstr "" @@ -815,12 +807,12 @@ msgid "This username is already taken." msgstr "" #, elixir-format -#: lib/graphql/resolvers/discussion.ex:73 +#: lib/graphql/resolvers/discussion.ex:74 msgid "You must provide either an ID or a slug to access a discussion" msgstr "" #, elixir-format -#: lib/graphql/resolvers/event.ex:200 +#: lib/graphql/resolvers/event.ex:245 msgid "Organizer profile is not owned by the user" msgstr "" @@ -830,7 +822,32 @@ msgid "Profile ID provided is not the anonymous profile one" msgstr "" #, elixir-format -#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155 -#: lib/graphql/resolvers/person.ex:246 +#: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 +#: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 msgid "The provided picture is too heavy" msgstr "" + +#, elixir-format +#: lib/web/views/utils.ex:33 +msgid "Index file not found. You need to recompile the front-end." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:122 +msgid "Error while creating resource" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/user.ex:390 +msgid "Invalid activation token" +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/resource.ex:208 +msgid "Unable to fetch resource details from this URL." +msgstr "" + +#, elixir-format +#: lib/graphql/resolvers/event.ex:145 lib/graphql/resolvers/participant.ex:234 +msgid "Provided profile doesn't have moderator permissions on this event" +msgstr "" diff --git a/priv/repo/migrations/20210127153325_upgrade_oban_jobs_to_v10.exs b/priv/repo/migrations/20210127153325_upgrade_oban_jobs_to_v10.exs new file mode 100644 index 000000000..4b69af253 --- /dev/null +++ b/priv/repo/migrations/20210127153325_upgrade_oban_jobs_to_v10.exs @@ -0,0 +1,6 @@ +defmodule Mobilizon.Storage.Repo.Migrations.UpgradeObanJobsToV10 do + use Ecto.Migration + + defdelegate up, to: Oban.Migrations + defdelegate down, to: Oban.Migrations +end diff --git a/priv/repo/migrations/20210210143432_add_location_settings_to_user.exs b/priv/repo/migrations/20210210143432_add_location_settings_to_user.exs new file mode 100644 index 000000000..8513ce9f4 --- /dev/null +++ b/priv/repo/migrations/20210210143432_add_location_settings_to_user.exs @@ -0,0 +1,9 @@ +defmodule Mobilizon.Storage.Repo.Migrations.AddLocationSettingsToUser do + use Ecto.Migration + + def change do + alter table(:user_settings) do + add(:location, :map) + end + end +end diff --git a/priv/repo/migrations/20210215092515_add_activity_table.exs b/priv/repo/migrations/20210215092515_add_activity_table.exs new file mode 100644 index 000000000..6c14c3566 --- /dev/null +++ b/priv/repo/migrations/20210215092515_add_activity_table.exs @@ -0,0 +1,20 @@ +defmodule Mobilizon.Storage.Repo.Migrations.AddActivityTable do + use Ecto.Migration + + def change do + create table(:activities) do + add(:priority, :integer, null: false) + add(:type, :string, null: false) + add(:author_id, references(:actors, on_delete: :delete_all), null: false) + add(:group_id, references(:actors, on_delete: :delete_all), null: false) + add(:subject, :string, null: false) + add(:subject_params, :map, null: false) + add(:message, :string) + add(:message_params, :map) + add(:object_type, :string) + add(:object_id, :string) + + timestamps(updated_at: false, type: :utc_datetime) + end + end +end diff --git a/priv/repo/migrations/20210217164549_add_member_since_to_members.exs b/priv/repo/migrations/20210217164549_add_member_since_to_members.exs new file mode 100644 index 000000000..d4eaaf118 --- /dev/null +++ b/priv/repo/migrations/20210217164549_add_member_since_to_members.exs @@ -0,0 +1,34 @@ +defmodule Mobilizon.Storage.Repo.Migrations.AddMemberSinceToMembers do + use Ecto.Migration + + def up do + alter table(:members) do + add(:member_since, :utc_datetime) + end + + flush() + + %Postgrex.Result{rows: rows} = + Ecto.Adapters.SQL.query!( + Mobilizon.Storage.Repo, + "SELECT id, role FROM members" + ) + + Enum.each(rows, fn [id, role] -> + if role in ["member", "moderator", "administrator", "creator"] do + Ecto.Adapters.SQL.query!( + Mobilizon.Storage.Repo, + "UPDATE members SET member_since = '#{DateTime.to_iso8601(DateTime.utc_now())}' WHERE id = '#{ + Ecto.UUID.cast!(id) + }'" + ) + end + end) + end + + def down do + alter table(:members) do + remove(:member_since) + end + end +end diff --git a/priv/repo/migrations/20210310084210_add_indexes_to_activities.exs b/priv/repo/migrations/20210310084210_add_indexes_to_activities.exs new file mode 100644 index 000000000..06faf47bf --- /dev/null +++ b/priv/repo/migrations/20210310084210_add_indexes_to_activities.exs @@ -0,0 +1,8 @@ +defmodule Mobilizon.Storage.Repo.Migrations.AddIndexesToActivities do + use Ecto.Migration + + def change do + create(index(:activities, [:group_id], name: "activity_group_id")) + create(index(:activities, [:author_id, :type], name: "activity_filter")) + end +end diff --git a/priv/repo/migrations/20210422140923_cleanup_addresses.exs b/priv/repo/migrations/20210422140923_cleanup_addresses.exs new file mode 100644 index 000000000..5a6a82693 --- /dev/null +++ b/priv/repo/migrations/20210422140923_cleanup_addresses.exs @@ -0,0 +1,73 @@ +defmodule Mobilizon.Storage.Repo.Migrations.CleanupAddresses do + use Ecto.Migration + + def up do + # Make sure we don't have any duplicate addresses + rows = fetch_bad_rows() + Enum.each(rows, &process_row/1) + end + + def down do + # No way down + end + + defp fetch_bad_rows() do + %Postgrex.Result{rows: rows} = + Ecto.Adapters.SQL.query!( + Mobilizon.Storage.Repo, + "SELECT * FROM ( + SELECT id, url, + ROW_NUMBER() OVER(PARTITION BY url ORDER BY id asc) AS Row + FROM addresses + ) dups + WHERE dups.Row > 1;" + ) + + rows + end + + defp process_row([id, url, _row]) do + first_id = find_first_address_id(url) + + if id != first_id do + repair_events(id, first_id) + repair_actors(id, first_id) + delete_row(id) + end + end + + defp find_first_address_id(url) do + %Postgrex.Result{rows: [[id]]} = + Ecto.Adapters.SQL.query!( + Mobilizon.Storage.Repo, + "SELECT id FROM addresses WHERE url = $1 order by id asc limit 1", + [url] + ) + + id + end + + defp repair_events(id, first_id) do + Ecto.Adapters.SQL.query!( + Mobilizon.Storage.Repo, + "UPDATE events SET physical_address_id = $1 WHERE physical_address_id = $2", + [first_id, id] + ) + end + + defp repair_actors(id, first_id) do + Ecto.Adapters.SQL.query!( + Mobilizon.Storage.Repo, + "UPDATE actors SET physical_address_id = $1 WHERE physical_address_id = $2", + [first_id, id] + ) + end + + defp delete_row(id) do + Ecto.Adapters.SQL.query!( + Mobilizon.Storage.Repo, + "DELETE FROM addresses WHERE id = $1", + [id] + ) + end +end diff --git a/priv/repo/migrations/20210422155913_add_index_to_addresses.exs b/priv/repo/migrations/20210422155913_add_index_to_addresses.exs new file mode 100644 index 000000000..1a08a28fd --- /dev/null +++ b/priv/repo/migrations/20210422155913_add_index_to_addresses.exs @@ -0,0 +1,11 @@ +defmodule Mobilizon.Storage.Repo.Migrations.AddIndexToAddresses do + use Ecto.Migration + + def up do + create_if_not_exists(unique_index("addresses", [:url])) + end + + def down do + drop_if_exists(index("addresses", [:url])) + end +end diff --git a/priv/repo/migrations/20210427091034_repair_users_default_actors.exs b/priv/repo/migrations/20210427091034_repair_users_default_actors.exs new file mode 100644 index 000000000..be4126e23 --- /dev/null +++ b/priv/repo/migrations/20210427091034_repair_users_default_actors.exs @@ -0,0 +1,47 @@ +defmodule Mobilizon.Storage.Repo.Migrations.RepairUsersDefaultActors do + use Ecto.Migration + + def up do + rows = fetch_bad_rows() + Enum.each(rows, &process_row/1) + end + + def down do + # Nothing to do + end + + defp fetch_bad_rows() do + %Postgrex.Result{rows: rows} = + Ecto.Adapters.SQL.query!( + Mobilizon.Storage.Repo, + "SELECT u.id FROM users u JOIN actors a ON u.default_actor_id = a.id WHERE a.user_id IS NULL" + ) + + rows + end + + defp process_row([user_id]) do + user_id + |> find_first_actor_id() + |> repair_user_default_actor(user_id) + end + + defp find_first_actor_id(user_id) do + %Postgrex.Result{rows: [[id]]} = + Ecto.Adapters.SQL.query!( + Mobilizon.Storage.Repo, + "SELECT id FROM actors WHERE user_id = $1 AND type = 'Person' AND NOT suspended ORDER BY id LIMIT 1", + [user_id] + ) + + id + end + + defp repair_user_default_actor(actor_id, user_id) do + Ecto.Adapters.SQL.query!( + Mobilizon.Storage.Repo, + "UPDATE users SET default_actor_id = $1 WHERE id = $2", + [actor_id, user_id] + ) + end +end diff --git a/priv/templates/config.template.eex b/priv/templates/config.template.eex index 710c63875..f66ce66e3 100644 --- a/priv/templates/config.template.eex +++ b/priv/templates/config.template.eex @@ -3,8 +3,12 @@ import Config config :mobilizon, Mobilizon.Web.Endpoint, + server: <%= release %>, url: [host: "<%= instance_domain %>"], - http: [port: <%= listen_port %>], + http: [ + ip: {0, 0, 0, 0, 0, 0, 0, 1}, + port: <%= listen_port %> + ], secret_key_base: "<%= instance_secret %>" config :mobilizon, Mobilizon.Web.Auth.Guardian, diff --git a/rel/overlays/bin/mobilizon_ctl b/rel/overlays/bin/mobilizon_ctl index 458de578c..acff87193 100755 --- a/rel/overlays/bin/mobilizon_ctl +++ b/rel/overlays/bin/mobilizon_ctl @@ -32,8 +32,15 @@ else if [ $# -gt 0 ]; then shift fi + echo "$1" | grep "^-" >/dev/null + if [ $? -eq 1 ]; then + SUBACTION="$1" + if [ $# -gt 0 ]; then + shift + fi + fi - if [ "$ACTION" = "migrate" ] || [ "$ACTION" = "rollback" ] || [ "$ACTION" = "create" ] || [ "$MOBILIZON_CTL_RPC_DISABLED" = true ]; then + if [ "$ACTION" = "migrate" ] || [ "$ACTION" = "rollback" ] || [ "$ACTION" = "create" ] || [ "$ACTION $SUBACTION" = "instance gen" ] || [ "$MOBILIZON_CTL_RPC_DISABLED" = true ]; then "$SCRIPTPATH"/mobilizon eval 'Mobilizon.CLI.run("'"$FULL_ARGS"'")' else "$SCRIPTPATH"/mobilizon rpc 'Mobilizon.CLI.run("'"$FULL_ARGS"'")' diff --git a/support/nginx/mobilizon-release.conf b/support/nginx/mobilizon-release.conf new file mode 100644 index 000000000..d6303e0be --- /dev/null +++ b/support/nginx/mobilizon-release.conf @@ -0,0 +1,98 @@ +# default nginx site config for Mobilizon +# +# Simple installation instructions: +# 1. Install your TLS certificate, possibly using Let's Encrypt. +# 2. Replace 'example.tld' with your instance's domain wherever it appears. +# 3. Copy this file to /etc/nginx/sites-available/ and then add a symlink to it +# in /etc/nginx/sites-enabled/ and run 'nginx -s reload' or restart nginx. + +server { + server_name example.tld; + + listen 80; + listen [::]:80; + + # Remove once HTTPS is setup + location ^~ '/.well-known/acme-challenge' { + root /var/www/certbot; + default_type "text/plain"; + } + + # Uncomment once HTTPS is setup + # return 301 https://$server_name$request_uri; +} + +server { + server_name example.tld; + + listen 443 ssl http2; + listen [::]:443 ssl http2; + ssl_session_timeout 5m; + + # Uncomment once you get the certificates + # ssl_trusted_certificate /etc/letsencrypt/live/example.tld/fullchain.pem; + # ssl_certificate /etc/letsencrypt/live/example.tld/fullchain.pem; + # ssl_certificate_key /etc/letsencrypt/live/example.tld/privkey.pem; + + # Add TLSv1.3 if it's supported by your system + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers 'EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA'; + ssl_prefer_server_ciphers on; + ssl_ecdh_curve prime256v1; + # ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1; + ssl_stapling on; + ssl_stapling_verify on; + add_header Strict-Transport-Security "max-age=31536000"; + + gzip on; + gzip_disable "msie6"; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 6; + gzip_buffers 16 8k; + gzip_http_version 1.1; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/activity+json application/atom+xml; + + # the nginx default is 1m, not enough for large media uploads + client_max_body_size 16m; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + + location / { + proxy_pass http://localhost:4000; + } + + # Let's Encrypt keeps its files here + location ^~ '/.well-known/acme-challenge' { + root /var/www/certbot; + default_type "text/plain"; + } + + location ~ ^/(js|css) { + root /opt/mobilizon/priv/static; + etag off; + access_log off; + add_header Cache-Control "public, max-age=31536000, immutable"; + } + + location ~ ^/(media|proxy) { + etag off; + access_log off; + add_header Cache-Control "public, max-age=31536000, immutable"; + proxy_pass http://localhost:4000; + } + + error_page 500 501 502 503 504 @error; + location @error { + root /opt/mobilizon/priv/errors; + try_files /error.html 502; + } + +} diff --git a/support/nginx/mobilizon.conf b/support/nginx/mobilizon-source.conf similarity index 99% rename from support/nginx/mobilizon.conf rename to support/nginx/mobilizon-source.conf index 544170607..ab6a81f1c 100644 --- a/support/nginx/mobilizon.conf +++ b/support/nginx/mobilizon-source.conf @@ -63,7 +63,7 @@ server { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - + location / { proxy_pass http://localhost:4000; diff --git a/support/runit/README.md b/support/runit/README.md new file mode 100644 index 000000000..537918375 --- /dev/null +++ b/support/runit/README.md @@ -0,0 +1,17 @@ +## runit config files + +These are the config files to run _Mobilizon_ under `runit` supervisor. + +The `user` directory contains the configs for running it completely under a +user, with full supervisory control. It requires the system to start +`runsvdir` in user mode so the dæmon can be handled as the user as + + - `sv start ~/sv/mobilizon` + - `sv stop ~/sv/mobilizon` + +This method is good when you are not root, or it's not simple to switch. + + + +The `system_wide` directory contains the config to administer by root user, +if you can access root easily. diff --git a/support/runit/system_wide/sv/mobilizon/finish b/support/runit/system_wide/sv/mobilizon/finish new file mode 100755 index 000000000..029552fae --- /dev/null +++ b/support/runit/system_wide/sv/mobilizon/finish @@ -0,0 +1,5 @@ +#!/bin/sh + +cd /opt/mobilizon +exec 2>&1 +exec chpst -u mobilizon /opt/mobilizon/bin/mobilizon stop diff --git a/support/runit/system_wide/sv/mobilizon/log/run b/support/runit/system_wide/sv/mobilizon/log/run new file mode 100755 index 000000000..043517f57 --- /dev/null +++ b/support/runit/system_wide/sv/mobilizon/log/run @@ -0,0 +1,3 @@ +#!/bin/sh +mkdir -p $HOME/log +exec chpst -u mobilizon svlogd -tt $HOME/log/ diff --git a/support/runit/system_wide/sv/mobilizon/run b/support/runit/system_wide/sv/mobilizon/run new file mode 100755 index 000000000..21309f6de --- /dev/null +++ b/support/runit/system_wide/sv/mobilizon/run @@ -0,0 +1,4 @@ +#!/bin/sh +cd /opt/mobilizon +exec 2>&1 +exec chpst -u mobilizon /opt/mobilizon/bin/mobilizon start diff --git a/support/runit/user/root_sv/mobilizon/log/run b/support/runit/user/root_sv/mobilizon/log/run new file mode 100755 index 000000000..846633f3a --- /dev/null +++ b/support/runit/user/root_sv/mobilizon/log/run @@ -0,0 +1,3 @@ +#!/bin/sh +mkdir -p /var/log/mobilizon/ +exec chpst -u mobilizon svlogd -tt /var/log/mobilizon/ diff --git a/support/runit/user/root_sv/mobilizon/run b/support/runit/user/root_sv/mobilizon/run new file mode 100755 index 000000000..2150a1429 --- /dev/null +++ b/support/runit/user/root_sv/mobilizon/run @@ -0,0 +1,9 @@ +#!/bin/sh + +export USER="mobilizon" +export HOME="/home/$USER" + +groups="$(id -Gn "$USER" | tr ' ' ':')" +svdir="$HOME/service" + +exec chpst -u "$USER:$groups" runsvdir "$svdir" diff --git a/support/runit/user/user_sv/mobilizon/finish b/support/runit/user/user_sv/mobilizon/finish new file mode 100755 index 000000000..42c985376 --- /dev/null +++ b/support/runit/user/user_sv/mobilizon/finish @@ -0,0 +1,5 @@ +#!/bin/sh + +cd /opt/mobilizon +exec 2>&1 +exec /opt/mobilizon/bin/mobilizon stop diff --git a/support/runit/user/user_sv/mobilizon/log/run b/support/runit/user/user_sv/mobilizon/log/run new file mode 100755 index 000000000..3ab5f1bb2 --- /dev/null +++ b/support/runit/user/user_sv/mobilizon/log/run @@ -0,0 +1,3 @@ +#!/bin/sh +mkdir -p $HOME/log +exec svlogd -tt $HOME/log/ diff --git a/support/runit/user/user_sv/mobilizon/run b/support/runit/user/user_sv/mobilizon/run new file mode 100755 index 000000000..8d2d182ca --- /dev/null +++ b/support/runit/user/user_sv/mobilizon/run @@ -0,0 +1,4 @@ +#!/bin/sh +cd /opt/mobilizon +exec 2>&1 +exec /opt/mobilizon/bin/mobilizon start diff --git a/support/systemd/mobilizon-release.service b/support/systemd/mobilizon-release.service new file mode 100644 index 000000000..6b731e2ab --- /dev/null +++ b/support/systemd/mobilizon-release.service @@ -0,0 +1,28 @@ +[Unit] +Description=Mobilizon Service +After=network.target postgresql.service + +[Service] +User=mobilizon +WorkingDirectory=/opt/mobilizon +ExecStart=/opt/mobilizon/bin/mobilizon start +ExecStop=/opt/mobilizon/bin/mobilizon stop +KillMode=process +Restart=on-failure +Environment=MIX_ENV=prod + +SyslogIdentifier=mobilizon + +; Some security directives. +; Use private /tmp and /var/tmp folders inside a new file system namespace, which are discarded after the process stops. +PrivateTmp=true +; Mount /usr, /boot, and /etc as read-only for processes invoked by this service. +ProtectSystem=full +; Sets up a new /dev mount for the process and only adds API pseudo devices like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled by default because it may not work on devices like the Raspberry Pi. +PrivateDevices=false +; Ensures that the service process and all its children can never gain new privileges through execve(). +NoNewPrivileges=true + + +[Install] +WantedBy=multi-user.target diff --git a/support/systemd/mobilizon.service b/support/systemd/mobilizon-source.service similarity index 100% rename from support/systemd/mobilizon.service rename to support/systemd/mobilizon-source.service diff --git a/test/federation/activity_pub/activity_pub_test.exs b/test/federation/activity_pub/activity_pub_test.exs index ac4f697bf..aa72aae8f 100644 --- a/test/federation/activity_pub/activity_pub_test.exs +++ b/test/federation/activity_pub/activity_pub_test.exs @@ -11,13 +11,12 @@ defmodule Mobilizon.Federation.ActivityPubTest do import Mox import Mobilizon.Factory - alias Mobilizon.{Actors, Discussions, Events} - alias Mobilizon.Actors.Actor + alias Mobilizon.{Discussions, Events} alias Mobilizon.Resources.Resource alias Mobilizon.Todos.{Todo, TodoList} alias Mobilizon.Federation.ActivityPub - alias Mobilizon.Federation.ActivityPub.{Relay, Utils} + alias Mobilizon.Federation.ActivityPub.Utils alias Mobilizon.Federation.HTTPSignatures.Signature alias Mobilizon.Service.HTTP.ActivityPub.Mock @@ -40,116 +39,6 @@ defmodule Mobilizon.Federation.ActivityPubTest do end end - describe "fetching actor from its url" do - test "returns an actor from nickname" do - use_cassette "activity_pub/fetch_tcit@framapiaf.org" do - assert {:ok, - %Actor{preferred_username: "tcit", domain: "framapiaf.org", visibility: :public} = - _actor} = ActivityPub.make_actor_from_nickname("tcit@framapiaf.org") - end - - use_cassette "activity_pub/fetch_tcit@framapiaf.org_not_discoverable" do - assert {:ok, - %Actor{preferred_username: "tcit", domain: "framapiaf.org", visibility: :unlisted} = - _actor} = ActivityPub.make_actor_from_nickname("tcit@framapiaf.org") - end - end - - @actor_url "https://framapiaf.org/users/tcit" - test "returns an actor from url" do - # Initial fetch - use_cassette "activity_pub/fetch_framapiaf.org_users_tcit" do - # Unlisted because discoverable is not present in the JSON payload - assert {:ok, - %Actor{preferred_username: "tcit", domain: "framapiaf.org", visibility: :unlisted}} = - ActivityPub.get_or_fetch_actor_by_url(@actor_url) - end - - # Fetch uses cache if Actors.needs_update? returns false - with_mocks([ - {Actors, [:passthrough], - [ - get_actor_by_url: fn @actor_url, false -> - {:ok, - %Actor{ - preferred_username: "tcit", - domain: "framapiaf.org" - }} - end, - needs_update?: fn _ -> false end - ]}, - {ActivityPub, [:passthrough], - make_actor_from_url: fn @actor_url, false -> - {:ok, - %Actor{ - preferred_username: "tcit", - domain: "framapiaf.org" - }} - end} - ]) do - assert {:ok, %Actor{preferred_username: "tcit", domain: "framapiaf.org"}} = - ActivityPub.get_or_fetch_actor_by_url(@actor_url) - - assert_called(Actors.needs_update?(:_)) - refute called(ActivityPub.make_actor_from_url(@actor_url, false)) - end - - # Fetch doesn't use cache if Actors.needs_update? returns true - with_mocks([ - {Actors, [:passthrough], - [ - get_actor_by_url: fn @actor_url, false -> - {:ok, - %Actor{ - preferred_username: "tcit", - domain: "framapiaf.org" - }} - end, - needs_update?: fn _ -> true end - ]}, - {ActivityPub, [:passthrough], - make_actor_from_url: fn @actor_url, false -> - {:ok, - %Actor{ - preferred_username: "tcit", - domain: "framapiaf.org" - }} - end} - ]) do - assert {:ok, %Actor{preferred_username: "tcit", domain: "framapiaf.org"}} = - ActivityPub.get_or_fetch_actor_by_url(@actor_url) - - assert_called(ActivityPub.get_or_fetch_actor_by_url(@actor_url)) - assert_called(Actors.get_actor_by_url(@actor_url, false)) - assert_called(Actors.needs_update?(:_)) - assert_called(ActivityPub.make_actor_from_url(@actor_url, false)) - end - end - - @public_url "https://www.w3.org/ns/activitystreams#Public" - test "activitystreams#Public uri returns Relay actor" do - assert ActivityPub.get_or_fetch_actor_by_url(@public_url) == {:ok, Relay.get_actor()} - end - end - - describe "create activities" do - # test "removes doubled 'to' recipients" do - # actor = insert(:actor) - # - # {:ok, activity, _} = - # ActivityPub.create(%{ - # to: ["user1", "user1", "user2"], - # actor: actor, - # context: "", - # object: %{} - # }) - # - # assert activity.data["to"] == ["user1", "user2"] - # assert activity.actor == actor.url - # assert activity.recipients == ["user1", "user2"] - # end - end - describe "fetching an" do test "object by url" do url = "https://framapiaf.org/users/Framasoft/statuses/102093631881522097" @@ -172,8 +61,8 @@ defmodule Mobilizon.Federation.ActivityPubTest do end test "object reply by url" do - url = "https://zoltasila.pl/objects/1c295713-8e3c-411e-9e62-57a7b9c9e514" - reply_to_url = "https://framapiaf.org/users/peertube/statuses/104584600044284729" + url = "https://pirateradio.social/notice/A5XnLBsFNQDKtthzM0" + reply_to_url = "https://framapiaf.org/users/peertube/statuses/105945857653893100" data = File.read!("test/fixtures/mastodon-status-3.json") diff --git a/test/federation/activity_pub/actor_test.exs b/test/federation/activity_pub/actor_test.exs new file mode 100644 index 000000000..69ebc5daa --- /dev/null +++ b/test/federation/activity_pub/actor_test.exs @@ -0,0 +1,120 @@ +defmodule Mobilizon.Federation.ActivityPub.ActorTest do + use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney + use Mobilizon.DataCase + + import Mock + + alias Mobilizon.Actors + alias Mobilizon.Actors.Actor + + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor + alias Mobilizon.Federation.ActivityPub.{Fetcher, Relay} + + describe "fetching actor from its url" do + test "returns an actor from nickname" do + use_cassette "activity_pub/fetch_tcit@framapiaf.org" do + assert {:ok, + %Actor{preferred_username: "tcit", domain: "framapiaf.org", visibility: :public} = + _actor} = ActivityPubActor.make_actor_from_nickname("tcit@framapiaf.org") + end + + use_cassette "activity_pub/fetch_tcit@framapiaf.org_not_discoverable" do + assert {:ok, + %Actor{preferred_username: "tcit", domain: "framapiaf.org", visibility: :unlisted} = + _actor} = ActivityPubActor.make_actor_from_nickname("tcit@framapiaf.org") + end + end + + @actor_url "https://framapiaf.org/users/tcit" + test "returns an actor from url" do + # Initial fetch + use_cassette "activity_pub/fetch_framapiaf.org_users_tcit" do + # Unlisted because discoverable is not present in the JSON payload + assert {:ok, + %Actor{preferred_username: "tcit", domain: "framapiaf.org", visibility: :unlisted}} = + ActivityPubActor.get_or_fetch_actor_by_url(@actor_url) + end + + # Fetch uses cache if Actors.needs_update? returns false + with_mocks([ + {Actors, [:passthrough], + [ + get_actor_by_url: fn @actor_url, false -> + {:ok, + %Actor{ + preferred_username: "tcit", + domain: "framapiaf.org" + }} + end, + needs_update?: fn _ -> false end + ]}, + {ActivityPubActor, [:passthrough], + make_actor_from_url: fn @actor_url, false -> + {:ok, + %Actor{ + preferred_username: "tcit", + domain: "framapiaf.org" + }} + end} + ]) do + assert {:ok, %Actor{preferred_username: "tcit", domain: "framapiaf.org"}} = + ActivityPubActor.get_or_fetch_actor_by_url(@actor_url) + + assert_called(Actors.needs_update?(:_)) + refute called(ActivityPubActor.make_actor_from_url(@actor_url, false)) + end + + # Fetch doesn't use cache if Actors.needs_update? returns true + with_mocks([ + {Actors, [:passthrough], + [ + get_actor_by_url: fn @actor_url, false -> + {:ok, + %Actor{ + preferred_username: "tcit", + domain: "framapiaf.org" + }} + end, + needs_update?: fn _ -> true end + ]}, + {ActivityPubActor, [:passthrough], + make_actor_from_url: fn @actor_url, false -> + {:ok, + %Actor{ + preferred_username: "tcit", + domain: "framapiaf.org" + }} + end} + ]) do + assert {:ok, %Actor{preferred_username: "tcit", domain: "framapiaf.org"}} = + ActivityPubActor.get_or_fetch_actor_by_url(@actor_url) + + assert_called(ActivityPubActor.get_or_fetch_actor_by_url(@actor_url)) + assert_called(Actors.get_actor_by_url(@actor_url, false)) + assert_called(Actors.needs_update?(:_)) + assert_called(ActivityPubActor.make_actor_from_url(@actor_url, false)) + end + end + + test "handles remote actor being deleted" do + with_mocks([ + {Fetcher, [:passthrough], + fetch_and_prepare_actor_from_url: fn @actor_url -> + {:error, :actor_deleted} + end} + ]) do + assert match?( + {:error, :actor_deleted}, + ActivityPubActor.make_actor_from_url(@actor_url, false) + ) + + assert_called(Fetcher.fetch_and_prepare_actor_from_url(@actor_url)) + end + end + + @public_url "https://www.w3.org/ns/activitystreams#Public" + test "activitystreams#Public uri returns Relay actor" do + assert ActivityPubActor.get_or_fetch_actor_by_url(@public_url) == {:ok, Relay.get_actor()} + end + end +end diff --git a/test/federation/activity_pub/transmogrifier/comments_test.exs b/test/federation/activity_pub/transmogrifier/comments_test.exs index 34d9e1e69..8729ca512 100644 --- a/test/federation/activity_pub/transmogrifier/comments_test.exs +++ b/test/federation/activity_pub/transmogrifier/comments_test.exs @@ -40,7 +40,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier.CommentsTest do File.read!("test/fixtures/mastodon-post-activity.json") |> Jason.decode!() - reply_to_url = "https://blob.cat/objects/02fdea3d-932c-4348-9ecb-3f9eb3fbdd94" + reply_to_url = "https://soc.punktrash.club/objects/d811df79-6e54-4f51-841e-0c38bc356467" object = data["object"] @@ -65,11 +65,11 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier.CommentsTest do %Comment{} = origin_comment = Discussions.get_comment_from_url( - "https://blob.cat/objects/02fdea3d-932c-4348-9ecb-3f9eb3fbdd94" + "https://soc.punktrash.club/objects/d811df79-6e54-4f51-841e-0c38bc356467" ) assert returned_activity.data["object"]["inReplyTo"] == - "https://blob.cat/objects/02fdea3d-932c-4348-9ecb-3f9eb3fbdd94" + "https://soc.punktrash.club/objects/d811df79-6e54-4f51-841e-0c38bc356467" assert returned_activity.data["object"]["inReplyTo"] == origin_comment.url end diff --git a/test/federation/activity_pub/transmogrifier/delete_test.exs b/test/federation/activity_pub/transmogrifier/delete_test.exs index 30717266a..cefd4d64f 100644 --- a/test/federation/activity_pub/transmogrifier/delete_test.exs +++ b/test/federation/activity_pub/transmogrifier/delete_test.exs @@ -3,7 +3,6 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier.DeleteTest do use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney use Oban.Testing, repo: Mobilizon.Storage.Repo import Mobilizon.Factory - import ExUnit.CaptureLog import Mox alias Mobilizon.{Actors, Discussions, Events, Posts, Resources} @@ -78,7 +77,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier.DeleteTest do data |> Map.put("object", object) - :error = Transmogrifier.handle_incoming(data) + {:error, :unknown_actor} = Transmogrifier.handle_incoming(data) assert Discussions.get_comment_from_url(comment.url) end @@ -119,13 +118,14 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier.DeleteTest do test "it fails for incoming actor deletes with spoofed origin" do %{url: url} = insert(:actor) - deleted_actor_url = "https://framapiaf.org/users/admin" data = File.read!("test/fixtures/mastodon-delete-user.json") |> Jason.decode!() |> Map.put("actor", url) + deleted_actor_url = "https://framapiaf.org/users/admin" + deleted_actor_data = File.read!("test/fixtures/mastodon-actor.json") |> Jason.decode!() @@ -137,9 +137,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier.DeleteTest do {:ok, %Tesla.Env{status: 200, body: deleted_actor_data}} end) - assert capture_log(fn -> - assert :error == Transmogrifier.handle_incoming(data) - end) =~ "Object origin check failed" + assert :error == Transmogrifier.handle_incoming(data) assert Actors.get_actor_by_url(url) end diff --git a/test/federation/activity_pub/transmogrifier/posts_test.exs b/test/federation/activity_pub/transmogrifier/posts_test.exs new file mode 100644 index 000000000..c79b01a0a --- /dev/null +++ b/test/federation/activity_pub/transmogrifier/posts_test.exs @@ -0,0 +1,91 @@ +defmodule Mobilizon.Federation.ActivityPub.Transmogrifier.PostsTest do + use Mobilizon.DataCase + + import Mobilizon.Factory + import Mox + alias Mobilizon.Actors.Actor + alias Mobilizon.Federation.ActivityPub.{Activity, Transmogrifier} + alias Mobilizon.Federation.ActivityStream.Convertible + alias Mobilizon.Posts.Post + + describe "handle incoming posts" do + setup :verify_on_exit! + + test "it ignores an incoming post if we already have it" do + post = insert(:post) + post = Repo.preload(post, [:author, :attributed_to, :picture, :media]) + + activity = %{ + "type" => "Create", + "to" => ["https://www.w3.org/ns/activitystreams#Public"], + "actor" => post.author.url, + "attributedTo" => post.attributed_to.url, + "object" => Convertible.model_to_as(post) + } + + data = + File.read!("test/fixtures/mobilizon-post-activity-group.json") + |> Jason.decode!() + |> Map.merge(activity) + + assert {:ok, nil, _} = Transmogrifier.handle_incoming(data) + end + + test "it receives a draft post correctly as a member" do + %Actor{} = group = insert(:group, domain: "remote.tld", url: "https://remote.tld/@group") + %Actor{} = author = insert(:actor, domain: "remote.tld", url: "https://remote.tld/@author") + insert(:member, parent: group, actor: author, role: :moderator) + insert(:member, parent: group, role: :member) + + object = + Convertible.model_to_as(%Post{ + url: "https://remote.tld/@group/some-slug", + author: author, + attributed_to: group, + picture: nil, + media: [], + body: "my body", + title: "my title", + draft: true + }) + + data = + File.read!("test/fixtures/mobilizon-post-activity-group.json") + |> Jason.decode!() + |> Map.put("object", object) + + assert {:ok, %Activity{}, %Post{draft: true}} = Transmogrifier.handle_incoming(data) + end + + test "it publishes a previously draft post correctly as a member" do + %Actor{} = group = insert(:group, domain: "remote.tld", url: "https://remote.tld/@group") + %Actor{} = author = insert(:actor, domain: "remote.tld", url: "https://remote.tld/@author") + insert(:member, parent: group, actor: author, role: :moderator) + insert(:member, parent: group, role: :member) + + %Post{} = + post = + insert(:post, + url: "https://remote.tld/@group/some-slug", + author: author, + attributed_to: group, + draft: true + ) + + activity = %{ + "type" => "Update", + "to" => ["https://www.w3.org/ns/activitystreams#Public"], + "actor" => post.author.url, + "attributedTo" => post.attributed_to.url, + "object" => Convertible.model_to_as(%Post{post | draft: false}) + } + + data = + File.read!("test/fixtures/mobilizon-post-activity-group.json") + |> Jason.decode!() + |> Map.merge(activity) + + assert {:ok, %Activity{}, %Post{draft: false}} = Transmogrifier.handle_incoming(data) + end + end +end diff --git a/test/federation/activity_pub/transmogrifier_test.exs b/test/federation/activity_pub/transmogrifier_test.exs index f04ad5a77..d344b5633 100644 --- a/test/federation/activity_pub/transmogrifier_test.exs +++ b/test/federation/activity_pub/transmogrifier_test.exs @@ -21,6 +21,7 @@ defmodule Mobilizon.Federation.ActivityPub.TransmogrifierTest do alias Mobilizon.Todos.{Todo, TodoList} alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Federation.ActivityPub.Utils alias Mobilizon.Federation.ActivityPub.{Activity, Relay, Transmogrifier} alias Mobilizon.Federation.ActivityStream.Convertible @@ -89,7 +90,7 @@ defmodule Mobilizon.Federation.ActivityPub.TransmogrifierTest do preferred_username: "member" ) - with_mock ActivityPub, [:passthrough], + with_mock ActivityPubActor, [:passthrough], get_or_fetch_actor_by_url: fn url -> case url do ^group_url -> {:ok, group} @@ -168,7 +169,7 @@ defmodule Mobilizon.Federation.ActivityPub.TransmogrifierTest do group = insert(:group, domain: "morebilizon.com", url: @mobilizon_group_url) %Actor{url: actor_url} = actor = insert(:actor) - with_mock ActivityPub, [:passthrough], + with_mock ActivityPubActor, [:passthrough], get_or_fetch_actor_by_url: fn url -> case url do @mobilizon_group_url -> {:ok, group} @@ -198,7 +199,7 @@ defmodule Mobilizon.Federation.ActivityPub.TransmogrifierTest do test "it accepts incoming todo lists and handles group being not found" do %Actor{url: actor_url} = actor = insert(:actor) - with_mock ActivityPub, [:passthrough], + with_mock ActivityPubActor, [:passthrough], get_or_fetch_actor_by_url: fn url -> case url do @mobilizon_group_url -> {:error, "Not found"} @@ -274,7 +275,7 @@ defmodule Mobilizon.Federation.ActivityPub.TransmogrifierTest do group = insert(:group, domain: "morebilizon.com", url: @mobilizon_group_url) %Actor{url: actor_url} = actor = insert(:actor) - with_mock ActivityPub, [:passthrough], + with_mock ActivityPubActor, [:passthrough], get_or_fetch_actor_by_url: fn url -> case url do @mobilizon_group_url -> {:ok, group} @@ -304,7 +305,7 @@ defmodule Mobilizon.Federation.ActivityPub.TransmogrifierTest do test "it accepts incoming todo lists and handles group being not found" do %Actor{url: actor_url} = actor = insert(:actor) - with_mock ActivityPub, [:passthrough], + with_mock ActivityPubActor, [:passthrough], get_or_fetch_actor_by_url: fn url -> case url do @mobilizon_group_url -> {:error, "Not found"} diff --git a/test/federation/web_finger/web_finger_test.exs b/test/federation/web_finger/web_finger_test.exs index 6aba2c594..19b9724d9 100644 --- a/test/federation/web_finger/web_finger_test.exs +++ b/test/federation/web_finger/web_finger_test.exs @@ -54,10 +54,7 @@ defmodule Mobilizon.Federation.WebFingerTest do describe "fingering" do test "a mastodon actor" do use_cassette "webfinger/mastodon" do - res = %{ - "subject" => "acct:" <> @mastodon_account, - "url" => "https://social.tcit.fr/users/#{@mastodon_account_username}" - } + res = "https://social.tcit.fr/users/#{@mastodon_account_username}" assert {:ok, res} == WebFinger.finger(@mastodon_account) end @@ -65,10 +62,7 @@ defmodule Mobilizon.Federation.WebFingerTest do test "a pleroma actor" do use_cassette "webfinger/pleroma" do - res = %{ - "subject" => "acct:" <> @pleroma_account, - "url" => "https://pleroma.soykaf.com/users/#{@pleroma_account_username}" - } + res = "https://pleroma.soykaf.com/users/#{@pleroma_account_username}" assert {:ok, res} == WebFinger.finger(@pleroma_account) end @@ -76,10 +70,7 @@ defmodule Mobilizon.Federation.WebFingerTest do test "a peertube actor" do use_cassette "webfinger/peertube" do - res = %{ - "subject" => "acct:" <> @peertube_account, - "url" => "https://framatube.org/accounts/#{@peertube_account_username}" - } + res = "https://framatube.org/accounts/#{@peertube_account_username}" assert {:ok, res} == WebFinger.finger(@peertube_account) end @@ -87,10 +78,7 @@ defmodule Mobilizon.Federation.WebFingerTest do test "a friendica actor" do use_cassette "webfinger/friendica" do - res = %{ - "subject" => "acct:" <> @friendica_account, - "url" => "https://squeet.me/profile/#{@friendica_account_username}" - } + res = "https://squeet.me/profile/#{@friendica_account_username}" assert {:ok, res} == WebFinger.finger(@friendica_account) end diff --git a/test/fixtures/mastodon-status-3.json b/test/fixtures/mastodon-status-3.json index a650d063d..0f00cddf3 100644 --- a/test/fixtures/mastodon-status-3.json +++ b/test/fixtures/mastodon-status-3.json @@ -1,23 +1,24 @@ { "@context": [ "https://www.w3.org/ns/activitystreams", - "https://zoltasila.pl/schemas/litepub-0.1.jsonld", + "https://pirateradio.social/schemas/litepub-0.1.jsonld", { "@language": "und" } ], - "actor": "https://zoltasila.pl/users/mkljczk", + "actor": "https://pirateradio.social/users/captain", "attachment": [], - "attributedTo": "https://zoltasila.pl/users/mkljczk", - "cc": ["https://zoltasila.pl/users/mkljczk/followers"], - "content": "

@peertube guess you wanted to put the en_US lang link

", - "context": "tag:framapiaf.org,2020-07-27:objectId=39135637:objectType=Conversation", - "conversation": "tag:framapiaf.org,2020-07-27:objectId=39135637:objectType=Conversation", - "id": "https://zoltasila.pl/objects/1c295713-8e3c-411e-9e62-57a7b9c9e514", - "inReplyTo": "https://framapiaf.org/users/peertube/statuses/104584600044284729", - "published": "2020-07-27T09:37:57.202806Z", + "attributedTo": "https://pirateradio.social/users/captain", + "cc": ["https://pirateradio.social/users/captain/followers"], + "content": "

@peertube Pirate Radio TV is updated. You can now remote follow channels on PeerTube, awesome!

", + "context": "tag:framapiaf.org,2021-03-24:objectId=47491096:objectType=Conversation", + "conversation": "tag:framapiaf.org,2021-03-24:objectId=47491096:objectType=Conversation", + "id": "https://pirateradio.social/objects/eeaa8ced-27d6-49bb-a53b-fd2646b63f99", + "inReplyTo": "https://framapiaf.org/users/peertube/statuses/105945857653893100", + "published": "2021-03-24T19:01:37.759478Z", + "repliesCount": 1, "sensitive": false, - "source": "@peertube@framapiaf.org guess you wanted to put the [en_US lang link](https://joinpeertube.org/en_US/news#release-2-3-0)", + "source": "@peertube@framapiaf.org [Pirate Radio TV](https://tv.pirateradio.social/about/instance) is updated. You can now remote follow channels on PeerTube, awesome!", "summary": "", "tag": [ { diff --git a/test/fixtures/mastodon-status-4.json b/test/fixtures/mastodon-status-4.json index 31e70078f..ddc8091aa 100644 --- a/test/fixtures/mastodon-status-4.json +++ b/test/fixtures/mastodon-status-4.json @@ -16,40 +16,40 @@ } } ], - "id": "https://framapiaf.org/users/peertube/statuses/104584600044284729", + "id": "https://framapiaf.org/users/peertube/statuses/105945857653893100", "type": "Note", "summary": null, "inReplyTo": null, - "published": "2020-07-27T07:19:11Z", - "url": "https://framapiaf.org/@peertube/104584600044284729", + "published": "2021-03-24T17:04:54Z", + "url": "https://framapiaf.org/@peertube/105945857653893100", "attributedTo": "https://framapiaf.org/users/peertube", "to": ["https://www.w3.org/ns/activitystreams#Public"], "cc": ["https://framapiaf.org/users/peertube/followers"], "sensitive": false, - "atomUri": "https://framapiaf.org/users/peertube/statuses/104584600044284729", + "atomUri": "https://framapiaf.org/users/peertube/statuses/105945857653893100", "inReplyToAtomUri": null, - "conversation": "tag:framapiaf.org,2020-07-27:objectId=39135637:objectType=Conversation", - "content": "

PeerTube 2.3 is out! Discover on https://joinpeertube.org/fr_FR/news#release-2-3-0 the list of new features!

Have you seen the broadcast message system ? 🤩

", + "conversation": "tag:framapiaf.org,2021-03-24:objectId=47491096:objectType=Conversation", + "content": "

PeerTube v3.1 is out!
Better transcoding features, more pleasant interfaces, possibility to easily subscribe to a remote account and... so many great features!

➡️ https://joinpeertube.org/en_US/news#release-3.1

", "contentMap": { - "en": "

PeerTube 2.3 is out! Discover on https://joinpeertube.org/fr_FR/news#release-2-3-0 the list of new features!

Have you seen the broadcast message system ? 🤩

" + "en": "

PeerTube v3.1 is out!
Better transcoding features, more pleasant interfaces, possibility to easily subscribe to a remote account and... so many great features!

➡️ https://joinpeertube.org/en_US/news#release-3.1

" }, "attachment": [ { "type": "Document", "mediaType": "image/png", - "url": "https://framapiaf.s3.framasoft.org/framapiaf/media_attachments/files/104/584/599/807/860/387/original/88c94143f78fdfa3.png", + "url": "https://framapiaf.s3.framasoft.org/framapiaf/media_attachments/files/105/945/857/331/391/923/original/7932c6912fe1e5ac.png", "name": null, - "blurhash": "U5SY?Z00nOxu7ORP.8-pU^kVS#NGXyxbMxM{" + "blurhash": "UdMHJg00D%9F-pozjFoL?aWBe.of%Mofaeof" } ], "tag": [], "replies": { - "id": "https://framapiaf.org/users/peertube/statuses/104584600044284729/replies", + "id": "https://framapiaf.org/users/peertube/statuses/105945857653893100/replies", "type": "Collection", "first": { "type": "CollectionPage", - "next": "https://framapiaf.org/users/peertube/statuses/104584600044284729/replies?only_other_accounts=true&page=true", - "partOf": "https://framapiaf.org/users/peertube/statuses/104584600044284729/replies", + "next": "https://framapiaf.org/users/peertube/statuses/105945857653893100/replies?only_other_accounts=true&page=true", + "partOf": "https://framapiaf.org/users/peertube/statuses/105945857653893100/replies", "items": [] } } diff --git a/test/fixtures/pleroma-comment-object.json b/test/fixtures/pleroma-comment-object.json index 843170f5f..2a5f4239b 100644 --- a/test/fixtures/pleroma-comment-object.json +++ b/test/fixtures/pleroma-comment-object.json @@ -1,28 +1,23 @@ { "@context": [ "https://www.w3.org/ns/activitystreams", - "https://blob.cat/schemas/litepub-0.1.jsonld", + "https://soc.punktrash.club/schemas/litepub-0.1.jsonld", { "@language": "und" } ], - "actor": "https://blob.cat/users/comicbot", - "attachment": [ - { - "mediaType": "image/gif", - "name": "1574936800141.gif", - "type": "Document", - "url": "https://blob.cat/media/143ba9b1ed15e67d7401906f7b71a459b90680af7075af5b8ac9cb8e3b86868a.gif" - } - ], - "attributedTo": "https://blob.cat/users/comicbot", - "cc": ["https://blob.cat/users/comicbot/followers"], - "content": "Super Mega Comics
http://supermegacomics.com/", - "context": "https://blob.cat/contexts/26f3271a-3eb8-4f3f-8fb1-8ff96e2c4a47", - "conversation": "https://blob.cat/contexts/26f3271a-3eb8-4f3f-8fb1-8ff96e2c4a47", - "id": "https://blob.cat/objects/02fdea3d-932c-4348-9ecb-3f9eb3fbdd94", - "published": "2019-11-28T10:26:42.503473Z", + "actor": "https://soc.punktrash.club/users/jorin", + "attachment": [], + "attributedTo": "https://soc.punktrash.club/users/jorin", + "cc": ["https://soc.punktrash.club/users/jorin/followers"], + "content": "I live in Spain

The S is silent

And it's French

🥖😎", + "context": "https://soc.punktrash.club/contexts/62eb8f27-c8ea-4cc3-818d-385ff96e4397", + "conversation": "https://soc.punktrash.club/contexts/62eb8f27-c8ea-4cc3-818d-385ff96e4397", + "id": "https://soc.punktrash.club/objects/d811df79-6e54-4f51-841e-0c38bc356467", + "published": "2021-05-06T03:52:10.195835Z", + "repliesCount": 1, "sensitive": false, + "source": "I live in Spain\n\nThe S is silent\n\nAnd it's French\n\n🥖😎", "summary": "", "tag": [], "to": ["https://www.w3.org/ns/activitystreams#Public"], diff --git a/test/fixtures/vcr_cassettes/activity_pub/fetch_tcit@framapiaf.org.json b/test/fixtures/vcr_cassettes/activity_pub/fetch_tcit@framapiaf.org.json index d2675951b..7280516e5 100644 --- a/test/fixtures/vcr_cassettes/activity_pub/fetch_tcit@framapiaf.org.json +++ b/test/fixtures/vcr_cassettes/activity_pub/fetch_tcit@framapiaf.org.json @@ -3,26 +3,26 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.2-180-gae03f849-dirty", - "Accept": "application/json, application/activity+json, application/jrd+json" + "User-Agent": "localhost - Mobilizon 1.1.0-43-g36000152-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" }, "method": "get", "options": { "recv_timeout": 20000 }, "request_body": "", - "url": "http://framapiaf.org/.well-known/webfinger?resource=acct:tcit@framapiaf.org" + "url": "http://framapiaf.org/.well-known/host-meta" }, "response": { "binary": false, "body": "\r\n301 Moved Permanently\r\n\r\n

301 Moved Permanently

\r\n
nginx/1.14.2
\r\n\r\n\r\n", "headers": { "Server": "nginx/1.14.2", - "Date": "Tue, 15 Dec 2020 14:14:45 GMT", + "Date": "Mon, 12 Apr 2021 09:43:20 GMT", "Content-Type": "text/html", "Content-Length": "185", "Connection": "keep-alive", - "Location": "https://framapiaf.org/.well-known/webfinger?resource=acct:tcit@framapiaf.org" + "Location": "https://framapiaf.org/.well-known/host-meta" }, "status_code": 301, "type": "ok" @@ -32,7 +32,45 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.2-180-gae03f849-dirty", + "User-Agent": "localhost - Mobilizon 1.1.0-43-g36000152-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "https://framapiaf.org/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\n\n \n\n", + "headers": { + "Date": "Mon, 12 Apr 2021 09:43:20 GMT", + "Content-Type": "application/xrd+xml; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Server": "Mastodon", + "X-Frame-Options": "DENY", + "X-Content-Type-Options": "nosniff", + "X-XSS-Protection": "1; mode=block", + "Vary": "Accept, Accept-Encoding, Origin", + "Cache-Control": "max-age=259200, public", + "ETag": "W/\"4a5299e847275a5957709037c73a2295\"", + "X-Request-Id": "82f2617c-9c56-4eda-baa1-bee62e981172", + "X-Runtime": "0.003007", + "X-Cached": "MISS", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload" + }, + "status_code": 200, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-43-g36000152-dirty", "Accept": "application/json, application/activity+json, application/jrd+json" }, "method": "get", @@ -46,7 +84,7 @@ "binary": false, "body": "{\"subject\":\"acct:tcit@framapiaf.org\",\"aliases\":[\"https://framapiaf.org/@tcit\",\"https://framapiaf.org/users/tcit\"],\"links\":[{\"rel\":\"http://webfinger.net/rel/profile-page\",\"type\":\"text/html\",\"href\":\"https://framapiaf.org/@tcit\"},{\"rel\":\"self\",\"type\":\"application/activity+json\",\"href\":\"https://framapiaf.org/users/tcit\"},{\"rel\":\"http://ostatus.org/schema/1.0/subscribe\",\"template\":\"https://framapiaf.org/authorize_interaction?uri={uri}\"}]}", "headers": { - "Date": "Tue, 15 Dec 2020 14:14:45 GMT", + "Date": "Mon, 12 Apr 2021 09:43:20 GMT", "Content-Type": "application/jrd+json; charset=utf-8", "Transfer-Encoding": "chunked", "Connection": "keep-alive", @@ -57,8 +95,8 @@ "Vary": "Accept, Accept-Encoding, Origin", "Cache-Control": "max-age=259200, public", "ETag": "W/\"faab8ee8c2b4d8858c5d58028878f99c\"", - "X-Request-Id": "b5fb66c6-49e7-428b-a1f2-ac82459f8777", - "X-Runtime": "0.009471", + "X-Request-Id": "06fdc081-d68e-4f5b-a6e2-1e9dd6cd730a", + "X-Runtime": "0.003687", "X-Cached": "MISS", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload" }, @@ -81,7 +119,7 @@ "binary": false, "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\",{\"manuallyApprovesFollowers\":\"as:manuallyApprovesFollowers\",\"toot\":\"http://joinmastodon.org/ns#\",\"featured\":{\"@id\":\"toot:featured\",\"@type\":\"@id\"},\"alsoKnownAs\":{\"@id\":\"as:alsoKnownAs\",\"@type\":\"@id\"},\"movedTo\":{\"@id\":\"as:movedTo\",\"@type\":\"@id\"},\"schema\":\"http://schema.org#\",\"PropertyValue\":\"schema:PropertyValue\",\"value\":\"schema:value\",\"IdentityProof\":\"toot:IdentityProof\",\"discoverable\":\"toot:discoverable\",\"Device\":\"toot:Device\",\"Ed25519Signature\":\"toot:Ed25519Signature\",\"Ed25519Key\":\"toot:Ed25519Key\",\"Curve25519Key\":\"toot:Curve25519Key\",\"EncryptedMessage\":\"toot:EncryptedMessage\",\"publicKeyBase64\":\"toot:publicKeyBase64\",\"deviceId\":\"toot:deviceId\",\"claim\":{\"@type\":\"@id\",\"@id\":\"toot:claim\"},\"fingerprintKey\":{\"@type\":\"@id\",\"@id\":\"toot:fingerprintKey\"},\"identityKey\":{\"@type\":\"@id\",\"@id\":\"toot:identityKey\"},\"devices\":{\"@type\":\"@id\",\"@id\":\"toot:devices\"},\"messageFranking\":\"toot:messageFranking\",\"messageType\":\"toot:messageType\",\"cipherText\":\"toot:cipherText\",\"Hashtag\":\"as:Hashtag\",\"focalPoint\":{\"@container\":\"@list\",\"@id\":\"toot:focalPoint\"}}],\"id\":\"https://framapiaf.org/users/tcit\",\"type\":\"Person\",\"following\":\"https://framapiaf.org/users/tcit/following\",\"followers\":\"https://framapiaf.org/users/tcit/followers\",\"inbox\":\"https://framapiaf.org/users/tcit/inbox\",\"outbox\":\"https://framapiaf.org/users/tcit/outbox\",\"featured\":\"https://framapiaf.org/users/tcit/collections/featured\",\"preferredUsername\":\"tcit\",\"name\":\"💼 Thomas Citharel (Work)\",\"summary\":\"\\u003cp\\u003e\\u003ca href=\\\"https://framapiaf.org/tags/Framasoft\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eFramasoft\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/FreeSoftware\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eFreeSoftware\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/Activism\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eActivism\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/wallabag\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003ewallabag\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/Federation\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eFederation\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/Nextcloud\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eNextcloud\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/Mobilizon\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eMobilizon\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/Libre\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eLibre\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\",\"url\":\"https://framapiaf.org/@tcit\",\"manuallyApprovesFollowers\":false,\"discoverable\":true,\"devices\":\"https://framapiaf.org/users/tcit/collections/devices\",\"publicKey\":{\"id\":\"https://framapiaf.org/users/tcit#main-key\",\"owner\":\"https://framapiaf.org/users/tcit\",\"publicKeyPem\":\"-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApscVCt06lrIiB5jT6Kqk\\nZZwPVoPkhR7HzoTGb8rnklZuOyP4goHIuBDnurklztkmDCaM7DbsUWAPgRVtwWFE\\nWuQrOenb7BPRe/m99pJfUTkBQU3IeuRMD/5Fc3OTIhHQOltTSiB900srCUxjysfw\\nnV5JFciCz8YAXTNJZD34qyv8DbtC/pCJM7wMd9Hl3ohxSPETa6CJUaTdlNwlYJa2\\nMOMCj6/7Iv5oAg14FT9lwqS5lF7jPHk9Z7PNc2wPmNVgIYA2n9d5k7JY8TdM8iu4\\nHLnIbJuqDd1uitlYgy1qsdsxjv4U2Y7Nytc+3ZKHtGsCzUltYL5kC7uWrFpGoWo1\\n0QIDAQAB\\n-----END PUBLIC KEY-----\\n\"},\"tag\":[{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/activism\",\"name\":\"#activism\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/federation\",\"name\":\"#federation\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/framasoft\",\"name\":\"#framasoft\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/freesoftware\",\"name\":\"#freesoftware\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/libre\",\"name\":\"#libre\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/mobilizon\",\"name\":\"#mobilizon\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/nextcloud\",\"name\":\"#nextcloud\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/wallabag\",\"name\":\"#wallabag\"}],\"attachment\":[{\"type\":\"PropertyValue\",\"name\":\"Personal account\",\"value\":\"\\u003ca href=\\\"https://social.tcit.fr/@tcit\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"\\u003e\\u003cspan class=\\\"invisible\\\"\\u003ehttps://\\u003c/span\\u003e\\u003cspan class=\\\"\\\"\\u003esocial.tcit.fr/@tcit\\u003c/span\\u003e\\u003cspan class=\\\"invisible\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e\"},{\"type\":\"PropertyValue\",\"name\":\"Location\",\"value\":\"Nantes, France\"},{\"type\":\"PropertyValue\",\"name\":\"Works at\",\"value\":\"\\u003cspan class=\\\"h-card\\\"\\u003e\\u003ca href=\\\"https://framapiaf.org/@Framasoft\\\" class=\\\"u-url mention\\\"\\u003e@\\u003cspan\\u003eFramasoft\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/span\\u003e\"},{\"type\":\"PropertyValue\",\"name\":\"Website\",\"value\":\"\\u003ca href=\\\"https://tcit.fr\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"\\u003e\\u003cspan class=\\\"invisible\\\"\\u003ehttps://\\u003c/span\\u003e\\u003cspan class=\\\"\\\"\\u003etcit.fr\\u003c/span\\u003e\\u003cspan class=\\\"invisible\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e\"},{\"type\":\"IdentityProof\",\"name\":\"tcit\",\"signatureAlgorithm\":\"keybase\",\"signatureValue\":\"f66b45be42803010fe2f4d80e729b41bbe5ed056e2ff1286b7b5a5ea9c724cc70f\"}],\"endpoints\":{\"sharedInbox\":\"https://framapiaf.org/inbox\"},\"icon\":{\"type\":\"Image\",\"mediaType\":\"image/jpeg\",\"url\":\"https://framapiaf.s3.framasoft.org/framapiaf/accounts/avatars/000/000/001/original/da0cad7ffd20eb61.jpg\"},\"image\":{\"type\":\"Image\",\"mediaType\":\"image/jpeg\",\"url\":\"https://framapiaf.s3.framasoft.org/framapiaf/accounts/headers/000/000/001/original/198d058b3086d82d.jpg\"}}", "headers": { - "Date": "Tue, 15 Dec 2020 14:14:45 GMT", + "Date": "Mon, 12 Apr 2021 09:43:20 GMT", "Content-Type": "application/activity+json; charset=utf-8", "Transfer-Encoding": "chunked", "Connection": "keep-alive", @@ -92,8 +130,8 @@ "Vary": "Accept, Accept-Encoding, Origin", "Cache-Control": "max-age=180, public", "ETag": "W/\"5d358dbfda8db0e851d1476b22a4afa0\"", - "X-Request-Id": "daf7c5a4-cb52-400a-9251-564ef55bce03", - "X-Runtime": "0.039586", + "X-Request-Id": "21d6d06d-ec25-45a4-95a0-d2f69afe4325", + "X-Runtime": "0.016197", "X-Cached": "EXPIRED", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload" }, @@ -105,7 +143,7 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.2-180-gae03f849-dirty" + "User-Agent": "localhost - Mobilizon 1.1.0-43-g36000152-dirty" }, "method": "get", "options": { @@ -119,7 +157,7 @@ "body": "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", "headers": { "Server": "nginx/1.14.2", - "Date": "Tue, 15 Dec 2020 14:14:45 GMT", + "Date": "Mon, 12 Apr 2021 09:43:20 GMT", "Content-Type": "image/jpeg", "Content-Length": "4297", "Connection": "keep-alive", @@ -127,8 +165,12 @@ "x-rgw-object-type": "Normal", "ETag": "\"0198adc7595a8c7b0730df99f9d9aa6c\"", "x-amz-meta-s3cmd-attrs": "uid:1008/gname:mastodon/uname:mastodon/gid:1008/mode:33188/mtime:1491844231/atime:1551282313/ctime:1491844231", - "x-amz-request-id": "tx00000000000000036d87e-005fd88d90-1b195dc-default", + "x-amz-request-id": "tx00000000000000117856f-0060740df3-3e40cf4-default", "X-Cached": "HIT", + "Access-Control-Allow-Origin": "https://framapiaf.org", + "Access-Control-Allow-Credentials": "true", + "Access-Control-Allow-Methods": "GET, POST, HEAD, OPTIONS", + "Access-Control-Allow-Headers": "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-MM-TokenIndex", "Accept-Ranges": "bytes" }, "status_code": 200, @@ -139,7 +181,7 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.2-180-gae03f849-dirty" + "User-Agent": "localhost - Mobilizon 1.1.0-43-g36000152-dirty" }, "method": "get", "options": { @@ -153,7 +195,7 @@ "body": "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", "headers": { "Server": "nginx/1.14.2", - "Date": "Tue, 15 Dec 2020 14:14:45 GMT", + "Date": "Mon, 12 Apr 2021 09:43:20 GMT", "Content-Type": "image/jpeg", "Content-Length": "28562", "Connection": "keep-alive", @@ -161,8 +203,12 @@ "x-rgw-object-type": "Normal", "ETag": "\"f889f2485f455bd55bd4851944a90284\"", "x-amz-meta-s3cmd-attrs": "uid:1008/gname:mastodon/uname:mastodon/gid:1008/mode:33188/mtime:1491844231/atime:1551273716/ctime:1491844231", - "x-amz-request-id": "tx00000000000000036d87f-005fd88d90-1b195dc-default", + "x-amz-request-id": "tx000000000000001178570-0060740df3-3e40cf4-default", "X-Cached": "HIT", + "Access-Control-Allow-Origin": "https://framapiaf.org", + "Access-Control-Allow-Credentials": "true", + "Access-Control-Allow-Methods": "GET, POST, HEAD, OPTIONS", + "Access-Control-Allow-Headers": "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-MM-TokenIndex", "Accept-Ranges": "bytes" }, "status_code": 200, diff --git a/test/fixtures/vcr_cassettes/activity_pub/fetch_tcit@framapiaf.org_not_discoverable.json b/test/fixtures/vcr_cassettes/activity_pub/fetch_tcit@framapiaf.org_not_discoverable.json index f9f89278b..238794f86 100644 --- a/test/fixtures/vcr_cassettes/activity_pub/fetch_tcit@framapiaf.org_not_discoverable.json +++ b/test/fixtures/vcr_cassettes/activity_pub/fetch_tcit@framapiaf.org_not_discoverable.json @@ -3,26 +3,26 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.2-180-gae03f849-dirty", - "Accept": "application/json, application/activity+json, application/jrd+json" + "User-Agent": "localhost - Mobilizon 1.1.0-43-g36000152-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" }, "method": "get", "options": { "recv_timeout": 20000 }, "request_body": "", - "url": "http://framapiaf.org/.well-known/webfinger?resource=acct:tcit@framapiaf.org" + "url": "http://framapiaf.org/.well-known/host-meta" }, "response": { "binary": false, "body": "\r\n301 Moved Permanently\r\n\r\n

301 Moved Permanently

\r\n
nginx/1.14.2
\r\n\r\n\r\n", "headers": { "Server": "nginx/1.14.2", - "Date": "Tue, 15 Dec 2020 15:17:25 GMT", + "Date": "Mon, 12 Apr 2021 09:43:51 GMT", "Content-Type": "text/html", "Content-Length": "185", "Connection": "keep-alive", - "Location": "https://framapiaf.org/.well-known/webfinger?resource=acct:tcit@framapiaf.org" + "Location": "https://framapiaf.org/.well-known/host-meta" }, "status_code": 301, "type": "ok" @@ -32,7 +32,45 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.2-180-gae03f849-dirty", + "User-Agent": "localhost - Mobilizon 1.1.0-43-g36000152-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "https://framapiaf.org/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\n\n \n\n", + "headers": { + "Date": "Mon, 12 Apr 2021 09:43:51 GMT", + "Content-Type": "application/xrd+xml; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Server": "Mastodon", + "X-Frame-Options": "DENY", + "X-Content-Type-Options": "nosniff", + "X-XSS-Protection": "1; mode=block", + "Vary": "Accept, Accept-Encoding, Origin", + "Cache-Control": "max-age=259200, public", + "ETag": "W/\"4a5299e847275a5957709037c73a2295\"", + "X-Request-Id": "82f2617c-9c56-4eda-baa1-bee62e981172", + "X-Runtime": "0.003007", + "X-Cached": "HIT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload" + }, + "status_code": 200, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-43-g36000152-dirty", "Accept": "application/json, application/activity+json, application/jrd+json" }, "method": "get", @@ -46,7 +84,7 @@ "binary": false, "body": "{\"subject\":\"acct:tcit@framapiaf.org\",\"aliases\":[\"https://framapiaf.org/@tcit\",\"https://framapiaf.org/users/tcit\"],\"links\":[{\"rel\":\"http://webfinger.net/rel/profile-page\",\"type\":\"text/html\",\"href\":\"https://framapiaf.org/@tcit\"},{\"rel\":\"self\",\"type\":\"application/activity+json\",\"href\":\"https://framapiaf.org/users/tcit\"},{\"rel\":\"http://ostatus.org/schema/1.0/subscribe\",\"template\":\"https://framapiaf.org/authorize_interaction?uri={uri}\"}]}", "headers": { - "Date": "Tue, 15 Dec 2020 15:17:25 GMT", + "Date": "Mon, 12 Apr 2021 09:43:51 GMT", "Content-Type": "application/jrd+json; charset=utf-8", "Transfer-Encoding": "chunked", "Connection": "keep-alive", @@ -57,8 +95,8 @@ "Vary": "Accept, Accept-Encoding, Origin", "Cache-Control": "max-age=259200, public", "ETag": "W/\"faab8ee8c2b4d8858c5d58028878f99c\"", - "X-Request-Id": "b5fb66c6-49e7-428b-a1f2-ac82459f8777", - "X-Runtime": "0.009471", + "X-Request-Id": "06fdc081-d68e-4f5b-a6e2-1e9dd6cd730a", + "X-Runtime": "0.003687", "X-Cached": "HIT", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload" }, @@ -81,7 +119,7 @@ "binary": false, "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\",{\"manuallyApprovesFollowers\":\"as:manuallyApprovesFollowers\",\"toot\":\"http://joinmastodon.org/ns#\",\"featured\":{\"@id\":\"toot:featured\",\"@type\":\"@id\"},\"alsoKnownAs\":{\"@id\":\"as:alsoKnownAs\",\"@type\":\"@id\"},\"movedTo\":{\"@id\":\"as:movedTo\",\"@type\":\"@id\"},\"schema\":\"http://schema.org#\",\"PropertyValue\":\"schema:PropertyValue\",\"value\":\"schema:value\",\"IdentityProof\":\"toot:IdentityProof\",\"discoverable\":\"toot:discoverable\",\"Device\":\"toot:Device\",\"Ed25519Signature\":\"toot:Ed25519Signature\",\"Ed25519Key\":\"toot:Ed25519Key\",\"Curve25519Key\":\"toot:Curve25519Key\",\"EncryptedMessage\":\"toot:EncryptedMessage\",\"publicKeyBase64\":\"toot:publicKeyBase64\",\"deviceId\":\"toot:deviceId\",\"claim\":{\"@type\":\"@id\",\"@id\":\"toot:claim\"},\"fingerprintKey\":{\"@type\":\"@id\",\"@id\":\"toot:fingerprintKey\"},\"identityKey\":{\"@type\":\"@id\",\"@id\":\"toot:identityKey\"},\"devices\":{\"@type\":\"@id\",\"@id\":\"toot:devices\"},\"messageFranking\":\"toot:messageFranking\",\"messageType\":\"toot:messageType\",\"cipherText\":\"toot:cipherText\",\"Hashtag\":\"as:Hashtag\",\"focalPoint\":{\"@container\":\"@list\",\"@id\":\"toot:focalPoint\"}}],\"id\":\"https://framapiaf.org/users/tcit\",\"type\":\"Person\",\"following\":\"https://framapiaf.org/users/tcit/following\",\"followers\":\"https://framapiaf.org/users/tcit/followers\",\"inbox\":\"https://framapiaf.org/users/tcit/inbox\",\"outbox\":\"https://framapiaf.org/users/tcit/outbox\",\"featured\":\"https://framapiaf.org/users/tcit/collections/featured\",\"preferredUsername\":\"tcit\",\"name\":\"💼 Thomas Citharel (Work)\",\"summary\":\"\\u003cp\\u003e\\u003ca href=\\\"https://framapiaf.org/tags/Framasoft\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eFramasoft\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/FreeSoftware\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eFreeSoftware\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/Activism\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eActivism\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/wallabag\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003ewallabag\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/Federation\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eFederation\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/Nextcloud\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eNextcloud\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/Mobilizon\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eMobilizon\\u003c/span\\u003e\\u003c/a\\u003e \\u003ca href=\\\"https://framapiaf.org/tags/Libre\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\"\\u003e#\\u003cspan\\u003eLibre\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/p\\u003e\",\"url\":\"https://framapiaf.org/@tcit\",\"manuallyApprovesFollowers\":false,\"discoverable\":false,\"devices\":\"https://framapiaf.org/users/tcit/collections/devices\",\"publicKey\":{\"id\":\"https://framapiaf.org/users/tcit#main-key\",\"owner\":\"https://framapiaf.org/users/tcit\",\"publicKeyPem\":\"-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApscVCt06lrIiB5jT6Kqk\\nZZwPVoPkhR7HzoTGb8rnklZuOyP4goHIuBDnurklztkmDCaM7DbsUWAPgRVtwWFE\\nWuQrOenb7BPRe/m99pJfUTkBQU3IeuRMD/5Fc3OTIhHQOltTSiB900srCUxjysfw\\nnV5JFciCz8YAXTNJZD34qyv8DbtC/pCJM7wMd9Hl3ohxSPETa6CJUaTdlNwlYJa2\\nMOMCj6/7Iv5oAg14FT9lwqS5lF7jPHk9Z7PNc2wPmNVgIYA2n9d5k7JY8TdM8iu4\\nHLnIbJuqDd1uitlYgy1qsdsxjv4U2Y7Nytc+3ZKHtGsCzUltYL5kC7uWrFpGoWo1\\n0QIDAQAB\\n-----END PUBLIC KEY-----\\n\"},\"tag\":[{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/activism\",\"name\":\"#activism\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/federation\",\"name\":\"#federation\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/framasoft\",\"name\":\"#framasoft\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/freesoftware\",\"name\":\"#freesoftware\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/libre\",\"name\":\"#libre\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/mobilizon\",\"name\":\"#mobilizon\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/nextcloud\",\"name\":\"#nextcloud\"},{\"type\":\"Hashtag\",\"href\":\"https://framapiaf.org/explore/wallabag\",\"name\":\"#wallabag\"}],\"attachment\":[{\"type\":\"PropertyValue\",\"name\":\"Personal account\",\"value\":\"\\u003ca href=\\\"https://social.tcit.fr/@tcit\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"\\u003e\\u003cspan class=\\\"invisible\\\"\\u003ehttps://\\u003c/span\\u003e\\u003cspan class=\\\"\\\"\\u003esocial.tcit.fr/@tcit\\u003c/span\\u003e\\u003cspan class=\\\"invisible\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e\"},{\"type\":\"PropertyValue\",\"name\":\"Location\",\"value\":\"Nantes, France\"},{\"type\":\"PropertyValue\",\"name\":\"Works at\",\"value\":\"\\u003cspan class=\\\"h-card\\\"\\u003e\\u003ca href=\\\"https://framapiaf.org/@Framasoft\\\" class=\\\"u-url mention\\\"\\u003e@\\u003cspan\\u003eFramasoft\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/span\\u003e\"},{\"type\":\"PropertyValue\",\"name\":\"Website\",\"value\":\"\\u003ca href=\\\"https://tcit.fr\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"\\u003e\\u003cspan class=\\\"invisible\\\"\\u003ehttps://\\u003c/span\\u003e\\u003cspan class=\\\"\\\"\\u003etcit.fr\\u003c/span\\u003e\\u003cspan class=\\\"invisible\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e\"},{\"type\":\"IdentityProof\",\"name\":\"tcit\",\"signatureAlgorithm\":\"keybase\",\"signatureValue\":\"f66b45be42803010fe2f4d80e729b41bbe5ed056e2ff1286b7b5a5ea9c724cc70f\"}],\"endpoints\":{\"sharedInbox\":\"https://framapiaf.org/inbox\"},\"icon\":{\"type\":\"Image\",\"mediaType\":\"image/jpeg\",\"url\":\"https://framapiaf.s3.framasoft.org/framapiaf/accounts/avatars/000/000/001/original/da0cad7ffd20eb61.jpg\"},\"image\":{\"type\":\"Image\",\"mediaType\":\"image/jpeg\",\"url\":\"https://framapiaf.s3.framasoft.org/framapiaf/accounts/headers/000/000/001/original/198d058b3086d82d.jpg\"}}", "headers": { - "Date": "Tue, 15 Dec 2020 15:17:26 GMT", + "Date": "Mon, 12 Apr 2021 09:43:51 GMT", "Content-Type": "application/activity+json; charset=utf-8", "Transfer-Encoding": "chunked", "Connection": "keep-alive", @@ -92,9 +130,9 @@ "Vary": "Accept, Accept-Encoding, Origin", "Cache-Control": "max-age=180, public", "ETag": "W/\"5d358dbfda8db0e851d1476b22a4afa0\"", - "X-Request-Id": "24570eeb-c2e9-4d2d-acef-9cd38edaeda0", - "X-Runtime": "0.013956", - "X-Cached": "EXPIRED", + "X-Request-Id": "21d6d06d-ec25-45a4-95a0-d2f69afe4325", + "X-Runtime": "0.016197", + "X-Cached": "HIT", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload" }, "status_code": 200, @@ -105,7 +143,7 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.2-180-gae03f849-dirty" + "User-Agent": "localhost - Mobilizon 1.1.0-43-g36000152-dirty" }, "method": "get", "options": { @@ -119,7 +157,7 @@ "body": "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", "headers": { "Server": "nginx/1.14.2", - "Date": "Tue, 15 Dec 2020 15:17:26 GMT", + "Date": "Mon, 12 Apr 2021 09:43:51 GMT", "Content-Type": "image/jpeg", "Content-Length": "4297", "Connection": "keep-alive", @@ -127,8 +165,12 @@ "x-rgw-object-type": "Normal", "ETag": "\"0198adc7595a8c7b0730df99f9d9aa6c\"", "x-amz-meta-s3cmd-attrs": "uid:1008/gname:mastodon/uname:mastodon/gid:1008/mode:33188/mtime:1491844231/atime:1551282313/ctime:1491844231", - "x-amz-request-id": "tx00000000000000036d87e-005fd88d90-1b195dc-default", + "x-amz-request-id": "tx00000000000000117856f-0060740df3-3e40cf4-default", "X-Cached": "HIT", + "Access-Control-Allow-Origin": "https://framapiaf.org", + "Access-Control-Allow-Credentials": "true", + "Access-Control-Allow-Methods": "GET, POST, HEAD, OPTIONS", + "Access-Control-Allow-Headers": "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-MM-TokenIndex", "Accept-Ranges": "bytes" }, "status_code": 200, @@ -139,7 +181,7 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.2-180-gae03f849-dirty" + "User-Agent": "localhost - Mobilizon 1.1.0-43-g36000152-dirty" }, "method": "get", "options": { @@ -153,7 +195,7 @@ "body": "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", "headers": { "Server": "nginx/1.14.2", - "Date": "Tue, 15 Dec 2020 15:17:26 GMT", + "Date": "Mon, 12 Apr 2021 09:43:51 GMT", "Content-Type": "image/jpeg", "Content-Length": "28562", "Connection": "keep-alive", @@ -161,8 +203,12 @@ "x-rgw-object-type": "Normal", "ETag": "\"f889f2485f455bd55bd4851944a90284\"", "x-amz-meta-s3cmd-attrs": "uid:1008/gname:mastodon/uname:mastodon/gid:1008/mode:33188/mtime:1491844231/atime:1551273716/ctime:1491844231", - "x-amz-request-id": "tx00000000000000036d87f-005fd88d90-1b195dc-default", + "x-amz-request-id": "tx000000000000001178570-0060740df3-3e40cf4-default", "X-Cached": "HIT", + "Access-Control-Allow-Origin": "https://framapiaf.org", + "Access-Control-Allow-Credentials": "true", + "Access-Control-Allow-Methods": "GET, POST, HEAD, OPTIONS", + "Access-Control-Allow-Headers": "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-MM-TokenIndex", "Accept-Ranges": "bytes" }, "status_code": 200, diff --git a/test/fixtures/vcr_cassettes/actors/remote_actor_mastodon_tcit.json b/test/fixtures/vcr_cassettes/actors/remote_actor_mastodon_tcit.json index 3289b5b1f..fa83acb12 100644 --- a/test/fixtures/vcr_cassettes/actors/remote_actor_mastodon_tcit.json +++ b/test/fixtures/vcr_cassettes/actors/remote_actor_mastodon_tcit.json @@ -6,17 +6,15 @@ "Accept": "application/activity+json" }, "method": "get", - "options": { - "follow_redirect": "true" - }, + "options": [], "request_body": "", "url": "https://social.tcit.fr/users/tcit" }, "response": { "binary": false, - "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\",{\"manuallyApprovesFollowers\":\"as:manuallyApprovesFollowers\",\"toot\":\"http://joinmastodon.org/ns#\",\"featured\":{\"@id\":\"toot:featured\",\"@type\":\"@id\"},\"alsoKnownAs\":{\"@id\":\"as:alsoKnownAs\",\"@type\":\"@id\"},\"movedTo\":{\"@id\":\"as:movedTo\",\"@type\":\"@id\"},\"schema\":\"http://schema.org#\",\"PropertyValue\":\"schema:PropertyValue\",\"value\":\"schema:value\",\"Hashtag\":\"as:Hashtag\",\"Emoji\":\"toot:Emoji\",\"IdentityProof\":\"toot:IdentityProof\",\"focalPoint\":{\"@container\":\"@list\",\"@id\":\"toot:focalPoint\"}}],\"id\":\"https://social.tcit.fr/users/tcit\",\"type\":\"Person\",\"following\":\"https://social.tcit.fr/users/tcit/following\",\"followers\":\"https://social.tcit.fr/users/tcit/followers\",\"inbox\":\"https://social.tcit.fr/users/tcit/inbox\",\"outbox\":\"https://social.tcit.fr/users/tcit/outbox\",\"featured\":\"https://social.tcit.fr/users/tcit/collections/featured\",\"preferredUsername\":\"tcit\",\"name\":\"🦄 Thomas Citharel\",\"summary\":\"\\u003cp\\u003eHoping to make people\\u0026apos;s life better with free software at \\u003cspan class=\\\"h-card\\\"\\u003e\\u003ca href=\\\"https://framapiaf.org/@Framasoft\\\" class=\\\"u-url mention\\\"\\u003e@\\u003cspan\\u003eFramasoft\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/span\\u003e.\\u003c/p\\u003e\",\"url\":\"https://social.tcit.fr/@tcit\",\"manuallyApprovesFollowers\":false,\"publicKey\":{\"id\":\"https://social.tcit.fr/users/tcit#main-key\",\"owner\":\"https://social.tcit.fr/users/tcit\",\"publicKeyPem\":\"-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApXwYMUdFg3XUd+bGsh8C\\nyiMRGpRGAWuCdM5pDWx5uM4pW2pM3xbHbcI21j9h8BmlAiPg6hbZD73KGly2N8Rt\\n5iIS0I+l6i8kA1JCCdlAaDTRd41RKMggZDoQvjVZQtsyE1VzMeU2kbqqTFN6ew7H\\nvbd6O0NhixoKoZ5f3jwuBDZoT0p1TAcaMdmG8oqHD97isizkDnRn8cOBA6wtI+xb\\n5xP2zxZMsLpTDZLiKU8XcPKZCw4OfQfmDmKkHtrFb77jCAQj/s/FxjVnvxRwmfhN\\nnWy0D+LUV/g63nHh/b5zXIeV92QZLvDYbgbezmzUzv9UeA1s70GGbaDqCIy85gw9\\n+wIDAQAB\\n-----END PUBLIC KEY-----\\n\"},\"tag\":[],\"attachment\":[{\"type\":\"PropertyValue\",\"name\":\"Works at\",\"value\":\"\\u003cspan class=\\\"h-card\\\"\\u003e\\u003ca href=\\\"https://framapiaf.org/@Framasoft\\\" class=\\\"u-url mention\\\"\\u003e@\\u003cspan\\u003eFramasoft\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/span\\u003e\"},{\"type\":\"PropertyValue\",\"name\":\"Pronouns\",\"value\":\"He/Him\"},{\"type\":\"PropertyValue\",\"name\":\"Work Account\",\"value\":\"\\u003ca href=\\\"https://framapiaf.org/@tcit\\\" rel=\\\"me nofollow noopener\\\" target=\\\"_blank\\\"\\u003e\\u003cspan class=\\\"invisible\\\"\\u003ehttps://\\u003c/span\\u003e\\u003cspan class=\\\"\\\"\\u003eframapiaf.org/@tcit\\u003c/span\\u003e\\u003cspan class=\\\"invisible\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e\"},{\"type\":\"PropertyValue\",\"name\":\"Site\",\"value\":\"\\u003ca href=\\\"https://tcit.fr\\\" rel=\\\"me nofollow noopener\\\" target=\\\"_blank\\\"\\u003e\\u003cspan class=\\\"invisible\\\"\\u003ehttps://\\u003c/span\\u003e\\u003cspan class=\\\"\\\"\\u003etcit.fr\\u003c/span\\u003e\\u003cspan class=\\\"invisible\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e\"}],\"endpoints\":{\"sharedInbox\":\"https://social.tcit.fr/inbox\"},\"icon\":{\"type\":\"Image\",\"mediaType\":\"image/jpeg\",\"url\":\"https://media.social.tcit.fr/mastodontcit/accounts/avatars/000/000/001/original/a28c50ce5f2b13fd.jpg\"},\"image\":{\"type\":\"Image\",\"mediaType\":\"image/png\",\"url\":\"https://media.social.tcit.fr/mastodontcit/accounts/headers/000/000/001/original/a3f3ec4f1b6f9f50.png\"}}", + "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\",{\"manuallyApprovesFollowers\":\"as:manuallyApprovesFollowers\",\"toot\":\"http://joinmastodon.org/ns#\",\"featured\":{\"@id\":\"toot:featured\",\"@type\":\"@id\"},\"featuredTags\":{\"@id\":\"toot:featuredTags\",\"@type\":\"@id\"},\"alsoKnownAs\":{\"@id\":\"as:alsoKnownAs\",\"@type\":\"@id\"},\"movedTo\":{\"@id\":\"as:movedTo\",\"@type\":\"@id\"},\"schema\":\"http://schema.org#\",\"PropertyValue\":\"schema:PropertyValue\",\"value\":\"schema:value\",\"IdentityProof\":\"toot:IdentityProof\",\"discoverable\":\"toot:discoverable\",\"Device\":\"toot:Device\",\"Ed25519Signature\":\"toot:Ed25519Signature\",\"Ed25519Key\":\"toot:Ed25519Key\",\"Curve25519Key\":\"toot:Curve25519Key\",\"EncryptedMessage\":\"toot:EncryptedMessage\",\"publicKeyBase64\":\"toot:publicKeyBase64\",\"deviceId\":\"toot:deviceId\",\"claim\":{\"@type\":\"@id\",\"@id\":\"toot:claim\"},\"fingerprintKey\":{\"@type\":\"@id\",\"@id\":\"toot:fingerprintKey\"},\"identityKey\":{\"@type\":\"@id\",\"@id\":\"toot:identityKey\"},\"devices\":{\"@type\":\"@id\",\"@id\":\"toot:devices\"},\"messageFranking\":\"toot:messageFranking\",\"messageType\":\"toot:messageType\",\"cipherText\":\"toot:cipherText\",\"suspended\":\"toot:suspended\",\"focalPoint\":{\"@container\":\"@list\",\"@id\":\"toot:focalPoint\"}}],\"id\":\"https://social.tcit.fr/users/tcit\",\"type\":\"Person\",\"following\":\"https://social.tcit.fr/users/tcit/following\",\"followers\":\"https://social.tcit.fr/users/tcit/followers\",\"inbox\":\"https://social.tcit.fr/users/tcit/inbox\",\"outbox\":\"https://social.tcit.fr/users/tcit/outbox\",\"featured\":\"https://social.tcit.fr/users/tcit/collections/featured\",\"featuredTags\":\"https://social.tcit.fr/users/tcit/collections/tags\",\"preferredUsername\":\"tcit\",\"name\":\"🦄 Thomas Citharel\",\"summary\":\"\\u003cp\\u003eHoping to make people\\u0026apos;s life better with free software at \\u003cspan class=\\\"h-card\\\"\\u003e\\u003ca href=\\\"https://framapiaf.org/@Framasoft\\\" class=\\\"u-url mention\\\"\\u003e@\\u003cspan\\u003eFramasoft\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/span\\u003e.\\u003c/p\\u003e\\u003cp\\u003eᕕ(ᐛ)ᕗ\\u003c/p\\u003e\",\"url\":\"https://social.tcit.fr/@tcit\",\"manuallyApprovesFollowers\":false,\"discoverable\":true,\"devices\":\"https://social.tcit.fr/users/tcit/collections/devices\",\"publicKey\":{\"id\":\"https://social.tcit.fr/users/tcit#main-key\",\"owner\":\"https://social.tcit.fr/users/tcit\",\"publicKeyPem\":\"-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApXwYMUdFg3XUd+bGsh8C\\nyiMRGpRGAWuCdM5pDWx5uM4pW2pM3xbHbcI21j9h8BmlAiPg6hbZD73KGly2N8Rt\\n5iIS0I+l6i8kA1JCCdlAaDTRd41RKMggZDoQvjVZQtsyE1VzMeU2kbqqTFN6ew7H\\nvbd6O0NhixoKoZ5f3jwuBDZoT0p1TAcaMdmG8oqHD97isizkDnRn8cOBA6wtI+xb\\n5xP2zxZMsLpTDZLiKU8XcPKZCw4OfQfmDmKkHtrFb77jCAQj/s/FxjVnvxRwmfhN\\nnWy0D+LUV/g63nHh/b5zXIeV92QZLvDYbgbezmzUzv9UeA1s70GGbaDqCIy85gw9\\n+wIDAQAB\\n-----END PUBLIC KEY-----\\n\"},\"tag\":[],\"attachment\":[{\"type\":\"PropertyValue\",\"name\":\"Works at\",\"value\":\"\\u003cspan class=\\\"h-card\\\"\\u003e\\u003ca href=\\\"https://framapiaf.org/@Framasoft\\\" class=\\\"u-url mention\\\"\\u003e@\\u003cspan\\u003eFramasoft\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/span\\u003e\"},{\"type\":\"PropertyValue\",\"name\":\"Pronouns\",\"value\":\"He/Him\"},{\"type\":\"PropertyValue\",\"name\":\"Work Account\",\"value\":\"\\u003ca href=\\\"https://framapiaf.org/@tcit\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"\\u003e\\u003cspan class=\\\"invisible\\\"\\u003ehttps://\\u003c/span\\u003e\\u003cspan class=\\\"\\\"\\u003eframapiaf.org/@tcit\\u003c/span\\u003e\\u003cspan class=\\\"invisible\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e\"},{\"type\":\"PropertyValue\",\"name\":\"Site\",\"value\":\"\\u003ca href=\\\"https://tcit.fr\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"\\u003e\\u003cspan class=\\\"invisible\\\"\\u003ehttps://\\u003c/span\\u003e\\u003cspan class=\\\"\\\"\\u003etcit.fr\\u003c/span\\u003e\\u003cspan class=\\\"invisible\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e\"}],\"endpoints\":{\"sharedInbox\":\"https://social.tcit.fr/inbox\"},\"icon\":{\"type\":\"Image\",\"mediaType\":\"image/jpeg\",\"url\":\"https://media.social.tcit.fr/mastodontcit/accounts/avatars/000/000/001/original/a28c50ce5f2b13fd.jpg\"},\"image\":{\"type\":\"Image\",\"mediaType\":\"image/jpeg\",\"url\":\"https://media.social.tcit.fr/mastodontcit/accounts/headers/000/000/001/original/ac9c4a71083bd9a1.jpg\"}}", "headers": { - "Date": "Mon, 13 May 2019 09:16:03 GMT", + "Date": "Thu, 25 Mar 2021 09:20:47 GMT", "Content-Type": "application/activity+json; charset=utf-8", "Transfer-Encoding": "chunked", "Connection": "keep-alive", @@ -24,12 +22,14 @@ "X-Frame-Options": "DENY", "X-Content-Type-Options": "nosniff", "X-XSS-Protection": "1; mode=block", - "Link": "; rel=\"lrdd\"; type=\"application/xrd+xml\", ; rel=\"alternate\"; type=\"application/atom+xml\", ; rel=\"alternate\"; type=\"application/activity+json\"", + "Referrer-Policy": "same-origin", + "Strict-Transport-Security": "max-age=63072000; includeSubDomains; preload", + "X-Clacks-Overhead": "GNU Natalie Nguyen", "Vary": "Accept, Accept-Encoding, Origin", "Cache-Control": "max-age=180, public", - "ETag": "W/\"94c59bcf2b317b0b130e2eecda95b800\"", - "X-Request-Id": "9e5aeac4-fec6-4454-ade5-b1ca76b051d2", - "X-Runtime": "0.017077", + "ETag": "W/\"02b63cb3b3430080c6706574823964a3\"", + "X-Request-Id": "39d9795c-872e-443a-8aa2-c6cb597b9e4e", + "X-Runtime": "0.025156", "X-Cached": "MISS" }, "status_code": 200, @@ -39,9 +39,13 @@ { "request": { "body": "", - "headers": [], + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-beta.6-14-ge6189390-dirty" + }, "method": "get", - "options": [], + "options": { + "recv_timeout": 20000 + }, "request_body": "", "url": "https://media.social.tcit.fr/mastodontcit/accounts/avatars/000/000/001/original/a28c50ce5f2b13fd.jpg" }, @@ -49,15 +53,15 @@ "binary": true, "body": "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", "headers": { - "Server": "nginx/1.15.12", - "Date": "Mon, 13 May 2019 09:16:03 GMT", + "Server": "nginx/1.14.2", + "Date": "Thu, 25 Mar 2021 09:20:47 GMT", "Content-Type": "image/jpeg", "Content-Length": "4283", "Connection": "keep-alive", "ETag": "\"fa0bd9e906cf03cff0d50cc4a111322e\"", "Last-Modified": "Tue, 31 Jul 2018 13:56:47 GMT", - "x-amz-id-2": "+To4FtymHdRkZSiDo9MrQD0yu6ZSn5lh7eri0V4HC3DA2iMwFTMNZ4Sj1kN/hvP+JxrjLs0AmnMY", - "x-amz-request-id": "D7705B440C4C6BAB", + "x-amz-id-2": "W5zM+dD3AoO4DNCQtapsFi/HkLpvMOvQ9BRQFt9lF3g0GVxHiKOxMGMDm818yrh5zNZ4Z8Ve1RJJ", + "x-amz-request-id": "3EC456329FF0CAFB", "X-Cached": "HIT", "Accept-Ranges": "bytes" }, @@ -68,26 +72,30 @@ { "request": { "body": "", - "headers": [], + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-beta.6-14-ge6189390-dirty" + }, "method": "get", - "options": [], + "options": { + "recv_timeout": 20000 + }, "request_body": "", - "url": "https://media.social.tcit.fr/mastodontcit/accounts/headers/000/000/001/original/a3f3ec4f1b6f9f50.png" + "url": "https://media.social.tcit.fr/mastodontcit/accounts/headers/000/000/001/original/ac9c4a71083bd9a1.jpg" }, "response": { "binary": true, - "body": "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", + "body": "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", "headers": { - "Server": "nginx/1.15.12", - "Date": "Mon, 13 May 2019 09:16:03 GMT", - "Content-Type": "image/png", - "Content-Length": "425045", + "Server": "nginx/1.14.2", + "Date": "Thu, 25 Mar 2021 09:20:47 GMT", + "Content-Type": "image/jpeg", + "Content-Length": "114726", "Connection": "keep-alive", "Cache-Control": "public, max-age=315576000, immutable", - "ETag": "\"4ddd7f14be50f8bc3a800c7f3acd9f78\"", - "Last-Modified": "Sat, 27 Apr 2019 17:50:06 GMT", - "x-amz-id-2": "7p6sI+2FD1quB+kDTPjAhdhXv7WHTGFbJ2zX8DhC0RSLOZF65oDcj8lb5hmYm0X+TW2uLzejLKaT", - "x-amz-request-id": "CF8E974D4592F9B8", + "ETag": "\"18851ab965bcb14a7c0c8560b2899fc0\"", + "Last-Modified": "Thu, 16 Jul 2020 08:58:24 GMT", + "x-amz-id-2": "PMOlAqg6HumtHo3MyIeDwpUEMgW7msmKOMbUDS125EDMsImNXHXJQVm/xCvrEMUwTKwv9oMpePua", + "x-amz-request-id": "E22D3F330D9355AA", "X-Cached": "HIT", "Accept-Ranges": "bytes" }, diff --git a/test/fixtures/vcr_cassettes/relay/fetch_relay_follow.json b/test/fixtures/vcr_cassettes/relay/fetch_relay_follow.json deleted file mode 100644 index 7d4027941..000000000 --- a/test/fixtures/vcr_cassettes/relay/fetch_relay_follow.json +++ /dev/null @@ -1,101 +0,0 @@ -[ - { - "request": { - "body": "", - "headers": { - "Accept": "application/json, application/activity+json, application/jrd+json" - }, - "method": "get", - "options": { - "follow_redirect": "true" - }, - "request_body": "", - "url": "http://mobilizon1.com/.well-known/webfinger?resource=acct:relay@mobilizon1.com" - }, - "response": { - "binary": false, - "body": "{\"aliases\":[\"http://mobilizon1.com/relay\"],\"links\":[{\"href\":\"http://mobilizon1.com/relay\",\"rel\":\"self\",\"type\":\"application/activity+json\"},{\"href\":\"http://mobilizon1.com/relay\",\"rel\":\"https://webfinger.net/rel/profile-page/\",\"type\":\"text/html\"}],\"subject\":\"acct:relay@mobilizon1.com\"}", - "headers": { - "Server": "nginx/1.16.1", - "Date": "Fri, 13 Dec 2019 09:41:40 GMT", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "284", - "Connection": "keep-alive", - "access-control-allow-credentials": "true", - "access-control-allow-origin": "*", - "access-control-expose-headers": "", - "cache-control": "max-age=0, private, must-revalidate", - "x-request-id": "Fd_k7OtPJ28p8-MAAAOh" - }, - "status_code": 200, - "type": "ok" - } - }, - { - "request": { - "body": "", - "headers": { - "Accept": "application/activity+json" - }, - "method": "get", - "options": { - "follow_redirect": "true" - }, - "request_body": "", - "url": "http://mobilizon1.com/relay" - }, - "response": { - "binary": false, - "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://litepub.social/litepub/context.jsonld\",{\"Hashtag\":\"as:Hashtag\",\"category\":\"sc:category\",\"ical\":\"http://www.w3.org/2002/12/cal/ical#\",\"joinMode\":{\"@id\":\"mz:joinMode\",\"@type\":\"mz:joinModeType\"},\"joinModeType\":{\"@id\":\"mz:joinModeType\",\"@type\":\"rdfs:Class\"},\"maximumAttendeeCapacity\":\"sc:maximumAttendeeCapacity\",\"mz\":\"https://joinmobilizon.org/ns#\",\"repliesModerationOption\":{\"@id\":\"mz:repliesModerationOption\",\"@type\":\"mz:repliesModerationOptionType\"},\"repliesModerationOptionType\":{\"@id\":\"mz:repliesModerationOptionType\",\"@type\":\"rdfs:Class\"},\"sc\":\"http://schema.org#\",\"uuid\":\"sc:identifier\"}],\"endpoints\":{\"sharedInbox\":\"http://mobilizon1.com/inbox\"},\"followers\":\"http://mobilizon1.com/relay/followers\",\"following\":\"http://mobilizon1.com/relay/following\",\"id\":\"http://mobilizon1.com/relay\",\"inbox\":\"http://mobilizon1.com/inbox\",\"manuallyApprovesFollowers\":false,\"name\":\"Mobilizon\",\"outbox\":null,\"preferredUsername\":\"relay\",\"publicKey\":{\"id\":\"http://mobilizon1.com/relay#main-key\",\"owner\":\"http://mobilizon1.com/relay\",\"publicKeyPem\":\"-----BEGIN RSA PUBLIC KEY-----\\nMIIBCgKCAQEAqBbeHMV5UVw0AIVch7fWDp2it5rqbGZX6yXPYnnT8LHhdvfv3DFk\\npk74BN66MzNqsthvSVznu2BEil0sEKD5rQoE9Yirhzz/LN9SlnU+u6262nBA18E3\\nkQ10RgL2jpZ9e8Om6qYqarhN7draupJXYRKEaUoEFPT09ABbwQv+4K1YadU8klJi\\nHJ6D+IIHiXNizfsxVLDKpbUKStMYeEzyfqCkWw0EQEuzc3O7Aci5lwCMkCts2993\\nsTbNyzsYAVWJNcy/An1F1P+K4iZhWEtZInQz67MBtjMWtQUhyWib0e671HdBiWM6\\nkZq74U8c6RR6eMzBLuY7YAUCG6nWg90zxwIDAQAB\\n-----END RSA PUBLIC KEY-----\\n\\n\"},\"summary\":\"Change this to a proper description of your instance\",\"type\":\"Application\",\"url\":\"http://mobilizon1.com/relay\"}", - "headers": { - "Server": "nginx/1.16.1", - "Date": "Fri, 13 Dec 2019 09:41:41 GMT", - "Content-Type": "application/activity+json", - "Content-Length": "1657", - "Connection": "keep-alive", - "access-control-allow-credentials": "true", - "access-control-allow-origin": "*", - "access-control-expose-headers": "", - "cache-control": "max-age=0, private, must-revalidate", - "x-request-id": "Fd_k7PjOAWuySL0AAAPB" - }, - "status_code": 200, - "type": "ok" - } - }, - { - "request": { - "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://litepub.social/litepub/context.jsonld\",{\"Hashtag\":\"as:Hashtag\",\"category\":\"sc:category\",\"ical\":\"http://www.w3.org/2002/12/cal/ical#\",\"joinMode\":{\"@id\":\"mz:joinMode\",\"@type\":\"mz:joinModeType\"},\"joinModeType\":{\"@id\":\"mz:joinModeType\",\"@type\":\"rdfs:Class\"},\"maximumAttendeeCapacity\":\"sc:maximumAttendeeCapacity\",\"mz\":\"https://joinmobilizon.org/ns#\",\"repliesModerationOption\":{\"@id\":\"mz:repliesModerationOption\",\"@type\":\"mz:repliesModerationOptionType\"},\"repliesModerationOptionType\":{\"@id\":\"mz:repliesModerationOptionType\",\"@type\":\"rdfs:Class\"},\"sc\":\"http://schema.org#\",\"uuid\":\"sc:identifier\"}],\"actor\":\"http://mobilizon.test/relay\",\"cc\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"id\":\"http://mobilizon.test/follow/b7791977-2a75-4715-815b-6e7125065b71\",\"object\":\"http://mobilizon1.com/relay\",\"to\":[\"http://mobilizon1.com/relay\"],\"type\":\"Follow\"}", - "headers": { - "Content-Type": "application/activity+json", - "signature": "keyId=\"http://mobilizon.test/relay#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) content-length date digest host\",signature=\"WbyGHT/WdvdRpWek8uCGHrFSblLpg+Iq802R5S2cjNj035OKpxRmu1r8u9Qr5KGIKgZn6LHt9YmB+PNlwsubPtTSkJpE8AAUDMHLKgCrH7A5Q6x6GlARl5bHNo4QtOxkXvnEbn31xfNDNp70QqZb/emw95TnELYUlMLZds0qYutT8U4WdDhSWcVytQmKJWNZXxEj+KlMDUaxag3lGscJ/HY0F+yGNov7FHthid1Y4LTGFsp/tismnMTlba12NH/kXPHtduNsX8uxFslM2ODwqAaospTGEpXmr9CPgbNy7626qgYaR2RdB/fYlCayLI4JJIlH8gOdocGHPrWNtVEHaQ==\"", - "digest": "SHA-256=ibNFcsnBeCCjWZo9We60tKfbRN3el0WCMVdOxtuC1cg=", - "date": "Fri, 13 Dec 2019 09:41:41 GMT" - }, - "method": "post", - "options": { - "pool": "default" - }, - "request_body": "", - "url": "http://mobilizon1.com/inbox" - }, - "response": { - "binary": false, - "body": "# HTTPoison.Error at POST /inbox\n\nException:\n\n ** (HTTPoison.Error) :nxdomain\n (httpoison) lib/httpoison.ex:128: HTTPoison.request!/5\n (mobilizon) lib/service/activity_pub/activity_pub.ex:610: Mobilizon.Service.ActivityPub.fetch_and_prepare_actor_from_url/1\n (mobilizon) lib/service/activity_pub/activity_pub.ex:473: Mobilizon.Service.ActivityPub.make_actor_from_url/2\n (mobilizon) lib/service/activity_pub/activity_pub.ex:122: Mobilizon.Service.ActivityPub.get_or_fetch_actor_by_url/2\n (mobilizon) lib/service/http_signatures/signature.ex:54: Mobilizon.Federation.HTTPSignatures.Signature.get_public_key_for_url/1\n (mobilizon) lib/service/http_signatures/signature.ex:74: Mobilizon.Federation.HTTPSignatures.Signature.fetch_public_key/1\n (http_signatures) lib/http_signatures/http_signatures.ex:40: HTTPSignatures.validate_conn/1\n (mobilizon) lib/mobilizon_web/http_signature.ex:45: Mobilizon.Web.HTTPSignaturePlug.call/2\n (mobilizon) Mobilizon.Web.Router.activity_pub_signature/2\n (mobilizon) lib/mobilizon_web/router.ex:1: Mobilizon.Web.Router.__pipe_through7__/1\n (phoenix) lib/phoenix/router.ex:283: Phoenix.Router.__call__/2\n (mobilizon) lib/mobilizon_web/endpoint.ex:1: Mobilizon.Web.Endpoint.plug_builder_call/2\n (mobilizon) lib/plug/debugger.ex:122: Mobilizon.Web.Endpoint.\"call (overridable 3)\"/2\n (mobilizon) lib/mobilizon_web/endpoint.ex:1: Mobilizon.Web.Endpoint.call/2\n (phoenix) lib/phoenix/endpoint/cowboy2_handler.ex:42: Phoenix.Endpoint.Cowboy2Handler.init/4\n (cowboy) /home/tcit/dev/frama/mobilizon/deps/cowboy/src/cowboy_handler.erl:41: :cowboy_handler.execute/2\n (cowboy) /home/tcit/dev/frama/mobilizon/deps/cowboy/src/cowboy_stream_h.erl:320: :cowboy_stream_h.execute/3\n (cowboy) /home/tcit/dev/frama/mobilizon/deps/cowboy/src/cowboy_stream_h.erl:302: :cowboy_stream_h.request_process/3\n (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3\n \n\n## Connection details\n\n### Params\n\n %{\"@context\" => [\"https://www.w3.org/ns/activitystreams\", \"https://litepub.social/litepub/context.jsonld\", %{\"Hashtag\" => \"as:Hashtag\", \"category\" => \"sc:category\", \"ical\" => \"http://www.w3.org/2002/12/cal/ical#\", \"joinMode\" => %{\"@id\" => \"mz:joinMode\", \"@type\" => \"mz:joinModeType\"}, \"joinModeType\" => %{\"@id\" => \"mz:joinModeType\", \"@type\" => \"rdfs:Class\"}, \"maximumAttendeeCapacity\" => \"sc:maximumAttendeeCapacity\", \"mz\" => \"https://joinmobilizon.org/ns#\", \"repliesModerationOption\" => %{\"@id\" => \"mz:repliesModerationOption\", \"@type\" => \"mz:repliesModerationOptionType\"}, \"repliesModerationOptionType\" => %{\"@id\" => \"mz:repliesModerationOptionType\", \"@type\" => \"rdfs:Class\"}, \"sc\" => \"http://schema.org#\", \"uuid\" => \"sc:identifier\"}], \"actor\" => \"http://mobilizon.test/relay\", \"cc\" => [\"https://www.w3.org/ns/activitystreams#Public\"], \"id\" => \"http://mobilizon.test/follow/b7791977-2a75-4715-815b-6e7125065b71\", \"object\" => \"http://mobilizon1.com/relay\", \"to\" => [\"http://mobilizon1.com/relay\"], \"type\" => \"Follow\"}\n\n### Request info\n\n * URI: http://mobilizon1.com:80/inbox\n * Query string: \n\n### Headers\n \n * connection: upgrade\n * content-length: 912\n * content-type: application/activity+json\n * date: Fri, 13 Dec 2019 09:41:41 GMT\n * digest: SHA-256=ibNFcsnBeCCjWZo9We60tKfbRN3el0WCMVdOxtuC1cg=\n * host: mobilizon1.com\n * signature: keyId=\"http://mobilizon.test/relay#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) content-length date digest host\",signature=\"WbyGHT/WdvdRpWek8uCGHrFSblLpg+Iq802R5S2cjNj035OKpxRmu1r8u9Qr5KGIKgZn6LHt9YmB+PNlwsubPtTSkJpE8AAUDMHLKgCrH7A5Q6x6GlARl5bHNo4QtOxkXvnEbn31xfNDNp70QqZb/emw95TnELYUlMLZds0qYutT8U4WdDhSWcVytQmKJWNZXxEj+KlMDUaxag3lGscJ/HY0F+yGNov7FHthid1Y4LTGFsp/tismnMTlba12NH/kXPHtduNsX8uxFslM2ODwqAaospTGEpXmr9CPgbNy7626qgYaR2RdB/fYlCayLI4JJIlH8gOdocGHPrWNtVEHaQ==\"\n * user-agent: hackney/1.15.2\n * x-forwarded-for: 127.0.0.1\n * x-real-ip: 127.0.0.1\n\n### Session\n\n %{}\n", - "headers": { - "Server": "nginx/1.16.1", - "Date": "Fri, 13 Dec 2019 09:41:41 GMT", - "Content-Type": "text/markdown; charset=utf-8", - "Content-Length": "3977", - "Connection": "keep-alive", - "access-control-allow-credentials": "true", - "access-control-allow-origin": "*", - "access-control-expose-headers": "", - "cache-control": "max-age=0, private, must-revalidate", - "x-request-id": "Fd_k7PoZpCCBYRQAAAPh" - }, - "status_code": 500, - "type": "ok" - } - } -] diff --git a/test/fixtures/vcr_cassettes/relay/fetch_relay_unfollow.json b/test/fixtures/vcr_cassettes/relay/fetch_relay_unfollow.json index 3fce72e7b..e69de29bb 100644 --- a/test/fixtures/vcr_cassettes/relay/fetch_relay_unfollow.json +++ b/test/fixtures/vcr_cassettes/relay/fetch_relay_unfollow.json @@ -1,101 +0,0 @@ -[ - { - "request": { - "body": "", - "headers": { - "Accept": "application/json, application/activity+json, application/jrd+json" - }, - "method": "get", - "options": { - "follow_redirect": "true" - }, - "request_body": "", - "url": "http://mobilizon1.com/.well-known/webfinger?resource=acct:relay@mobilizon1.com" - }, - "response": { - "binary": false, - "body": "{\"aliases\":[\"http://mobilizon1.com/relay\"],\"links\":[{\"href\":\"http://mobilizon1.com/relay\",\"rel\":\"self\",\"type\":\"application/activity+json\"},{\"href\":\"http://mobilizon1.com/relay\",\"rel\":\"https://webfinger.net/rel/profile-page/\",\"type\":\"text/html\"}],\"subject\":\"acct:relay@mobilizon1.com\"}", - "headers": { - "Server": "nginx/1.16.1", - "Date": "Fri, 13 Dec 2019 09:41:39 GMT", - "Content-Type": "application/json; charset=utf-8", - "Content-Length": "284", - "Connection": "keep-alive", - "access-control-allow-credentials": "true", - "access-control-allow-origin": "*", - "access-control-expose-headers": "", - "cache-control": "max-age=0, private, must-revalidate", - "x-request-id": "Fd_k7LmY5k0CMQkAAANB" - }, - "status_code": 200, - "type": "ok" - } - }, - { - "request": { - "body": "", - "headers": { - "Accept": "application/activity+json" - }, - "method": "get", - "options": { - "follow_redirect": "true" - }, - "request_body": "", - "url": "http://mobilizon1.com/relay" - }, - "response": { - "binary": false, - "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://litepub.social/litepub/context.jsonld\",{\"Hashtag\":\"as:Hashtag\",\"category\":\"sc:category\",\"ical\":\"http://www.w3.org/2002/12/cal/ical#\",\"joinMode\":{\"@id\":\"mz:joinMode\",\"@type\":\"mz:joinModeType\"},\"joinModeType\":{\"@id\":\"mz:joinModeType\",\"@type\":\"rdfs:Class\"},\"maximumAttendeeCapacity\":\"sc:maximumAttendeeCapacity\",\"mz\":\"https://joinmobilizon.org/ns#\",\"repliesModerationOption\":{\"@id\":\"mz:repliesModerationOption\",\"@type\":\"mz:repliesModerationOptionType\"},\"repliesModerationOptionType\":{\"@id\":\"mz:repliesModerationOptionType\",\"@type\":\"rdfs:Class\"},\"sc\":\"http://schema.org#\",\"uuid\":\"sc:identifier\"}],\"endpoints\":{\"sharedInbox\":\"http://mobilizon1.com/inbox\"},\"followers\":\"http://mobilizon1.com/relay/followers\",\"following\":\"http://mobilizon1.com/relay/following\",\"id\":\"http://mobilizon1.com/relay\",\"inbox\":\"http://mobilizon1.com/inbox\",\"manuallyApprovesFollowers\":false,\"name\":\"Mobilizon\",\"outbox\":null,\"preferredUsername\":\"relay\",\"publicKey\":{\"id\":\"http://mobilizon1.com/relay#main-key\",\"owner\":\"http://mobilizon1.com/relay\",\"publicKeyPem\":\"-----BEGIN RSA PUBLIC KEY-----\\nMIIBCgKCAQEAqBbeHMV5UVw0AIVch7fWDp2it5rqbGZX6yXPYnnT8LHhdvfv3DFk\\npk74BN66MzNqsthvSVznu2BEil0sEKD5rQoE9Yirhzz/LN9SlnU+u6262nBA18E3\\nkQ10RgL2jpZ9e8Om6qYqarhN7draupJXYRKEaUoEFPT09ABbwQv+4K1YadU8klJi\\nHJ6D+IIHiXNizfsxVLDKpbUKStMYeEzyfqCkWw0EQEuzc3O7Aci5lwCMkCts2993\\nsTbNyzsYAVWJNcy/An1F1P+K4iZhWEtZInQz67MBtjMWtQUhyWib0e671HdBiWM6\\nkZq74U8c6RR6eMzBLuY7YAUCG6nWg90zxwIDAQAB\\n-----END RSA PUBLIC KEY-----\\n\\n\"},\"summary\":\"Change this to a proper description of your instance\",\"type\":\"Application\",\"url\":\"http://mobilizon1.com/relay\"}", - "headers": { - "Server": "nginx/1.16.1", - "Date": "Fri, 13 Dec 2019 09:41:40 GMT", - "Content-Type": "application/activity+json", - "Content-Length": "1657", - "Connection": "keep-alive", - "access-control-allow-credentials": "true", - "access-control-allow-origin": "*", - "access-control-expose-headers": "", - "cache-control": "max-age=0, private, must-revalidate", - "x-request-id": "Fd_k7L4h92fDp5cAAANh" - }, - "status_code": 200, - "type": "ok" - } - }, - { - "request": { - "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://litepub.social/litepub/context.jsonld\",{\"Hashtag\":\"as:Hashtag\",\"category\":\"sc:category\",\"ical\":\"http://www.w3.org/2002/12/cal/ical#\",\"joinMode\":{\"@id\":\"mz:joinMode\",\"@type\":\"mz:joinModeType\"},\"joinModeType\":{\"@id\":\"mz:joinModeType\",\"@type\":\"rdfs:Class\"},\"maximumAttendeeCapacity\":\"sc:maximumAttendeeCapacity\",\"mz\":\"https://joinmobilizon.org/ns#\",\"repliesModerationOption\":{\"@id\":\"mz:repliesModerationOption\",\"@type\":\"mz:repliesModerationOptionType\"},\"repliesModerationOptionType\":{\"@id\":\"mz:repliesModerationOptionType\",\"@type\":\"rdfs:Class\"},\"sc\":\"http://schema.org#\",\"uuid\":\"sc:identifier\"}],\"actor\":\"http://mobilizon.test/relay\",\"cc\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"id\":\"http://mobilizon.test/follow/57a6973e-f43f-4533-bf71-7a14a4c6e5ac\",\"object\":\"http://mobilizon1.com/relay\",\"to\":[\"http://mobilizon1.com/relay\"],\"type\":\"Follow\"}", - "headers": { - "Content-Type": "application/activity+json", - "signature": "keyId=\"http://mobilizon.test/relay#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) content-length date digest host\",signature=\"JQPqSiJ0ZYdU6llrYXNMuN/bfzoLyubwOB59bljFq6i8ORXLw62Pt7Jue5WkMsySFcCXgS8k8K/H81YZkKzfWadwQV9L5rQEFSuW/DYJ2xffsDj90GsSi+sDRaQ5Ke8nPEbEMGR9jalh/F2VL97XscCgm6i3tdpbs6aFmqjKC+LzeH665t0WCHUxTgK47wECrMHw3j7lteGdm6N6IKWoWsRYeJoyFr/QCbNdWQOaAYYpCbJd0fjhPQRHhWQXidBoaDkhwesWc3mO8pvEnply9ES7Nzc6ULK7B98hg+aWeep8/KzRbxFyJ0OgnDJj/l39QiJ9t7v0yHX/WUzn0CaiiQ==\"", - "digest": "SHA-256=Qc9d9X3qh2EqIqtn/72iY17OMDXAOINDC10hARNAc4w=", - "date": "Fri, 13 Dec 2019 09:41:40 GMT" - }, - "method": "post", - "options": { - "pool": "default" - }, - "request_body": "", - "url": "http://mobilizon1.com/inbox" - }, - "response": { - "binary": false, - "body": "# HTTPoison.Error at POST /inbox\n\nException:\n\n ** (HTTPoison.Error) :nxdomain\n (httpoison) lib/httpoison.ex:128: HTTPoison.request!/5\n (mobilizon) lib/service/activity_pub/activity_pub.ex:610: Mobilizon.Service.ActivityPub.fetch_and_prepare_actor_from_url/1\n (mobilizon) lib/service/activity_pub/activity_pub.ex:473: Mobilizon.Service.ActivityPub.make_actor_from_url/2\n (mobilizon) lib/service/activity_pub/activity_pub.ex:122: Mobilizon.Service.ActivityPub.get_or_fetch_actor_by_url/2\n (mobilizon) lib/service/http_signatures/signature.ex:54: Mobilizon.Service.HTTPSignatures.Signature.get_public_key_for_url/1\n (mobilizon) lib/service/http_signatures/signature.ex:74: Mobilizon.Service.HTTPSignatures.Signature.fetch_public_key/1\n (http_signatures) lib/http_signatures/http_signatures.ex:40: HTTPSignatures.validate_conn/1\n (mobilizon) lib/mobilizon_web/http_signature.ex:45: Mobilizon.Web.HTTPSignaturePlug.call/2\n (mobilizon) Mobilizon.Web.Router.activity_pub_signature/2\n (mobilizon) lib/mobilizon_web/router.ex:1: Mobilizon.Web.Router.__pipe_through7__/1\n (phoenix) lib/phoenix/router.ex:283: Phoenix.Router.__call__/2\n (mobilizon) lib/mobilizon_web/endpoint.ex:1: Mobilizon.Web.Endpoint.plug_builder_call/2\n (mobilizon) lib/plug/debugger.ex:122: Mobilizon.Web.Endpoint.\"call (overridable 3)\"/2\n (mobilizon) lib/mobilizon_web/endpoint.ex:1: Mobilizon.Web.Endpoint.call/2\n (phoenix) lib/phoenix/endpoint/cowboy2_handler.ex:42: Phoenix.Endpoint.Cowboy2Handler.init/4\n (cowboy) /home/tcit/dev/frama/mobilizon/deps/cowboy/src/cowboy_handler.erl:41: :cowboy_handler.execute/2\n (cowboy) /home/tcit/dev/frama/mobilizon/deps/cowboy/src/cowboy_stream_h.erl:320: :cowboy_stream_h.execute/3\n (cowboy) /home/tcit/dev/frama/mobilizon/deps/cowboy/src/cowboy_stream_h.erl:302: :cowboy_stream_h.request_process/3\n (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3\n \n\n## Connection details\n\n### Params\n\n %{\"@context\" => [\"https://www.w3.org/ns/activitystreams\", \"https://litepub.social/litepub/context.jsonld\", %{\"Hashtag\" => \"as:Hashtag\", \"category\" => \"sc:category\", \"ical\" => \"http://www.w3.org/2002/12/cal/ical#\", \"joinMode\" => %{\"@id\" => \"mz:joinMode\", \"@type\" => \"mz:joinModeType\"}, \"joinModeType\" => %{\"@id\" => \"mz:joinModeType\", \"@type\" => \"rdfs:Class\"}, \"maximumAttendeeCapacity\" => \"sc:maximumAttendeeCapacity\", \"mz\" => \"https://joinmobilizon.org/ns#\", \"repliesModerationOption\" => %{\"@id\" => \"mz:repliesModerationOption\", \"@type\" => \"mz:repliesModerationOptionType\"}, \"repliesModerationOptionType\" => %{\"@id\" => \"mz:repliesModerationOptionType\", \"@type\" => \"rdfs:Class\"}, \"sc\" => \"http://schema.org#\", \"uuid\" => \"sc:identifier\"}], \"actor\" => \"http://mobilizon.test/relay\", \"cc\" => [\"https://www.w3.org/ns/activitystreams#Public\"], \"id\" => \"http://mobilizon.test/follow/57a6973e-f43f-4533-bf71-7a14a4c6e5ac\", \"object\" => \"http://mobilizon1.com/relay\", \"to\" => [\"http://mobilizon1.com/relay\"], \"type\" => \"Follow\"}\n\n### Request info\n\n * URI: http://mobilizon1.com:80/inbox\n * Query string: \n\n### Headers\n \n * connection: upgrade\n * content-length: 912\n * content-type: application/activity+json\n * date: Fri, 13 Dec 2019 09:41:40 GMT\n * digest: SHA-256=Qc9d9X3qh2EqIqtn/72iY17OMDXAOINDC10hARNAc4w=\n * host: mobilizon1.com\n * signature: keyId=\"http://mobilizon.test/relay#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) content-length date digest host\",signature=\"JQPqSiJ0ZYdU6llrYXNMuN/bfzoLyubwOB59bljFq6i8ORXLw62Pt7Jue5WkMsySFcCXgS8k8K/H81YZkKzfWadwQV9L5rQEFSuW/DYJ2xffsDj90GsSi+sDRaQ5Ke8nPEbEMGR9jalh/F2VL97XscCgm6i3tdpbs6aFmqjKC+LzeH665t0WCHUxTgK47wECrMHw3j7lteGdm6N6IKWoWsRYeJoyFr/QCbNdWQOaAYYpCbJd0fjhPQRHhWQXidBoaDkhwesWc3mO8pvEnply9ES7Nzc6ULK7B98hg+aWeep8/KzRbxFyJ0OgnDJj/l39QiJ9t7v0yHX/WUzn0CaiiQ==\"\n * user-agent: hackney/1.15.2\n * x-forwarded-for: 127.0.0.1\n * x-real-ip: 127.0.0.1\n\n### Session\n\n %{}\n", - "headers": { - "Server": "nginx/1.16.1", - "Date": "Fri, 13 Dec 2019 09:41:40 GMT", - "Content-Type": "text/markdown; charset=utf-8", - "Content-Length": "3977", - "Connection": "keep-alive", - "access-control-allow-credentials": "true", - "access-control-allow-origin": "*", - "access-control-expose-headers": "", - "cache-control": "max-age=0, private, must-revalidate", - "x-request-id": "Fd_k7MU4jVIgj4wAAAOB" - }, - "status_code": 500, - "type": "ok" - } - } -] diff --git a/test/fixtures/vcr_cassettes/webfinger/friendica.json b/test/fixtures/vcr_cassettes/webfinger/friendica.json index ab86ef707..95a8d40e9 100644 --- a/test/fixtures/vcr_cassettes/webfinger/friendica.json +++ b/test/fixtures/vcr_cassettes/webfinger/friendica.json @@ -3,28 +3,81 @@ "request": { "body": "", "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "http://squeet.me/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\n\n301 Moved Permanently\n\n

Moved Permanently

\n

The document has moved here.

\n
\n
Apache/2.4.25 (Debian) Server at squeet.me Port 80
\n\n", + "headers": { + "Date": "Fri, 09 Apr 2021 08:08:52 GMT", + "Server": "Apache/2.4.25 (Debian)", + "Location": "https://squeet.me/.well-known/host-meta", + "Content-Length": "322", + "Content-Type": "text/html; charset=iso-8859-1" + }, + "status_code": 301, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "https://squeet.me/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\n\n \n squeet.me\n \n \n \n \n \n\t\n\n RSA.xlM2BNDH9hnO3W6vOUfJ5-tcUCaX-rx-kKydQd4ht21At4D4d1MrZ6nAQu7rnf5or9YZRhIpgvJvXBqWSo0zmALkUZUVrsS9WhH65I0qt24XNTPZJ1FdPDd7c1C131GzkymCbXBie3U2JaT7t0oimhWKUeA45gNfXk1T1l-7v4k.AQAB\n\n", + "headers": { + "Date": "Fri, 09 Apr 2021 08:08:52 GMT", + "Server": "Apache/2.4.25 (Debian)", + "X-Account-Management-Status": "none", + "Vary": "Accept-Encoding", + "Transfer-Encoding": "chunked", + "Content-Type": "text/xml;charset=UTF-8" + }, + "status_code": 200, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", "Accept": "application/json, application/activity+json, application/jrd+json" }, "method": "get", "options": { - "follow_redirect": "true" + "recv_timeout": 20000 }, "request_body": "", - "url": "http://squeet.me/.well-known/webfinger?resource=acct:lain@squeet.me" + "url": "https://squeet.me/.well-known/webfinger?resource=acct:lain@squeet.me" }, "response": { "binary": false, - "body": "{\"subject\":\"acct:lain@squeet.me\",\"aliases\":[\"https:\\/\\/squeet.me\\/~lain\",\"https:\\/\\/squeet.me\\/profile\\/lain\"],\"links\":[{\"rel\":\"http:\\/\\/purl.org\\/macgirvin\\/dfrn\\/1.0\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"http:\\/\\/schemas.google.com\\/g\\/2010#updates-from\",\"type\":\"application\\/atom+xml\",\"href\":\"https:\\/\\/squeet.me\\/dfrn_poll\\/lain\"},{\"rel\":\"http:\\/\\/webfinger.net\\/rel\\/profile-page\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"self\",\"type\":\"application\\/activity+json\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"http:\\/\\/microformats.org\\/profile\\/hcard\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\\/hcard\\/lain\"},{\"rel\":\"http:\\/\\/portablecontacts.net\\/spec\\/1.0\",\"href\":\"https:\\/\\/squeet.me\\/poco\\/lain\"},{\"rel\":\"http:\\/\\/webfinger.net\\/rel\\/avatar\",\"type\":\"image\\/jpeg\",\"href\":\"https:\\/\\/squeet.me\\/photo\\/profile\\/301.jpg\"},{\"rel\":\"http:\\/\\/joindiaspora.com\\/seed_location\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\"},{\"rel\":\"salmon\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\"},{\"rel\":\"http:\\/\\/salmon-protocol.org\\/ns\\/salmon-replies\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\"},{\"rel\":\"http:\\/\\/salmon-protocol.org\\/ns\\/salmon-mention\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\\/mention\"},{\"rel\":\"http:\\/\\/ostatus.org\\/schema\\/1.0\\/subscribe\",\"template\":\"https:\\/\\/squeet.me\\/follow?url={uri}\"},{\"rel\":\"magic-public-key\",\"href\":\"data:application\\/magic-public-key,RSA.AMwa8FUs2fWEjX0xN7yRQgegQffhBpuKNC6fa5VNSVorFjGZhRrlPMn7TQOeihlc9lBz2OsHlIedbYn2uJ7yCs0.AQAB\"},{\"rel\":\"http:\\/\\/purl.org\\/openwebauth\\/v1\",\"type\":\"application\\/x-dfrn+json\",\"href\":\"https:\\/\\/squeet.me\\/owa\"}]}", + "body": "{\"subject\":\"acct:lain@squeet.me\",\"aliases\":[\"https:\\/\\/squeet.me\\/~lain\",\"https:\\/\\/squeet.me\\/profile\\/lain\"],\"links\":[{\"rel\":\"http:\\/\\/purl.org\\/macgirvin\\/dfrn\\/1.0\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"http:\\/\\/schemas.google.com\\/g\\/2010#updates-from\",\"type\":\"application\\/atom+xml\",\"href\":\"https:\\/\\/squeet.me\\/dfrn_poll\\/lain\"},{\"rel\":\"http:\\/\\/webfinger.net\\/rel\\/profile-page\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"self\",\"type\":\"application\\/activity+json\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"http:\\/\\/microformats.org\\/profile\\/hcard\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\\/hcard\\/lain\"},{\"rel\":\"http:\\/\\/portablecontacts.net\\/spec\\/1.0\",\"href\":\"https:\\/\\/squeet.me\\/poco\\/lain\"},{\"rel\":\"http:\\/\\/webfinger.net\\/rel\\/avatar\",\"type\":\"image\\/jpeg\",\"href\":\"https:\\/\\/squeet.me\\/photo\\/abf2ee40bfcb044ac7fd1d143c82f63a-4.jpg?ts=1526641378\"},{\"rel\":\"http:\\/\\/joindiaspora.com\\/seed_location\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\"},{\"rel\":\"salmon\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\"},{\"rel\":\"http:\\/\\/salmon-protocol.org\\/ns\\/salmon-replies\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\"},{\"rel\":\"http:\\/\\/salmon-protocol.org\\/ns\\/salmon-mention\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\\/mention\"},{\"rel\":\"http:\\/\\/ostatus.org\\/schema\\/1.0\\/subscribe\",\"template\":\"https:\\/\\/squeet.me\\/follow?url={uri}\"},{\"rel\":\"magic-public-key\",\"href\":\"data:application\\/magic-public-key,RSA.zBrwVSzZ9YSNfTE3vJFCB6BB9-EGm4o0Lp9rlU1JWisWMZmFGuU8yftNA56KGVz2UHPY6weUh51tifa4nvIKzQ.AQAB\"},{\"rel\":\"http:\\/\\/purl.org\\/openwebauth\\/v1\",\"type\":\"application\\/x-zot+json\",\"href\":\"https:\\/\\/squeet.me\\/owa\"}]}", "headers": { - "Date": "Tue, 13 Nov 2018 11:11:09 GMT", - "Server": "Apache", - "Expires": "Thu, 19 Nov 1981 08:52:00 GMT", - "Cache-Control": "no-store, no-cache, must-revalidate", - "Pragma": "no-cache", + "Date": "Fri, 09 Apr 2021 08:08:52 GMT", + "Server": "Apache/2.4.25 (Debian)", "X-Account-Management-Status": "none", "Access-Control-Allow-Origin": "*", - "Set-Cookie": "PHPSESSID=330arcps63iok272c5hqdsfhp3; path=/; secure; HttpOnly", - "Strict-Transport-Security": "max-age=31536000; includeSubDomains", "Transfer-Encoding": "chunked", "Content-Type": "application/json; charset=utf-8" }, diff --git a/test/fixtures/vcr_cassettes/webfinger/mastodon.json b/test/fixtures/vcr_cassettes/webfinger/mastodon.json index 123fbfe64..5dbee2a96 100644 --- a/test/fixtures/vcr_cassettes/webfinger/mastodon.json +++ b/test/fixtures/vcr_cassettes/webfinger/mastodon.json @@ -3,26 +3,26 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.0-rc.2-5-g6701e6a4", - "Accept": "application/json, application/activity+json, application/jrd+json" + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" }, "method": "get", "options": { "recv_timeout": 20000 }, "request_body": "", - "url": "http://social.tcit.fr/.well-known/webfinger?resource=acct:tcit@social.tcit.fr" + "url": "http://social.tcit.fr/.well-known/host-meta" }, "response": { "binary": false, - "body": "\r\n301 Moved Permanently\r\n\r\n

301 Moved Permanently

\r\n
nginx/1.19.3
\r\n\r\n\r\n", + "body": "\r\n301 Moved Permanently\r\n\r\n

301 Moved Permanently

\r\n
nginx/1.14.2
\r\n\r\n\r\n", "headers": { - "Server": "nginx/1.19.3", - "Date": "Wed, 21 Oct 2020 09:07:41 GMT", + "Server": "nginx/1.14.2", + "Date": "Thu, 08 Apr 2021 18:59:56 GMT", "Content-Type": "text/html", - "Content-Length": "169", + "Content-Length": "185", "Connection": "keep-alive", - "Location": "https://social.tcit.fr/.well-known/webfinger?resource=acct:tcit@social.tcit.fr" + "Location": "https://social.tcit.fr/.well-known/host-meta" }, "status_code": 301, "type": "ok" @@ -32,7 +32,47 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.0-rc.2-5-g6701e6a4", + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "https://social.tcit.fr/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\n\n \n\n", + "headers": { + "Date": "Thu, 08 Apr 2021 18:59:56 GMT", + "Content-Type": "application/xrd+xml; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Server": "Mastodon", + "X-Frame-Options": "DENY", + "X-Content-Type-Options": "nosniff", + "X-XSS-Protection": "1; mode=block", + "Referrer-Policy": "same-origin", + "Strict-Transport-Security": "max-age=63072000; includeSubDomains; preload", + "X-Clacks-Overhead": "GNU Natalie Nguyen", + "Vary": "Accept, Accept-Encoding, Origin", + "Cache-Control": "max-age=259200, public", + "ETag": "W/\"b397089bfee005b03360ba4435bb4aad\"", + "X-Request-Id": "41e837ba-21a6-4324-bda8-cac28a8d1778", + "X-Runtime": "0.004198", + "X-Cached": "MISS" + }, + "status_code": 200, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", "Accept": "application/json, application/activity+json, application/jrd+json" }, "method": "get", @@ -46,7 +86,7 @@ "binary": false, "body": "{\"subject\":\"acct:tcit@social.tcit.fr\",\"aliases\":[\"https://social.tcit.fr/@tcit\",\"https://social.tcit.fr/users/tcit\"],\"links\":[{\"rel\":\"http://webfinger.net/rel/profile-page\",\"type\":\"text/html\",\"href\":\"https://social.tcit.fr/@tcit\"},{\"rel\":\"self\",\"type\":\"application/activity+json\",\"href\":\"https://social.tcit.fr/users/tcit\"},{\"rel\":\"http://ostatus.org/schema/1.0/subscribe\",\"template\":\"https://social.tcit.fr/authorize_interaction?uri={uri}\"}]}", "headers": { - "Date": "Wed, 21 Oct 2020 09:07:41 GMT", + "Date": "Thu, 08 Apr 2021 18:59:56 GMT", "Content-Type": "application/jrd+json; charset=utf-8", "Transfer-Encoding": "chunked", "Connection": "keep-alive", @@ -60,8 +100,8 @@ "Vary": "Accept, Accept-Encoding, Origin", "Cache-Control": "max-age=259200, public", "ETag": "W/\"37760e35c1537b8e02b6d4b4f9ebfe82\"", - "X-Request-Id": "429bb891-1033-498b-91bb-12835984223f", - "X-Runtime": "0.072046", + "X-Request-Id": "4c8384d6-d921-4ef6-8a18-1fcbf35ee6bc", + "X-Runtime": "0.009277", "X-Cached": "MISS" }, "status_code": 200, diff --git a/test/fixtures/vcr_cassettes/webfinger/peertube.json b/test/fixtures/vcr_cassettes/webfinger/peertube.json index 3e8eba03d..fc525c3cc 100644 --- a/test/fixtures/vcr_cassettes/webfinger/peertube.json +++ b/test/fixtures/vcr_cassettes/webfinger/peertube.json @@ -3,33 +3,88 @@ "request": { "body": "", "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "http://framatube.org/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\r\n301 Moved Permanently\r\n\r\n

301 Moved Permanently

\r\n
nginx/1.14.2
\r\n\r\n\r\n", + "headers": { + "Server": "nginx/1.14.2", + "Date": "Thu, 08 Apr 2021 18:59:59 GMT", + "Content-Type": "text/html", + "Content-Length": "185", + "Connection": "keep-alive", + "Location": "https://framatube.org/.well-known/host-meta" + }, + "status_code": 301, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "https://framatube.org/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\n\n \n", + "headers": { + "Server": "nginx/1.14.2", + "Date": "Thu, 08 Apr 2021 18:59:59 GMT", + "Content-Type": "application/xml; charset=utf-8", + "Content-Length": "219", + "Connection": "keep-alive", + "Tk": "N", + "Access-Control-Allow-Origin": "*", + "ETag": "W/\"db-l6RCFQ8UK40DPZ9VQ8G/SKn3A64\"" + }, + "status_code": 200, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", "Accept": "application/json, application/activity+json, application/jrd+json" }, "method": "get", "options": { - "follow_redirect": "true" + "recv_timeout": 20000 }, "request_body": "", - "url": "http://framatube.org/.well-known/webfinger?resource=acct:framasoft@framatube.org" + "url": "https://framatube.org/.well-known/webfinger?resource=acct:framasoft@framatube.org" }, "response": { "binary": false, - "body": "{\"subject\":\"acct:framasoft@framatube.org\",\"aliases\":[\"https://framatube.org/accounts/framasoft\"],\"links\":[{\"rel\":\"self\",\"type\":\"application/activity+json\",\"href\":\"https://framatube.org/accounts/framasoft\"}]}", + "body": "{\"subject\":\"acct:framasoft@framatube.org\",\"aliases\":[\"https://framatube.org/accounts/framasoft\"],\"links\":[{\"rel\":\"self\",\"type\":\"application/activity+json\",\"href\":\"https://framatube.org/accounts/framasoft\"},{\"rel\":\"http://ostatus.org/schema/1.0/subscribe\",\"template\":\"https://framatube.org/remote-interaction?uri={uri}\"}]}", "headers": { - "Server": "nginx/1.10.3", - "Date": "Tue, 13 Nov 2018 11:11:11 GMT", + "Server": "nginx/1.14.2", + "Date": "Thu, 08 Apr 2021 18:59:59 GMT", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "207", + "Content-Length": "321", "Connection": "keep-alive", - "X-DNS-Prefetch-Control": "off", - "X-Frame-Options": "DENY", - "X-Download-Options": "noopen", - "X-Content-Type-Options": "nosniff", - "X-XSS-Protection": "1; mode=block", "Tk": "N", - "ETag": "W/\"cf-VoWlsif7OQ4xxqki7jRAnOPKRes\"", - "Strict-Transport-Security": "max-age=63072000; includeSubDomains; preload", - "X-Robots-Tag": "none" + "Access-Control-Allow-Origin": "*", + "ETag": "W/\"141-yxvvlAPayX5y2q2Yra8qYVtz4VU\"" }, "status_code": 200, "type": "ok" diff --git a/test/fixtures/vcr_cassettes/webfinger/pleroma.json b/test/fixtures/vcr_cassettes/webfinger/pleroma.json index c4e182755..6bc2e3163 100644 --- a/test/fixtures/vcr_cassettes/webfinger/pleroma.json +++ b/test/fixtures/vcr_cassettes/webfinger/pleroma.json @@ -3,38 +3,107 @@ "request": { "body": "", "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "http://pleroma.soykaf.com/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\r\n301 Moved Permanently\r\n\r\n

301 Moved Permanently

\r\n
nginx/1.18.0 (Ubuntu)
\r\n\r\n\r\n", + "headers": { + "Server": "nginx/1.18.0 (Ubuntu)", + "Date": "Thu, 08 Apr 2021 18:59:57 GMT", + "Content-Type": "text/html", + "Content-Length": "178", + "Connection": "keep-alive", + "Location": "https://pleroma.soykaf.com/.well-known/host-meta" + }, + "status_code": 301, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "https://pleroma.soykaf.com/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "", + "headers": { + "Server": "nginx/1.18.0 (Ubuntu)", + "Date": "Thu, 08 Apr 2021 18:59:57 GMT", + "Content-Type": "application/xrd+xml; charset=utf-8", + "Content-Length": "220", + "Connection": "keep-alive", + "access-control-allow-credentials": "true", + "access-control-allow-origin": "*", + "access-control-expose-headers": "Link,X-RateLimit-Reset,X-RateLimit-Limit,X-RateLimit-Remaining,X-Request-Id,Idempotency-Key", + "cache-control": "max-age=0, private, must-revalidate", + "content-security-policy": "upgrade-insecure-requests;script-src 'self';connect-src 'self' blob: https://pleroma.soykaf.com wss://pleroma.soykaf.com;media-src 'self';img-src 'self' data: blob:;default-src 'none';base-uri 'self';frame-ancestors 'none';style-src 'self' 'unsafe-inline';font-src 'self';manifest-src 'self';", + "referrer-policy": "same-origin", + "x-content-type-options": "nosniff", + "x-download-options": "noopen", + "x-frame-options": "DENY", + "x-permitted-cross-domain-policies": "none", + "x-request-id": "FnP3HZA8tRWC7E4EYzyS", + "x-xss-protection": "1; mode=block" + }, + "status_code": 200, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", "Accept": "application/json, application/activity+json, application/jrd+json" }, "method": "get", "options": { - "follow_redirect": "true" + "recv_timeout": 20000 }, "request_body": "", - "url": "http://pleroma.soykaf.com/.well-known/webfinger?resource=acct:lain@pleroma.soykaf.com" + "url": "https://pleroma.soykaf.com/.well-known/webfinger?resource=acct:lain@pleroma.soykaf.com" }, "response": { "binary": false, - "body": "{\"aliases\":[\"https://pleroma.soykaf.com/users/lain\"],\"links\":[{\"href\":\"https://pleroma.soykaf.com/users/lain/feed.atom\",\"rel\":\"http://schemas.google.com/g/2010#updates-from\",\"type\":\"application/atom+xml\"},{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"http://webfinger.net/rel/profile-page\",\"type\":\"text/html\"},{\"href\":\"https://pleroma.soykaf.com/users/lain/salmon\",\"rel\":\"salmon\"},{\"href\":\"data:application/magic-public-key,RSA.u39dKLin8N4PywPvasEGXstOMsgg9m1OEKnpfHnSHqc6UOtIPs5-aI_LcLbhIEH2EVl6jstvtqMIloPch1FizZ3OBiKz81dXTiEZ3NfKgj_GJfIlipChAadxrmUyWT_Pr0qPaF1vhPrkSTwR8iDNUiQ-OEggRPpJVkJ619MXNdsJE59yklZiD1WY0vC9aG9m-dh0BANKNwSjwfZ3uFjDh0UosMATKjPTSO_I59nK_lArex_jAwTnVm6Dryk2qR2XXZyzTzZAHuYqSM77RlsNTJUCOaSadl816eZAvU3TF-ibIou0D-0sN-M-QehRh93sVJ95U40GQz8jOGc_5wK8xw==.AQAB\",\"rel\":\"magic-public-key\"},{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"self\",\"type\":\"application/activity+json\"},{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"self\",\"type\":\"application/ld+json; profile=\\\"https://www.w3.org/ns/activitystreams\\\"\"},{\"rel\":\"http://ostatus.org/schema/1.0/subscribe\",\"template\":\"https://pleroma.soykaf.com/ostatus_subscribe?acct={uri}\"}],\"subject\":\"acct:lain@pleroma.soykaf.com\"}", + "body": "{\"aliases\":[\"https://pleroma.soykaf.com/users/lain\"],\"links\":[{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"http://webfinger.net/rel/profile-page\",\"type\":\"text/html\"},{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"self\",\"type\":\"application/activity+json\"},{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"self\",\"type\":\"application/ld+json; profile=\\\"https://www.w3.org/ns/activitystreams\\\"\"},{\"rel\":\"http://ostatus.org/schema/1.0/subscribe\",\"template\":\"https://pleroma.soykaf.com/ostatus_subscribe?acct={uri}\"}],\"subject\":\"acct:lain@pleroma.soykaf.com\"}", "headers": { - "Server": "nginx/1.10.3", - "Date": "Tue, 13 Nov 2018 11:11:11 GMT", + "Server": "nginx/1.18.0 (Ubuntu)", + "Date": "Thu, 08 Apr 2021 18:59:57 GMT", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "1214", + "Content-Length": "576", "Connection": "keep-alive", "Vary": "Accept-Encoding", - "cache-control": "max-age=0, private, must-revalidate", - "x-request-id": "2ljal4oljell0gfni41am571", - "access-control-allow-origin": "*", - "access-control-expose-headers": "", "access-control-allow-credentials": "true", - "Access-Control-Allow-Methods": "POST, GET, OPTIONS", - "Access-Control-Allow-Headers": "Authorization, Content-Type", - "X-XSS-Protection": "1; mode=block", - "X-Permitted-Cross-Domain-Policies": "none", - "X-Frame-Options": "DENY", - "X-Content-Type-Options": "nosniff", - "Referrer-Policy": "same-origin", - "X-Download-Options": "noopen" + "access-control-allow-origin": "*", + "access-control-expose-headers": "Link,X-RateLimit-Reset,X-RateLimit-Limit,X-RateLimit-Remaining,X-Request-Id,Idempotency-Key", + "cache-control": "max-age=0, private, must-revalidate", + "content-security-policy": "upgrade-insecure-requests;script-src 'self';connect-src 'self' blob: https://pleroma.soykaf.com wss://pleroma.soykaf.com;media-src 'self';img-src 'self' data: blob:;default-src 'none';base-uri 'self';frame-ancestors 'none';style-src 'self' 'unsafe-inline';font-src 'self';manifest-src 'self';", + "referrer-policy": "same-origin", + "x-content-type-options": "nosniff", + "x-download-options": "noopen", + "x-frame-options": "DENY", + "x-permitted-cross-domain-policies": "none", + "x-request-id": "FnP3HZJ_kh8ymy8E1OCx", + "x-xss-protection": "1; mode=block" }, "status_code": 200, "type": "ok" diff --git a/test/graphql/api/search_test.exs b/test/graphql/api/search_test.exs index 74e8a65ea..2d0b1351f 100644 --- a/test/graphql/api/search_test.exs +++ b/test/graphql/api/search_test.exs @@ -12,14 +12,15 @@ defmodule Mobilizon.GraphQL.API.SearchTest do alias Mobilizon.GraphQL.API.Search alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor test "search an user by username" do - with_mock ActivityPub, + with_mock ActivityPubActor, find_or_make_actor_from_nickname: fn "toto@domain.tld" -> {:ok, %Actor{id: 42}} end do assert {:ok, %Page{total: 1, elements: [%Actor{id: 42}]}} == Search.search_actors(%{term: "toto@domain.tld"}, 1, 10, :Person) - assert_called(ActivityPub.find_or_make_actor_from_nickname("toto@domain.tld")) + assert_called(ActivityPubActor.find_or_make_actor_from_nickname("toto@domain.tld")) end end diff --git a/test/graphql/resolvers/activity_test.exs b/test/graphql/resolvers/activity_test.exs new file mode 100644 index 000000000..437c0e55d --- /dev/null +++ b/test/graphql/resolvers/activity_test.exs @@ -0,0 +1,347 @@ +defmodule Mobilizon.GraphQL.Resolvers.ActivityTest do + use Mobilizon.Web.ConnCase + + import Mobilizon.Factory + + alias Mobilizon.{Activities, Posts} + alias Mobilizon.Activities.Activity + alias Mobilizon.Actors.Actor + alias Mobilizon.Service.Activity.Event, as: EventActivity + alias Mobilizon.Service.Activity.Post, as: PostActivity + + alias Mobilizon.GraphQL.AbsintheHelpers + + setup %{conn: conn} do + group = insert(:group) + {:ok, conn: conn, group: group} + end + + describe "Resolver: List activities for group" do + @group_activities_query """ + query GroupTimeline( + $preferredUsername: String! + $type: ActivityType + $author: ActivityAuthor + $page: Int + $limit: Int + ) { + group(preferredUsername: $preferredUsername) { + id + preferredUsername + domain + name + activity(type: $type, author: $author, page: $page, limit: $limit) { + total + elements { + id + insertedAt + subject + subjectParams { + key + value + } + type + author { + id + preferredUsername + name + domain + avatar { + id + url + } + } + group { + id + preferredUsername + } + object { + ... on Event { + id + title + } + ... on Post { + id + title + } + ... on Member { + id + actor { + id + name + preferredUsername + domain + avatar { + id + url + } + } + } + ... on Resource { + id + title + path + type + } + ... on Discussion { + id + title + slug + } + ... on Group { + id + preferredUsername + domain + name + summary + visibility + openness + physicalAddress { + id + } + banner { + id + } + avatar { + id + } + } + } + } + } + } + } + """ + + test "without being logged-in", %{ + conn: conn, + group: %Actor{preferred_username: preferred_username} + } do + res = + conn + |> AbsintheHelpers.graphql_query( + query: @group_activities_query, + variables: %{preferredUsername: preferred_username} + ) + + assert hd(res["errors"])["message"] == "unauthenticated" + end + + test "without being a member", %{ + conn: conn, + group: %Actor{preferred_username: preferred_username} + } do + user = insert(:user) + insert(:actor, user: user) + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @group_activities_query, + variables: %{preferredUsername: preferred_username} + ) + + assert hd(res["errors"])["message"] == "unauthorized" + end + + test "without being a validated member", %{ + conn: conn, + group: %Actor{preferred_username: preferred_username} = group + } do + user = insert(:user) + actor = insert(:actor, user: user) + insert(:member, parent: group, actor: actor, role: :not_approved) + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @group_activities_query, + variables: %{preferredUsername: preferred_username} + ) + + assert hd(res["errors"])["message"] == "unauthorized" + end + + test "group_activity/3 list group activities", %{ + conn: conn, + group: %Actor{preferred_username: preferred_username, id: group_id} = group + } do + user = insert(:user) + actor = insert(:actor, user: user) + + insert(:member, + parent: group, + actor: actor, + role: :member, + member_since: DateTime.truncate(DateTime.utc_now(), :second) + ) + + event = insert(:event, attributed_to: group, organizer_actor: actor) + EventActivity.insert_activity(event, subject: "event_created") + assert %{success: 1, failure: 0} == Oban.drain_queue(queue: :activity) + assert Activities.list_activities() |> length() == 1 + + [%Activity{author_id: author_id, group_id: activity_group_id}] = + Activities.list_activities() + + assert author_id == actor.id + assert activity_group_id == group_id + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @group_activities_query, + variables: %{preferredUsername: preferred_username} + ) + + assert res["errors"] == nil + assert res["data"]["group"]["id"] == to_string(group_id) + assert res["data"]["group"]["activity"]["total"] == 1 + activity = hd(res["data"]["group"]["activity"]["elements"]) + assert activity["object"]["id"] == to_string(event.id) + assert activity["subject"] == "event_created" + + assert Enum.find(activity["subjectParams"], &(&1["key"] == "event_title"))["value"] == + event.title + + assert Enum.find(activity["subjectParams"], &(&1["key"] == "event_uuid"))["value"] == + event.uuid + end + + test "group_activity/3 list group activities filtered by type", %{ + conn: conn, + group: %Actor{preferred_username: preferred_username, id: group_id} = group + } do + user = insert(:user) + actor = insert(:actor, user: user) + + insert(:member, + parent: group, + actor: actor, + role: :member, + member_since: DateTime.truncate(DateTime.utc_now(), :second) + ) + + event = insert(:event, attributed_to: group, organizer_actor: actor) + post = insert(:post, author: actor, attributed_to: group) + EventActivity.insert_activity(event, subject: "event_created") + PostActivity.insert_activity(post, subject: "post_created") + assert %{success: 2, failure: 0} == Oban.drain_queue(queue: :activity) + assert Activities.list_activities() |> length() == 2 + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @group_activities_query, + variables: %{preferredUsername: preferred_username, type: "POST"} + ) + + assert res["errors"] == nil + assert res["data"]["group"]["id"] == to_string(group_id) + assert res["data"]["group"]["activity"]["total"] == 1 + activity = hd(res["data"]["group"]["activity"]["elements"]) + assert activity["object"]["id"] == to_string(post.id) + assert activity["subject"] == "post_created" + + assert Enum.find(activity["subjectParams"], &(&1["key"] == "post_title"))["value"] == + post.title + + assert Enum.find(activity["subjectParams"], &(&1["key"] == "post_slug"))["value"] == + post.slug + end + + test "group_activity/3 list group activities filtered by author", %{ + conn: conn, + group: %Actor{preferred_username: preferred_username, id: group_id} = group + } do + user = insert(:user) + actor = insert(:actor, user: user) + + insert(:member, + parent: group, + actor: actor, + role: :member, + member_since: DateTime.truncate(DateTime.utc_now(), :second) + ) + + event = insert(:event, attributed_to: group, organizer_actor: actor) + post = insert(:post, attributed_to: group) + EventActivity.insert_activity(event, subject: "event_created") + PostActivity.insert_activity(post, subject: "post_created") + assert %{success: 2, failure: 0} == Oban.drain_queue(queue: :activity) + assert Activities.list_activities() |> length() == 2 + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @group_activities_query, + variables: %{preferredUsername: preferred_username, author: "BY"} + ) + + assert res["errors"] == nil + assert res["data"]["group"]["id"] == to_string(group_id) + assert res["data"]["group"]["activity"]["total"] == 1 + activity = hd(res["data"]["group"]["activity"]["elements"]) + assert activity["object"]["id"] == to_string(post.id) + assert activity["subject"] == "post_created" + + assert Enum.find(activity["subjectParams"], &(&1["key"] == "post_title"))["value"] == + post.title + + assert Enum.find(activity["subjectParams"], &(&1["key"] == "post_slug"))["value"] == + post.slug + end + + test "group_activity/3 list group activities from deleted object", %{ + conn: conn, + group: %Actor{preferred_username: preferred_username, id: group_id} = group + } do + user = insert(:user) + actor = insert(:actor, user: user) + + insert(:member, + parent: group, + actor: actor, + role: :member, + member_since: DateTime.truncate(DateTime.utc_now(), :second) + ) + + post = insert(:post, attributed_to: group, author: actor) + PostActivity.insert_activity(post, subject: "post_created") + Process.sleep(1000) + Posts.delete_post(post) + PostActivity.insert_activity(post, subject: "post_deleted") + assert %{success: 2, failure: 0} == Oban.drain_queue(queue: :activity) + assert Activities.list_activities() |> length() == 2 + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @group_activities_query, + variables: %{preferredUsername: preferred_username} + ) + + assert res["errors"] == nil + assert res["data"]["group"]["id"] == to_string(group_id) + assert res["data"]["group"]["activity"]["total"] == 2 + [delete_activity, create_activity] = res["data"]["group"]["activity"]["elements"] + assert create_activity["object"] == nil + assert create_activity["subject"] == "post_created" + + assert Enum.find(create_activity["subjectParams"], &(&1["key"] == "post_title"))["value"] == + post.title + + assert Enum.find(create_activity["subjectParams"], &(&1["key"] == "post_slug"))["value"] == + post.slug + + assert delete_activity["object"] == nil + assert delete_activity["subject"] == "post_deleted" + end + end +end diff --git a/test/graphql/resolvers/admin_test.exs b/test/graphql/resolvers/admin_test.exs index d079568e7..0812caef7 100644 --- a/test/graphql/resolvers/admin_test.exs +++ b/test/graphql/resolvers/admin_test.exs @@ -31,17 +31,20 @@ defmodule Mobilizon.GraphQL.Resolvers.AdminTest do query = """ { actionLogs { - action, - actor { - preferredUsername - }, - object { - ... on Report { - id, - status + total + elements { + action, + actor { + preferredUsername }, - ... on ReportNote { - content + object { + ... on Report { + id, + status + }, + ... on ReportNote { + content + } } } } @@ -62,9 +65,10 @@ defmodule Mobilizon.GraphQL.Resolvers.AdminTest do assert json_response(res, 200)["errors"] == nil - assert json_response(res, 200)["data"]["actionLogs"] |> length == 3 + assert json_response(res, 200)["data"]["actionLogs"]["total"] == 3 + assert json_response(res, 200)["data"]["actionLogs"]["elements"] |> length == 3 - assert json_response(res, 200)["data"]["actionLogs"] == [ + assert json_response(res, 200)["data"]["actionLogs"]["elements"] == [ %{ "action" => "NOTE_DELETION", "actor" => %{"preferredUsername" => moderator_2.preferred_username}, diff --git a/test/graphql/resolvers/comment_test.exs b/test/graphql/resolvers/comment_test.exs index 395d1ff42..4ded1f48e 100644 --- a/test/graphql/resolvers/comment_test.exs +++ b/test/graphql/resolvers/comment_test.exs @@ -228,25 +228,28 @@ defmodule Mobilizon.GraphQL.Resolvers.CommentTest do query = """ { actionLogs { - action, - actor { - preferredUsername - }, - object { - ... on Report { - id, - status + total + elements { + action, + actor { + preferredUsername }, - ... on ReportNote { - content - } - ... on Event { - id, - title - }, - ... on Comment { - id, - text + object { + ... on Report { + id, + status + }, + ... on ReportNote { + content + } + ... on Event { + id, + title + }, + ... on Comment { + id, + text + } } } } @@ -260,7 +263,7 @@ defmodule Mobilizon.GraphQL.Resolvers.CommentTest do refute json_response(res, 200)["errors"] - assert hd(json_response(res, 200)["data"]["actionLogs"]) == %{ + assert hd(json_response(res, 200)["data"]["actionLogs"]["elements"]) == %{ "action" => "COMMENT_DELETION", "actor" => %{"preferredUsername" => actor_moderator.preferred_username}, "object" => %{"text" => comment.text, "id" => to_string(comment.id)} diff --git a/test/graphql/resolvers/discussion_test.exs b/test/graphql/resolvers/discussion_test.exs new file mode 100644 index 000000000..e0adc56ec --- /dev/null +++ b/test/graphql/resolvers/discussion_test.exs @@ -0,0 +1,558 @@ +defmodule Mobilizon.GraphQL.Resolvers.DiscussionTest do + use Mobilizon.Web.ConnCase + + import Mobilizon.Factory + + alias Mobilizon.Actors.Actor + alias Mobilizon.Discussions + alias Mobilizon.Discussions.{Comment, Discussion} + alias Mobilizon.GraphQL.AbsintheHelpers + + @comment_text "What do you think?" + @discussion_title "Hey, I'm a title!" + + setup %{conn: conn} do + user = insert(:user) + actor = insert(:actor, user: user) + group = insert(:group) + insert(:member, role: :member, parent: group, actor: actor) + + {:ok, conn: conn, actor: actor, user: user, group: group} + end + + @discussion_fields_fragment """ + fragment DiscussionFields on Discussion { + id + title + slug + lastComment { + id + text + insertedAt + updatedAt + actor { + id + } + } + actor { + id + domain + name + preferredUsername + } + creator { + id + domain + name + preferredUsername + } + } + """ + + describe "create a discussion" do + @create_discussion_mutation """ + mutation createDiscussion($title: String!, $actorId: ID!, $text: String!) { + createDiscussion(title: $title, text: $text, actorId: $actorId) { + ...DiscussionFields + } + } + #{@discussion_fields_fragment} + """ + + test "create_discussion/3 creates a discussion", %{ + conn: conn, + actor: actor, + user: user, + group: group + } do + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @create_discussion_mutation, + variables: %{text: @comment_text, actorId: group.id, title: @discussion_title} + ) + + assert res["errors"] == nil + assert res["data"]["createDiscussion"]["actor"]["id"] == to_string(group.id) + assert res["data"]["createDiscussion"]["creator"]["id"] == to_string(actor.id) + + assert res["data"]["createDiscussion"]["title"] == @discussion_title + assert res["data"]["createDiscussion"]["lastComment"]["text"] == @comment_text + + assert res["data"]["createDiscussion"]["lastComment"]["actor"]["id"] == + to_string(actor.id) + end + + test "create_discussion/3 doesn't work if the actor is not a member", %{ + conn: conn, + group: group + } do + user = insert(:user) + insert(:actor, user: user) + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @create_discussion_mutation, + variables: %{text: @comment_text, actorId: group.id, title: @discussion_title} + ) + + assert hd(res["errors"])["code"] == "unauthorized" + end + + test "create_discussion/3 doesn't work if the actor is not an approved member", %{ + conn: conn, + group: group + } do + user = insert(:user) + actor = insert(:actor, user: user) + insert(:member, role: :invited, actor: actor, parent: group) + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @create_discussion_mutation, + variables: %{text: @comment_text, actorId: group.id, title: @discussion_title} + ) + + assert hd(res["errors"])["code"] == "unauthorized" + end + + test "create_discussion/3 doesn't work if the user isn't logged-in", %{ + conn: conn, + group: group + } do + res = + conn + |> AbsintheHelpers.graphql_query( + query: @create_discussion_mutation, + variables: %{text: @comment_text, actorId: group.id, title: @discussion_title} + ) + + assert hd(res["errors"])["code"] == "unauthenticated" + end + end + + describe "reply to a discussion" do + @reply_to_discussion_mutation """ + mutation replyToDiscussion($discussionId: ID!, $text: String!) { + replyToDiscussion(discussionId: $discussionId, text: $text) { + ...DiscussionFields + } + } + #{@discussion_fields_fragment} + """ + + @reply_text "I agree with that." + + test "reply_to_discussion/3 replies to a discussion", %{ + conn: conn, + actor: actor, + group: group + } do + %Discussion{id: discussion_id} = insert_discussion(group, actor) + + user = insert(:user) + actor2 = insert(:actor, user: user) + insert(:member, role: :member, parent: group, actor: actor2) + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @reply_to_discussion_mutation, + variables: %{text: @reply_text, discussionId: discussion_id} + ) + + assert res["errors"] == nil + assert res["data"]["replyToDiscussion"]["actor"]["id"] == to_string(group.id) + assert res["data"]["replyToDiscussion"]["creator"]["id"] == to_string(actor.id) + + assert res["data"]["replyToDiscussion"]["lastComment"]["actor"]["id"] == + to_string(actor2.id) + + assert res["data"]["replyToDiscussion"]["lastComment"]["text"] == @reply_text + end + end + + describe "Update a discussion" do + @update_a_discussion_mutation """ + mutation updateDiscussion($discussionId: ID!, $title: String!) { + updateDiscussion(discussionId: $discussionId, title: $title) { + ...DiscussionFields + } + } + #{@discussion_fields_fragment} + """ + + @updated_title "New title for discussion" + + test "update_a_discussion/3 updates a discussion as original creator", %{ + conn: conn, + user: user, + actor: actor, + group: group + } do + %Discussion{id: discussion_id} = insert_discussion(group, actor) + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @update_a_discussion_mutation, + variables: %{title: @updated_title, discussionId: discussion_id} + ) + + assert res["errors"] == nil + assert res["data"]["updateDiscussion"]["title"] == @updated_title + end + + test "update_a_discussion/3 doesn't update a discussion if not member", %{ + conn: conn, + actor: actor, + group: group + } do + %Discussion{id: discussion_id} = insert_discussion(group, actor) + + user = insert(:user) + actor2 = insert(:actor, user: user) + insert(:member, role: :invited, parent: group, actor: actor2) + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @update_a_discussion_mutation, + variables: %{title: @updated_title, discussionId: discussion_id} + ) + + assert hd(res["errors"])["code"] == "unauthorized" + end + + test "update_a_discussion/3 doesn't update a discussion if not logged in", %{ + conn: conn, + actor: actor, + group: group + } do + %Discussion{id: discussion_id} = insert_discussion(group, actor) + + res = + conn + |> AbsintheHelpers.graphql_query( + query: @update_a_discussion_mutation, + variables: %{title: @updated_title, discussionId: discussion_id} + ) + + assert hd(res["errors"])["code"] == "unauthenticated" + end + end + + describe "Delete a discussion" do + @delete_discussion_mutation """ + mutation deleteDiscussion($discussionId: ID!) { + deleteDiscussion(discussionId: $discussionId) { + id + } + } + """ + + test "delete_discussion/3 deletes a discussion", %{ + conn: conn, + user: user, + actor: actor, + group: group + } do + %Discussion{id: discussion_id} = insert_discussion(group, actor) + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @delete_discussion_mutation, + variables: %{discussionId: discussion_id} + ) + + assert res["errors"] == nil + assert res["data"]["deleteDiscussion"]["id"] == to_string(discussion_id) + + assert nil == Discussions.get_discussion(discussion_id) + end + + test "delete_discussion/3 doesn't delete a discussion if not member", %{ + conn: conn, + actor: actor, + group: group + } do + %Discussion{id: discussion_id} = insert_discussion(group, actor) + + user = insert(:user) + actor2 = insert(:actor, user: user) + insert(:member, role: :invited, parent: group, actor: actor2) + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @delete_discussion_mutation, + variables: %{discussionId: discussion_id} + ) + + assert hd(res["errors"])["code"] == "unauthorized" + refute nil == Discussions.get_discussion(discussion_id) + end + + test "delete_discussion/3 doesn't delete a discussion if not logged in", %{ + conn: conn, + actor: actor, + group: group + } do + %Discussion{id: discussion_id} = insert_discussion(group, actor) + + res = + conn + |> AbsintheHelpers.graphql_query( + query: @delete_discussion_mutation, + variables: %{discussionId: discussion_id} + ) + + assert hd(res["errors"])["code"] == "unauthenticated" + refute nil == Discussions.get_discussion(discussion_id) + end + + # test "create_comment/3 doesn't allow creating events if it's disabled", %{ + # conn: conn, + # actor: actor, + # user: user, + # event: event + # } do + # {:ok, %Event{options: %EventOptions{comment_moderation: :closed}}} = + # Events.update_event(event, %{options: %{comment_moderation: :closed}}) + + # res = + # conn + # |> auth_conn(user) + # |> AbsintheHelpers.graphql_query( + # query: @create_comment_mutation, + # variables: %{text: @comment_text, eventId: event.id} + # ) + + # assert hd(res["errors"])["message"] == + # "You don't have permission to do this" + # end + + # test "create_comment/3 allows creating events if it's disabled but we're the organizer", %{ + # conn: conn, + # actor: actor, + # user: user + # } do + # event = insert(:event, organizer_actor: actor, options: %{comment_moderation: :closed}) + + # res = + # conn + # |> auth_conn(user) + # |> AbsintheHelpers.graphql_query( + # query: @create_comment_mutation, + # variables: %{text: @comment_text, eventId: event.id} + # ) + + # assert is_nil(res["errors"]) + # assert res["data"]["createComment"]["text"] == @comment_text + # end + + # test "create_comment/3 requires that the user needs to be authenticated", %{ + # conn: conn, + # event: event + # } do + # actor = insert(:actor) + + # res = + # conn + # |> AbsintheHelpers.graphql_query( + # query: @create_comment_mutation, + # variables: %{text: @comment_text, eventId: event.id} + # ) + + # assert hd(res["errors"])["message"] == + # "You are not allowed to create a comment if not connected" + # end + + # test "create_comment/3 creates a reply to a comment", %{ + # conn: conn, + # actor: actor, + # user: user, + # event: event + # } do + # comment = insert(:comment) + + # res = + # conn + # |> auth_conn(user) + # |> AbsintheHelpers.graphql_query( + # query: @create_comment_mutation, + # variables: %{ + # text: @comment_text, + # eventId: event.id, + # inReplyToCommentId: comment.id + # } + # ) + + # assert is_nil(res["errors"]) + # assert res["data"]["createComment"]["text"] == @comment_text + # uuid = res["data"]["createComment"]["uuid"] + + # assert res["data"]["createComment"]["inReplyToComment"]["id"] == + # to_string(comment.id) + + # query = """ + # query { + # thread(id: #{comment.id}) { + # text, + # uuid + # } + # } + # """ + + # res = + # conn + # |> auth_conn(user) + # |> AbsintheHelpers.graphql_query(query: query, variables: %{}) + + # assert res["errors"] == nil + # assert res["data"]["thread"] == [%{"uuid" => uuid, "text" => @comment_text}] + # end + + # @delete_comment """ + # mutation DeleteComment($commentId: ID!) { + # deleteComment(commentId: $commentId) { + # id, + # deletedAt + # } + # } + # """ + + # test "deletes a comment", %{conn: conn, user: user, actor: actor} do + # comment = insert(:comment, actor: actor) + + # res = + # conn + # |> AbsintheHelpers.graphql_query( + # query: @delete_comment, + # variables: %{commentId: comment.id} + # ) + + # assert hd(res["errors"])["message"] == + # "You are not allowed to delete a comment if not connected" + + # # Change the current actor for user + # actor2 = insert(:actor, user: user) + # Mobilizon.Users.update_user_default_actor(user.id, actor2.id) + + # res = + # conn + # |> auth_conn(user) + # |> AbsintheHelpers.graphql_query( + # query: @delete_comment, + # variables: %{commentId: comment.id} + # ) + + # assert hd(res["errors"])["message"] == + # "You cannot delete this comment" + + # Mobilizon.Users.update_user_default_actor(user.id, actor.id) + + # res = + # conn + # |> auth_conn(user) + # |> AbsintheHelpers.graphql_query( + # query: @delete_comment, + # variables: %{commentId: comment.id} + # ) + + # assert res["errors"] == nil + # assert res["data"]["deleteComment"]["id"] == to_string(comment.id) + # refute is_nil(res["data"]["deleteComment"]["deletedAt"]) + # end + + # test "delete_comment/3 allows a comment being deleted by a moderator and creates a entry in actionLogs", + # %{ + # conn: conn, + # user: _user, + # actor: _actor + # } do + # user_moderator = insert(:user, role: :moderator) + # actor_moderator = insert(:actor, user: user_moderator) + + # actor2 = insert(:actor) + # comment = insert(:comment, actor: actor2) + + # res = + # conn + # |> auth_conn(user_moderator) + # |> AbsintheHelpers.graphql_query( + # query: @delete_comment, + # variables: %{commentId: comment.id} + # ) + + # assert res["data"]["deleteComment"]["id"] == to_string(comment.id) + + # query = """ + # { + # actionLogs { + # action, + # actor { + # preferredUsername + # }, + # object { + # ... on Report { + # id, + # status + # }, + # ... on ReportNote { + # content + # } + # ... on Event { + # id, + # title + # }, + # ... on Comment { + # id, + # text + # } + # } + # } + # } + # """ + + # res = + # conn + # |> auth_conn(user_moderator) + # |> get("/api", AbsintheHelpers.query_skeleton(query, "actionLogs")) + + # refute json_response(res, 200)["errors"] + + # assert hd(json_response(res, 200)["data"]["actionLogs"]) == %{ + # "action" => "COMMENT_DELETION", + # "actor" => %{"preferredUsername" => actor_moderator.preferred_username}, + # "object" => %{"text" => comment.text, "id" => to_string(comment.id)} + # } + # end + end + + @spec insert_discussion(Actor.t(), Actor.t()) :: Discussion.t() + defp insert_discussion(%Actor{type: :Group} = group, %Actor{} = actor) do + %Comment{id: comment_id} = comment = insert(:comment) + + %Discussion{id: discussion_id} = + discussion = insert(:discussion, creator: actor, actor: group) + + Discussions.update_comment(comment, %{discussion_id: discussion_id}) + + {:ok, %Discussion{} = discussion} = + Discussions.update_discussion(discussion, %{last_comment_id: comment_id}) + + discussion + end +end diff --git a/test/graphql/resolvers/event_test.exs b/test/graphql/resolvers/event_test.exs index 021347ad7..94db0cd68 100644 --- a/test/graphql/resolvers/event_test.exs +++ b/test/graphql/resolvers/event_test.exs @@ -1368,21 +1368,24 @@ defmodule Mobilizon.Web.Resolvers.EventTest do query = """ { actionLogs { - action, - actor { - preferredUsername - }, - object { - ... on Report { - id, - status + total + elements { + action, + actor { + preferredUsername }, - ... on ReportNote { - content - } - ... on Event { - id, - title + object { + ... on Report { + id, + status + }, + ... on ReportNote { + content + } + ... on Event { + id, + title + } } } } @@ -1394,7 +1397,7 @@ defmodule Mobilizon.Web.Resolvers.EventTest do |> auth_conn(user_moderator) |> get("/api", AbsintheHelpers.query_skeleton(query, "actionLogs")) - assert hd(json_response(res, 200)["data"]["actionLogs"]) == %{ + assert hd(json_response(res, 200)["data"]["actionLogs"]["elements"]) == %{ "action" => "EVENT_DELETION", "actor" => %{"preferredUsername" => actor_moderator.preferred_username}, "object" => %{"title" => event.title, "id" => to_string(event.id)} diff --git a/test/graphql/resolvers/feed_token_test.exs b/test/graphql/resolvers/feed_token_test.exs index 931c8c342..bc2d353ce 100644 --- a/test/graphql/resolvers/feed_token_test.exs +++ b/test/graphql/resolvers/feed_token_test.exs @@ -186,7 +186,7 @@ defmodule Mobilizon.GraphQL.Resolvers.FeedTokenTest do %{ "feedTokens" => [ %{ - "token" => feed_token.token + "token" => ShortUUID.encode!(feed_token.token) } ] } @@ -194,7 +194,7 @@ defmodule Mobilizon.GraphQL.Resolvers.FeedTokenTest do mutation = """ mutation { deleteFeedToken( - token: "#{feed_token.token}", + token: "#{ShortUUID.encode!(feed_token.token)}", ) { actor { id @@ -270,7 +270,7 @@ defmodule Mobilizon.GraphQL.Resolvers.FeedTokenTest do mutation = """ mutation { deleteFeedToken( - token: "#{feed_token.token}", + token: "#{ShortUUID.encode!(feed_token.token)}", ) { actor { id @@ -320,7 +320,7 @@ defmodule Mobilizon.GraphQL.Resolvers.FeedTokenTest do mutation = """ mutation { deleteFeedToken( - token: "#{uuid}" + token: "#{ShortUUID.encode!(uuid)}" ) { actor { id diff --git a/test/graphql/resolvers/participant_test.exs b/test/graphql/resolvers/participant_test.exs index b6cba8240..80d3c7b06 100644 --- a/test/graphql/resolvers/participant_test.exs +++ b/test/graphql/resolvers/participant_test.exs @@ -792,7 +792,7 @@ defmodule Mobilizon.GraphQL.Resolvers.ParticipantTest do |> post("/api", AbsintheHelpers.mutation_skeleton(mutation)) assert hd(json_response(res, 200)["errors"])["message"] == - "Provided moderator profile doesn't have permission on this event" + "Provided profile doesn't have moderator permissions on this event" end end @@ -934,7 +934,7 @@ defmodule Mobilizon.GraphQL.Resolvers.ParticipantTest do |> post("/api", AbsintheHelpers.mutation_skeleton(mutation)) assert hd(json_response(res, 200)["errors"])["message"] == - "Provided moderator profile doesn't have permission on this event" + "Provided profile doesn't have moderator permissions on this event" end end diff --git a/test/graphql/resolvers/person_test.exs b/test/graphql/resolvers/person_test.exs index 8f1bb27b8..a4c2f237f 100644 --- a/test/graphql/resolvers/person_test.exs +++ b/test/graphql/resolvers/person_test.exs @@ -685,15 +685,18 @@ defmodule Mobilizon.GraphQL.Resolvers.PersonTest do @moderation_logs_query """ { actionLogs { - action, - actor { - id, - preferredUsername - }, - object { - ...on Person { + total + elements { + action, + actor { id, preferredUsername + }, + object { + ...on Person { + id, + preferredUsername + } } } } @@ -733,7 +736,7 @@ defmodule Mobilizon.GraphQL.Resolvers.PersonTest do |> auth_conn(modo) |> AbsintheHelpers.graphql_query(query: @moderation_logs_query) - actionlog = hd(res["data"]["actionLogs"]) + actionlog = hd(res["data"]["actionLogs"]["elements"]) refute is_nil(actionlog) assert actionlog["action"] == "ACTOR_SUSPENSION" assert actionlog["actor"]["id"] == to_string(modo_actor_id) diff --git a/test/graphql/resolvers/post_test.exs b/test/graphql/resolvers/post_test.exs index e20e384b6..968d79303 100644 --- a/test/graphql/resolvers/post_test.exs +++ b/test/graphql/resolvers/post_test.exs @@ -107,6 +107,8 @@ defmodule Mobilizon.GraphQL.Resolvers.PostTest do %Post{} = post_private = insert(:post, attributed_to: group, author: actor, visibility: :private) + insert(:follower, target_actor: group, approved: true) + {:ok, user: user, group: group, @@ -485,6 +487,32 @@ defmodule Mobilizon.GraphQL.Resolvers.PostTest do assert res["data"]["createPost"]["slug"] == "my-post-#{ShortUUID.encode!(id)}" end + test "create_post/3 creates a draft post for a group", %{ + conn: conn, + user: user, + group: group + } do + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @create_post, + variables: %{ + title: @post_title, + body: "My new post is here", + attributedToId: group.id, + draft: true + } + ) + + assert is_nil(res["errors"]) + + assert res["data"]["createPost"]["title"] == @post_title + id = res["data"]["createPost"]["id"] + assert res["data"]["createPost"]["slug"] == "my-post-#{ShortUUID.encode!(id)}" + assert res["data"]["createPost"]["draft"] == true + end + test "create_post/3 doesn't create a post if no group is defined", %{ conn: conn, user: user diff --git a/test/graphql/resolvers/user_test.exs b/test/graphql/resolvers/user_test.exs index 46b2a8cde..e701553c0 100644 --- a/test/graphql/resolvers/user_test.exs +++ b/test/graphql/resolvers/user_test.exs @@ -121,6 +121,16 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do } """ + @change_default_actor """ + mutation ChangeDefaultActor($preferredUsername: String!) { + changeDefaultActor(preferredUsername: $preferredUsername) { + defaultActor { + preferredUsername + } + } + } + """ + @valid_actor_params %{email: "test@test.tld", password: "testest", username: "test"} @valid_single_actor_params %{preferred_username: "test2", keys: "yolo"} @@ -835,7 +845,7 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do end describe "Resolver: change default actor for user" do - test "test change_default_actor/3 with valid actor", context do + test "test change_default_actor/3 without being logged-in", %{conn: conn} do # Prepare user with two actors user = insert(:user) insert(:actor, user: user) @@ -848,24 +858,41 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do assert {:ok, %User{actors: actors}} = Users.get_user_with_actors(user.id) assert length(actors) == 2 - mutation = """ - mutation { - changeDefaultActor(preferred_username: "#{actor2.preferred_username}") { - default_actor { - preferred_username - } - } - } - """ + res = + conn + |> AbsintheHelpers.graphql_query( + query: @change_default_actor, + variables: %{preferredUsername: actor2.preferred_username} + ) + + assert hd(res["errors"])["message"] == "You need to be logged in" + end + + test "test change_default_actor/3 with valid actor", %{conn: conn} do + # Prepare user with two actors + user = insert(:user) + insert(:actor, user: user) + + assert {:ok, %User{actors: _actors}} = Users.get_user_with_actors(user.id) + + actor_params = @valid_single_actor_params |> Map.put(:user_id, user.id) + assert {:ok, %Actor{} = actor2} = Actors.create_actor(actor_params) + + assert {:ok, %User{actors: actors}} = Users.get_user_with_actors(user.id) + assert length(actors) == 2 res = - context.conn + conn |> auth_conn(user) - |> post("/api", AbsintheHelpers.mutation_skeleton(mutation)) + |> AbsintheHelpers.graphql_query( + query: @change_default_actor, + variables: %{preferredUsername: actor2.preferred_username} + ) - assert json_response(res, 200)["data"]["changeDefaultActor"]["default_actor"][ - "preferred_username" - ] == actor2.preferred_username + assert res["errors"] == nil + + assert res["data"]["changeDefaultActor"]["defaultActor"]["preferredUsername"] == + actor2.preferred_username end end @@ -1113,6 +1140,59 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do assert user.unconfirmed_email == nil end + test "change_email/3 with valid email but invalid token", %{conn: conn} do + {:ok, %User{} = user} = Users.register(%{email: @old_email, password: @password}) + + # Hammer time ! + {:ok, %User{} = _user} = + Users.update_user(user, %{ + confirmed_at: Timex.shift(user.confirmation_sent_at, hours: -3), + confirmation_sent_at: nil, + confirmation_token: nil + }) + + res = + conn + |> AbsintheHelpers.graphql_query( + query: @login_mutation, + variables: %{email: @old_email, password: @password} + ) + + login = res["data"]["login"] + assert Map.has_key?(login, "accessToken") && not is_nil(login["accessToken"]) + + res = + conn + |> auth_conn(user) + |> AbsintheHelpers.graphql_query( + query: @change_email_mutation, + variables: %{email: @new_email, password: @password} + ) + + assert res["errors"] == nil + assert res["data"]["changeEmail"]["id"] == to_string(user.id) + + user = Users.get_user!(user.id) + assert user.email == @old_email + assert user.unconfirmed_email == @new_email + + assert_delivered_email(Email.User.send_email_reset_old_email(user)) + assert_delivered_email(Email.User.send_email_reset_new_email(user)) + + res = + conn + |> AbsintheHelpers.graphql_query( + query: @validate_email_mutation, + variables: %{token: "some token"} + ) + + assert hd(res["errors"])["message"] == "Invalid activation token" + + user = Users.get_user!(user.id) + assert user.email == @old_email + assert user.unconfirmed_email == @new_email + end + test "change_email/3 with invalid password", %{conn: conn} do {:ok, %User{} = user} = Users.register(%{email: @old_email, password: @password}) diff --git a/test/mobilizon/activities_test.exs b/test/mobilizon/activities_test.exs new file mode 100644 index 000000000..e04990e0b --- /dev/null +++ b/test/mobilizon/activities_test.exs @@ -0,0 +1,91 @@ +defmodule Mobilizon.ActivitiesTest do + use Mobilizon.DataCase + + alias Mobilizon.Activities + import Mobilizon.Factory + + describe "activities" do + alias Mobilizon.Activities.Activity + + @valid_attrs %{ + message: "some message", + message_params: %{}, + type: "event", + object_id: "some object_id", + subject: "event_created", + subject_params: %{} + } + + @invalid_attrs %{ + message: nil, + object_id: nil, + subject: nil + } + + setup do + actor = insert(:actor) + group = insert(:group) + {:ok, actor: actor, group: group} + end + + def activity_fixture(attrs \\ %{}) do + {:ok, activity} = + attrs + |> Enum.into(@valid_attrs) + |> Activities.create_activity() + + activity + end + + test "list_activities/0 returns all activities", %{actor: actor, group: group} do + activity = + activity_fixture(%{ + group_id: group.id, + author_id: actor.id, + inserted_at: DateTime.utc_now() + }) + + assert Activities.list_activities() == [activity] + end + + test "get_activity!/1 returns the activity with given id", %{actor: actor, group: group} do + activity = + activity_fixture(%{ + author_id: actor.id, + group_id: group.id, + inserted_at: DateTime.utc_now() + }) + + assert Activities.get_activity!(activity.id) == activity + end + + test "create_activity/1 with valid data creates a activity", %{actor: actor, group: group} do + assert {:ok, %Activity{} = activity} = + Activities.create_activity( + @valid_attrs + |> Map.put(:group_id, group.id) + |> Map.put(:author_id, actor.id) + |> Map.put(:inserted_at, DateTime.utc_now()) + ) + + assert activity.message == "some message" + assert activity.message_params == %{} + assert activity.object_id == "some object_id" + assert activity.subject == :event_created + assert activity.subject_params == %{} + end + + test "create_activity/1 with invalid data returns error changeset", %{ + actor: actor, + group: group + } do + assert {:error, %Ecto.Changeset{}} = + Activities.create_activity( + @invalid_attrs + |> Map.put(:author_id, actor.id) + |> Map.put(:group_id, group.id) + |> Map.put(:inserted_at, DateTime.utc_now()) + ) + end + end +end diff --git a/test/mobilizon/actors/actors_test.exs b/test/mobilizon/actors/actors_test.exs index ca4ef2ba7..94abd067e 100644 --- a/test/mobilizon/actors/actors_test.exs +++ b/test/mobilizon/actors/actors_test.exs @@ -13,7 +13,7 @@ defmodule Mobilizon.ActorsTest do alias Mobilizon.Service.Workers alias Mobilizon.Storage.Page - alias Mobilizon.Federation.ActivityPub + alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor alias Mobilizon.Web.Upload.Uploader @@ -106,7 +106,7 @@ defmodule Mobilizon.ActorsTest do preferred_username: preferred_username, domain: domain, avatar: %FileModel{name: picture_name} = _picture - } = _actor} = ActivityPub.get_or_fetch_actor_by_url(@remote_account_url) + } = _actor} = ActivityPubActor.get_or_fetch_actor_by_url(@remote_account_url) assert picture_name == "a28c50ce5f2b13fd.jpg" @@ -156,7 +156,8 @@ defmodule Mobilizon.ActorsTest do test "get_actor_by_name_with_preload!/1 returns the remote actor with its organized events" do use_cassette "actors/remote_actor_mastodon_tcit" do - with {:ok, %Actor{} = actor} <- ActivityPub.get_or_fetch_actor_by_url(@remote_account_url) do + with {:ok, %Actor{} = actor} <- + ActivityPubActor.get_or_fetch_actor_by_url(@remote_account_url) do assert Actors.get_actor_by_name_with_preload( "#{actor.preferred_username}@#{actor.domain}" ).organized_events == [] @@ -186,7 +187,7 @@ defmodule Mobilizon.ActorsTest do %{actor: %Actor{id: actor_id}} do use_cassette "actors/remote_actor_mastodon_tcit" do with {:ok, %Actor{id: actor2_id}} <- - ActivityPub.get_or_fetch_actor_by_url(@remote_account_url) do + ActivityPubActor.get_or_fetch_actor_by_url(@remote_account_url) do %Page{total: 2, elements: actors} = Actors.build_actors_by_username_or_name_page("tcit", actor_type: [:Person], diff --git a/test/mobilizon/users/users_test.exs b/test/mobilizon/users/users_test.exs index 3f06ae066..c49dfdf0a 100644 --- a/test/mobilizon/users/users_test.exs +++ b/test/mobilizon/users/users_test.exs @@ -85,9 +85,9 @@ defmodule Mobilizon.UsersTest do test "get_user_by_email/1 finds an activated user by its email" do {:ok, %User{} = user} = Users.register(%{email: @email, password: @password}) - {:ok, %User{id: id}} = Users.get_user_by_email(@email, false) + {:ok, %User{id: id}} = Users.get_user_by_email(@email, activated: false) assert id == user.id - assert {:error, :user_not_found} = Users.get_user_by_email(@email, true) + assert {:error, :user_not_found} = Users.get_user_by_email(@email, activated: true) Users.update_user(user, %{ "confirmed_at" => DateTime.utc_now() |> DateTime.truncate(:second), @@ -95,10 +95,28 @@ defmodule Mobilizon.UsersTest do "confirmation_token" => nil }) - assert {:error, :user_not_found} = Users.get_user_by_email(@email, false) - {:ok, %User{id: id}} = Users.get_user_by_email(@email, true) + assert {:error, :user_not_found} = Users.get_user_by_email(@email, activated: false) + {:ok, %User{id: id}} = Users.get_user_by_email(@email, activated: true) assert id == user.id end + + @unconfirmed_email "unconfirmed@email.com" + test "get_user_by_email/1 finds an user by its pending email" do + {:ok, %User{} = user} = Users.register(%{email: @email, password: @password}) + + Users.update_user(user, %{ + "confirmed_at" => DateTime.utc_now() |> DateTime.truncate(:second), + "confirmation_sent_at" => nil, + "confirmation_token" => nil + }) + + assert {:ok, %User{}} = Users.update_user_email(user, @unconfirmed_email) + + assert {:error, :user_not_found} = + Users.get_user_by_email(@unconfirmed_email, unconfirmed: false) + + assert {:ok, %User{}} = Users.get_user_by_email(@unconfirmed_email, unconfirmed: true) + end end describe "user_settings" do diff --git a/test/service/clean_old_activity_test.exs b/test/service/clean_old_activity_test.exs new file mode 100644 index 000000000..b9de8cfce --- /dev/null +++ b/test/service/clean_old_activity_test.exs @@ -0,0 +1,84 @@ +defmodule Mobilizon.Service.CleanOldActivityTest do + use Mobilizon.DataCase + + import Mobilizon.Factory + + alias Mobilizon.{Activities, Config} + alias Mobilizon.Service.CleanOldActivity + + @activity_inserted_at_1 DateTime.from_iso8601("2019-01-02T10:33:39.207493Z") |> elem(1) + @activity_inserted_at_2 DateTime.utc_now() + + setup do + group1 = insert(:group) + group2 = insert(:group) + Config.clear_config_cache() + + {:ok, group1: group1, group2: group2} + end + + describe "clean old activities" do + test "with default settings", %{group1: group1, group2: group2} do + create_activities(group1, group2) + Config.put([:instance, :activity_expire_days], 100) + Config.put([:instance, :activity_keep_number], 5) + assert Activities.list_group_activities(group1.id).total == 10 + assert Activities.list_group_activities(group2.id).total == 5 + + assert {:ok, actors: 1, activities: 5} == CleanOldActivity.clean(dry_run: true) + + assert Activities.list_group_activities(group1.id).total == 10 + assert Activities.list_group_activities(group2.id).total == 5 + + assert {:ok, actors: 1, activities: 5} == CleanOldActivity.clean() + + assert Activities.list_group_activities(group1.id).total == 5 + assert Activities.list_group_activities(group2.id).total == 5 + + assert {:ok, actors: 0, activities: 0} == CleanOldActivity.clean() + + assert Activities.list_group_activities(group1.id).total == 5 + assert Activities.list_group_activities(group2.id).total == 5 + Config.put([:instance, :activity_expire_days], 365) + Config.put([:instance, :activity_keep_number], 100) + end + + test "with custom settings", %{group1: group1, group2: group2} do + create_activities(group1, group2) + assert Activities.list_group_activities(group1.id).total == 10 + assert Activities.list_group_activities(group2.id).total == 5 + + assert {:ok, actors: 1, activities: 5} == + CleanOldActivity.clean(grace_period: 100, activity_keep_number: 5, dry_run: true) + + assert Activities.list_group_activities(group1.id).total == 10 + assert Activities.list_group_activities(group2.id).total == 5 + + assert {:ok, actors: 1, activities: 5} == + CleanOldActivity.clean(grace_period: 100, activity_keep_number: 5) + + assert Activities.list_group_activities(group1.id).total == 5 + assert Activities.list_group_activities(group2.id).total == 5 + + assert {:ok, actors: 0, activities: 0} == + CleanOldActivity.clean(grace_period: 100, activity_keep_number: 5) + + assert Activities.list_group_activities(group1.id).total == 5 + assert Activities.list_group_activities(group2.id).total == 5 + end + end + + defp create_activities(group1, group2) do + Enum.each(1..5, fn _ -> + insert(:mobilizon_activity, group: group1, inserted_at: @activity_inserted_at_1) + end) + + Enum.each(1..5, fn _ -> + insert(:mobilizon_activity, group: group1, inserted_at: @activity_inserted_at_2) + end) + + Enum.each(1..5, fn _ -> + insert(:mobilizon_activity, group: group2, inserted_at: @activity_inserted_at_2) + end) + end +end diff --git a/test/service/clean_orphan_media_test.exs b/test/service/clean_orphan_media_test.exs index f16d3a5cc..21c1c2264 100644 --- a/test/service/clean_orphan_media_test.exs +++ b/test/service/clean_orphan_media_test.exs @@ -1,4 +1,4 @@ -defmodule Mix.Tasks.Mobilizon.Media.CleanOrphanTest do +defmodule Mobilizon.Service.CleanOrphanMediaTest do use Mobilizon.DataCase import Mobilizon.Factory diff --git a/test/service/clean_unconfirmed_users_test.exs b/test/service/clean_unconfirmed_users_test.exs index 51ced50a3..8cf0b740b 100644 --- a/test/service/clean_unconfirmed_users_test.exs +++ b/test/service/clean_unconfirmed_users_test.exs @@ -1,4 +1,4 @@ -defmodule Mix.Tasks.Mobilizon.User.CleanUnconfirmedUsersTest do +defmodule Mobilizon.Service.CleanUnconfirmedUsersTest do use Mobilizon.DataCase import Mobilizon.Factory diff --git a/test/service/export/icalendar_test.exs b/test/service/export/icalendar_test.exs index 1e90a7489..b50351e12 100644 --- a/test/service/export/icalendar_test.exs +++ b/test/service/export/icalendar_test.exs @@ -6,7 +6,7 @@ defmodule Mobilizon.Service.ICalendarTest do alias ICalendar.Value alias Mobilizon.Addresses.Address - alias Mobilizon.Events.Event + alias Mobilizon.Events.{Event, FeedToken} alias Mobilizon.Service.Export.ICalendar, as: ICalendarService describe "export an event to ics" do @@ -36,4 +36,30 @@ defmodule Mobilizon.Service.ICalendarTest do assert {:ok, ics} == ICalendarService.export_public_event(event) end end + + describe "export the instance's public events" do + test "succeds" do + %Event{} = event = insert(:event, title: "I'm public") + %Event{} = event2 = insert(:event, visibility: :private, title: "I'm private") + %Event{} = event3 = insert(:event, title: "Another public") + + {:commit, ics} = ICalendarService.create_cache("instance") + assert ics =~ event.title + refute ics =~ event2.title + assert ics =~ event3.title + end + end + + describe "export an actor's events from a token" do + test "an actor feedtoken" do + user = insert(:user) + actor = insert(:actor, user: user) + %FeedToken{token: token} = insert(:feed_token, user: user, actor: actor) + event = insert(:event) + insert(:participant, event: event, actor: actor, role: :participant) + + {:commit, ics} = ICalendarService.create_cache("token_#{ShortUUID.encode!(token)}") + assert ics =~ event.title + end + end end diff --git a/test/service/formatter/formatter_test.exs b/test/service/formatter/formatter_test.exs index 79e12429a..3dd7ba167 100644 --- a/test/service/formatter/formatter_test.exs +++ b/test/service/formatter/formatter_test.exs @@ -13,7 +13,7 @@ defmodule Mobilizon.Service.FormatterTest do text = "I love #cofe and #2hu" expected_text = - "I love and " + "I love #cofe and #2hu" assert {^expected_text, [], _tags} = Formatter.linkify(text) end @@ -22,7 +22,7 @@ defmodule Mobilizon.Service.FormatterTest do text = "#fact_3: pleroma does what mastodon't" expected_text = - ": pleroma does what mastodon't" + "#fact_3: pleroma does what mastodon't" assert {^expected_text, [], _tags} = Formatter.linkify(text) end @@ -174,6 +174,12 @@ defmodule Mobilizon.Service.FormatterTest do assert {_text, [], ^expected_tags} = Formatter.linkify(text) end + + test "parses tags in HTML" do + text = "

Hello #there

" + + assert {_text, [], [{"#there", "there"}]} = Formatter.linkify(text) + end end test "it can parse mentions and return the relevant users" do diff --git a/test/service/metadata/metadata_test.exs b/test/service/metadata/metadata_test.exs index a2148258f..0a747eab2 100644 --- a/test/service/metadata/metadata_test.exs +++ b/test/service/metadata/metadata_test.exs @@ -120,7 +120,7 @@ defmodule Mobilizon.Service.MetadataTest do Metadata.Utils.process_description(post.body) }\" property=\"og:description\">