diff --git a/.docker/partdb-entrypoint.sh b/.docker/partdb-entrypoint.sh index ffd2b24a..f5071e22 100644 --- a/.docker/partdb-entrypoint.sh +++ b/.docker/partdb-entrypoint.sh @@ -40,7 +40,7 @@ if [ -d /var/www/html/var/db ]; then fi # Start PHP-FPM (the PHP_VERSION is replaced by the configured version in the Dockerfile) -service phpPHP_VERSION-fpm start +php-fpmPHP_VERSION -F & # Run migrations if automigration is enabled via env variable DB_AUTOMIGRATE @@ -90,4 +90,4 @@ if [ "${1#-}" != "$1" ]; then fi # Pass to the original entrypoint -exec "$@" \ No newline at end of file +exec "$@" diff --git a/.docker/symfony.conf b/.docker/symfony.conf index 0d69c00c..aa88eef2 100644 --- a/.docker/symfony.conf +++ b/.docker/symfony.conf @@ -24,35 +24,10 @@ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined - # Pass the configuration from the docker env to the PHP environment (here you should list all .env options) - PassEnv APP_ENV APP_DEBUG APP_SECRET REDIRECT_TO_HTTPS DISABLE_YEAR2038_BUG_CHECK - PassEnv TRUSTED_PROXIES TRUSTED_HOSTS LOCK_DSN - PassEnv DATABASE_URL ENFORCE_CHANGE_COMMENTS_FOR DATABASE_MYSQL_USE_SSL_CA DATABASE_MYSQL_SSL_VERIFY_CERT - PassEnv DEFAULT_LANG DEFAULT_TIMEZONE BASE_CURRENCY INSTANCE_NAME ALLOW_ATTACHMENT_DOWNLOADS USE_GRAVATAR MAX_ATTACHMENT_FILE_SIZE DEFAULT_URI CHECK_FOR_UPDATES ATTACHMENT_DOWNLOAD_BY_DEFAULT - PassEnv MAILER_DSN ALLOW_EMAIL_PW_RESET EMAIL_SENDER_EMAIL EMAIL_SENDER_NAME - PassEnv HISTORY_SAVE_CHANGED_FIELDS HISTORY_SAVE_CHANGED_DATA HISTORY_SAVE_REMOVED_DATA HISTORY_SAVE_NEW_DATA - PassEnv ERROR_PAGE_ADMIN_EMAIL ERROR_PAGE_SHOW_HELP - PassEnv DEMO_MODE NO_URL_REWRITE_AVAILABLE FIXER_API_KEY BANNER - # In old version the SAML sp private key env, was wrongly named SAMLP_SP_PRIVATE_KEY, keep it for backward compatibility - PassEnv SAML_ENABLED SAML_BEHIND_PROXY SAML_ROLE_MAPPING SAML_UPDATE_GROUP_ON_LOGIN SAML_IDP_ENTITY_ID SAML_IDP_SINGLE_SIGN_ON_SERVICE SAML_IDP_SINGLE_LOGOUT_SERVICE SAML_IDP_X509_CERT SAML_SP_ENTITY_ID SAML_SP_X509_CERT SAML_SP_PRIVATE_KEY SAMLP_SP_PRIVATE_KEY - PassEnv TABLE_DEFAULT_PAGE_SIZE TABLE_PARTS_DEFAULT_COLUMNS - - PassEnv PROVIDER_DIGIKEY_CLIENT_ID PROVIDER_DIGIKEY_SECRET PROVIDER_DIGIKEY_CURRENCY PROVIDER_DIGIKEY_LANGUAGE PROVIDER_DIGIKEY_COUNTRY - PassEnv PROVIDER_ELEMENT14_KEY PROVIDER_ELEMENT14_STORE_ID - PassEnv PROVIDER_TME_KEY PROVIDER_TME_SECRET PROVIDER_TME_CURRENCY PROVIDER_TME_LANGUAGE PROVIDER_TME_COUNTRY PROVIDER_TME_GET_GROSS_PRICES - PassEnv PROVIDER_OCTOPART_CLIENT_ID PROVIDER_OCTOPART_SECRET PROVIDER_OCTOPART_CURRENCY PROVIDER_OCTOPART_COUNTRY PROVIDER_OCTOPART_SEARCH_LIMIT PROVIDER_OCTOPART_ONLY_AUTHORIZED_SELLERS - PassEnv PROVIDER_MOUSER_KEY PROVIDER_MOUSER_SEARCH_OPTION PROVIDER_MOUSER_SEARCH_LIMIT PROVIDER_MOUSER_SEARCH_WITH_SIGNUP_LANGUAGE - PassEnv PROVIDER_LCSC_ENABLED PROVIDER_LCSC_CURRENCY - PassEnv PROVIDER_OEMSECRETS_KEY PROVIDER_OEMSECRETS_COUNTRY_CODE PROVIDER_OEMSECRETS_CURRENCY PROVIDER_OEMSECRETS_ZERO_PRICE PROVIDER_OEMSECRETS_SET_PARAM PROVIDER_OEMSECRETS_SORT_CRITERIA - PassEnv PROVIDER_REICHELT_ENABLED PROVIDER_REICHELT_CURRENCY PROVIDER_REICHELT_COUNTRY PROVIDER_REICHELT_LANGUAGE PROVIDER_REICHELT_INCLUDE_VAT - PassEnv PROVIDER_POLLIN_ENABLED - PassEnv EDA_KICAD_CATEGORY_DEPTH - PassEnv SHOW_PART_IMAGE_OVERLAY - # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf - \ No newline at end of file + diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..66990769 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[{compose.yaml,compose.*.yaml}] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false diff --git a/.env b/.env index d3f99c76..982d4bbd 100644 --- a/.env +++ b/.env @@ -31,13 +31,6 @@ DATABASE_EMULATE_NATURAL_SORT=0 # General settings ################################################################################### -# The language to use serverwide as default (en, de, ru, etc.) -#DEFAULT_LANG="en" -# The default timezone to use serverwide (e.g. Europe/Berlin) -#DEFAULT_TIMEZONE="Europe/Berlin" -# The currency that is used inside the DB (and is assumed when no currency is set). This can not be changed later, so be sure to set it the currency used in your country -#BASE_CURRENCY="EUR" - # The public reachable URL of this Part-DB installation. This is used for generating links in SAML and email templates # This must end with a slash! DEFAULT_URI="https://partdb.changeme.invalid/" @@ -67,43 +60,6 @@ ERROR_PAGE_ADMIN_EMAIL='' # If this is set to true, solutions to common problems are shown on error pages. Disable this, if you do not want your users to see them... ERROR_PAGE_SHOW_HELP=1 -################################################################################## -# Info provider settings -################################################################################## - -# Digikey Provider: -# You can get your client id and secret from https://developer.digikey.com/ -PROVIDER_DIGIKEY_CLIENT_ID= -PROVIDER_DIGIKEY_SECRET= -# The currency to get prices in -PROVIDER_DIGIKEY_CURRENCY=EUR -# The language to get results in (en, de, fr, it, es, zh, ja, ko) -PROVIDER_DIGIKEY_LANGUAGE=en -# The country to get results for -PROVIDER_DIGIKEY_COUNTRY=DE - -# Octopart / Nexar Provider: -# You can get your API key from https://nexar.com/api -PROVIDER_OCTOPART_CLIENT_ID= -PROVIDER_OCTOPART_SECRET= -# The currency and country to get prices for (you have to set both to get meaningful results) -# 3 letter ISO currency code (e.g. EUR, USD, GBP) -PROVIDER_OCTOPART_CURRENCY=EUR -# 2 letter ISO country code (e.g. DE, US, GB) -PROVIDER_OCTOPART_COUNTRY=DE -# The number of results to get from Octopart while searching (please note that this counts towards your API limits) -PROVIDER_OCTOPART_SEARCH_LIMIT=10 -# Set to false to include non authorized offers in the results -PROVIDER_OCTOPART_ONLY_AUTHORIZED_SELLERS=1 - -################################################################################## -# EDA integration related settings -################################################################################## - -# This value determines the depth of the category tree, that is visible inside KiCad -# 0 means that only the top level categories are visible. Set to a value > 0 to show more levels. -# Set to -1, to show all parts of Part-DB inside a sigle cnategory in KiCad -#EDA_KICAD_CATEGORY_DEPTH=0 ################################################################################### # SAML Single sign on-settings @@ -157,19 +113,6 @@ NO_URL_REWRITE_AVAILABLE=0 # Set to 1, if Part-DB should redirect all HTTP requests to HTTPS. You dont need to configure this, if your webserver already does this. REDIRECT_TO_HTTPS=0 -# If you want to use fixer.io for currency conversion, you have to set this to your API key -FIXER_API_KEY=CHANGEME - -# Override value if you want to show to show a given text on homepage. -# When this is empty the content of config/banner.md is used as banner -BANNER="" - -# Enable the part image overlay which shows name and filename of the picture -SHOW_PART_IMAGE_OVERLAY=1 - -APP_ENV=prod -APP_SECRET=a03498528f5a5fc089273ec9ae5b2849 - # Set this to zero, if you want to disable the year 2038 bug check on 32-bit systems (it will cause errors with current 32-bit PHP versions) DISABLE_YEAR2038_BUG_CHECK=0 @@ -187,3 +130,8 @@ LOCK_DSN=flock ###> nelmio/cors-bundle ### CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$' ###< nelmio/cors-bundle ### + +###> symfony/framework-bundle ### +APP_ENV=prod +APP_SECRET=a03498528f5a5fc089273ec9ae5b2849 +###< symfony/framework-bundle ### diff --git a/.env.dev b/.env.dev index e69de29b..53b05877 100644 --- a/.env.dev +++ b/.env.dev @@ -0,0 +1,4 @@ + +###> symfony/framework-bundle ### +APP_SECRET=318b5d659e07a0b3f96d9b3a83b254ca +###< symfony/framework-bundle ### diff --git a/.github/workflows/assets_artifact_build.yml b/.github/workflows/assets_artifact_build.yml index 0bbfe432..c950375b 100644 --- a/.github/workflows/assets_artifact_build.yml +++ b/.github/workflows/assets_artifact_build.yml @@ -1,5 +1,8 @@ name: Build assets artifact +permissions: + contents: read + on: push: branches: @@ -19,7 +22,7 @@ jobs: APP_ENV: prod steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -39,7 +42,7 @@ jobs: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: | - ${{ runner.os }}-composer- + ${{ runner.os }}-composer- - name: Install dependencies run: composer install --prefer-dist --no-progress --no-dev -a @@ -59,7 +62,7 @@ jobs: - name: Setup node uses: actions/setup-node@v4 with: - node-version: '18' + node-version: '20' - name: Install yarn dependencies run: yarn install diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 64287d83..c912e769 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -1,5 +1,8 @@ name: Docker Image Build +permissions: + contents: read + on: #schedule: # - cron: '0 10 * * *' # everyday at 10am @@ -17,7 +20,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Docker meta id: docker_meta @@ -73,4 +76,4 @@ jobs: tags: ${{ steps.docker_meta.outputs.tags }} labels: ${{ steps.docker_meta.outputs.labels }} cache-from: type=gha - cache-to: type=gha,mode=max \ No newline at end of file + cache-to: type=gha,mode=max diff --git a/.github/workflows/docker_frankenphp.yml b/.github/workflows/docker_frankenphp.yml index d8cd0695..0b2eb874 100644 --- a/.github/workflows/docker_frankenphp.yml +++ b/.github/workflows/docker_frankenphp.yml @@ -1,5 +1,8 @@ name: Docker Image Build (FrankenPHP) +permissions: + contents: read + on: #schedule: # - cron: '0 10 * * *' # everyday at 10am @@ -17,7 +20,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Docker meta id: docker_meta @@ -74,4 +77,4 @@ jobs: tags: ${{ steps.docker_meta.outputs.tags }} labels: ${{ steps.docker_meta.outputs.labels }} cache-from: type=gha - cache-to: type=gha,mode=max \ No newline at end of file + cache-to: type=gha,mode=max diff --git a/.github/workflows/static_analysis.yml b/.github/workflows/static_analysis.yml index 20150b28..1de98ee9 100644 --- a/.github/workflows/static_analysis.yml +++ b/.github/workflows/static_analysis.yml @@ -1,5 +1,8 @@ name: Static analysis +permissions: + contents: read + on: push: branches: @@ -16,7 +19,7 @@ jobs: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -30,20 +33,20 @@ jobs: id: composer-cache run: | echo "::set-output name=dir::$(composer config cache-files-dir)" - + - uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: | - ${{ runner.os }}-composer- + ${{ runner.os }}-composer- - name: Install dependencies run: composer install --prefer-dist --no-progress - name: Lint config files run: ./bin/console lint:yaml config --parse-tags - + - name: Lint twig templates run: ./bin/console lint:twig templates --env=prod @@ -53,13 +56,13 @@ jobs: - name: Check dependencies for security uses: symfonycorp/security-checker-action@v5 - + - name: Check doctrine mapping run: ./bin/console doctrine:schema:validate --skip-sync -vvv --no-interaction # Use the -d option to raise the max nesting level - name: Generate dev container run: php -d xdebug.max_nesting_level=1000 ./bin/console cache:clear --env dev - + - name: Run PHPstan run: composer phpstan diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8e6ea54c..66e2f40c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,5 +1,8 @@ name: PHPUnit Tests +permissions: + contents: read + on: push: branches: @@ -9,7 +12,7 @@ on: branches: - '*' - "!l10n_*" - + jobs: phpunit: name: PHPUnit and coverage Test (PHP ${{ matrix.php-versions }}, ${{ matrix.db-type }}) @@ -18,7 +21,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: [ '8.1', '8.2', '8.3', '8.4' ] + php-versions: ['8.2', '8.3', '8.4' ] db-type: [ 'mysql', 'sqlite', 'postgres' ] env: @@ -43,7 +46,7 @@ jobs: if: matrix.db-type == 'postgres' - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -52,7 +55,7 @@ jobs: coverage: pcov ini-values: xdebug.max_nesting_level=1000 extensions: mbstring, intl, gd, xsl, gmp, bcmath, :php-psr - + - name: Start MySQL run: sudo systemctl start mysql.service if: matrix.db-type == 'mysql' @@ -71,9 +74,9 @@ jobs: # mysql version: 5.7 # mysql database: 'part-db' # mysql root password: '1234' - + ## Setup caches - + - name: Get Composer Cache Directory id: composer-cache run: | @@ -83,8 +86,8 @@ jobs: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: | - ${{ runner.os }}-composer- - + ${{ runner.os }}-composer- + - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn cache dir)" @@ -96,48 +99,48 @@ jobs: key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- - + - name: Install composer dependencies run: composer install --prefer-dist --no-progress - + - name: Setup node uses: actions/setup-node@v4 with: - node-version: '18' - + node-version: '20' + - name: Install yarn dependencies run: yarn install - + - name: Build frontend run: yarn build - + - name: Create DB run: php bin/console --env test doctrine:database:create --if-not-exists -n if: matrix.db-type == 'mysql' || matrix.db-type == 'postgres' - + - name: Do migrations run: php bin/console --env test doctrine:migrations:migrate -n # Use our own custom fixtures loading command to circumvent some problems with reset the autoincrement values - name: Load fixtures run: php bin/console --env test partdb:fixtures:load -n - + - name: Run PHPunit and generate coverage run: ./bin/phpunit --coverage-clover=coverage.xml - + - name: Upload coverage uses: codecov/codecov-action@v5 with: env_vars: PHP_VERSION,DB_TYPE token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true - + - name: Test app:clean-attachments run: php bin/console partdb:attachments:clean-unused -n - + - name: Test app:convert-bbcode run: php bin/console app:convert-bbcode -n - + - name: Test app:show-logs run: php bin/console app:show-logs -n diff --git a/.gitignore b/.gitignore index c8c59090..76655919 100644 --- a/.gitignore +++ b/.gitignore @@ -42,7 +42,7 @@ yarn-error.log ###> phpunit/phpunit ### /phpunit.xml -.phpunit.result.cache +/.phpunit.cache/ ###< phpunit/phpunit ### ###> phpstan/phpstan ### diff --git a/Dockerfile b/Dockerfile index 0f909f16..cb18c78f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ARG BASE_IMAGE=debian:bookworm-slim -ARG PHP_VERSION=8.3 +ARG PHP_VERSION=8.4 FROM ${BASE_IMAGE} AS base ARG PHP_VERSION @@ -48,7 +48,7 @@ RUN apt-get update && apt-get -y install \ # Install node and yarn RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ - curl -sL https://deb.nodesource.com/setup_20.x | bash - && \ + curl -sL https://deb.nodesource.com/setup_22.x | bash - && \ apt-get update && apt-get install -y \ nodejs \ yarn \ @@ -119,12 +119,12 @@ realpath_cache_size=4096K realpath_cache_ttl=600 EOF -# Increase upload limit and enable preloading +# Increase upload limit and enable preloading (disabled for now, as it does not seem to work properly, and require prod env anyway) COPY </dev/null; \ + chmod 644 /etc/apt/keyrings/yarn.gpg; \ + \ + # Add Yarn repo with signed-by + echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian stable main" \ + | tee /etc/apt/sources.list.d/yarn.list; \ + \ + # Run NodeSource setup script (unchanged) + curl -sL https://deb.nodesource.com/setup_22.x | bash -; \ + \ + # Install Node.js + Yarn + apt-get update; \ + apt-get install -y --no-install-recommends \ + nodejs \ + yarn; \ + \ + # Cleanup + apt-get -y autoremove; \ + apt-get clean autoclean; \ + rm -rf /var/lib/apt/lists/* + # Install PHP RUN set -eux; \ diff --git a/README.md b/README.md index 74ebfe7f..c9d25016 100644 --- a/README.md +++ b/README.md @@ -75,10 +75,10 @@ Part-DB is also used by small companies and universities for managing their inve * A **web server** (like Apache2 or nginx) that is capable of running [Symfony 6](https://symfony.com/doc/current/reference/requirements.html), - this includes a minimum PHP version of **PHP 8.1** + this includes a minimum PHP version of **PHP 8.2** * A **MySQL** (at least 5.7) /**MariaDB** (at least 10.4) database server, or **PostgreSQL** 10+ if you do not want to use SQLite. * Shell access to your server is highly recommended! -* For building the client-side assets **yarn** and **nodejs** (>= 18.0) is needed. +* For building the client-side assets **yarn** and **nodejs** (>= 20.0) is needed. ## Installation diff --git a/VERSION b/VERSION index b9a05a6d..e9307ca5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.17.3 +2.0.2 diff --git a/assets/ckeditor/emojis.json b/assets/ckeditor/emojis.json new file mode 100644 index 00000000..a6bafe26 --- /dev/null +++ b/assets/ckeditor/emojis.json @@ -0,0 +1 @@ +[{"emoji":"๐Ÿ˜€","group":0,"order":1,"tags":["cheerful","cheery","face","grin","grinning","happy","laugh","nice","smile","smiling","teeth"],"version":1,"annotation":"grinning face","shortcodes":["grinning","grinning_face"]},{"emoji":"๐Ÿ˜ƒ","group":0,"order":2,"tags":["awesome","big","eyes","face","grin","grinning","happy","mouth","open","smile","smiling","teeth","yay"],"version":0.6,"annotation":"grinning face with big eyes","shortcodes":["grinning_face_with_big_eyes","smiley"]},{"emoji":"๐Ÿ˜„","group":0,"order":3,"tags":["eye","eyes","face","grin","grinning","happy","laugh","lol","mouth","open","smile","smiling"],"version":0.6,"annotation":"grinning face with smiling eyes","emoticon":":D","shortcodes":["grinning_face_with_closed_eyes","smile"]},{"emoji":"๐Ÿ˜","group":0,"order":4,"tags":["beaming","eye","eyes","face","grin","grinning","happy","nice","smile","smiling","teeth"],"version":0.6,"annotation":"beaming face with smiling eyes","shortcodes":["beaming_face","grin"]},{"emoji":"๐Ÿ˜†","group":0,"order":5,"tags":["closed","eyes","face","grinning","haha","hahaha","happy","laugh","lol","mouth","open","rofl","smile","smiling","squinting"],"version":0.6,"annotation":"grinning squinting face","emoticon":"XD","shortcodes":["laughing","lol","satisfied","squinting_face"]},{"emoji":"๐Ÿ˜…","group":0,"order":6,"tags":["cold","dejected","excited","face","grinning","mouth","nervous","open","smile","smiling","stress","stressed","sweat"],"version":0.6,"annotation":"grinning face with sweat","shortcodes":["grinning_face_with_sweat","sweat_smile"]},{"emoji":"๐Ÿคฃ","group":0,"order":7,"tags":["crying","face","floor","funny","haha","happy","hehe","hilarious","joy","laugh","lmao","lol","rofl","roflmao","rolling","tear"],"version":3,"annotation":"rolling on the floor laughing","emoticon":":'D","shortcodes":["rofl"]},{"emoji":"๐Ÿ˜‚","group":0,"order":8,"tags":["crying","face","feels","funny","haha","happy","hehe","hilarious","joy","laugh","lmao","lol","rofl","roflmao","tear"],"version":0.6,"annotation":"face with tears of joy","emoticon":":')","shortcodes":["joy","lmao","tears_of_joy"]},{"emoji":"๐Ÿ™‚","group":0,"order":9,"tags":["face","happy","slightly","smile","smiling"],"version":1,"annotation":"slightly smiling face","emoticon":":)","shortcodes":["slightly_smiling_face"]},{"emoji":"๐Ÿ™ƒ","group":0,"order":10,"tags":["face","hehe","smile","upside-down"],"version":1,"annotation":"upside-down face","shortcodes":["upside_down_face"]},{"emoji":"๐Ÿซ ","group":0,"order":11,"tags":["disappear","dissolve","embarrassed","face","haha","heat","hot","liquid","lol","melt","melting","sarcasm","sarcastic"],"version":14,"annotation":"melting face","shortcodes":["melt","melting_face"]},{"emoji":"๐Ÿ˜‰","group":0,"order":12,"tags":["face","flirt","heartbreaker","sexy","slide","tease","wink","winking","winks"],"version":0.6,"annotation":"winking face","emoticon":";)","shortcodes":["wink","winking_face"]},{"emoji":"๐Ÿ˜Š","group":0,"order":13,"tags":["blush","eye","eyes","face","glad","satisfied","smile","smiling"],"version":0.6,"annotation":"smiling face with smiling eyes","emoticon":":>","shortcodes":["blush","smiling_face_with_closed_eyes"]},{"emoji":"๐Ÿ˜‡","group":0,"order":14,"tags":["angel","angelic","angels","blessed","face","fairy","fairytale","fantasy","halo","happy","innocent","peaceful","smile","smiling","spirit","tale"],"version":1,"annotation":"smiling face with halo","emoticon":"O:)","shortcodes":["halo","innocent"]},{"emoji":"๐Ÿฅฐ","group":0,"order":15,"tags":["3","adore","crush","face","heart","hearts","ily","love","romance","smile","smiling","you"],"version":11,"annotation":"smiling face with hearts","shortcodes":["smiling_face_with_3_hearts"]},{"emoji":"๐Ÿ˜","group":0,"order":16,"tags":["143","bae","eye","face","feels","heart-eyes","hearts","ily","kisses","love","romance","romantic","smile","xoxo"],"version":0.6,"annotation":"smiling face with heart-eyes","shortcodes":["heart_eyes","smiling_face_with_heart_eyes"]},{"emoji":"๐Ÿคฉ","group":0,"order":17,"tags":["excited","eyes","face","grinning","smile","star","starry-eyed","wow"],"version":5,"annotation":"star-struck","shortcodes":["star_struck"]},{"emoji":"๐Ÿ˜˜","group":0,"order":18,"tags":["adorbs","bae","blowing","face","flirt","heart","ily","kiss","love","lover","miss","muah","romantic","smooch","xoxo","you"],"version":0.6,"annotation":"face blowing a kiss","emoticon":":X","shortcodes":["blowing_a_kiss","kissing_heart"]},{"emoji":"๐Ÿ˜—","group":0,"order":19,"tags":["143","date","dating","face","flirt","ily","kiss","love","smooch","smooches","xoxo","you"],"version":1,"annotation":"kissing face","shortcodes":["kissing","kissing_face"]},{"emoji":"โ˜บ๏ธ","group":0,"order":21,"tags":["face","happy","outlined","relaxed","smile","smiling"],"version":0.6,"annotation":"smiling face","shortcodes":["relaxed","smiling_face"]},{"emoji":"๐Ÿ˜š","group":0,"order":22,"tags":["143","bae","blush","closed","date","dating","eye","eyes","face","flirt","ily","kisses","kissing","smooches","xoxo"],"version":0.6,"annotation":"kissing face with closed eyes","emoticon":":*","shortcodes":["kissing_closed_eyes","kissing_face_with_closed_eyes"]},{"emoji":"๐Ÿ˜™","group":0,"order":23,"tags":["143","closed","date","dating","eye","eyes","face","flirt","ily","kiss","kisses","kissing","love","night","smile","smiling"],"version":1,"annotation":"kissing face with smiling eyes","shortcodes":["kissing_face_with_smiling_eyes","kissing_smiling_eyes"]},{"emoji":"๐Ÿฅฒ","group":0,"order":24,"tags":["face","glad","grateful","happy","joy","pain","proud","relieved","smile","smiley","smiling","tear","touched"],"version":13,"annotation":"smiling face with tear","shortcodes":["smiling_face_with_tear"]},{"emoji":"๐Ÿ˜‹","group":0,"order":25,"tags":["delicious","eat","face","food","full","hungry","savor","smile","smiling","tasty","um","yum","yummy"],"version":0.6,"annotation":"face savoring food","shortcodes":["savoring_food","yum"]},{"emoji":"๐Ÿ˜›","group":0,"order":26,"tags":["awesome","cool","face","nice","party","stuck-out","sweet","tongue"],"version":1,"annotation":"face with tongue","emoticon":":P","shortcodes":["face_with_tongue","stuck_out_tongue"]},{"emoji":"๐Ÿ˜œ","group":0,"order":27,"tags":["crazy","epic","eye","face","funny","joke","loopy","nutty","party","stuck-out","tongue","wacky","weirdo","wink","winking","yolo"],"version":0.6,"annotation":"winking face with tongue","emoticon":";P","shortcodes":["stuck_out_tongue_winking_eye"]},{"emoji":"๐Ÿคช","group":0,"order":28,"tags":["crazy","eye","eyes","face","goofy","large","small","zany"],"version":5,"annotation":"zany face","shortcodes":["zany","zany_face"]},{"emoji":"๐Ÿ˜","group":0,"order":29,"tags":["closed","eye","eyes","face","gross","horrible","omg","squinting","stuck-out","taste","tongue","whatever","yolo"],"version":0.6,"annotation":"squinting face with tongue","emoticon":"XP","shortcodes":["stuck_out_tongue_closed_eyes"]},{"emoji":"๐Ÿค‘","group":0,"order":30,"tags":["face","money","money-mouth","mouth","paid"],"version":1,"annotation":"money-mouth face","shortcodes":["money_mouth_face"]},{"emoji":"๐Ÿค—","group":0,"order":31,"tags":["face","hands","hug","hugging","open","smiling"],"version":1,"annotation":"smiling face with open hands","shortcodes":["hug","hugging","hugging_face"]},{"emoji":"๐Ÿคญ","group":0,"order":32,"tags":["face","giggle","giggling","hand","mouth","oops","realization","secret","shock","sudden","surprise","whoops"],"version":5,"annotation":"face with hand over mouth","shortcodes":["face_with_hand_over_mouth","hand_over_mouth"]},{"emoji":"๐Ÿซข","group":0,"order":33,"tags":["amazement","awe","disbelief","embarrass","eyes","face","gasp","hand","mouth","omg","open","over","quiet","scared","shock","surprise"],"version":14,"annotation":"face with open eyes and hand over mouth","shortcodes":["face_with_open_eyes_hand_over_mouth","gasp"]},{"emoji":"๐Ÿซฃ","group":0,"order":34,"tags":["captivated","embarrass","eye","face","hide","hiding","peek","peeking","peep","scared","shy","stare"],"version":14,"annotation":"face with peeking eye","shortcodes":["face_with_peeking_eye","peek"]},{"emoji":"๐Ÿคซ","group":0,"order":35,"tags":["face","quiet","shh","shush","shushing"],"version":5,"annotation":"shushing face","shortcodes":["shush","shushing_face"]},{"emoji":"๐Ÿค”","group":0,"order":36,"tags":["chin","consider","face","hmm","ponder","pondering","thinking","wondering"],"version":1,"annotation":"thinking face","emoticon":":L","shortcodes":["thinking","thinking_face","wtf"]},{"emoji":"๐Ÿซก","group":0,"order":37,"tags":["face","good","luck","maโ€™am","ok","respect","salute","saluting","sir","troops","yes"],"version":14,"annotation":"saluting face","shortcodes":["salute","saluting_face"]},{"emoji":"๐Ÿค","group":0,"order":38,"tags":["face","keep","mouth","quiet","secret","shut","zip","zipper","zipper-mouth"],"version":1,"annotation":"zipper-mouth face","emoticon":":Z","shortcodes":["zipper_mouth","zipper_mouth_face"]},{"emoji":"๐Ÿคจ","group":0,"order":39,"tags":["disapproval","disbelief","distrust","emoji","eyebrow","face","hmm","mild","raised","skeptic","skeptical","skepticism","surprise","what"],"version":5,"annotation":"face with raised eyebrow","shortcodes":["face_with_raised_eyebrow","raised_eyebrow"]},{"emoji":"๐Ÿ˜๏ธ","group":0,"order":40,"tags":["awkward","blank","deadpan","expressionless","face","fine","jealous","meh","neutral","oh","shade","straight","unamused","unhappy","unimpressed","whatever"],"version":0.7,"annotation":"neutral face","emoticon":":|","shortcodes":["neutral","neutral_face"]},{"emoji":"๐Ÿ˜‘","group":0,"order":41,"tags":["awkward","dead","expressionless","face","fine","inexpressive","jealous","meh","not","oh","omg","straight","uh","unhappy","unimpressed","whatever"],"version":1,"annotation":"expressionless face","shortcodes":["expressionless","expressionless_face"]},{"emoji":"๐Ÿ˜ถ","group":0,"order":42,"tags":["awkward","blank","expressionless","face","mouth","mouthless","mute","quiet","secret","silence","silent","speechless"],"version":1,"annotation":"face without mouth","emoticon":":#","shortcodes":["no_mouth"]},{"emoji":"๐Ÿซฅ","group":0,"order":43,"tags":["depressed","disappear","dotted","face","hidden","hide","introvert","invisible","line","meh","whatever","wtv"],"version":14,"annotation":"dotted line face","shortcodes":["dotted_line_face"]},{"emoji":"๐Ÿ˜ถโ€๐ŸŒซ๏ธ","group":0,"order":44,"tags":["absentminded","clouds","face","fog","head"],"version":13.1,"annotation":"face in clouds","shortcodes":["in_clouds"]},{"emoji":"๐Ÿ˜","group":0,"order":46,"tags":["boss","dapper","face","flirt","homie","kidding","leer","shade","slick","sly","smirk","smug","snicker","suave","suspicious","swag"],"version":0.6,"annotation":"smirking face","emoticon":":j","shortcodes":["smirk","smirking","smirking_face"]},{"emoji":"๐Ÿ˜’","group":0,"order":47,"tags":["...","bored","face","fine","jealous","jel","jelly","pissed","smh","ugh","uhh","unamused","unhappy","weird","whatever"],"version":0.6,"annotation":"unamused face","emoticon":":?","shortcodes":["unamused","unamused_face"]},{"emoji":"๐Ÿ™„","group":0,"order":48,"tags":["eyeroll","eyes","face","rolling","shade","ugh","whatever"],"version":1,"annotation":"face with rolling eyes","shortcodes":["rolling_eyes"]},{"emoji":"๐Ÿ˜ฌ","group":0,"order":49,"tags":["awk","awkward","dentist","face","grimace","grimacing","grinning","smile","smiling"],"version":1,"annotation":"grimacing face","emoticon":"8D","shortcodes":["grimacing","grimacing_face"]},{"emoji":"๐Ÿ˜ฎโ€๐Ÿ’จ","group":0,"order":50,"tags":["blow","blowing","exhale","exhaling","exhausted","face","gasp","groan","relief","sigh","smiley","smoke","whisper","whistle"],"version":13.1,"annotation":"face exhaling","shortcodes":["exhale","exhaling"]},{"emoji":"๐Ÿคฅ","group":0,"order":51,"tags":["face","liar","lie","lying","pinocchio"],"version":3,"annotation":"lying face","shortcodes":["lying","lying_face"]},{"emoji":"๐Ÿซจ","group":0,"order":52,"tags":["crazy","daze","earthquake","face","omg","panic","shaking","shock","surprise","vibrate","whoa","wow"],"version":15,"annotation":"shaking face","shortcodes":["shaking","shaking_face"]},{"emoji":"๐Ÿ™‚โ€โ†”๏ธ","group":0,"order":53,"tags":["head","horizontally","no","shake","shaking"],"version":15.1,"annotation":"head shaking horizontally","shortcodes":["head_shaking_horizontally"]},{"emoji":"๐Ÿ™‚โ€โ†•๏ธ","group":0,"order":55,"tags":["head","nod","shaking","vertically","yes"],"version":15.1,"annotation":"head shaking vertically","shortcodes":["head_shaking_vertically"]},{"emoji":"๐Ÿ˜Œ","group":0,"order":57,"tags":["calm","face","peace","relief","relieved","zen"],"version":0.6,"annotation":"relieved face","shortcodes":["relieved","relieved_face"]},{"emoji":"๐Ÿ˜”","group":0,"order":58,"tags":["awful","bored","dejected","died","disappointed","face","losing","lost","pensive","sad","sucks"],"version":0.6,"annotation":"pensive face","shortcodes":["pensive","pensive_face"]},{"emoji":"๐Ÿ˜ช","group":0,"order":59,"tags":["crying","face","good","night","sad","sleep","sleeping","sleepy","tired"],"version":0.6,"annotation":"sleepy face","shortcodes":["sleepy","sleepy_face"]},{"emoji":"๐Ÿคค","group":0,"order":60,"tags":["drooling","face"],"version":3,"annotation":"drooling face","shortcodes":["drooling","drooling_face"]},{"emoji":"๐Ÿ˜ด","group":0,"order":61,"tags":["bed","bedtime","face","good","goodnight","nap","night","sleep","sleeping","tired","whatever","yawn","zzz"],"version":1,"annotation":"sleeping face","shortcodes":["sleeping","sleeping_face"]},{"emoji":"๐Ÿซฉ","group":0,"order":62,"tags":["bags","bored","exhausted","eyes","face","fatigued","late","sleepy","tired","weary"],"version":16,"annotation":"face with bags under eyes","shortcodes":["face_with_eye_bags"]},{"emoji":"๐Ÿ˜ท","group":0,"order":63,"tags":["cold","dentist","dermatologist","doctor","dr","face","germs","mask","medical","medicine","sick"],"version":0.6,"annotation":"face with medical mask","shortcodes":["mask","medical_mask"]},{"emoji":"๐Ÿค’","group":0,"order":64,"tags":["face","ill","sick","thermometer"],"version":1,"annotation":"face with thermometer","shortcodes":["face_with_thermometer"]},{"emoji":"๐Ÿค•","group":0,"order":65,"tags":["bandage","face","head-bandage","hurt","injury","ouch"],"version":1,"annotation":"face with head-bandage","shortcodes":["face_with_head_bandage"]},{"emoji":"๐Ÿคข","group":0,"order":66,"tags":["face","gross","nasty","nauseated","sick","vomit"],"version":3,"annotation":"nauseated face","emoticon":"%(","shortcodes":["nauseated","nauseated_face"]},{"emoji":"๐Ÿคฎ","group":0,"order":67,"tags":["barf","ew","face","gross","puke","sick","spew","throw","up","vomit","vomiting"],"version":5,"annotation":"face vomiting","shortcodes":["face_vomiting","vomiting"]},{"emoji":"๐Ÿคง","group":0,"order":68,"tags":["face","fever","flu","gesundheit","sick","sneeze","sneezing"],"version":3,"annotation":"sneezing face","shortcodes":["sneezing","sneezing_face"]},{"emoji":"๐Ÿฅต","group":0,"order":69,"tags":["dying","face","feverish","heat","hot","panting","red-faced","stroke","sweating","tongue"],"version":11,"annotation":"hot face","shortcodes":["hot","hot_face"]},{"emoji":"๐Ÿฅถ","group":0,"order":70,"tags":["blue","blue-faced","cold","face","freezing","frostbite","icicles","subzero","teeth"],"version":11,"annotation":"cold face","shortcodes":["cold","cold_face"]},{"emoji":"๐Ÿฅด","group":0,"order":71,"tags":["dizzy","drunk","eyes","face","intoxicated","mouth","tipsy","uneven","wavy","woozy"],"version":11,"annotation":"woozy face","emoticon":":&","shortcodes":["woozy","woozy_face"]},{"emoji":"๐Ÿ˜ต","group":0,"order":72,"tags":["crossed-out","dead","dizzy","eyes","face","feels","knocked","out","sick","tired"],"version":0.6,"annotation":"face with crossed-out eyes","emoticon":"XO","shortcodes":["dizzy_face","knocked_out"]},{"emoji":"๐Ÿ˜ตโ€๐Ÿ’ซ","group":0,"order":73,"tags":["confused","dizzy","eyes","face","hypnotized","omg","smiley","spiral","trouble","whoa","woah","woozy"],"version":13.1,"annotation":"face with spiral eyes","shortcodes":["dizzy_eyes"]},{"emoji":"๐Ÿคฏ","group":0,"order":74,"tags":["blown","explode","exploding","head","mind","mindblown","no","shocked","way"],"version":5,"annotation":"exploding head","shortcodes":["exploding_head"]},{"emoji":"๐Ÿค ","group":0,"order":75,"tags":["cowboy","cowgirl","face","hat"],"version":3,"annotation":"cowboy hat face","shortcodes":["cowboy","cowboy_face"]},{"emoji":"๐Ÿฅณ","group":0,"order":76,"tags":["bday","birthday","celebrate","celebration","excited","face","happy","hat","hooray","horn","party","partying"],"version":11,"annotation":"partying face","shortcodes":["hooray","partying","partying_face"]},{"emoji":"๐Ÿฅธ","group":0,"order":77,"tags":["disguise","eyebrow","face","glasses","incognito","moustache","mustache","nose","person","spy","tache","tash"],"version":13,"annotation":"disguised face","shortcodes":["disguised","disguised_face"]},{"emoji":"๐Ÿ˜Ž","group":0,"order":78,"tags":["awesome","beach","bright","bro","chilling","cool","face","rad","relaxed","shades","slay","smile","style","sunglasses","swag","win"],"version":1,"annotation":"smiling face with sunglasses","emoticon":"8)","shortcodes":["smiling_face_with_sunglasses","sunglasses_cool","too_cool"]},{"emoji":"๐Ÿค“","group":0,"order":79,"tags":["brainy","clever","expert","face","geek","gifted","glasses","intelligent","nerd","smart"],"version":1,"annotation":"nerd face","emoticon":":B","shortcodes":["nerd","nerd_face"]},{"emoji":"๐Ÿง","group":0,"order":80,"tags":["classy","face","fancy","monocle","rich","stuffy","wealthy"],"version":5,"annotation":"face with monocle","shortcodes":["face_with_monocle"]},{"emoji":"๐Ÿ˜•","group":0,"order":81,"tags":["befuddled","confused","confusing","dunno","face","frown","hm","meh","not","sad","sorry","sure"],"version":1,"annotation":"confused face","emoticon":":/","shortcodes":["confused","confused_face"]},{"emoji":"๐Ÿซค","group":0,"order":82,"tags":["confused","confusion","diagonal","disappointed","doubt","doubtful","face","frustrated","frustration","meh","mouth","skeptical","unsure","whatever","wtv"],"version":14,"annotation":"face with diagonal mouth","shortcodes":["face_with_diagonal_mouth"]},{"emoji":"๐Ÿ˜Ÿ","group":0,"order":83,"tags":["anxious","butterflies","face","nerves","nervous","sad","stress","stressed","surprised","worried","worry"],"version":1,"annotation":"worried face","shortcodes":["worried","worried_face"]},{"emoji":"๐Ÿ™","group":0,"order":84,"tags":["face","frown","frowning","sad","slightly"],"version":1,"annotation":"slightly frowning face","shortcodes":["slightly_frowning_face"]},{"emoji":"โ˜น๏ธ","group":0,"order":86,"tags":["face","frown","frowning","sad"],"version":0.7,"annotation":"frowning face","emoticon":":(","shortcodes":["white_frowning_face"]},{"emoji":"๐Ÿ˜ฎ","group":0,"order":87,"tags":["believe","face","forgot","mouth","omg","open","shocked","surprised","sympathy","unbelievable","unreal","whoa","wow","you"],"version":1,"annotation":"face with open mouth","shortcodes":["face_with_open_mouth","open_mouth"]},{"emoji":"๐Ÿ˜ฏ","group":0,"order":88,"tags":["epic","face","hushed","omg","stunned","surprised","whoa","woah"],"version":1,"annotation":"hushed face","shortcodes":["hushed","hushed_face"]},{"emoji":"๐Ÿ˜ฒ","group":0,"order":89,"tags":["astonished","cost","face","no","omg","shocked","totally","way"],"version":0.6,"annotation":"astonished face","emoticon":":O","shortcodes":["astonished","astonished_face"]},{"emoji":"๐Ÿ˜ณ","group":0,"order":90,"tags":["amazed","awkward","crazy","dazed","dead","disbelief","embarrassed","face","flushed","geez","heat","hot","impressed","jeez","what","wow"],"version":0.6,"annotation":"flushed face","emoticon":":$","shortcodes":["flushed","flushed_face"]},{"emoji":"๐Ÿฅบ","group":0,"order":91,"tags":["begging","big","eyes","face","mercy","not","pleading","please","pretty","puppy","sad","why"],"version":11,"annotation":"pleading face","shortcodes":["pleading","pleading_face"]},{"emoji":"๐Ÿฅน","group":0,"order":92,"tags":["admiration","aww","back","cry","embarrassed","face","feelings","grateful","gratitude","holding","joy","please","proud","resist","sad","tears"],"version":14,"annotation":"face holding back tears","shortcodes":["face_holding_back_tears","watery_eyes"]},{"emoji":"๐Ÿ˜ฆ","group":0,"order":93,"tags":["caught","face","frown","frowning","guard","mouth","open","scared","scary","surprise","what","wow"],"version":1,"annotation":"frowning face with open mouth","shortcodes":["frowning","frowning_face"]},{"emoji":"๐Ÿ˜ง","group":0,"order":94,"tags":["anguished","face","forgot","scared","scary","stressed","surprise","unhappy","what","wow"],"version":1,"annotation":"anguished face","emoticon":":S","shortcodes":["anguished","anguished_face"]},{"emoji":"๐Ÿ˜จ","group":0,"order":95,"tags":["afraid","anxious","blame","face","fear","fearful","scared","worried"],"version":0.6,"annotation":"fearful face","shortcodes":["fearful","fearful_face"]},{"emoji":"๐Ÿ˜ฐ","group":0,"order":96,"tags":["anxious","blue","cold","eek","face","mouth","nervous","open","rushed","scared","sweat","yikes"],"version":0.6,"annotation":"anxious face with sweat","shortcodes":["anxious","anxious_face","cold_sweat"]},{"emoji":"๐Ÿ˜ฅ","group":0,"order":97,"tags":["anxious","call","close","complicated","disappointed","face","not","relieved","sad","sweat","time","whew"],"version":0.6,"annotation":"sad but relieved face","shortcodes":["disappointed_relieved","sad_relieved_face"]},{"emoji":"๐Ÿ˜ข","group":0,"order":98,"tags":["awful","cry","crying","face","feels","miss","sad","tear","triste","unhappy"],"version":0.6,"annotation":"crying face","emoticon":":'(","shortcodes":["cry","crying_face"]},{"emoji":"๐Ÿ˜ญ","group":0,"order":99,"tags":["bawling","cry","crying","face","loudly","sad","sob","tear","tears","unhappy"],"version":0.6,"annotation":"loudly crying face","emoticon":":'o","shortcodes":["loudly_crying_face","sob"]},{"emoji":"๐Ÿ˜ฑ","group":0,"order":100,"tags":["epic","face","fear","fearful","munch","scared","scream","screamer","screaming","shocked","surprised","woah"],"version":0.6,"annotation":"face screaming in fear","emoticon":"Dx","shortcodes":["scream","screaming_in_fear"]},{"emoji":"๐Ÿ˜–","group":0,"order":101,"tags":["annoyed","confounded","confused","cringe","distraught","face","feels","frustrated","mad","sad"],"version":0.6,"annotation":"confounded face","emoticon":"X(","shortcodes":["confounded","confounded_face"]},{"emoji":"๐Ÿ˜ฃ","group":0,"order":102,"tags":["concentrate","concentration","face","focus","headache","persevere","persevering"],"version":0.6,"annotation":"persevering face","shortcodes":["persevere","persevering_face"]},{"emoji":"๐Ÿ˜ž","group":0,"order":103,"tags":["awful","blame","dejected","disappointed","face","fail","losing","sad","unhappy"],"version":0.6,"annotation":"disappointed face","shortcodes":["disappointed","disappointed_face"]},{"emoji":"๐Ÿ˜“","group":0,"order":104,"tags":["close","cold","downcast","face","feels","headache","nervous","sad","scared","sweat","yikes"],"version":0.6,"annotation":"downcast face with sweat","emoticon":":<","shortcodes":["downcast_face","sweat"]},{"emoji":"๐Ÿ˜ฉ","group":0,"order":105,"tags":["crying","face","fail","feels","hungry","mad","nooo","sad","sleepy","tired","unhappy","weary"],"version":0.6,"annotation":"weary face","emoticon":"D:","shortcodes":["weary","weary_face"]},{"emoji":"๐Ÿ˜ซ","group":0,"order":106,"tags":["cost","face","feels","nap","sad","sneeze","tired"],"version":0.6,"annotation":"tired face","emoticon":":C","shortcodes":["tired","tired_face"]},{"emoji":"๐Ÿฅฑ","group":0,"order":107,"tags":["bedtime","bored","face","goodnight","nap","night","sleep","sleepy","tired","whatever","yawn","yawning","zzz"],"version":12,"annotation":"yawning face","shortcodes":["yawn","yawning","yawning_face"]},{"emoji":"๐Ÿ˜ค","group":0,"order":108,"tags":["anger","angry","face","feels","fume","fuming","furious","fury","mad","nose","steam","triumph","unhappy","won"],"version":0.6,"annotation":"face with steam from nose","shortcodes":["nose_steam","triumph"]},{"emoji":"๐Ÿ˜ก","group":0,"order":109,"tags":["anger","angry","enraged","face","feels","mad","maddening","pouting","rage","red","shade","unhappy","upset"],"version":0.6,"annotation":"enraged face","emoticon":">:/","shortcodes":["pout","pouting_face","rage"]},{"emoji":"๐Ÿ˜ ","group":0,"order":110,"tags":["anger","angry","blame","face","feels","frustrated","mad","maddening","rage","shade","unhappy","upset"],"version":0.6,"annotation":"angry face","shortcodes":["angry","angry_face"]},{"emoji":"๐Ÿคฌ","group":0,"order":111,"tags":["censor","cursing","cussing","face","mad","mouth","pissed","swearing","symbols"],"version":5,"annotation":"face with symbols on mouth","emoticon":":@","shortcodes":["censored","face_with_symbols_on_mouth"]},{"emoji":"๐Ÿ˜ˆ","group":0,"order":112,"tags":["demon","devil","evil","face","fairy","fairytale","fantasy","horns","purple","shade","smile","smiling","tale"],"version":1,"annotation":"smiling face with horns","emoticon":">:)","shortcodes":["smiling_imp"]},{"emoji":"๐Ÿ‘ฟ","group":0,"order":113,"tags":["angry","demon","devil","evil","face","fairy","fairytale","fantasy","horns","imp","mischievous","purple","shade","tale"],"version":0.6,"annotation":"angry face with horns","emoticon":">:(","shortcodes":["angry_imp","imp"]},{"emoji":"๐Ÿ’€","group":0,"order":114,"tags":["body","dead","death","face","fairy","fairytale","iโ€™m","lmao","monster","tale","yolo"],"version":0.6,"annotation":"skull","shortcodes":["skull"]},{"emoji":"โ˜ ๏ธ","group":0,"order":116,"tags":["bone","crossbones","dead","death","face","monster","skull"],"version":1,"annotation":"skull and crossbones","shortcodes":["skull_and_crossbones"]},{"emoji":"๐Ÿ’ฉ","group":0,"order":117,"tags":["bs","comic","doo","dung","face","fml","monster","pile","poo","poop","smelly","smh","stink","stinks","stinky","turd"],"version":0.6,"annotation":"pile of poo","shortcodes":["poop","shit"]},{"emoji":"๐Ÿคก","group":0,"order":118,"tags":["clown","face"],"version":3,"annotation":"clown face","shortcodes":["clown","clown_face"]},{"emoji":"๐Ÿ‘น","group":0,"order":119,"tags":["creature","devil","face","fairy","fairytale","fantasy","mask","monster","scary","tale"],"version":0.6,"annotation":"ogre","emoticon":">0)","shortcodes":["japanese_ogre","ogre"]},{"emoji":"๐Ÿ‘บ","group":0,"order":120,"tags":["angry","creature","face","fairy","fairytale","fantasy","mask","mean","monster","tale"],"version":0.6,"annotation":"goblin","shortcodes":["goblin","japanese_goblin"]},{"emoji":"๐Ÿ‘ป","group":0,"order":121,"tags":["boo","creature","excited","face","fairy","fairytale","fantasy","halloween","haunting","monster","scary","silly","tale"],"version":0.6,"annotation":"ghost","shortcodes":["ghost"]},{"emoji":"๐Ÿ‘ฝ๏ธ","group":0,"order":122,"tags":["creature","extraterrestrial","face","fairy","fairytale","fantasy","monster","space","tale","ufo"],"version":0.6,"annotation":"alien","shortcodes":["alien"]},{"emoji":"๐Ÿ‘พ","group":0,"order":123,"tags":["alien","creature","extraterrestrial","face","fairy","fairytale","fantasy","game","gamer","games","monster","pixelated","space","tale","ufo"],"version":0.6,"annotation":"alien monster","shortcodes":["alien_monster","space_invader"]},{"emoji":"๐Ÿค–","group":0,"order":124,"tags":["face","monster"],"version":1,"annotation":"robot","shortcodes":["robot","robot_face"]},{"emoji":"๐Ÿ˜บ","group":0,"order":125,"tags":["animal","cat","face","grinning","mouth","open","smile","smiling"],"version":0.6,"annotation":"grinning cat","shortcodes":["grinning_cat","smiley_cat"]},{"emoji":"๐Ÿ˜ธ","group":0,"order":126,"tags":["animal","cat","eye","eyes","face","grin","grinning","smile","smiling"],"version":0.6,"annotation":"grinning cat with smiling eyes","shortcodes":["grinning_cat_with_closed_eyes","smile_cat"]},{"emoji":"๐Ÿ˜น","group":0,"order":127,"tags":["animal","cat","face","joy","laugh","laughing","lol","tear","tears"],"version":0.6,"annotation":"cat with tears of joy","shortcodes":["joy_cat","tears_of_joy_cat"]},{"emoji":"๐Ÿ˜ป","group":0,"order":128,"tags":["animal","cat","eye","face","heart","heart-eyes","love","smile","smiling"],"version":0.6,"annotation":"smiling cat with heart-eyes","shortcodes":["heart_eyes_cat","smiling_cat_with_heart_eyes"]},{"emoji":"๐Ÿ˜ผ","group":0,"order":129,"tags":["animal","cat","face","ironic","smile","wry"],"version":0.6,"annotation":"cat with wry smile","shortcodes":["smirk_cat","wry_smile_cat"]},{"emoji":"๐Ÿ˜ฝ","group":0,"order":130,"tags":["animal","cat","closed","eye","eyes","face","kiss","kissing"],"version":0.6,"annotation":"kissing cat","emoticon":":3","shortcodes":["kissing_cat"]},{"emoji":"๐Ÿ™€","group":0,"order":131,"tags":["animal","cat","face","oh","surprised","weary"],"version":0.6,"annotation":"weary cat","shortcodes":["scream_cat","weary_cat"]},{"emoji":"๐Ÿ˜ฟ","group":0,"order":132,"tags":["animal","cat","cry","crying","face","sad","tear"],"version":0.6,"annotation":"crying cat","shortcodes":["crying_cat"]},{"emoji":"๐Ÿ˜พ","group":0,"order":133,"tags":["animal","cat","face","pouting"],"version":0.6,"annotation":"pouting cat","shortcodes":["pouting_cat"]},{"emoji":"๐Ÿ™ˆ","group":0,"order":134,"tags":["embarrassed","evil","face","forbidden","forgot","gesture","hide","monkey","no","omg","prohibited","scared","secret","smh","watch"],"version":0.6,"annotation":"see-no-evil monkey","shortcodes":["see_no_evil"]},{"emoji":"๐Ÿ™‰","group":0,"order":135,"tags":["animal","ears","evil","face","forbidden","gesture","hear","listen","monkey","no","not","prohibited","secret","shh","tmi"],"version":0.6,"annotation":"hear-no-evil monkey","shortcodes":["hear_no_evil"]},{"emoji":"๐Ÿ™Š","group":0,"order":136,"tags":["animal","evil","face","forbidden","gesture","monkey","no","not","oops","prohibited","quiet","secret","speak","stealth"],"version":0.6,"annotation":"speak-no-evil monkey","shortcodes":["speak_no_evil"]},{"emoji":"๐Ÿ’Œ","group":0,"order":137,"tags":["heart","letter","love","mail","romance","valentine"],"version":0.6,"annotation":"love letter","shortcodes":["love_letter"]},{"emoji":"๐Ÿ’˜","group":0,"order":138,"tags":["143","adorbs","arrow","cupid","date","emotion","heart","ily","love","romance","valentine"],"version":0.6,"annotation":"heart with arrow","shortcodes":["cupid","heart_with_arrow"]},{"emoji":"๐Ÿ’","group":0,"order":139,"tags":["143","anniversary","emotion","heart","ily","kisses","ribbon","valentine","xoxo"],"version":0.6,"annotation":"heart with ribbon","shortcodes":["gift_heart","heart_with_ribbon"]},{"emoji":"๐Ÿ’–","group":0,"order":140,"tags":["143","emotion","excited","good","heart","ily","kisses","morning","night","sparkle","sparkling","xoxo"],"version":0.6,"annotation":"sparkling heart","shortcodes":["sparkling_heart"]},{"emoji":"๐Ÿ’—","group":0,"order":141,"tags":["143","emotion","excited","growing","heart","heartpulse","ily","kisses","muah","nervous","pulse","xoxo"],"version":0.6,"annotation":"growing heart","shortcodes":["growing_heart","heartpulse"]},{"emoji":"๐Ÿ’“","group":0,"order":142,"tags":["143","beating","cardio","emotion","heart","heartbeat","ily","love","pulsating","pulse"],"version":0.6,"annotation":"beating heart","shortcodes":["beating_heart","heartbeat"]},{"emoji":"๐Ÿ’ž","group":0,"order":143,"tags":["143","adorbs","anniversary","emotion","heart","hearts","revolving"],"version":0.6,"annotation":"revolving hearts","shortcodes":["revolving_hearts"]},{"emoji":"๐Ÿ’•","group":0,"order":144,"tags":["143","anniversary","date","dating","emotion","heart","hearts","ily","kisses","love","loving","two","xoxo"],"version":0.6,"annotation":"two hearts","shortcodes":["two_hearts"]},{"emoji":"๐Ÿ’Ÿ","group":0,"order":145,"tags":["143","decoration","emotion","heart","hearth","purple","white"],"version":0.6,"annotation":"heart decoration","shortcodes":["heart_decoration"]},{"emoji":"โฃ๏ธ","group":0,"order":147,"tags":["exclamation","heart","heavy","mark","punctuation"],"version":1,"annotation":"heart exclamation","shortcodes":["heart_exclamation"]},{"emoji":"๐Ÿ’”","group":0,"order":148,"tags":["break","broken","crushed","emotion","heart","heartbroken","lonely","sad"],"version":0.6,"annotation":"broken heart","emoticon":"","shortcodes":["man_mage"],"skins":[{"tone":1,"emoji":"๐Ÿง™๐Ÿปโ€โ™‚๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง™๐Ÿผโ€โ™‚๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง™๐Ÿฝโ€โ™‚๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง™๐Ÿพโ€โ™‚๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง™๐Ÿฟโ€โ™‚๏ธ","version":5}]},{"emoji":"๐Ÿง™โ€โ™€๏ธ","group":1,"order":1746,"tags":["fantasy","mage","magic","play","sorcerer","sorceress","sorcery","spell","summon","witch","wizard","woman"],"version":5,"annotation":"woman mage","shortcodes":["woman_mage"],"skins":[{"tone":1,"emoji":"๐Ÿง™๐Ÿปโ€โ™€๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง™๐Ÿผโ€โ™€๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง™๐Ÿฝโ€โ™€๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง™๐Ÿพโ€โ™€๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง™๐Ÿฟโ€โ™€๏ธ","version":5}]},{"emoji":"๐Ÿงš","group":1,"order":1758,"tags":["fairytale","fantasy","myth","person","pixie","tale","wings"],"version":5,"annotation":"fairy","shortcodes":["fairy"],"skins":[{"tone":1,"emoji":"๐Ÿงš๐Ÿป","version":5},{"tone":2,"emoji":"๐Ÿงš๐Ÿผ","version":5},{"tone":3,"emoji":"๐Ÿงš๐Ÿฝ","version":5},{"tone":4,"emoji":"๐Ÿงš๐Ÿพ","version":5},{"tone":5,"emoji":"๐Ÿงš๐Ÿฟ","version":5}]},{"emoji":"๐Ÿงšโ€โ™‚๏ธ","group":1,"order":1764,"tags":["fairy","fairytale","fantasy","man","myth","oberon","person","pixie","puck","tale","wings"],"version":5,"annotation":"man fairy","shortcodes":["man_fairy"],"skins":[{"tone":1,"emoji":"๐Ÿงš๐Ÿปโ€โ™‚๏ธ","version":5},{"tone":2,"emoji":"๐Ÿงš๐Ÿผโ€โ™‚๏ธ","version":5},{"tone":3,"emoji":"๐Ÿงš๐Ÿฝโ€โ™‚๏ธ","version":5},{"tone":4,"emoji":"๐Ÿงš๐Ÿพโ€โ™‚๏ธ","version":5},{"tone":5,"emoji":"๐Ÿงš๐Ÿฟโ€โ™‚๏ธ","version":5}]},{"emoji":"๐Ÿงšโ€โ™€๏ธ","group":1,"order":1776,"tags":["fairy","fairytale","fantasy","myth","person","pixie","tale","titania","wings","woman"],"version":5,"annotation":"woman fairy","shortcodes":["woman_fairy"],"skins":[{"tone":1,"emoji":"๐Ÿงš๐Ÿปโ€โ™€๏ธ","version":5},{"tone":2,"emoji":"๐Ÿงš๐Ÿผโ€โ™€๏ธ","version":5},{"tone":3,"emoji":"๐Ÿงš๐Ÿฝโ€โ™€๏ธ","version":5},{"tone":4,"emoji":"๐Ÿงš๐Ÿพโ€โ™€๏ธ","version":5},{"tone":5,"emoji":"๐Ÿงš๐Ÿฟโ€โ™€๏ธ","version":5}]},{"emoji":"๐Ÿง›","group":1,"order":1788,"tags":["blood","dracula","fangs","halloween","scary","supernatural","teeth","undead"],"version":5,"annotation":"vampire","emoticon":":E","shortcodes":["vampire"],"skins":[{"tone":1,"emoji":"๐Ÿง›๐Ÿป","version":5},{"tone":2,"emoji":"๐Ÿง›๐Ÿผ","version":5},{"tone":3,"emoji":"๐Ÿง›๐Ÿฝ","version":5},{"tone":4,"emoji":"๐Ÿง›๐Ÿพ","version":5},{"tone":5,"emoji":"๐Ÿง›๐Ÿฟ","version":5}]},{"emoji":"๐Ÿง›โ€โ™‚๏ธ","group":1,"order":1794,"tags":["blood","fangs","halloween","man","scary","supernatural","teeth","undead","vampire"],"version":5,"annotation":"man vampire","shortcodes":["man_vampire"],"skins":[{"tone":1,"emoji":"๐Ÿง›๐Ÿปโ€โ™‚๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง›๐Ÿผโ€โ™‚๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง›๐Ÿฝโ€โ™‚๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง›๐Ÿพโ€โ™‚๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง›๐Ÿฟโ€โ™‚๏ธ","version":5}]},{"emoji":"๐Ÿง›โ€โ™€๏ธ","group":1,"order":1806,"tags":["blood","fangs","halloween","scary","supernatural","teeth","undead","vampire","woman"],"version":5,"annotation":"woman vampire","shortcodes":["woman_vampire"],"skins":[{"tone":1,"emoji":"๐Ÿง›๐Ÿปโ€โ™€๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง›๐Ÿผโ€โ™€๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง›๐Ÿฝโ€โ™€๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง›๐Ÿพโ€โ™€๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง›๐Ÿฟโ€โ™€๏ธ","version":5}]},{"emoji":"๐Ÿงœ","group":1,"order":1818,"tags":["creature","fairytale","folklore","ocean","sea","siren","trident"],"version":5,"annotation":"merperson","shortcodes":["merperson"],"skins":[{"tone":1,"emoji":"๐Ÿงœ๐Ÿป","version":5},{"tone":2,"emoji":"๐Ÿงœ๐Ÿผ","version":5},{"tone":3,"emoji":"๐Ÿงœ๐Ÿฝ","version":5},{"tone":4,"emoji":"๐Ÿงœ๐Ÿพ","version":5},{"tone":5,"emoji":"๐Ÿงœ๐Ÿฟ","version":5}]},{"emoji":"๐Ÿงœโ€โ™‚๏ธ","group":1,"order":1824,"tags":["creature","fairytale","folklore","neptune","ocean","poseidon","sea","siren","trident","triton"],"version":5,"annotation":"merman","shortcodes":["merman"],"skins":[{"tone":1,"emoji":"๐Ÿงœ๐Ÿปโ€โ™‚๏ธ","version":5},{"tone":2,"emoji":"๐Ÿงœ๐Ÿผโ€โ™‚๏ธ","version":5},{"tone":3,"emoji":"๐Ÿงœ๐Ÿฝโ€โ™‚๏ธ","version":5},{"tone":4,"emoji":"๐Ÿงœ๐Ÿพโ€โ™‚๏ธ","version":5},{"tone":5,"emoji":"๐Ÿงœ๐Ÿฟโ€โ™‚๏ธ","version":5}]},{"emoji":"๐Ÿงœโ€โ™€๏ธ","group":1,"order":1836,"tags":["creature","fairytale","folklore","merwoman","ocean","sea","siren","trident"],"version":5,"annotation":"mermaid","shortcodes":["mermaid"],"skins":[{"tone":1,"emoji":"๐Ÿงœ๐Ÿปโ€โ™€๏ธ","version":5},{"tone":2,"emoji":"๐Ÿงœ๐Ÿผโ€โ™€๏ธ","version":5},{"tone":3,"emoji":"๐Ÿงœ๐Ÿฝโ€โ™€๏ธ","version":5},{"tone":4,"emoji":"๐Ÿงœ๐Ÿพโ€โ™€๏ธ","version":5},{"tone":5,"emoji":"๐Ÿงœ๐Ÿฟโ€โ™€๏ธ","version":5}]},{"emoji":"๐Ÿง","group":1,"order":1848,"tags":["elves","enchantment","fantasy","folklore","magic","magical","myth"],"version":5,"annotation":"elf","shortcodes":["elf"],"skins":[{"tone":1,"emoji":"๐Ÿง๐Ÿป","version":5},{"tone":2,"emoji":"๐Ÿง๐Ÿผ","version":5},{"tone":3,"emoji":"๐Ÿง๐Ÿฝ","version":5},{"tone":4,"emoji":"๐Ÿง๐Ÿพ","version":5},{"tone":5,"emoji":"๐Ÿง๐Ÿฟ","version":5}]},{"emoji":"๐Ÿงโ€โ™‚๏ธ","group":1,"order":1854,"tags":["elf","elves","enchantment","fantasy","folklore","magic","magical","man","myth"],"version":5,"annotation":"man elf","shortcodes":["man_elf"],"skins":[{"tone":1,"emoji":"๐Ÿง๐Ÿปโ€โ™‚๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง๐Ÿผโ€โ™‚๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง๐Ÿฝโ€โ™‚๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง๐Ÿพโ€โ™‚๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง๐Ÿฟโ€โ™‚๏ธ","version":5}]},{"emoji":"๐Ÿงโ€โ™€๏ธ","group":1,"order":1866,"tags":["elf","elves","enchantment","fantasy","folklore","magic","magical","myth","woman"],"version":5,"annotation":"woman elf","shortcodes":["woman_elf"],"skins":[{"tone":1,"emoji":"๐Ÿง๐Ÿปโ€โ™€๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง๐Ÿผโ€โ™€๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง๐Ÿฝโ€โ™€๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง๐Ÿพโ€โ™€๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง๐Ÿฟโ€โ™€๏ธ","version":5}]},{"emoji":"๐Ÿงž","group":1,"order":1878,"tags":["djinn","fantasy","jinn","lamp","myth","rub","wishes"],"version":5,"annotation":"genie","shortcodes":["genie"]},{"emoji":"๐Ÿงžโ€โ™‚๏ธ","group":1,"order":1879,"tags":["djinn","fantasy","genie","jinn","lamp","man","myth","rub","wishes"],"version":5,"annotation":"man genie","shortcodes":["man_genie"]},{"emoji":"๐Ÿงžโ€โ™€๏ธ","group":1,"order":1881,"tags":["djinn","fantasy","genie","jinn","lamp","myth","rub","wishes","woman"],"version":5,"annotation":"woman genie","shortcodes":["woman_genie"]},{"emoji":"๐ŸงŸ","group":1,"order":1883,"tags":["apocalypse","dead","halloween","horror","scary","undead","walking"],"version":5,"annotation":"zombie","emoticon":"8#","shortcodes":["zombie"]},{"emoji":"๐ŸงŸโ€โ™‚๏ธ","group":1,"order":1884,"tags":["apocalypse","dead","halloween","horror","man","scary","undead","walking","zombie"],"version":5,"annotation":"man zombie","shortcodes":["man_zombie"]},{"emoji":"๐ŸงŸโ€โ™€๏ธ","group":1,"order":1886,"tags":["apocalypse","dead","halloween","horror","scary","undead","walking","woman","zombie"],"version":5,"annotation":"woman zombie","shortcodes":["woman_zombie"]},{"emoji":"๐ŸงŒ","group":1,"order":1888,"tags":["fairy","fantasy","monster","tale","trolling"],"version":14,"annotation":"troll","shortcodes":["troll"]},{"emoji":"๐Ÿ’†","group":1,"order":1889,"tags":["face","getting","headache","massage","person","relax","relaxing","salon","soothe","spa","tension","therapy","treatment"],"version":0.6,"annotation":"person getting massage","shortcodes":["massage","person_getting_massage"],"skins":[{"tone":1,"emoji":"๐Ÿ’†๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿ’†๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿ’†๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿ’†๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿ’†๐Ÿฟ","version":1}]},{"emoji":"๐Ÿ’†โ€โ™‚๏ธ","group":1,"order":1895,"tags":["face","getting","headache","man","massage","relax","relaxing","salon","soothe","spa","tension","therapy","treatment"],"version":4,"annotation":"man getting massage","shortcodes":["man_getting_massage"],"skins":[{"tone":1,"emoji":"๐Ÿ’†๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿ’†๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿ’†๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿ’†๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿ’†๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿ’†โ€โ™€๏ธ","group":1,"order":1907,"tags":["face","getting","headache","massage","relax","relaxing","salon","soothe","spa","tension","therapy","treatment","woman"],"version":4,"annotation":"woman getting massage","shortcodes":["woman_getting_massage"],"skins":[{"tone":1,"emoji":"๐Ÿ’†๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿ’†๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿ’†๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿ’†๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿ’†๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿ’‡","group":1,"order":1919,"tags":["barber","beauty","chop","cosmetology","cut","groom","hair","haircut","parlor","person","shears","style"],"version":0.6,"annotation":"person getting haircut","shortcodes":["haircut","person_getting_haircut"],"skins":[{"tone":1,"emoji":"๐Ÿ’‡๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿ’‡๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿ’‡๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿ’‡๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿ’‡๐Ÿฟ","version":1}]},{"emoji":"๐Ÿ’‡โ€โ™‚๏ธ","group":1,"order":1925,"tags":["barber","beauty","chop","cosmetology","cut","groom","hair","haircut","man","parlor","person","shears","style"],"version":4,"annotation":"man getting haircut","shortcodes":["man_getting_haircut"],"skins":[{"tone":1,"emoji":"๐Ÿ’‡๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿ’‡๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿ’‡๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿ’‡๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿ’‡๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿ’‡โ€โ™€๏ธ","group":1,"order":1937,"tags":["barber","beauty","chop","cosmetology","cut","groom","hair","haircut","parlor","person","shears","style","woman"],"version":4,"annotation":"woman getting haircut","shortcodes":["woman_getting_haircut"],"skins":[{"tone":1,"emoji":"๐Ÿ’‡๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿ’‡๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿ’‡๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿ’‡๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿ’‡๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿšถ","group":1,"order":1949,"tags":["amble","gait","hike","man","pace","pedestrian","person","stride","stroll","walk","walking"],"version":0.6,"annotation":"person walking","shortcodes":["person_walking","walking"],"skins":[{"tone":1,"emoji":"๐Ÿšถ๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿšถ๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿšถ๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿšถ๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿšถ๐Ÿฟ","version":1}]},{"emoji":"๐Ÿšถโ€โ™‚๏ธ","group":1,"order":1955,"tags":["amble","gait","hike","man","pace","pedestrian","stride","stroll","walk","walking"],"version":4,"annotation":"man walking","shortcodes":["man_walking"],"skins":[{"tone":1,"emoji":"๐Ÿšถ๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿšถ๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿšถ๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿšถ๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿšถ๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿšถโ€โ™€๏ธ","group":1,"order":1967,"tags":["amble","gait","hike","man","pace","pedestrian","stride","stroll","walk","walking","woman"],"version":4,"annotation":"woman walking","shortcodes":["woman_walking"],"skins":[{"tone":1,"emoji":"๐Ÿšถ๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿšถ๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿšถ๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿšถ๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿšถ๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿšถโ€โžก๏ธ","group":1,"order":1979,"tags":["amble","gait","hike","man","pace","pedestrian","person","stride","stroll","walk","walking"],"version":15.1,"annotation":"person walking facing right","shortcodes":["person_walking_right"],"skins":[{"tone":1,"emoji":"๐Ÿšถ๐Ÿปโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿšถ๐Ÿผโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿšถ๐Ÿฝโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿšถ๐Ÿพโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿšถ๐Ÿฟโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿšถโ€โ™€๏ธโ€โžก๏ธ","group":1,"order":1991,"tags":["amble","gait","hike","man","pace","pedestrian","stride","stroll","walk","walking","woman"],"version":15.1,"annotation":"woman walking facing right","shortcodes":["woman_walking_right"],"skins":[{"tone":1,"emoji":"๐Ÿšถ๐Ÿปโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿšถ๐Ÿผโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿšถ๐Ÿฝโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿšถ๐Ÿพโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿšถ๐Ÿฟโ€โ™€๏ธโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿšถโ€โ™‚๏ธโ€โžก๏ธ","group":1,"order":2015,"tags":["amble","gait","hike","man","pace","pedestrian","stride","stroll","walk","walking"],"version":15.1,"annotation":"man walking facing right","shortcodes":["man_walking_right"],"skins":[{"tone":1,"emoji":"๐Ÿšถ๐Ÿปโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿšถ๐Ÿผโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿšถ๐Ÿฝโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿšถ๐Ÿพโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿšถ๐Ÿฟโ€โ™‚๏ธโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿง","group":1,"order":2039,"tags":["person","stand","standing"],"version":12,"annotation":"person standing","shortcodes":["person_standing","standing"],"skins":[{"tone":1,"emoji":"๐Ÿง๐Ÿป","version":12},{"tone":2,"emoji":"๐Ÿง๐Ÿผ","version":12},{"tone":3,"emoji":"๐Ÿง๐Ÿฝ","version":12},{"tone":4,"emoji":"๐Ÿง๐Ÿพ","version":12},{"tone":5,"emoji":"๐Ÿง๐Ÿฟ","version":12}]},{"emoji":"๐Ÿงโ€โ™‚๏ธ","group":1,"order":2045,"tags":["man","stand","standing"],"version":12,"annotation":"man standing","shortcodes":["man_standing"],"skins":[{"tone":1,"emoji":"๐Ÿง๐Ÿปโ€โ™‚๏ธ","version":12},{"tone":2,"emoji":"๐Ÿง๐Ÿผโ€โ™‚๏ธ","version":12},{"tone":3,"emoji":"๐Ÿง๐Ÿฝโ€โ™‚๏ธ","version":12},{"tone":4,"emoji":"๐Ÿง๐Ÿพโ€โ™‚๏ธ","version":12},{"tone":5,"emoji":"๐Ÿง๐Ÿฟโ€โ™‚๏ธ","version":12}]},{"emoji":"๐Ÿงโ€โ™€๏ธ","group":1,"order":2057,"tags":["stand","standing","woman"],"version":12,"annotation":"woman standing","shortcodes":["woman_standing"],"skins":[{"tone":1,"emoji":"๐Ÿง๐Ÿปโ€โ™€๏ธ","version":12},{"tone":2,"emoji":"๐Ÿง๐Ÿผโ€โ™€๏ธ","version":12},{"tone":3,"emoji":"๐Ÿง๐Ÿฝโ€โ™€๏ธ","version":12},{"tone":4,"emoji":"๐Ÿง๐Ÿพโ€โ™€๏ธ","version":12},{"tone":5,"emoji":"๐Ÿง๐Ÿฟโ€โ™€๏ธ","version":12}]},{"emoji":"๐ŸงŽ","group":1,"order":2069,"tags":["kneel","kneeling","knees","person"],"version":12,"annotation":"person kneeling","shortcodes":["kneeling","person_kneeling"],"skins":[{"tone":1,"emoji":"๐ŸงŽ๐Ÿป","version":12},{"tone":2,"emoji":"๐ŸงŽ๐Ÿผ","version":12},{"tone":3,"emoji":"๐ŸงŽ๐Ÿฝ","version":12},{"tone":4,"emoji":"๐ŸงŽ๐Ÿพ","version":12},{"tone":5,"emoji":"๐ŸงŽ๐Ÿฟ","version":12}]},{"emoji":"๐ŸงŽโ€โ™‚๏ธ","group":1,"order":2075,"tags":["kneel","kneeling","knees","man"],"version":12,"annotation":"man kneeling","shortcodes":["man_kneeling"],"skins":[{"tone":1,"emoji":"๐ŸงŽ๐Ÿปโ€โ™‚๏ธ","version":12},{"tone":2,"emoji":"๐ŸงŽ๐Ÿผโ€โ™‚๏ธ","version":12},{"tone":3,"emoji":"๐ŸงŽ๐Ÿฝโ€โ™‚๏ธ","version":12},{"tone":4,"emoji":"๐ŸงŽ๐Ÿพโ€โ™‚๏ธ","version":12},{"tone":5,"emoji":"๐ŸงŽ๐Ÿฟโ€โ™‚๏ธ","version":12}]},{"emoji":"๐ŸงŽโ€โ™€๏ธ","group":1,"order":2087,"tags":["kneel","kneeling","knees","woman"],"version":12,"annotation":"woman kneeling","shortcodes":["woman_kneeling"],"skins":[{"tone":1,"emoji":"๐ŸงŽ๐Ÿปโ€โ™€๏ธ","version":12},{"tone":2,"emoji":"๐ŸงŽ๐Ÿผโ€โ™€๏ธ","version":12},{"tone":3,"emoji":"๐ŸงŽ๐Ÿฝโ€โ™€๏ธ","version":12},{"tone":4,"emoji":"๐ŸงŽ๐Ÿพโ€โ™€๏ธ","version":12},{"tone":5,"emoji":"๐ŸงŽ๐Ÿฟโ€โ™€๏ธ","version":12}]},{"emoji":"๐ŸงŽโ€โžก๏ธ","group":1,"order":2099,"tags":["kneel","kneeling","knees","person"],"version":15.1,"annotation":"person kneeling facing right","shortcodes":["person_kneeling_right"],"skins":[{"tone":1,"emoji":"๐ŸงŽ๐Ÿปโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐ŸงŽ๐Ÿผโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐ŸงŽ๐Ÿฝโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐ŸงŽ๐Ÿพโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐ŸงŽ๐Ÿฟโ€โžก๏ธ","version":15.1}]},{"emoji":"๐ŸงŽโ€โ™€๏ธโ€โžก๏ธ","group":1,"order":2111,"tags":["kneel","kneeling","knees","woman"],"version":15.1,"annotation":"woman kneeling facing right","shortcodes":["woman_kneeling_right"],"skins":[{"tone":1,"emoji":"๐ŸงŽ๐Ÿปโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐ŸงŽ๐Ÿผโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐ŸงŽ๐Ÿฝโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐ŸงŽ๐Ÿพโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐ŸงŽ๐Ÿฟโ€โ™€๏ธโ€โžก๏ธ","version":15.1}]},{"emoji":"๐ŸงŽโ€โ™‚๏ธโ€โžก๏ธ","group":1,"order":2135,"tags":["kneel","kneeling","knees","man"],"version":15.1,"annotation":"man kneeling facing right","shortcodes":["man_kneeling_right"],"skins":[{"tone":1,"emoji":"๐ŸงŽ๐Ÿปโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐ŸงŽ๐Ÿผโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐ŸงŽ๐Ÿฝโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐ŸงŽ๐Ÿพโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐ŸงŽ๐Ÿฟโ€โ™‚๏ธโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿง‘โ€๐Ÿฆฏ","group":1,"order":2159,"tags":["accessibility","blind","cane","person","probing","white"],"version":12.1,"annotation":"person with white cane","shortcodes":["person_with_probing_cane","person_with_white_cane"],"skins":[{"tone":1,"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿฆฏ","version":12.1},{"tone":2,"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿฆฏ","version":12.1},{"tone":3,"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿฆฏ","version":12.1},{"tone":4,"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿฆฏ","version":12.1},{"tone":5,"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿฆฏ","version":12.1}]},{"emoji":"๐Ÿง‘โ€๐Ÿฆฏโ€โžก๏ธ","group":1,"order":2165,"tags":["accessibility","blind","cane","person","probing","white"],"version":15.1,"annotation":"person with white cane facing right","shortcodes":["person_with_white_cane_right"],"skins":[{"tone":1,"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿ‘จโ€๐Ÿฆฏ","group":1,"order":2177,"tags":["accessibility","blind","cane","man","probing","white"],"version":12,"annotation":"man with white cane","shortcodes":["man_with_probing_cane","man_with_white_cane"],"skins":[{"tone":1,"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฏ","version":12},{"tone":2,"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฏ","version":12},{"tone":3,"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฏ","version":12},{"tone":4,"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฏ","version":12},{"tone":5,"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฏ","version":12}]},{"emoji":"๐Ÿ‘จโ€๐Ÿฆฏโ€โžก๏ธ","group":1,"order":2183,"tags":["accessibility","blind","cane","man","probing","white"],"version":15.1,"annotation":"man with white cane facing right","shortcodes":["man_with_white_cane_right"],"skins":[{"tone":1,"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿฆฏ","group":1,"order":2195,"tags":["accessibility","blind","cane","probing","white","woman"],"version":12,"annotation":"woman with white cane","shortcodes":["woman_with_probing_cane","woman_with_white_cane"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฏ","version":12},{"tone":2,"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฏ","version":12},{"tone":3,"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฏ","version":12},{"tone":4,"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฏ","version":12},{"tone":5,"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฏ","version":12}]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿฆฏโ€โžก๏ธ","group":1,"order":2201,"tags":["accessibility","blind","cane","probing","white","woman"],"version":15.1,"annotation":"woman with white cane facing right","shortcodes":["woman_with_white_cane_right"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฏโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿง‘โ€๐Ÿฆผ","group":1,"order":2213,"tags":["accessibility","motorized","person","wheelchair"],"version":12.1,"annotation":"person in motorized wheelchair","shortcodes":["person_in_motorized_wheelchair"],"skins":[{"tone":1,"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿฆผ","version":12.1},{"tone":2,"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿฆผ","version":12.1},{"tone":3,"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿฆผ","version":12.1},{"tone":4,"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿฆผ","version":12.1},{"tone":5,"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿฆผ","version":12.1}]},{"emoji":"๐Ÿง‘โ€๐Ÿฆผโ€โžก๏ธ","group":1,"order":2219,"tags":["accessibility","motorized","person","wheelchair"],"version":15.1,"annotation":"person in motorized wheelchair facing right","shortcodes":["person_in_motorized_wheelchair_right"],"skins":[{"tone":1,"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿฆผโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿ‘จโ€๐Ÿฆผ","group":1,"order":2231,"tags":["accessibility","man","motorized","wheelchair"],"version":12,"annotation":"man in motorized wheelchair","shortcodes":["man_in_motorized_wheelchair"],"skins":[{"tone":1,"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿฆผ","version":12},{"tone":2,"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿฆผ","version":12},{"tone":3,"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆผ","version":12},{"tone":4,"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿฆผ","version":12},{"tone":5,"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆผ","version":12}]},{"emoji":"๐Ÿ‘จโ€๐Ÿฆผโ€โžก๏ธ","group":1,"order":2237,"tags":["accessibility","man","motorized","wheelchair"],"version":15.1,"annotation":"man in motorized wheelchair facing right","shortcodes":["man_in_motorized_wheelchair_right"],"skins":[{"tone":1,"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆผโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿฆผ","group":1,"order":2249,"tags":["accessibility","motorized","wheelchair","woman"],"version":12,"annotation":"woman in motorized wheelchair","shortcodes":["woman_in_motorized_wheelchair"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆผ","version":12},{"tone":2,"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆผ","version":12},{"tone":3,"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆผ","version":12},{"tone":4,"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆผ","version":12},{"tone":5,"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆผ","version":12}]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿฆผโ€โžก๏ธ","group":1,"order":2255,"tags":["accessibility","motorized","wheelchair","woman"],"version":15.1,"annotation":"woman in motorized wheelchair facing right","shortcodes":["woman_in_motorized_wheelchair_right"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆผโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆผโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿง‘โ€๐Ÿฆฝ","group":1,"order":2267,"tags":["accessibility","manual","person","wheelchair"],"version":12.1,"annotation":"person in manual wheelchair","shortcodes":["person_in_manual_wheelchair"],"skins":[{"tone":1,"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿฆฝ","version":12.1},{"tone":2,"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿฆฝ","version":12.1},{"tone":3,"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿฆฝ","version":12.1},{"tone":4,"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿฆฝ","version":12.1},{"tone":5,"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿฆฝ","version":12.1}]},{"emoji":"๐Ÿง‘โ€๐Ÿฆฝโ€โžก๏ธ","group":1,"order":2273,"tags":["accessibility","manual","person","wheelchair"],"version":15.1,"annotation":"person in manual wheelchair facing right","shortcodes":["person_in_manual_wheelchair_right"],"skins":[{"tone":1,"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿ‘จโ€๐Ÿฆฝ","group":1,"order":2285,"tags":["accessibility","man","manual","wheelchair"],"version":12,"annotation":"man in manual wheelchair","shortcodes":["man_in_manual_wheelchair"],"skins":[{"tone":1,"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฝ","version":12},{"tone":2,"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฝ","version":12},{"tone":3,"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฝ","version":12},{"tone":4,"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฝ","version":12},{"tone":5,"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฝ","version":12}]},{"emoji":"๐Ÿ‘จโ€๐Ÿฆฝโ€โžก๏ธ","group":1,"order":2291,"tags":["accessibility","man","manual","wheelchair"],"version":15.1,"annotation":"man in manual wheelchair facing right","shortcodes":["man_in_manual_wheelchair_right"],"skins":[{"tone":1,"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿฆฝ","group":1,"order":2303,"tags":["accessibility","manual","wheelchair","woman"],"version":12,"annotation":"woman in manual wheelchair","shortcodes":["woman_in_manual_wheelchair"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฝ","version":12},{"tone":2,"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฝ","version":12},{"tone":3,"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฝ","version":12},{"tone":4,"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฝ","version":12},{"tone":5,"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฝ","version":12}]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿฆฝโ€โžก๏ธ","group":1,"order":2309,"tags":["accessibility","manual","wheelchair","woman"],"version":15.1,"annotation":"woman in manual wheelchair facing right","shortcodes":["woman_in_manual_wheelchair_right"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฝโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿƒ","group":1,"order":2321,"tags":["fast","hurry","marathon","move","person","quick","race","racing","run","rush","speed"],"version":0.6,"annotation":"person running","shortcodes":["person_running","running"],"skins":[{"tone":1,"emoji":"๐Ÿƒ๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿƒ๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿƒ๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿƒ๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿƒ๐Ÿฟ","version":1}]},{"emoji":"๐Ÿƒโ€โ™‚๏ธ","group":1,"order":2327,"tags":["fast","hurry","man","marathon","move","quick","race","racing","run","rush","speed"],"version":4,"annotation":"man running","shortcodes":["man_running"],"skins":[{"tone":1,"emoji":"๐Ÿƒ๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿƒ๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿƒ๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿƒ๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿƒ๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿƒโ€โ™€๏ธ","group":1,"order":2339,"tags":["fast","hurry","marathon","move","quick","race","racing","run","rush","speed","woman"],"version":4,"annotation":"woman running","shortcodes":["woman_running"],"skins":[{"tone":1,"emoji":"๐Ÿƒ๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿƒ๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿƒ๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿƒ๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿƒ๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿƒโ€โžก๏ธ","group":1,"order":2351,"tags":["fast","hurry","marathon","move","person","quick","race","racing","run","rush","speed"],"version":15.1,"annotation":"person running facing right","shortcodes":["person_running_right"],"skins":[{"tone":1,"emoji":"๐Ÿƒ๐Ÿปโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿƒ๐Ÿผโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿƒ๐Ÿฝโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿƒ๐Ÿพโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿƒ๐Ÿฟโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿƒโ€โ™€๏ธโ€โžก๏ธ","group":1,"order":2363,"tags":["fast","hurry","marathon","move","quick","race","racing","run","rush","speed","woman"],"version":15.1,"annotation":"woman running facing right","shortcodes":["woman_running_right"],"skins":[{"tone":1,"emoji":"๐Ÿƒ๐Ÿปโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿƒ๐Ÿผโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿƒ๐Ÿฝโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿƒ๐Ÿพโ€โ™€๏ธโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿƒ๐Ÿฟโ€โ™€๏ธโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿƒโ€โ™‚๏ธโ€โžก๏ธ","group":1,"order":2387,"tags":["fast","hurry","man","marathon","move","quick","race","racing","run","rush","speed"],"version":15.1,"annotation":"man running facing right","shortcodes":["man_running_right"],"skins":[{"tone":1,"emoji":"๐Ÿƒ๐Ÿปโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":2,"emoji":"๐Ÿƒ๐Ÿผโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":3,"emoji":"๐Ÿƒ๐Ÿฝโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":4,"emoji":"๐Ÿƒ๐Ÿพโ€โ™‚๏ธโ€โžก๏ธ","version":15.1},{"tone":5,"emoji":"๐Ÿƒ๐Ÿฟโ€โ™‚๏ธโ€โžก๏ธ","version":15.1}]},{"emoji":"๐Ÿ’ƒ","group":1,"order":2411,"tags":["dance","dancer","dancing","elegant","festive","flair","flamenco","groove","letโ€™s","salsa","tango","woman"],"version":0.6,"annotation":"woman dancing","shortcodes":["dancer","woman_dancing"],"skins":[{"tone":1,"emoji":"๐Ÿ’ƒ๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿ’ƒ๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿ’ƒ๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿ’ƒ๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿ’ƒ๐Ÿฟ","version":1}]},{"emoji":"๐Ÿ•บ","group":1,"order":2417,"tags":["dance","dancer","dancing","elegant","festive","flair","flamenco","groove","letโ€™s","man","salsa","tango"],"version":3,"annotation":"man dancing","shortcodes":["man_dancing"],"skins":[{"tone":1,"emoji":"๐Ÿ•บ๐Ÿป","version":3},{"tone":2,"emoji":"๐Ÿ•บ๐Ÿผ","version":3},{"tone":3,"emoji":"๐Ÿ•บ๐Ÿฝ","version":3},{"tone":4,"emoji":"๐Ÿ•บ๐Ÿพ","version":3},{"tone":5,"emoji":"๐Ÿ•บ๐Ÿฟ","version":3}]},{"emoji":"๐Ÿ•ด๏ธ","group":1,"order":2424,"tags":["business","levitating","person","suit"],"version":0.7,"annotation":"person in suit levitating","shortcodes":["levitate","levitating","person_in_suit_levitating"],"skins":[{"tone":1,"emoji":"๐Ÿ•ด๐Ÿป","version":4},{"tone":2,"emoji":"๐Ÿ•ด๐Ÿผ","version":4},{"tone":3,"emoji":"๐Ÿ•ด๐Ÿฝ","version":4},{"tone":4,"emoji":"๐Ÿ•ด๐Ÿพ","version":4},{"tone":5,"emoji":"๐Ÿ•ด๐Ÿฟ","version":4}]},{"emoji":"๐Ÿ‘ฏ","group":1,"order":2430,"tags":["bestie","bff","bunny","counterpart","dancer","double","ear","identical","pair","party","partying","people","soulmate","twin","twinsies"],"version":0.6,"annotation":"people with bunny ears","shortcodes":["dancers","people_with_bunny_ears_partying"]},{"emoji":"๐Ÿ‘ฏโ€โ™‚๏ธ","group":1,"order":2431,"tags":["bestie","bff","bunny","counterpart","dancer","double","ear","identical","men","pair","party","partying","people","soulmate","twin","twinsies"],"version":4,"annotation":"men with bunny ears","shortcodes":["men_with_bunny_ears_partying"]},{"emoji":"๐Ÿ‘ฏโ€โ™€๏ธ","group":1,"order":2433,"tags":["bestie","bff","bunny","counterpart","dancer","double","ear","identical","pair","party","partying","people","soulmate","twin","twinsies","women"],"version":4,"annotation":"women with bunny ears","shortcodes":["women_with_bunny_ears_partying"]},{"emoji":"๐Ÿง–","group":1,"order":2435,"tags":["day","luxurious","pamper","person","relax","room","sauna","spa","steam","steambath","unwind"],"version":5,"annotation":"person in steamy room","shortcodes":["person_in_steamy_room"],"skins":[{"tone":1,"emoji":"๐Ÿง–๐Ÿป","version":5},{"tone":2,"emoji":"๐Ÿง–๐Ÿผ","version":5},{"tone":3,"emoji":"๐Ÿง–๐Ÿฝ","version":5},{"tone":4,"emoji":"๐Ÿง–๐Ÿพ","version":5},{"tone":5,"emoji":"๐Ÿง–๐Ÿฟ","version":5}]},{"emoji":"๐Ÿง–โ€โ™‚๏ธ","group":1,"order":2441,"tags":["day","luxurious","man","pamper","relax","room","sauna","spa","steam","steambath","unwind"],"version":5,"annotation":"man in steamy room","shortcodes":["man_in_steamy_room"],"skins":[{"tone":1,"emoji":"๐Ÿง–๐Ÿปโ€โ™‚๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง–๐Ÿผโ€โ™‚๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง–๐Ÿฝโ€โ™‚๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง–๐Ÿพโ€โ™‚๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง–๐Ÿฟโ€โ™‚๏ธ","version":5}]},{"emoji":"๐Ÿง–โ€โ™€๏ธ","group":1,"order":2453,"tags":["day","luxurious","pamper","relax","room","sauna","spa","steam","steambath","unwind","woman"],"version":5,"annotation":"woman in steamy room","shortcodes":["woman_in_steamy_room"],"skins":[{"tone":1,"emoji":"๐Ÿง–๐Ÿปโ€โ™€๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง–๐Ÿผโ€โ™€๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง–๐Ÿฝโ€โ™€๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง–๐Ÿพโ€โ™€๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง–๐Ÿฟโ€โ™€๏ธ","version":5}]},{"emoji":"๐Ÿง—","group":1,"order":2465,"tags":["climb","climber","climbing","mountain","person","rock","scale","up"],"version":5,"annotation":"person climbing","shortcodes":["climbing","person_climbing"],"skins":[{"tone":1,"emoji":"๐Ÿง—๐Ÿป","version":5},{"tone":2,"emoji":"๐Ÿง—๐Ÿผ","version":5},{"tone":3,"emoji":"๐Ÿง—๐Ÿฝ","version":5},{"tone":4,"emoji":"๐Ÿง—๐Ÿพ","version":5},{"tone":5,"emoji":"๐Ÿง—๐Ÿฟ","version":5}]},{"emoji":"๐Ÿง—โ€โ™‚๏ธ","group":1,"order":2471,"tags":["climb","climber","climbing","man","mountain","rock","scale","up"],"version":5,"annotation":"man climbing","shortcodes":["man_climbing"],"skins":[{"tone":1,"emoji":"๐Ÿง—๐Ÿปโ€โ™‚๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง—๐Ÿผโ€โ™‚๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง—๐Ÿฝโ€โ™‚๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง—๐Ÿพโ€โ™‚๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง—๐Ÿฟโ€โ™‚๏ธ","version":5}]},{"emoji":"๐Ÿง—โ€โ™€๏ธ","group":1,"order":2483,"tags":["climb","climber","climbing","mountain","rock","scale","up","woman"],"version":5,"annotation":"woman climbing","shortcodes":["woman_climbing"],"skins":[{"tone":1,"emoji":"๐Ÿง—๐Ÿปโ€โ™€๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง—๐Ÿผโ€โ™€๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง—๐Ÿฝโ€โ™€๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง—๐Ÿพโ€โ™€๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง—๐Ÿฟโ€โ™€๏ธ","version":5}]},{"emoji":"๐Ÿคบ","group":1,"order":2495,"tags":["fencer","fencing","person","sword"],"version":3,"annotation":"person fencing","shortcodes":["fencer","fencing","person_fencing"]},{"emoji":"๐Ÿ‡","group":1,"order":2496,"tags":["horse","jockey","racehorse","racing","riding","sport"],"version":1,"annotation":"horse racing","shortcodes":["horse_racing"],"skins":[{"tone":1,"emoji":"๐Ÿ‡๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿ‡๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿ‡๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿ‡๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿ‡๐Ÿฟ","version":1}]},{"emoji":"โ›ท๏ธ","group":1,"order":2503,"tags":["ski","snow"],"version":0.7,"annotation":"skier","shortcodes":["person_skiing","skier","skiing"]},{"emoji":"๐Ÿ‚๏ธ","group":1,"order":2504,"tags":["ski","snow","snowboard","sport"],"version":0.6,"annotation":"snowboarder","shortcodes":["person_snowboarding","snowboarder","snowboarding"],"skins":[{"tone":1,"emoji":"๐Ÿ‚๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿ‚๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿ‚๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿ‚๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿ‚๐Ÿฟ","version":1}]},{"emoji":"๐ŸŒ๏ธ","group":1,"order":2511,"tags":["ball","birdie","caddy","driving","golf","golfing","green","person","pga","putt","range","tee"],"version":0.7,"annotation":"person golfing","shortcodes":["golfer","golfing","person_golfing"],"skins":[{"tone":1,"emoji":"๐ŸŒ๐Ÿป","version":4},{"tone":2,"emoji":"๐ŸŒ๐Ÿผ","version":4},{"tone":3,"emoji":"๐ŸŒ๐Ÿฝ","version":4},{"tone":4,"emoji":"๐ŸŒ๐Ÿพ","version":4},{"tone":5,"emoji":"๐ŸŒ๐Ÿฟ","version":4}]},{"emoji":"๐ŸŒ๏ธโ€โ™‚๏ธ","group":1,"order":2517,"tags":["ball","birdie","caddy","driving","golf","golfing","green","man","pga","putt","range","tee"],"version":4,"annotation":"man golfing","shortcodes":["man_golfing"],"skins":[{"tone":1,"emoji":"๐ŸŒ๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐ŸŒ๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐ŸŒ๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐ŸŒ๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐ŸŒ๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐ŸŒ๏ธโ€โ™€๏ธ","group":1,"order":2531,"tags":["ball","birdie","caddy","driving","golf","golfing","green","pga","putt","range","tee","woman"],"version":4,"annotation":"woman golfing","shortcodes":["woman_golfing"],"skins":[{"tone":1,"emoji":"๐ŸŒ๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐ŸŒ๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐ŸŒ๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐ŸŒ๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐ŸŒ๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿ„๏ธ","group":1,"order":2545,"tags":["beach","ocean","person","sport","surf","surfer","surfing","swell","waves"],"version":0.6,"annotation":"person surfing","shortcodes":["person_surfing","surfer","surfing"],"skins":[{"tone":1,"emoji":"๐Ÿ„๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿ„๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿ„๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿ„๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿ„๐Ÿฟ","version":1}]},{"emoji":"๐Ÿ„โ€โ™‚๏ธ","group":1,"order":2551,"tags":["beach","man","ocean","sport","surf","surfer","surfing","swell","waves"],"version":4,"annotation":"man surfing","shortcodes":["man_surfing"],"skins":[{"tone":1,"emoji":"๐Ÿ„๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿ„๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿ„๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿ„๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿ„๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿ„โ€โ™€๏ธ","group":1,"order":2563,"tags":["beach","ocean","person","sport","surf","surfer","surfing","swell","waves"],"version":4,"annotation":"woman surfing","shortcodes":["woman_surfing"],"skins":[{"tone":1,"emoji":"๐Ÿ„๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿ„๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿ„๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿ„๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿ„๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿšฃ","group":1,"order":2575,"tags":["boat","canoe","cruise","fishing","lake","oar","paddle","person","raft","river","row","rowboat","rowing"],"version":1,"annotation":"person rowing boat","shortcodes":["person_rowing_boat","rowboat"],"skins":[{"tone":1,"emoji":"๐Ÿšฃ๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿšฃ๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿšฃ๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿšฃ๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿšฃ๐Ÿฟ","version":1}]},{"emoji":"๐Ÿšฃโ€โ™‚๏ธ","group":1,"order":2581,"tags":["boat","canoe","cruise","fishing","lake","man","oar","paddle","raft","river","row","rowboat","rowing"],"version":4,"annotation":"man rowing boat","shortcodes":["man_rowing_boat"],"skins":[{"tone":1,"emoji":"๐Ÿšฃ๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿšฃ๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿšฃ๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿšฃ๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿšฃ๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿšฃโ€โ™€๏ธ","group":1,"order":2593,"tags":["boat","canoe","cruise","fishing","lake","oar","paddle","raft","river","row","rowboat","rowing","woman"],"version":4,"annotation":"woman rowing boat","shortcodes":["woman_rowing_boat"],"skins":[{"tone":1,"emoji":"๐Ÿšฃ๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿšฃ๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿšฃ๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿšฃ๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿšฃ๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐ŸŠ๏ธ","group":1,"order":2605,"tags":["freestyle","person","sport","swim","swimmer","swimming","triathlon"],"version":0.6,"annotation":"person swimming","shortcodes":["person_swimming","swimmer","swimming"],"skins":[{"tone":1,"emoji":"๐ŸŠ๐Ÿป","version":1},{"tone":2,"emoji":"๐ŸŠ๐Ÿผ","version":1},{"tone":3,"emoji":"๐ŸŠ๐Ÿฝ","version":1},{"tone":4,"emoji":"๐ŸŠ๐Ÿพ","version":1},{"tone":5,"emoji":"๐ŸŠ๐Ÿฟ","version":1}]},{"emoji":"๐ŸŠโ€โ™‚๏ธ","group":1,"order":2611,"tags":["freestyle","man","sport","swim","swimmer","swimming","triathlon"],"version":4,"annotation":"man swimming","shortcodes":["man_swimming"],"skins":[{"tone":1,"emoji":"๐ŸŠ๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐ŸŠ๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐ŸŠ๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐ŸŠ๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐ŸŠ๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐ŸŠโ€โ™€๏ธ","group":1,"order":2623,"tags":["freestyle","man","sport","swim","swimmer","swimming","triathlon"],"version":4,"annotation":"woman swimming","shortcodes":["woman_swimming"],"skins":[{"tone":1,"emoji":"๐ŸŠ๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐ŸŠ๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐ŸŠ๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐ŸŠ๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐ŸŠ๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"โ›น๏ธ","group":1,"order":2636,"tags":["athletic","ball","basketball","bouncing","championship","dribble","net","person","player","throw"],"version":0.7,"annotation":"person bouncing ball","shortcodes":["person_bouncing_ball"],"skins":[{"tone":1,"emoji":"โ›น๐Ÿป","version":2},{"tone":2,"emoji":"โ›น๐Ÿผ","version":2},{"tone":3,"emoji":"โ›น๐Ÿฝ","version":2},{"tone":4,"emoji":"โ›น๐Ÿพ","version":2},{"tone":5,"emoji":"โ›น๐Ÿฟ","version":2}]},{"emoji":"โ›น๏ธโ€โ™‚๏ธ","group":1,"order":2642,"tags":["athletic","ball","basketball","bouncing","championship","dribble","man","net","player","throw"],"version":4,"annotation":"man bouncing ball","shortcodes":["man_bouncing_ball"],"skins":[{"tone":1,"emoji":"โ›น๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"โ›น๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"โ›น๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"โ›น๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"โ›น๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"โ›น๏ธโ€โ™€๏ธ","group":1,"order":2656,"tags":["athletic","ball","basketball","bouncing","championship","dribble","net","player","throw","woman"],"version":4,"annotation":"woman bouncing ball","shortcodes":["woman_bouncing_ball"],"skins":[{"tone":1,"emoji":"โ›น๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"โ›น๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"โ›น๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"โ›น๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"โ›น๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿ‹๏ธ","group":1,"order":2671,"tags":["barbell","bodybuilder","deadlift","lifter","lifting","person","powerlifting","weight","weightlifter","weights","workout"],"version":0.7,"annotation":"person lifting weights","shortcodes":["person_lifting_weights","weight_lifter","weight_lifting"],"skins":[{"tone":1,"emoji":"๐Ÿ‹๐Ÿป","version":2},{"tone":2,"emoji":"๐Ÿ‹๐Ÿผ","version":2},{"tone":3,"emoji":"๐Ÿ‹๐Ÿฝ","version":2},{"tone":4,"emoji":"๐Ÿ‹๐Ÿพ","version":2},{"tone":5,"emoji":"๐Ÿ‹๐Ÿฟ","version":2}]},{"emoji":"๐Ÿ‹๏ธโ€โ™‚๏ธ","group":1,"order":2677,"tags":["barbell","bodybuilder","deadlift","lifter","lifting","man","powerlifting","weight","weightlifter","weights","workout"],"version":4,"annotation":"man lifting weights","shortcodes":["man_lifting_weights"],"skins":[{"tone":1,"emoji":"๐Ÿ‹๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿ‹๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿ‹๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿ‹๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿ‹๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿ‹๏ธโ€โ™€๏ธ","group":1,"order":2691,"tags":["barbell","bodybuilder","deadlift","lifter","lifting","powerlifting","weight","weightlifter","weights","woman","workout"],"version":4,"annotation":"woman lifting weights","shortcodes":["woman_lifting_weights"],"skins":[{"tone":1,"emoji":"๐Ÿ‹๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿ‹๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿ‹๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿ‹๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿ‹๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿšด","group":1,"order":2705,"tags":["bicycle","bicyclist","bike","biking","cycle","cyclist","person","riding","sport"],"version":1,"annotation":"person biking","shortcodes":["bicyclist","biking","person_biking"],"skins":[{"tone":1,"emoji":"๐Ÿšด๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿšด๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿšด๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿšด๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿšด๐Ÿฟ","version":1}]},{"emoji":"๐Ÿšดโ€โ™‚๏ธ","group":1,"order":2711,"tags":["bicycle","bicyclist","bike","biking","cycle","cyclist","man","riding","sport"],"version":4,"annotation":"man biking","shortcodes":["man_biking"],"skins":[{"tone":1,"emoji":"๐Ÿšด๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿšด๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿšด๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿšด๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿšด๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿšดโ€โ™€๏ธ","group":1,"order":2723,"tags":["bicycle","bicyclist","bike","biking","cycle","cyclist","riding","sport","woman"],"version":4,"annotation":"woman biking","shortcodes":["woman_biking"],"skins":[{"tone":1,"emoji":"๐Ÿšด๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿšด๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿšด๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿšด๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿšด๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿšต","group":1,"order":2735,"tags":["bicycle","bicyclist","bike","biking","cycle","cyclist","mountain","person","riding","sport"],"version":1,"annotation":"person mountain biking","shortcodes":["mountain_bicyclist","mountain_biking","person_mountain_biking"],"skins":[{"tone":1,"emoji":"๐Ÿšต๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿšต๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿšต๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿšต๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿšต๐Ÿฟ","version":1}]},{"emoji":"๐Ÿšตโ€โ™‚๏ธ","group":1,"order":2741,"tags":["bicycle","bicyclist","bike","biking","cycle","cyclist","man","mountain","riding","sport"],"version":4,"annotation":"man mountain biking","shortcodes":["man_mountain_biking"],"skins":[{"tone":1,"emoji":"๐Ÿšต๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿšต๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿšต๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿšต๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿšต๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿšตโ€โ™€๏ธ","group":1,"order":2753,"tags":["bicycle","bicyclist","bike","biking","cycle","cyclist","mountain","riding","sport","woman"],"version":4,"annotation":"woman mountain biking","shortcodes":["woman_mountain_biking"],"skins":[{"tone":1,"emoji":"๐Ÿšต๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿšต๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿšต๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿšต๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿšต๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿคธ","group":1,"order":2765,"tags":["active","cartwheel","cartwheeling","excited","flip","gymnastics","happy","person","somersault"],"version":3,"annotation":"person cartwheeling","shortcodes":["cartwheeling","person_cartwheel"],"skins":[{"tone":1,"emoji":"๐Ÿคธ๐Ÿป","version":3},{"tone":2,"emoji":"๐Ÿคธ๐Ÿผ","version":3},{"tone":3,"emoji":"๐Ÿคธ๐Ÿฝ","version":3},{"tone":4,"emoji":"๐Ÿคธ๐Ÿพ","version":3},{"tone":5,"emoji":"๐Ÿคธ๐Ÿฟ","version":3}]},{"emoji":"๐Ÿคธโ€โ™‚๏ธ","group":1,"order":2771,"tags":["active","cartwheel","cartwheeling","excited","flip","gymnastics","happy","man","somersault"],"version":4,"annotation":"man cartwheeling","shortcodes":["man_cartwheeling"],"skins":[{"tone":1,"emoji":"๐Ÿคธ๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿคธ๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿคธ๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿคธ๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿคธ๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿคธโ€โ™€๏ธ","group":1,"order":2783,"tags":["active","cartwheel","cartwheeling","excited","flip","gymnastics","happy","somersault","woman"],"version":4,"annotation":"woman cartwheeling","shortcodes":["woman_cartwheeling"],"skins":[{"tone":1,"emoji":"๐Ÿคธ๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿคธ๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿคธ๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿคธ๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿคธ๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿคผ","group":1,"order":2795,"tags":["combat","duel","grapple","people","ring","tournament","wrestle","wrestling"],"version":3,"annotation":"people wrestling","shortcodes":["people_wrestling","wrestlers","wrestling"]},{"emoji":"๐Ÿคผโ€โ™‚๏ธ","group":1,"order":2796,"tags":["combat","duel","grapple","men","ring","tournament","wrestle","wrestling"],"version":4,"annotation":"men wrestling","shortcodes":["men_wrestling"]},{"emoji":"๐Ÿคผโ€โ™€๏ธ","group":1,"order":2798,"tags":["combat","duel","grapple","ring","tournament","women","wrestle","wrestling"],"version":4,"annotation":"women wrestling","shortcodes":["women_wrestling"]},{"emoji":"๐Ÿคฝ","group":1,"order":2800,"tags":["person","playing","polo","sport","swimming","water","waterpolo"],"version":3,"annotation":"person playing water polo","shortcodes":["person_playing_water_polo","water_polo"],"skins":[{"tone":1,"emoji":"๐Ÿคฝ๐Ÿป","version":3},{"tone":2,"emoji":"๐Ÿคฝ๐Ÿผ","version":3},{"tone":3,"emoji":"๐Ÿคฝ๐Ÿฝ","version":3},{"tone":4,"emoji":"๐Ÿคฝ๐Ÿพ","version":3},{"tone":5,"emoji":"๐Ÿคฝ๐Ÿฟ","version":3}]},{"emoji":"๐Ÿคฝโ€โ™‚๏ธ","group":1,"order":2806,"tags":["man","playing","polo","sport","swimming","water","waterpolo"],"version":4,"annotation":"man playing water polo","shortcodes":["man_playing_water_polo"],"skins":[{"tone":1,"emoji":"๐Ÿคฝ๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿคฝ๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿคฝ๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿคฝ๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿคฝ๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿคฝโ€โ™€๏ธ","group":1,"order":2818,"tags":["playing","polo","sport","swimming","water","waterpolo","woman"],"version":4,"annotation":"woman playing water polo","shortcodes":["woman_playing_water_polo"],"skins":[{"tone":1,"emoji":"๐Ÿคฝ๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿคฝ๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿคฝ๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿคฝ๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿคฝ๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿคพ","group":1,"order":2830,"tags":["athletics","ball","catch","chuck","handball","hurl","lob","person","pitch","playing","sport","throw","toss"],"version":3,"annotation":"person playing handball","shortcodes":["handball","person_playing_handball"],"skins":[{"tone":1,"emoji":"๐Ÿคพ๐Ÿป","version":3},{"tone":2,"emoji":"๐Ÿคพ๐Ÿผ","version":3},{"tone":3,"emoji":"๐Ÿคพ๐Ÿฝ","version":3},{"tone":4,"emoji":"๐Ÿคพ๐Ÿพ","version":3},{"tone":5,"emoji":"๐Ÿคพ๐Ÿฟ","version":3}]},{"emoji":"๐Ÿคพโ€โ™‚๏ธ","group":1,"order":2836,"tags":["athletics","ball","catch","chuck","handball","hurl","lob","man","pitch","playing","sport","throw","toss"],"version":4,"annotation":"man playing handball","shortcodes":["man_playing_handball"],"skins":[{"tone":1,"emoji":"๐Ÿคพ๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿคพ๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿคพ๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿคพ๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿคพ๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿคพโ€โ™€๏ธ","group":1,"order":2848,"tags":["athletics","ball","catch","chuck","handball","hurl","lob","pitch","playing","sport","throw","toss","woman"],"version":4,"annotation":"woman playing handball","shortcodes":["woman_playing_handball"],"skins":[{"tone":1,"emoji":"๐Ÿคพ๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿคพ๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿคพ๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿคพ๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿคพ๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿคน","group":1,"order":2860,"tags":["act","balance","balancing","handle","juggle","juggling","manage","multitask","person","skill"],"version":3,"annotation":"person juggling","shortcodes":["juggler","juggling","person_juggling"],"skins":[{"tone":1,"emoji":"๐Ÿคน๐Ÿป","version":3},{"tone":2,"emoji":"๐Ÿคน๐Ÿผ","version":3},{"tone":3,"emoji":"๐Ÿคน๐Ÿฝ","version":3},{"tone":4,"emoji":"๐Ÿคน๐Ÿพ","version":3},{"tone":5,"emoji":"๐Ÿคน๐Ÿฟ","version":3}]},{"emoji":"๐Ÿคนโ€โ™‚๏ธ","group":1,"order":2866,"tags":["act","balance","balancing","handle","juggle","juggling","man","manage","multitask","skill"],"version":4,"annotation":"man juggling","shortcodes":["man_juggling"],"skins":[{"tone":1,"emoji":"๐Ÿคน๐Ÿปโ€โ™‚๏ธ","version":4},{"tone":2,"emoji":"๐Ÿคน๐Ÿผโ€โ™‚๏ธ","version":4},{"tone":3,"emoji":"๐Ÿคน๐Ÿฝโ€โ™‚๏ธ","version":4},{"tone":4,"emoji":"๐Ÿคน๐Ÿพโ€โ™‚๏ธ","version":4},{"tone":5,"emoji":"๐Ÿคน๐Ÿฟโ€โ™‚๏ธ","version":4}]},{"emoji":"๐Ÿคนโ€โ™€๏ธ","group":1,"order":2878,"tags":["act","balance","balancing","handle","juggle","juggling","manage","multitask","skill","woman"],"version":4,"annotation":"woman juggling","shortcodes":["woman_juggling"],"skins":[{"tone":1,"emoji":"๐Ÿคน๐Ÿปโ€โ™€๏ธ","version":4},{"tone":2,"emoji":"๐Ÿคน๐Ÿผโ€โ™€๏ธ","version":4},{"tone":3,"emoji":"๐Ÿคน๐Ÿฝโ€โ™€๏ธ","version":4},{"tone":4,"emoji":"๐Ÿคน๐Ÿพโ€โ™€๏ธ","version":4},{"tone":5,"emoji":"๐Ÿคน๐Ÿฟโ€โ™€๏ธ","version":4}]},{"emoji":"๐Ÿง˜","group":1,"order":2890,"tags":["cross","legged","legs","lotus","meditation","peace","person","position","relax","serenity","yoga","yogi","zen"],"version":5,"annotation":"person in lotus position","shortcodes":["person_in_lotus_position"],"skins":[{"tone":1,"emoji":"๐Ÿง˜๐Ÿป","version":5},{"tone":2,"emoji":"๐Ÿง˜๐Ÿผ","version":5},{"tone":3,"emoji":"๐Ÿง˜๐Ÿฝ","version":5},{"tone":4,"emoji":"๐Ÿง˜๐Ÿพ","version":5},{"tone":5,"emoji":"๐Ÿง˜๐Ÿฟ","version":5}]},{"emoji":"๐Ÿง˜โ€โ™‚๏ธ","group":1,"order":2896,"tags":["cross","legged","legs","lotus","man","meditation","peace","position","relax","serenity","yoga","yogi","zen"],"version":5,"annotation":"man in lotus position","shortcodes":["man_in_lotus_position"],"skins":[{"tone":1,"emoji":"๐Ÿง˜๐Ÿปโ€โ™‚๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง˜๐Ÿผโ€โ™‚๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง˜๐Ÿฝโ€โ™‚๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง˜๐Ÿพโ€โ™‚๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง˜๐Ÿฟโ€โ™‚๏ธ","version":5}]},{"emoji":"๐Ÿง˜โ€โ™€๏ธ","group":1,"order":2908,"tags":["cross","legged","legs","lotus","meditation","peace","position","relax","serenity","woman","yoga","yogi","zen"],"version":5,"annotation":"woman in lotus position","shortcodes":["woman_in_lotus_position"],"skins":[{"tone":1,"emoji":"๐Ÿง˜๐Ÿปโ€โ™€๏ธ","version":5},{"tone":2,"emoji":"๐Ÿง˜๐Ÿผโ€โ™€๏ธ","version":5},{"tone":3,"emoji":"๐Ÿง˜๐Ÿฝโ€โ™€๏ธ","version":5},{"tone":4,"emoji":"๐Ÿง˜๐Ÿพโ€โ™€๏ธ","version":5},{"tone":5,"emoji":"๐Ÿง˜๐Ÿฟโ€โ™€๏ธ","version":5}]},{"emoji":"๐Ÿ›€","group":1,"order":2920,"tags":["bath","bathtub","person","taking","tub"],"version":0.6,"annotation":"person taking bath","shortcodes":["bath","person_taking_bath"],"skins":[{"tone":1,"emoji":"๐Ÿ›€๐Ÿป","version":1},{"tone":2,"emoji":"๐Ÿ›€๐Ÿผ","version":1},{"tone":3,"emoji":"๐Ÿ›€๐Ÿฝ","version":1},{"tone":4,"emoji":"๐Ÿ›€๐Ÿพ","version":1},{"tone":5,"emoji":"๐Ÿ›€๐Ÿฟ","version":1}]},{"emoji":"๐Ÿ›Œ","group":1,"order":2926,"tags":["bed","bedtime","good","goodnight","hotel","nap","night","person","sleep","tired","zzz"],"version":1,"annotation":"person in bed","shortcodes":["person_in_bed","sleeping_accommodation"],"skins":[{"tone":1,"emoji":"๐Ÿ›Œ๐Ÿป","version":4},{"tone":2,"emoji":"๐Ÿ›Œ๐Ÿผ","version":4},{"tone":3,"emoji":"๐Ÿ›Œ๐Ÿฝ","version":4},{"tone":4,"emoji":"๐Ÿ›Œ๐Ÿพ","version":4},{"tone":5,"emoji":"๐Ÿ›Œ๐Ÿฟ","version":4}]},{"emoji":"๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘","group":1,"order":2932,"tags":["bae","bestie","bff","couple","dating","flirt","friends","hand","hold","people","twins"],"version":12,"annotation":"people holding hands","shortcodes":["people_holding_hands"],"skins":[{"tone":1,"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿป","version":12},{"tone":[1,2],"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ","version":12.1},{"tone":[1,3],"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ","version":12.1},{"tone":[1,4],"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ","version":12.1},{"tone":[1,5],"emoji":"๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ","version":12.1},{"tone":[2,1],"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿป","version":12},{"tone":2,"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ","version":12},{"tone":[2,3],"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ","version":12.1},{"tone":[2,4],"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ","version":12.1},{"tone":[2,5],"emoji":"๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ","version":12.1},{"tone":[3,1],"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿป","version":12},{"tone":[3,2],"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ","version":12},{"tone":3,"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ","version":12},{"tone":[3,4],"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ","version":12.1},{"tone":[3,5],"emoji":"๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ","version":12.1},{"tone":[4,1],"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿป","version":12},{"tone":[4,2],"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ","version":12},{"tone":[4,3],"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ","version":12},{"tone":4,"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ","version":12},{"tone":[4,5],"emoji":"๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ","version":12.1},{"tone":[5,1],"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿป","version":12},{"tone":[5,2],"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ","version":12},{"tone":[5,3],"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ","version":12},{"tone":[5,4],"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ","version":12},{"tone":5,"emoji":"๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ","version":12}]},{"emoji":"๐Ÿ‘ญ","group":1,"order":2958,"tags":["bae","bestie","bff","couple","dating","flirt","friends","girls","hand","hold","sisters","twins","women"],"version":1,"annotation":"women holding hands","shortcodes":["two_women_holding_hands"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ญ๐Ÿป","version":12},{"tone":2,"emoji":"๐Ÿ‘ญ๐Ÿผ","version":12},{"tone":3,"emoji":"๐Ÿ‘ญ๐Ÿฝ","version":12},{"tone":4,"emoji":"๐Ÿ‘ญ๐Ÿพ","version":12},{"tone":5,"emoji":"๐Ÿ‘ญ๐Ÿฟ","version":12},{"tone":[1,2],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ","version":12.1},{"tone":[1,3],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ","version":12.1},{"tone":[1,4],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ","version":12.1},{"tone":[1,5],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ","version":12.1},{"tone":[2,1],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป","version":12},{"tone":[2,3],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ","version":12.1},{"tone":[2,4],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ","version":12.1},{"tone":[2,5],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ","version":12.1},{"tone":[3,1],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป","version":12},{"tone":[3,2],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ","version":12},{"tone":[3,4],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ","version":12.1},{"tone":[3,5],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ","version":12.1},{"tone":[4,1],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป","version":12},{"tone":[4,2],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ","version":12},{"tone":[4,3],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ","version":12},{"tone":[4,5],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ","version":12.1},{"tone":[5,1],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป","version":12},{"tone":[5,2],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ","version":12},{"tone":[5,3],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ","version":12},{"tone":[5,4],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ","version":12}]},{"emoji":"๐Ÿ‘ซ","group":1,"order":2984,"tags":["bae","bestie","bff","couple","dating","flirt","friends","hand","hold","man","twins","woman"],"version":0.6,"annotation":"woman and man holding hands","shortcodes":["couple"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ซ๐Ÿป","version":12},{"tone":2,"emoji":"๐Ÿ‘ซ๐Ÿผ","version":12},{"tone":3,"emoji":"๐Ÿ‘ซ๐Ÿฝ","version":12},{"tone":4,"emoji":"๐Ÿ‘ซ๐Ÿพ","version":12},{"tone":5,"emoji":"๐Ÿ‘ซ๐Ÿฟ","version":12},{"tone":[1,2],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12},{"tone":[1,3],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12},{"tone":[1,4],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12},{"tone":[1,5],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12},{"tone":[2,1],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12},{"tone":[2,3],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12},{"tone":[2,4],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12},{"tone":[2,5],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12},{"tone":[3,1],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12},{"tone":[3,2],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12},{"tone":[3,4],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12},{"tone":[3,5],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12},{"tone":[4,1],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12},{"tone":[4,2],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12},{"tone":[4,3],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12},{"tone":[4,5],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12},{"tone":[5,1],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12},{"tone":[5,2],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12},{"tone":[5,3],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12},{"tone":[5,4],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12}]},{"emoji":"๐Ÿ‘ฌ","group":1,"order":3010,"tags":["bae","bestie","bff","boys","brothers","couple","dating","flirt","friends","hand","hold","men","twins"],"version":1,"annotation":"men holding hands","shortcodes":["two_men_holding_hands"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ฌ๐Ÿป","version":12},{"tone":2,"emoji":"๐Ÿ‘ฌ๐Ÿผ","version":12},{"tone":3,"emoji":"๐Ÿ‘ฌ๐Ÿฝ","version":12},{"tone":4,"emoji":"๐Ÿ‘ฌ๐Ÿพ","version":12},{"tone":5,"emoji":"๐Ÿ‘ฌ๐Ÿฟ","version":12},{"tone":[1,2],"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12.1},{"tone":[1,3],"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12.1},{"tone":[1,4],"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12.1},{"tone":[1,5],"emoji":"๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12.1},{"tone":[2,1],"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12},{"tone":[2,3],"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12.1},{"tone":[2,4],"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12.1},{"tone":[2,5],"emoji":"๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12.1},{"tone":[3,1],"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12},{"tone":[3,2],"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12},{"tone":[3,4],"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12.1},{"tone":[3,5],"emoji":"๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12.1},{"tone":[4,1],"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12},{"tone":[4,2],"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12},{"tone":[4,3],"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12},{"tone":[4,5],"emoji":"๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ","version":12.1},{"tone":[5,1],"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป","version":12},{"tone":[5,2],"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ","version":12},{"tone":[5,3],"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ","version":12},{"tone":[5,4],"emoji":"๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ","version":12}]},{"emoji":"๐Ÿ’","group":1,"order":3036,"tags":["anniversary","babe","bae","couple","date","dating","heart","love","mwah","person","romance","together","xoxo"],"version":0.6,"annotation":"kiss","shortcodes":["couple_kiss","couplekiss"],"skins":[{"tone":1,"emoji":"๐Ÿ’๐Ÿป","version":13.1},{"tone":2,"emoji":"๐Ÿ’๐Ÿผ","version":13.1},{"tone":3,"emoji":"๐Ÿ’๐Ÿฝ","version":13.1},{"tone":4,"emoji":"๐Ÿ’๐Ÿพ","version":13.1},{"tone":5,"emoji":"๐Ÿ’๐Ÿฟ","version":13.1},{"tone":[1,2],"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ","version":13.1},{"tone":[1,3],"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ","version":13.1},{"tone":[1,4],"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ","version":13.1},{"tone":[1,5],"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ","version":13.1},{"tone":[2,1],"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป","version":13.1},{"tone":[2,3],"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ","version":13.1},{"tone":[2,4],"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ","version":13.1},{"tone":[2,5],"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ","version":13.1},{"tone":[3,1],"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป","version":13.1},{"tone":[3,2],"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ","version":13.1},{"tone":[3,4],"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ","version":13.1},{"tone":[3,5],"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ","version":13.1},{"tone":[4,1],"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป","version":13.1},{"tone":[4,2],"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ","version":13.1},{"tone":[4,3],"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ","version":13.1},{"tone":[4,5],"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ","version":13.1},{"tone":[5,1],"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป","version":13.1},{"tone":[5,2],"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ","version":13.1},{"tone":[5,3],"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ","version":13.1},{"tone":[5,4],"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ","version":13.1}]},{"emoji":"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ","group":1,"order":3082,"tags":["anniversary","babe","bae","couple","date","dating","heart","kiss","love","man","mwah","person","romance","together","woman","xoxo"],"version":2,"annotation":"kiss: woman, man","shortcodes":["kiss_mw","kiss_wm"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[1,2],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[1,3],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[1,4],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[1,5],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[2,1],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":2,"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[2,3],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[2,4],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[2,5],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[3,1],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[3,2],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":3,"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[3,4],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[3,5],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[4,1],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[4,2],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[4,3],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":4,"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[4,5],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[5,1],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[5,2],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[5,3],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[5,4],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":5,"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1}]},{"emoji":"๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ","group":1,"order":3134,"tags":["anniversary","babe","bae","couple","date","dating","heart","kiss","love","man","mwah","person","romance","together","xoxo"],"version":2,"annotation":"kiss: man, man","shortcodes":["kiss_mm"],"skins":[{"tone":1,"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[1,2],"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[1,3],"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[1,4],"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[1,5],"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[2,1],"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":2,"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[2,3],"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[2,4],"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[2,5],"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[3,1],"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[3,2],"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":3,"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[3,4],"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[3,5],"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[4,1],"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[4,2],"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[4,3],"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":4,"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[4,5],"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[5,1],"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[5,2],"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[5,3],"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[5,4],"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":5,"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ","version":13.1}]},{"emoji":"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ","group":1,"order":3186,"tags":["anniversary","babe","bae","couple","date","dating","heart","kiss","love","mwah","person","romance","together","woman","xoxo"],"version":2,"annotation":"kiss: woman, woman","shortcodes":["kiss_ww"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป","version":13.1},{"tone":[1,2],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ","version":13.1},{"tone":[1,3],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1},{"tone":[1,4],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ","version":13.1},{"tone":[1,5],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1},{"tone":[2,1],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป","version":13.1},{"tone":2,"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ","version":13.1},{"tone":[2,3],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1},{"tone":[2,4],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ","version":13.1},{"tone":[2,5],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1},{"tone":[3,1],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป","version":13.1},{"tone":[3,2],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ","version":13.1},{"tone":3,"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1},{"tone":[3,4],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ","version":13.1},{"tone":[3,5],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1},{"tone":[4,1],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป","version":13.1},{"tone":[4,2],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ","version":13.1},{"tone":[4,3],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1},{"tone":4,"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ","version":13.1},{"tone":[4,5],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1},{"tone":[5,1],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป","version":13.1},{"tone":[5,2],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ","version":13.1},{"tone":[5,3],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1},{"tone":[5,4],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ","version":13.1},{"tone":5,"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1}]},{"emoji":"๐Ÿ’‘","group":1,"order":3238,"tags":["anniversary","babe","bae","couple","dating","heart","kiss","love","person","relationship","romance","together","you"],"version":0.6,"annotation":"couple with heart","shortcodes":["couple_with_heart"],"skins":[{"tone":1,"emoji":"๐Ÿ’‘๐Ÿป","version":13.1},{"tone":2,"emoji":"๐Ÿ’‘๐Ÿผ","version":13.1},{"tone":3,"emoji":"๐Ÿ’‘๐Ÿฝ","version":13.1},{"tone":4,"emoji":"๐Ÿ’‘๐Ÿพ","version":13.1},{"tone":5,"emoji":"๐Ÿ’‘๐Ÿฟ","version":13.1},{"tone":[1,2],"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿง‘๐Ÿผ","version":13.1},{"tone":[1,3],"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿง‘๐Ÿฝ","version":13.1},{"tone":[1,4],"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿง‘๐Ÿพ","version":13.1},{"tone":[1,5],"emoji":"๐Ÿง‘๐Ÿปโ€โค๏ธโ€๐Ÿง‘๐Ÿฟ","version":13.1},{"tone":[2,1],"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿง‘๐Ÿป","version":13.1},{"tone":[2,3],"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿง‘๐Ÿฝ","version":13.1},{"tone":[2,4],"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿง‘๐Ÿพ","version":13.1},{"tone":[2,5],"emoji":"๐Ÿง‘๐Ÿผโ€โค๏ธโ€๐Ÿง‘๐Ÿฟ","version":13.1},{"tone":[3,1],"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿป","version":13.1},{"tone":[3,2],"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿผ","version":13.1},{"tone":[3,4],"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿพ","version":13.1},{"tone":[3,5],"emoji":"๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿฟ","version":13.1},{"tone":[4,1],"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿง‘๐Ÿป","version":13.1},{"tone":[4,2],"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿง‘๐Ÿผ","version":13.1},{"tone":[4,3],"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿง‘๐Ÿฝ","version":13.1},{"tone":[4,5],"emoji":"๐Ÿง‘๐Ÿพโ€โค๏ธโ€๐Ÿง‘๐Ÿฟ","version":13.1},{"tone":[5,1],"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿง‘๐Ÿป","version":13.1},{"tone":[5,2],"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿง‘๐Ÿผ","version":13.1},{"tone":[5,3],"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿง‘๐Ÿฝ","version":13.1},{"tone":[5,4],"emoji":"๐Ÿง‘๐Ÿฟโ€โค๏ธโ€๐Ÿง‘๐Ÿพ","version":13.1}]},{"emoji":"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘จ","group":1,"order":3284,"tags":["anniversary","babe","bae","couple","dating","heart","kiss","love","man","person","relationship","romance","together","woman","you"],"version":2,"annotation":"couple with heart: woman, man","shortcodes":["couple_with_heart_mw","couple_with_heart_wm"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[1,2],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[1,3],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[1,4],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[1,5],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[2,1],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":2,"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[2,3],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[2,4],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[2,5],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[3,1],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[3,2],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":3,"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[3,4],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[3,5],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[4,1],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[4,2],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[4,3],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":4,"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[4,5],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[5,1],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[5,2],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[5,3],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[5,4],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":5,"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1}]},{"emoji":"๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ","group":1,"order":3336,"tags":["anniversary","babe","bae","couple","dating","heart","kiss","love","man","person","relationship","romance","together","you"],"version":2,"annotation":"couple with heart: man, man","shortcodes":["couple_with_heart_mm"],"skins":[{"tone":1,"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[1,2],"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[1,3],"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[1,4],"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[1,5],"emoji":"๐Ÿ‘จ๐Ÿปโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[2,1],"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":2,"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[2,3],"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[2,4],"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[2,5],"emoji":"๐Ÿ‘จ๐Ÿผโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[3,1],"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[3,2],"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":3,"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[3,4],"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[3,5],"emoji":"๐Ÿ‘จ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[4,1],"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[4,2],"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[4,3],"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":4,"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":[4,5],"emoji":"๐Ÿ‘จ๐Ÿพโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1},{"tone":[5,1],"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿป","version":13.1},{"tone":[5,2],"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿผ","version":13.1},{"tone":[5,3],"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฝ","version":13.1},{"tone":[5,4],"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿพ","version":13.1},{"tone":5,"emoji":"๐Ÿ‘จ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘จ๐Ÿฟ","version":13.1}]},{"emoji":"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ","group":1,"order":3388,"tags":["anniversary","babe","bae","couple","dating","heart","kiss","love","person","relationship","romance","together","woman","you"],"version":2,"annotation":"couple with heart: woman, woman","shortcodes":["couple_with_heart_ww"],"skins":[{"tone":1,"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿป","version":13.1},{"tone":[1,2],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿผ","version":13.1},{"tone":[1,3],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1},{"tone":[1,4],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿพ","version":13.1},{"tone":[1,5],"emoji":"๐Ÿ‘ฉ๐Ÿปโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1},{"tone":[2,1],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿป","version":13.1},{"tone":2,"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿผ","version":13.1},{"tone":[2,3],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1},{"tone":[2,4],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿพ","version":13.1},{"tone":[2,5],"emoji":"๐Ÿ‘ฉ๐Ÿผโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1},{"tone":[3,1],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿป","version":13.1},{"tone":[3,2],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿผ","version":13.1},{"tone":3,"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1},{"tone":[3,4],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿพ","version":13.1},{"tone":[3,5],"emoji":"๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1},{"tone":[4,1],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿป","version":13.1},{"tone":[4,2],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿผ","version":13.1},{"tone":[4,3],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1},{"tone":4,"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿพ","version":13.1},{"tone":[4,5],"emoji":"๐Ÿ‘ฉ๐Ÿพโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1},{"tone":[5,1],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿป","version":13.1},{"tone":[5,2],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿผ","version":13.1},{"tone":[5,3],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฝ","version":13.1},{"tone":[5,4],"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿพ","version":13.1},{"tone":5,"emoji":"๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธโ€๐Ÿ‘ฉ๐Ÿฟ","version":13.1}]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ","group":1,"order":3440,"tags":["boy","child","family","man","woman"],"version":2,"annotation":"family: man, woman, boy","shortcodes":["family_mwb"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง","group":1,"order":3441,"tags":["child","family","girl","man","woman"],"version":2,"annotation":"family: man, woman, girl","shortcodes":["family_mwg"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ","group":1,"order":3442,"tags":["boy","child","family","girl","man","woman"],"version":2,"annotation":"family: man, woman, girl, boy","shortcodes":["family_mwgb"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ","group":1,"order":3443,"tags":["boy","child","family","man","woman"],"version":2,"annotation":"family: man, woman, boy, boy","shortcodes":["family_mwbb"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง","group":1,"order":3444,"tags":["child","family","girl","man","woman"],"version":2,"annotation":"family: man, woman, girl, girl","shortcodes":["family_mwgg"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ","group":1,"order":3445,"tags":["boy","child","family","man"],"version":2,"annotation":"family: man, man, boy","shortcodes":["family_mmb"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง","group":1,"order":3446,"tags":["child","family","girl","man"],"version":2,"annotation":"family: man, man, girl","shortcodes":["family_mmg"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ","group":1,"order":3447,"tags":["boy","child","family","girl","man"],"version":2,"annotation":"family: man, man, girl, boy","shortcodes":["family_mmgb"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ","group":1,"order":3448,"tags":["boy","child","family","man"],"version":2,"annotation":"family: man, man, boy, boy","shortcodes":["family_mmbb"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง","group":1,"order":3449,"tags":["child","family","girl","man"],"version":2,"annotation":"family: man, man, girl, girl","shortcodes":["family_mmgg"]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ","group":1,"order":3450,"tags":["boy","child","family","woman"],"version":2,"annotation":"family: woman, woman, boy","shortcodes":["family_wwb"]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง","group":1,"order":3451,"tags":["child","family","girl","woman"],"version":2,"annotation":"family: woman, woman, girl","shortcodes":["family_wwg"]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ","group":1,"order":3452,"tags":["boy","child","family","girl","woman"],"version":2,"annotation":"family: woman, woman, girl, boy","shortcodes":["family_wwgb"]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ","group":1,"order":3453,"tags":["boy","child","family","woman"],"version":2,"annotation":"family: woman, woman, boy, boy","shortcodes":["family_wwbb"]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง","group":1,"order":3454,"tags":["child","family","girl","woman"],"version":2,"annotation":"family: woman, woman, girl, girl","shortcodes":["family_wwgg"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฆ","group":1,"order":3455,"tags":["boy","child","family","man"],"version":4,"annotation":"family: man, boy","shortcodes":["family_mb"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ","group":1,"order":3456,"tags":["boy","child","family","man"],"version":4,"annotation":"family: man, boy, boy","shortcodes":["family_mbb"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘ง","group":1,"order":3457,"tags":["child","family","girl","man"],"version":4,"annotation":"family: man, girl","shortcodes":["family_mg"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ","group":1,"order":3458,"tags":["boy","child","family","girl","man"],"version":4,"annotation":"family: man, girl, boy","shortcodes":["family_mgb"]},{"emoji":"๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง","group":1,"order":3459,"tags":["child","family","girl","man"],"version":4,"annotation":"family: man, girl, girl","shortcodes":["family_mgg"]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฆ","group":1,"order":3460,"tags":["boy","child","family","woman"],"version":4,"annotation":"family: woman, boy","shortcodes":["family_wb"]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ","group":1,"order":3461,"tags":["boy","child","family","woman"],"version":4,"annotation":"family: woman, boy, boy","shortcodes":["family_wbb"]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘ง","group":1,"order":3462,"tags":["child","family","girl","woman"],"version":4,"annotation":"family: woman, girl","shortcodes":["family_wg"]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ","group":1,"order":3463,"tags":["boy","child","family","girl","woman"],"version":4,"annotation":"family: woman, girl, boy","shortcodes":["family_wgb"]},{"emoji":"๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง","group":1,"order":3464,"tags":["child","family","girl","woman"],"version":4,"annotation":"family: woman, girl, girl","shortcodes":["family_wgg"]},{"emoji":"๐Ÿ—ฃ๏ธ","group":1,"order":3466,"tags":["face","head","silhouette","speak","speaking"],"version":0.7,"annotation":"speaking head","shortcodes":["speaking_head"]},{"emoji":"๐Ÿ‘ค","group":1,"order":3467,"tags":["bust","mysterious","shadow","silhouette"],"version":0.6,"annotation":"bust in silhouette","shortcodes":["bust_in_silhouette"]},{"emoji":"๐Ÿ‘ฅ","group":1,"order":3468,"tags":["bff","bust","busts","everyone","friend","friends","people","silhouette"],"version":1,"annotation":"busts in silhouette","shortcodes":["busts_in_silhouette"]},{"emoji":"๐Ÿซ‚","group":1,"order":3469,"tags":["comfort","embrace","farewell","friendship","goodbye","hello","hug","hugging","love","people","thanks"],"version":13,"annotation":"people hugging","shortcodes":["people_hugging"]},{"emoji":"๐Ÿ‘ช๏ธ","group":1,"order":3470,"tags":["child"],"version":0.6,"annotation":"family","shortcodes":["family"]},{"emoji":"๐Ÿง‘โ€๐Ÿง‘โ€๐Ÿง’","group":1,"order":3471,"tags":["adult","child","family"],"version":15.1,"annotation":"family: adult, adult, child","shortcodes":["family_aac"]},{"emoji":"๐Ÿง‘โ€๐Ÿง‘โ€๐Ÿง’โ€๐Ÿง’","group":1,"order":3472,"tags":["adult","child","family"],"version":15.1,"annotation":"family: adult, adult, child, child","shortcodes":["family_aacc"]},{"emoji":"๐Ÿง‘โ€๐Ÿง’","group":1,"order":3473,"tags":["adult","child","family"],"version":15.1,"annotation":"family: adult, child","shortcodes":["family_ac"]},{"emoji":"๐Ÿง‘โ€๐Ÿง’โ€๐Ÿง’","group":1,"order":3474,"tags":["adult","child","family"],"version":15.1,"annotation":"family: adult, child, child","shortcodes":["family_acc"]},{"emoji":"๐Ÿ‘ฃ","group":1,"order":3475,"tags":["barefoot","clothing","footprint","omw","print","walk"],"version":0.6,"annotation":"footprints","shortcodes":["footprints"]},{"emoji":"๐Ÿซ†","group":1,"order":3476,"tags":["clue","crime","detective","forensics","identity","mystery","print","safety","trace"],"version":16,"annotation":"fingerprint","shortcodes":["fingerprint"]},{"emoji":"๐Ÿป","group":2,"order":3477,"tags":["1โ€“2","light","skin","tone","type"],"version":1,"annotation":"light skin tone","shortcodes":["tone1","tone_light"]},{"emoji":"๐Ÿผ","group":2,"order":3478,"tags":["3","medium-light","skin","tone","type"],"version":1,"annotation":"medium-light skin tone","shortcodes":["tone2","tone_medium_light"]},{"emoji":"๐Ÿฝ","group":2,"order":3479,"tags":["4","medium","skin","tone","type"],"version":1,"annotation":"medium skin tone","shortcodes":["tone3","tone_medium"]},{"emoji":"๐Ÿพ","group":2,"order":3480,"tags":["5","medium-dark","skin","tone","type"],"version":1,"annotation":"medium-dark skin tone","shortcodes":["tone4","tone_medium_dark"]},{"emoji":"๐Ÿฟ","group":2,"order":3481,"tags":["6","dark","skin","tone","type"],"version":1,"annotation":"dark skin tone","shortcodes":["tone5","tone_dark"]},{"emoji":"๐Ÿฆฐ","group":2,"order":3482,"tags":["ginger","hair","red","redhead"],"version":11,"annotation":"red hair","shortcodes":["red_hair"]},{"emoji":"๐Ÿฆฑ","group":2,"order":3483,"tags":["afro","curly","hair","ringlets"],"version":11,"annotation":"curly hair","shortcodes":["curly_hair"]},{"emoji":"๐Ÿฆณ","group":2,"order":3484,"tags":["gray","hair","old","white"],"version":11,"annotation":"white hair","shortcodes":["white_hair"]},{"emoji":"๐Ÿฆฒ","group":2,"order":3485,"tags":["chemotherapy","hair","hairless","no","shaven"],"version":11,"annotation":"bald","shortcodes":["no_hair"]},{"emoji":"๐Ÿต","group":3,"order":3486,"tags":["animal","banana","face","monkey"],"version":0.6,"annotation":"monkey face","shortcodes":["monkey_face"]},{"emoji":"๐Ÿ’","group":3,"order":3487,"tags":["animal","banana"],"version":0.6,"annotation":"monkey","shortcodes":["monkey"]},{"emoji":"๐Ÿฆ","group":3,"order":3488,"tags":["animal"],"version":3,"annotation":"gorilla","shortcodes":["gorilla"]},{"emoji":"๐Ÿฆง","group":3,"order":3489,"tags":["animal","ape","monkey"],"version":12,"annotation":"orangutan","shortcodes":["orangutan"]},{"emoji":"๐Ÿถ","group":3,"order":3490,"tags":["adorbs","animal","dog","face","pet","puppies","puppy"],"version":0.6,"annotation":"dog face","shortcodes":["dog_face"]},{"emoji":"๐Ÿ•๏ธ","group":3,"order":3491,"tags":["animal","animals","dogs","pet"],"version":0.7,"annotation":"dog","shortcodes":["dog"]},{"emoji":"๐Ÿฆฎ","group":3,"order":3492,"tags":["accessibility","animal","blind","dog","guide"],"version":12,"annotation":"guide dog","shortcodes":["guide_dog"]},{"emoji":"๐Ÿ•โ€๐Ÿฆบ","group":3,"order":3493,"tags":["accessibility","animal","assistance","dog","service"],"version":12,"annotation":"service dog","shortcodes":["service_dog"]},{"emoji":"๐Ÿฉ","group":3,"order":3494,"tags":["animal","dog","fluffy"],"version":0.6,"annotation":"poodle","shortcodes":["poodle"]},{"emoji":"๐Ÿบ","group":3,"order":3495,"tags":["animal","face"],"version":0.6,"annotation":"wolf","shortcodes":["wolf","wolf_face"]},{"emoji":"๐ŸฆŠ","group":3,"order":3496,"tags":["animal","face"],"version":3,"annotation":"fox","shortcodes":["fox","fox_face"]},{"emoji":"๐Ÿฆ","group":3,"order":3497,"tags":["animal","curious","sly"],"version":11,"annotation":"raccoon","shortcodes":["raccoon"]},{"emoji":"๐Ÿฑ","group":3,"order":3498,"tags":["animal","cat","face","kitten","kitty","pet"],"version":0.6,"annotation":"cat face","shortcodes":["cat_face"]},{"emoji":"๐Ÿˆ๏ธ","group":3,"order":3499,"tags":["animal","animals","cats","kitten","pet"],"version":0.7,"annotation":"cat","shortcodes":["cat"]},{"emoji":"๐Ÿˆโ€โฌ›","group":3,"order":3500,"tags":["animal","black","cat","feline","halloween","meow","unlucky"],"version":13,"annotation":"black cat","shortcodes":["black_cat"]},{"emoji":"๐Ÿฆ","group":3,"order":3501,"tags":["alpha","animal","face","leo","mane","order","rawr","roar","safari","strong","zodiac"],"version":1,"annotation":"lion","shortcodes":["lion","lion_face"]},{"emoji":"๐Ÿฏ","group":3,"order":3502,"tags":["animal","big","cat","face","predator","tiger"],"version":0.6,"annotation":"tiger face","shortcodes":["tiger_face"]},{"emoji":"๐Ÿ…","group":3,"order":3503,"tags":["animal","big","cat","predator","zoo"],"version":1,"annotation":"tiger","shortcodes":["tiger"]},{"emoji":"๐Ÿ†","group":3,"order":3504,"tags":["animal","big","cat","predator","zoo"],"version":1,"annotation":"leopard","shortcodes":["leopard"]},{"emoji":"๐Ÿด","group":3,"order":3505,"tags":["animal","dressage","equine","face","farm","horse","horses"],"version":0.6,"annotation":"horse face","shortcodes":["horse_face"]},{"emoji":"๐ŸซŽ","group":3,"order":3506,"tags":["alces","animal","antlers","elk","mammal"],"version":15,"annotation":"moose","shortcodes":["moose"]},{"emoji":"๐Ÿซ","group":3,"order":3507,"tags":["animal","ass","burro","hinny","mammal","mule","stubborn"],"version":15,"annotation":"donkey","shortcodes":["donkey"]},{"emoji":"๐ŸŽ","group":3,"order":3508,"tags":["animal","equestrian","farm","racehorse","racing"],"version":0.6,"annotation":"horse","shortcodes":["horse","racehorse"]},{"emoji":"๐Ÿฆ„","group":3,"order":3509,"tags":["face"],"version":1,"annotation":"unicorn","shortcodes":["unicorn","unicorn_face"]},{"emoji":"๐Ÿฆ“","group":3,"order":3510,"tags":["animal","stripe"],"version":5,"annotation":"zebra","shortcodes":["zebra"]},{"emoji":"๐ŸฆŒ","group":3,"order":3511,"tags":["animal"],"version":3,"annotation":"deer","shortcodes":["deer"]},{"emoji":"๐Ÿฆฌ","group":3,"order":3512,"tags":["animal","buffalo","herd","wisent"],"version":13,"annotation":"bison","shortcodes":["bison"]},{"emoji":"๐Ÿฎ","group":3,"order":3513,"tags":["animal","cow","face","farm","milk","moo"],"version":0.6,"annotation":"cow face","shortcodes":["cow_face"]},{"emoji":"๐Ÿ‚","group":3,"order":3514,"tags":["animal","animals","bull","farm","taurus","zodiac"],"version":1,"annotation":"ox","shortcodes":["ox"]},{"emoji":"๐Ÿƒ","group":3,"order":3515,"tags":["animal","buffalo","water","zoo"],"version":1,"annotation":"water buffalo","shortcodes":["water_buffalo"]},{"emoji":"๐Ÿ„","group":3,"order":3516,"tags":["animal","animals","farm","milk","moo"],"version":1,"annotation":"cow","shortcodes":["cow"]},{"emoji":"๐Ÿท","group":3,"order":3517,"tags":["animal","bacon","face","farm","pig","pork"],"version":0.6,"annotation":"pig face","shortcodes":["pig_face"]},{"emoji":"๐Ÿ–","group":3,"order":3518,"tags":["animal","bacon","farm","pork","sow"],"version":1,"annotation":"pig","shortcodes":["pig"]},{"emoji":"๐Ÿ—","group":3,"order":3519,"tags":["animal","pig"],"version":0.6,"annotation":"boar","shortcodes":["boar"]},{"emoji":"๐Ÿฝ","group":3,"order":3520,"tags":["animal","face","farm","nose","pig","smell","snout"],"version":0.6,"annotation":"pig nose","shortcodes":["pig_nose"]},{"emoji":"๐Ÿ","group":3,"order":3521,"tags":["animal","aries","horns","male","sheep","zodiac","zoo"],"version":1,"annotation":"ram","shortcodes":["ram"]},{"emoji":"๐Ÿ‘","group":3,"order":3522,"tags":["animal","baa","farm","female","fluffy","lamb","sheep","wool"],"version":0.6,"annotation":"ewe","shortcodes":["ewe","sheep"]},{"emoji":"๐Ÿ","group":3,"order":3523,"tags":["animal","capricorn","farm","milk","zodiac"],"version":1,"annotation":"goat","shortcodes":["goat"]},{"emoji":"๐Ÿช","group":3,"order":3524,"tags":["animal","desert","dromedary","hump","one"],"version":1,"annotation":"camel","shortcodes":["dromedary_camel"]},{"emoji":"๐Ÿซ","group":3,"order":3525,"tags":["animal","bactrian","camel","desert","hump","two","two-hump"],"version":0.6,"annotation":"two-hump camel","shortcodes":["camel"]},{"emoji":"๐Ÿฆ™","group":3,"order":3526,"tags":["alpaca","animal","guanaco","vicuรฑa","wool"],"version":11,"annotation":"llama","shortcodes":["llama"]},{"emoji":"๐Ÿฆ’","group":3,"order":3527,"tags":["animal","spots"],"version":5,"annotation":"giraffe","shortcodes":["giraffe"]},{"emoji":"๐Ÿ˜","group":3,"order":3528,"tags":["animal"],"version":0.6,"annotation":"elephant","shortcodes":["elephant"]},{"emoji":"๐Ÿฆฃ","group":3,"order":3529,"tags":["animal","extinction","large","tusk","wooly"],"version":13,"annotation":"mammoth","shortcodes":["mammoth"]},{"emoji":"๐Ÿฆ","group":3,"order":3530,"tags":["animal"],"version":3,"annotation":"rhinoceros","shortcodes":["rhino","rhinoceros"]},{"emoji":"๐Ÿฆ›","group":3,"order":3531,"tags":["animal","hippo"],"version":11,"annotation":"hippopotamus","shortcodes":["hippo"]},{"emoji":"๐Ÿญ","group":3,"order":3532,"tags":["animal","face","mouse"],"version":0.6,"annotation":"mouse face","shortcodes":["mouse_face"]},{"emoji":"๐Ÿ","group":3,"order":3533,"tags":["animal","animals"],"version":1,"annotation":"mouse","shortcodes":["mouse"]},{"emoji":"๐Ÿ€","group":3,"order":3534,"tags":["animal"],"version":1,"annotation":"rat","shortcodes":["rat"]},{"emoji":"๐Ÿน","group":3,"order":3535,"tags":["animal","face","pet"],"version":0.6,"annotation":"hamster","shortcodes":["hamster","hamster_face"]},{"emoji":"๐Ÿฐ","group":3,"order":3536,"tags":["animal","bunny","face","pet","rabbit"],"version":0.6,"annotation":"rabbit face","shortcodes":["rabbit_face"]},{"emoji":"๐Ÿ‡","group":3,"order":3537,"tags":["animal","bunny","pet"],"version":1,"annotation":"rabbit","shortcodes":["rabbit"]},{"emoji":"๐Ÿฟ๏ธ","group":3,"order":3539,"tags":["animal","squirrel"],"version":0.7,"annotation":"chipmunk","shortcodes":["chipmunk"]},{"emoji":"๐Ÿฆซ","group":3,"order":3540,"tags":["animal","dam","teeth"],"version":13,"annotation":"beaver","shortcodes":["beaver"]},{"emoji":"๐Ÿฆ”","group":3,"order":3541,"tags":["animal","spiny"],"version":5,"annotation":"hedgehog","shortcodes":["hedgehog"]},{"emoji":"๐Ÿฆ‡","group":3,"order":3542,"tags":["animal","vampire"],"version":3,"annotation":"bat","shortcodes":["bat"]},{"emoji":"๐Ÿป","group":3,"order":3543,"tags":["animal","face","grizzly","growl","honey"],"version":0.6,"annotation":"bear","shortcodes":["bear","bear_face"]},{"emoji":"๐Ÿปโ€โ„๏ธ","group":3,"order":3544,"tags":["animal","arctic","bear","polar","white"],"version":13,"annotation":"polar bear","shortcodes":["polar_bear","polar_bear_face"]},{"emoji":"๐Ÿจ","group":3,"order":3546,"tags":["animal","australia","bear","down","face","marsupial","under"],"version":0.6,"annotation":"koala","shortcodes":["koala","koala_face"]},{"emoji":"๐Ÿผ","group":3,"order":3547,"tags":["animal","bamboo","face"],"version":0.6,"annotation":"panda","shortcodes":["panda","panda_face"]},{"emoji":"๐Ÿฆฅ","group":3,"order":3548,"tags":["lazy","slow"],"version":12,"annotation":"sloth","shortcodes":["sloth"]},{"emoji":"๐Ÿฆฆ","group":3,"order":3549,"tags":["animal","fishing","playful"],"version":12,"annotation":"otter","shortcodes":["otter"]},{"emoji":"๐Ÿฆจ","group":3,"order":3550,"tags":["animal","stink"],"version":12,"annotation":"skunk","shortcodes":["skunk"]},{"emoji":"๐Ÿฆ˜","group":3,"order":3551,"tags":["animal","joey","jump","marsupial"],"version":11,"annotation":"kangaroo","shortcodes":["kangaroo"]},{"emoji":"๐Ÿฆก","group":3,"order":3552,"tags":["animal","honey","pester"],"version":11,"annotation":"badger","shortcodes":["badger"]},{"emoji":"๐Ÿพ","group":3,"order":3553,"tags":["feet","paw","paws","print","prints"],"version":0.6,"annotation":"paw prints","shortcodes":["paw_prints"]},{"emoji":"๐Ÿฆƒ","group":3,"order":3554,"tags":["bird","gobble","thanksgiving"],"version":1,"annotation":"turkey","shortcodes":["turkey"]},{"emoji":"๐Ÿ”","group":3,"order":3555,"tags":["animal","bird","ornithology"],"version":0.6,"annotation":"chicken","shortcodes":["chicken","chicken_face"]},{"emoji":"๐Ÿ“","group":3,"order":3556,"tags":["animal","bird","ornithology"],"version":1,"annotation":"rooster","shortcodes":["rooster"]},{"emoji":"๐Ÿฃ","group":3,"order":3557,"tags":["animal","baby","bird","chick","egg","hatching"],"version":0.6,"annotation":"hatching chick","shortcodes":["hatching_chick"]},{"emoji":"๐Ÿค","group":3,"order":3558,"tags":["animal","baby","bird","chick","ornithology"],"version":0.6,"annotation":"baby chick","shortcodes":["baby_chick"]},{"emoji":"๐Ÿฅ","group":3,"order":3559,"tags":["animal","baby","bird","chick","front-facing","newborn","ornithology"],"version":0.6,"annotation":"front-facing baby chick","shortcodes":["hatched_chick"]},{"emoji":"๐Ÿฆ๏ธ","group":3,"order":3560,"tags":["animal","ornithology"],"version":0.6,"annotation":"bird","shortcodes":["bird","bird_face"]},{"emoji":"๐Ÿง","group":3,"order":3561,"tags":["animal","antarctica","bird","ornithology"],"version":0.6,"annotation":"penguin","shortcodes":["penguin","penguin_face"]},{"emoji":"๐Ÿ•Š๏ธ","group":3,"order":3563,"tags":["bird","fly","ornithology","peace"],"version":0.7,"annotation":"dove","shortcodes":["dove"]},{"emoji":"๐Ÿฆ…","group":3,"order":3564,"tags":["animal","bird","ornithology"],"version":3,"annotation":"eagle","shortcodes":["eagle"]},{"emoji":"๐Ÿฆ†","group":3,"order":3565,"tags":["animal","bird","ornithology"],"version":3,"annotation":"duck","shortcodes":["duck"]},{"emoji":"๐Ÿฆข","group":3,"order":3566,"tags":["animal","bird","cygnet","duckling","ornithology","ugly"],"version":11,"annotation":"swan","shortcodes":["swan"]},{"emoji":"๐Ÿฆ‰","group":3,"order":3567,"tags":["animal","bird","ornithology","wise"],"version":3,"annotation":"owl","shortcodes":["owl"]},{"emoji":"๐Ÿฆค","group":3,"order":3568,"tags":["animal","bird","extinction","large","ornithology"],"version":13,"annotation":"dodo","shortcodes":["dodo"]},{"emoji":"๐Ÿชถ","group":3,"order":3569,"tags":["bird","flight","light","plumage"],"version":13,"annotation":"feather","shortcodes":["feather"]},{"emoji":"๐Ÿฆฉ","group":3,"order":3570,"tags":["animal","bird","flamboyant","ornithology","tropical"],"version":12,"annotation":"flamingo","shortcodes":["flamingo"]},{"emoji":"๐Ÿฆš","group":3,"order":3571,"tags":["animal","bird","colorful","ornithology","ostentatious","peahen","pretty","proud"],"version":11,"annotation":"peacock","shortcodes":["peacock"]},{"emoji":"๐Ÿฆœ","group":3,"order":3572,"tags":["animal","bird","ornithology","pirate","talk"],"version":11,"annotation":"parrot","shortcodes":["parrot"]},{"emoji":"๐Ÿชฝ","group":3,"order":3573,"tags":["angelic","ascend","aviation","bird","fly","flying","heavenly","mythology","soar"],"version":15,"annotation":"wing","shortcodes":["wing"]},{"emoji":"๐Ÿฆโ€โฌ›","group":3,"order":3574,"tags":["animal","beak","bird","black","caw","corvid","crow","ornithology","raven","rook"],"version":15,"annotation":"black bird","shortcodes":["black_bird"]},{"emoji":"๐Ÿชฟ","group":3,"order":3575,"tags":["animal","bird","duck","flock","fowl","gaggle","gander","geese","honk","ornithology","silly"],"version":15,"annotation":"goose","shortcodes":["goose"]},{"emoji":"๐Ÿฆโ€๐Ÿ”ฅ","group":3,"order":3576,"tags":["ascend","ascension","emerge","fantasy","firebird","glory","immortal","rebirth","reincarnation","reinvent","renewal","revival","revive","rise","transform"],"version":15.1,"annotation":"phoenix","shortcodes":["phoenix"]},{"emoji":"๐Ÿธ","group":3,"order":3577,"tags":["animal","face"],"version":0.6,"annotation":"frog","shortcodes":["frog","frog_face"]},{"emoji":"๐ŸŠ","group":3,"order":3578,"tags":["animal","zoo"],"version":1,"annotation":"crocodile","shortcodes":["crocodile"]},{"emoji":"๐Ÿข","group":3,"order":3579,"tags":["animal","terrapin","tortoise"],"version":0.6,"annotation":"turtle","shortcodes":["turtle"]},{"emoji":"๐ŸฆŽ","group":3,"order":3580,"tags":["animal","reptile"],"version":3,"annotation":"lizard","shortcodes":["lizard"]},{"emoji":"๐Ÿ","group":3,"order":3581,"tags":["animal","bearer","ophiuchus","serpent","zodiac"],"version":0.6,"annotation":"snake","shortcodes":["snake"]},{"emoji":"๐Ÿฒ","group":3,"order":3582,"tags":["animal","dragon","face","fairy","fairytale","tale"],"version":0.6,"annotation":"dragon face","shortcodes":["dragon_face"]},{"emoji":"๐Ÿ‰","group":3,"order":3583,"tags":["animal","fairy","fairytale","knights","tale"],"version":1,"annotation":"dragon","shortcodes":["dragon"]},{"emoji":"๐Ÿฆ•","group":3,"order":3584,"tags":["brachiosaurus","brontosaurus","dinosaur","diplodocus"],"version":5,"annotation":"sauropod","shortcodes":["sauropod"]},{"emoji":"๐Ÿฆ–","group":3,"order":3585,"tags":["dinosaur","rex","t","t-rex","tyrannosaurus"],"version":5,"annotation":"T-Rex","shortcodes":["t-rex","trex"]},{"emoji":"๐Ÿณ","group":3,"order":3586,"tags":["animal","beach","face","ocean","spouting","whale"],"version":0.6,"annotation":"spouting whale","shortcodes":["spouting_whale"]},{"emoji":"๐Ÿ‹","group":3,"order":3587,"tags":["animal","beach","ocean"],"version":1,"annotation":"whale","shortcodes":["whale"]},{"emoji":"๐Ÿฌ","group":3,"order":3588,"tags":["animal","beach","flipper","ocean"],"version":0.6,"annotation":"dolphin","shortcodes":["dolphin"]},{"emoji":"๐Ÿฆญ","group":3,"order":3589,"tags":["animal","lion","ocean","sea"],"version":13,"annotation":"seal","shortcodes":["seal"]},{"emoji":"๐ŸŸ๏ธ","group":3,"order":3590,"tags":["animal","dinner","fishes","fishing","pisces","zodiac"],"version":0.6,"annotation":"fish","shortcodes":["fish"]},{"emoji":"๐Ÿ ","group":3,"order":3591,"tags":["animal","fish","fishes","tropical"],"version":0.6,"annotation":"tropical fish","shortcodes":["tropical_fish"]},{"emoji":"๐Ÿก","group":3,"order":3592,"tags":["animal","fish"],"version":0.6,"annotation":"blowfish","shortcodes":["blowfish"]},{"emoji":"๐Ÿฆˆ","group":3,"order":3593,"tags":["animal","fish"],"version":3,"annotation":"shark","shortcodes":["shark"]},{"emoji":"๐Ÿ™","group":3,"order":3594,"tags":["animal","creature","ocean"],"version":0.6,"annotation":"octopus","shortcodes":["octopus"]},{"emoji":"๐Ÿš","group":3,"order":3595,"tags":["animal","beach","conch","sea","shell","spiral"],"version":0.6,"annotation":"spiral shell","shortcodes":["shell"]},{"emoji":"๐Ÿชธ","group":3,"order":3596,"tags":["change","climate","ocean","reef","sea"],"version":14,"annotation":"coral","shortcodes":["coral"]},{"emoji":"๐Ÿชผ","group":3,"order":3597,"tags":["animal","aquarium","burn","invertebrate","jelly","life","marine","ocean","ouch","plankton","sea","sting","stinger","tentacles"],"version":15,"annotation":"jellyfish","shortcodes":["jellyfish"]},{"emoji":"๐Ÿฆ€","group":3,"order":3598,"tags":["cancer","zodiac"],"version":1,"annotation":"crab","shortcodes":["crab"]},{"emoji":"๐Ÿฆž","group":3,"order":3599,"tags":["animal","bisque","claws","seafood"],"version":11,"annotation":"lobster","shortcodes":["lobster"]},{"emoji":"๐Ÿฆ","group":3,"order":3600,"tags":["food","shellfish","small"],"version":3,"annotation":"shrimp","shortcodes":["shrimp"]},{"emoji":"๐Ÿฆ‘","group":3,"order":3601,"tags":["animal","food","mollusk"],"version":3,"annotation":"squid","shortcodes":["squid"]},{"emoji":"๐Ÿฆช","group":3,"order":3602,"tags":["diving","pearl"],"version":12,"annotation":"oyster","shortcodes":["oyster"]},{"emoji":"๐ŸŒ","group":3,"order":3603,"tags":["animal","escargot","garden","nature","slug"],"version":0.6,"annotation":"snail","shortcodes":["snail"]},{"emoji":"๐Ÿฆ‹","group":3,"order":3604,"tags":["insect","pretty"],"version":3,"annotation":"butterfly","shortcodes":["butterfly"]},{"emoji":"๐Ÿ›","group":3,"order":3605,"tags":["animal","garden","insect"],"version":0.6,"annotation":"bug","shortcodes":["bug"]},{"emoji":"๐Ÿœ","group":3,"order":3606,"tags":["animal","garden","insect"],"version":0.6,"annotation":"ant","shortcodes":["ant"]},{"emoji":"๐Ÿ","group":3,"order":3607,"tags":["animal","bee","bumblebee","honey","insect","nature","spring"],"version":0.6,"annotation":"honeybee","shortcodes":["bee"]},{"emoji":"๐Ÿชฒ","group":3,"order":3608,"tags":["animal","bug","insect"],"version":13,"annotation":"beetle","shortcodes":["beetle"]},{"emoji":"๐Ÿž","group":3,"order":3609,"tags":["animal","beetle","garden","insect","lady","ladybird","ladybug","nature"],"version":0.6,"annotation":"lady beetle","shortcodes":["lady_beetle"]},{"emoji":"๐Ÿฆ—","group":3,"order":3610,"tags":["animal","bug","grasshopper","insect","orthoptera"],"version":5,"annotation":"cricket","shortcodes":["cricket"]},{"emoji":"๐Ÿชณ","group":3,"order":3611,"tags":["animal","insect","pest","roach"],"version":13,"annotation":"cockroach","shortcodes":["cockroach"]},{"emoji":"๐Ÿ•ท๏ธ","group":3,"order":3613,"tags":["animal","insect"],"version":0.7,"annotation":"spider","shortcodes":["spider"]},{"emoji":"๐Ÿ•ธ๏ธ","group":3,"order":3615,"tags":["spider","web"],"version":0.7,"annotation":"spider web","shortcodes":["spider_web"]},{"emoji":"๐Ÿฆ‚","group":3,"order":3616,"tags":["scorpio","scorpius","zodiac"],"version":1,"annotation":"scorpion","shortcodes":["scorpion"]},{"emoji":"๐ŸฆŸ","group":3,"order":3617,"tags":["bite","disease","fever","insect","malaria","pest","virus"],"version":11,"annotation":"mosquito","shortcodes":["mosquito"]},{"emoji":"๐Ÿชฐ","group":3,"order":3618,"tags":["animal","disease","insect","maggot","pest","rotting"],"version":13,"annotation":"fly","shortcodes":["fly"]},{"emoji":"๐Ÿชฑ","group":3,"order":3619,"tags":["animal","annelid","earthworm","parasite"],"version":13,"annotation":"worm","shortcodes":["worm"]},{"emoji":"๐Ÿฆ ","group":3,"order":3620,"tags":["amoeba","bacteria","science","virus"],"version":11,"annotation":"microbe","shortcodes":["microbe"]},{"emoji":"๐Ÿ’","group":3,"order":3621,"tags":["anniversary","birthday","date","flower","love","plant","romance"],"version":0.6,"annotation":"bouquet","shortcodes":["bouquet"]},{"emoji":"๐ŸŒธ","group":3,"order":3622,"tags":["blossom","cherry","flower","plant","spring","springtime"],"version":0.6,"annotation":"cherry blossom","shortcodes":["cherry_blossom"]},{"emoji":"๐Ÿ’ฎ","group":3,"order":3623,"tags":["flower","white"],"version":0.6,"annotation":"white flower","shortcodes":["white_flower"]},{"emoji":"๐Ÿชท","group":3,"order":3624,"tags":["beauty","buddhism","calm","flower","hinduism","peace","purity","serenity"],"version":14,"annotation":"lotus","shortcodes":["lotus"]},{"emoji":"๐Ÿต๏ธ","group":3,"order":3626,"tags":["plant"],"version":0.7,"annotation":"rosette","shortcodes":["rosette"]},{"emoji":"๐ŸŒน","group":3,"order":3627,"tags":["beauty","elegant","flower","love","plant","red","valentine"],"version":0.6,"annotation":"rose","shortcodes":["rose"]},{"emoji":"๐Ÿฅ€","group":3,"order":3628,"tags":["dying","flower","wilted"],"version":3,"annotation":"wilted flower","shortcodes":["wilted_flower"]},{"emoji":"๐ŸŒบ","group":3,"order":3629,"tags":["flower","plant"],"version":0.6,"annotation":"hibiscus","shortcodes":["hibiscus"]},{"emoji":"๐ŸŒป","group":3,"order":3630,"tags":["flower","outdoors","plant","sun"],"version":0.6,"annotation":"sunflower","shortcodes":["sunflower"]},{"emoji":"๐ŸŒผ","group":3,"order":3631,"tags":["buttercup","dandelion","flower","plant"],"version":0.6,"annotation":"blossom","shortcodes":["blossom"]},{"emoji":"๐ŸŒท","group":3,"order":3632,"tags":["blossom","flower","growth","plant"],"version":0.6,"annotation":"tulip","shortcodes":["tulip"]},{"emoji":"๐Ÿชป","group":3,"order":3633,"tags":["bloom","bluebonnet","flower","indigo","lavender","lilac","lupine","plant","purple","shrub","snapdragon","spring","violet"],"version":15,"annotation":"hyacinth","shortcodes":["hyacinth"]},{"emoji":"๐ŸŒฑ","group":3,"order":3634,"tags":["plant","sapling","sprout","young"],"version":0.6,"annotation":"seedling","shortcodes":["seedling"]},{"emoji":"๐Ÿชด","group":3,"order":3635,"tags":["decor","grow","house","nurturing","plant","pot","potted"],"version":13,"annotation":"potted plant","shortcodes":["potted_plant"]},{"emoji":"๐ŸŒฒ","group":3,"order":3636,"tags":["christmas","evergreen","forest","pine","tree"],"version":1,"annotation":"evergreen tree","shortcodes":["evergreen_tree"]},{"emoji":"๐ŸŒณ","group":3,"order":3637,"tags":["deciduous","forest","green","habitat","shedding","tree"],"version":1,"annotation":"deciduous tree","shortcodes":["deciduous_tree"]},{"emoji":"๐ŸŒด","group":3,"order":3638,"tags":["beach","palm","plant","tree","tropical"],"version":0.6,"annotation":"palm tree","shortcodes":["palm_tree"]},{"emoji":"๐ŸŒต","group":3,"order":3639,"tags":["desert","drought","nature","plant"],"version":0.6,"annotation":"cactus","shortcodes":["cactus"]},{"emoji":"๐ŸŒพ","group":3,"order":3640,"tags":["ear","grain","grains","plant","rice","sheaf"],"version":0.6,"annotation":"sheaf of rice","shortcodes":["ear_of_rice","sheaf_of_rice"]},{"emoji":"๐ŸŒฟ","group":3,"order":3641,"tags":["leaf","plant"],"version":0.6,"annotation":"herb","shortcodes":["herb"]},{"emoji":"โ˜˜๏ธ","group":3,"order":3643,"tags":["irish","plant"],"version":1,"annotation":"shamrock","shortcodes":["shamrock"]},{"emoji":"๐Ÿ€","group":3,"order":3644,"tags":["4","clover","four","four-leaf","irish","leaf","lucky","plant"],"version":0.6,"annotation":"four leaf clover","shortcodes":["four_leaf_clover"]},{"emoji":"๐Ÿ","group":3,"order":3645,"tags":["falling","leaf","maple"],"version":0.6,"annotation":"maple leaf","shortcodes":["maple_leaf"]},{"emoji":"๐Ÿ‚","group":3,"order":3646,"tags":["autumn","fall","fallen","falling","leaf"],"version":0.6,"annotation":"fallen leaf","shortcodes":["fallen_leaf"]},{"emoji":"๐Ÿƒ","group":3,"order":3647,"tags":["blow","flutter","fluttering","leaf","wind"],"version":0.6,"annotation":"leaf fluttering in wind","shortcodes":["leaves"]},{"emoji":"๐Ÿชน","group":3,"order":3648,"tags":["branch","empty","home","nest","nesting"],"version":14,"annotation":"empty nest","shortcodes":["empty_nest","nest"]},{"emoji":"๐Ÿชบ","group":3,"order":3649,"tags":["bird","branch","egg","eggs","nest","nesting"],"version":14,"annotation":"nest with eggs","shortcodes":["nest_with_eggs"]},{"emoji":"๐Ÿ„","group":3,"order":3650,"tags":["fungus","toadstool"],"version":0.6,"annotation":"mushroom","shortcodes":["mushroom"]},{"emoji":"๐Ÿชพ","group":3,"order":3651,"tags":["bare","barren","branches","dead","drought","leafless","tree","trunk","winter","wood"],"version":16,"annotation":"leafless tree","shortcodes":["leafless_tree"]},{"emoji":"๐Ÿ‡","group":4,"order":3652,"tags":["dionysus","fruit","grape"],"version":0.6,"annotation":"grapes","shortcodes":["grapes"]},{"emoji":"๐Ÿˆ","group":4,"order":3653,"tags":["cantaloupe","fruit"],"version":0.6,"annotation":"melon","shortcodes":["melon"]},{"emoji":"๐Ÿ‰","group":4,"order":3654,"tags":["fruit"],"version":0.6,"annotation":"watermelon","shortcodes":["watermelon"]},{"emoji":"๐ŸŠ","group":4,"order":3655,"tags":["c","citrus","fruit","nectarine","orange","vitamin"],"version":0.6,"annotation":"tangerine","shortcodes":["orange","tangerine"]},{"emoji":"๐Ÿ‹","group":4,"order":3656,"tags":["citrus","fruit","sour"],"version":1,"annotation":"lemon","shortcodes":["lemon"]},{"emoji":"๐Ÿ‹โ€๐ŸŸฉ","group":4,"order":3657,"tags":["acidity","citrus","cocktail","fruit","garnish","key","margarita","mojito","refreshing","salsa","sour","tangy","tequila","tropical","zest"],"version":15.1,"annotation":"lime","shortcodes":["lime"]},{"emoji":"๐ŸŒ","group":4,"order":3658,"tags":["fruit","potassium"],"version":0.6,"annotation":"banana","shortcodes":["banana"]},{"emoji":"๐Ÿ","group":4,"order":3659,"tags":["colada","fruit","pina","tropical"],"version":0.6,"annotation":"pineapple","shortcodes":["pineapple"]},{"emoji":"๐Ÿฅญ","group":4,"order":3660,"tags":["food","fruit","tropical"],"version":11,"annotation":"mango","shortcodes":["mango"]},{"emoji":"๐ŸŽ","group":4,"order":3661,"tags":["apple","diet","food","fruit","health","red","ripe"],"version":0.6,"annotation":"red apple","shortcodes":["apple","red_apple"]},{"emoji":"๐Ÿ","group":4,"order":3662,"tags":["apple","fruit","green"],"version":0.6,"annotation":"green apple","shortcodes":["green_apple"]},{"emoji":"๐Ÿ","group":4,"order":3663,"tags":["fruit"],"version":1,"annotation":"pear","shortcodes":["pear"]},{"emoji":"๐Ÿ‘","group":4,"order":3664,"tags":["fruit"],"version":0.6,"annotation":"peach","shortcodes":["peach"]},{"emoji":"๐Ÿ’","group":4,"order":3665,"tags":["berries","cherry","fruit","red"],"version":0.6,"annotation":"cherries","shortcodes":["cherries"]},{"emoji":"๐Ÿ“","group":4,"order":3666,"tags":["berry","fruit"],"version":0.6,"annotation":"strawberry","shortcodes":["strawberry"]},{"emoji":"๐Ÿซ","group":4,"order":3667,"tags":["berries","berry","bilberry","blue","blueberry","food","fruit"],"version":13,"annotation":"blueberries","shortcodes":["blueberries"]},{"emoji":"๐Ÿฅ","group":4,"order":3668,"tags":["food","fruit","kiwi"],"version":3,"annotation":"kiwi fruit","shortcodes":["kiwi"]},{"emoji":"๐Ÿ…","group":4,"order":3669,"tags":["food","fruit","vegetable"],"version":0.6,"annotation":"tomato","shortcodes":["tomato"]},{"emoji":"๐Ÿซ’","group":4,"order":3670,"tags":["food"],"version":13,"annotation":"olive","shortcodes":["olive"]},{"emoji":"๐Ÿฅฅ","group":4,"order":3671,"tags":["colada","palm","piรฑa"],"version":5,"annotation":"coconut","shortcodes":["coconut"]},{"emoji":"๐Ÿฅ‘","group":4,"order":3672,"tags":["food","fruit"],"version":3,"annotation":"avocado","shortcodes":["avocado"]},{"emoji":"๐Ÿ†","group":4,"order":3673,"tags":["aubergine","vegetable"],"version":0.6,"annotation":"eggplant","shortcodes":["eggplant"]},{"emoji":"๐Ÿฅ”","group":4,"order":3674,"tags":["food","vegetable"],"version":3,"annotation":"potato","shortcodes":["potato"]},{"emoji":"๐Ÿฅ•","group":4,"order":3675,"tags":["food","vegetable"],"version":3,"annotation":"carrot","shortcodes":["carrot"]},{"emoji":"๐ŸŒฝ","group":4,"order":3676,"tags":["corn","crops","ear","farm","maize","maze"],"version":0.6,"annotation":"ear of corn","shortcodes":["corn","ear_of_corn"]},{"emoji":"๐ŸŒถ๏ธ","group":4,"order":3678,"tags":["hot","pepper"],"version":0.7,"annotation":"hot pepper","shortcodes":["hot_pepper"]},{"emoji":"๐Ÿซ‘","group":4,"order":3679,"tags":["bell","capsicum","food","pepper","vegetable"],"version":13,"annotation":"bell pepper","shortcodes":["bell_pepper"]},{"emoji":"๐Ÿฅ’","group":4,"order":3680,"tags":["food","pickle","vegetable"],"version":3,"annotation":"cucumber","shortcodes":["cucumber"]},{"emoji":"๐Ÿฅฌ","group":4,"order":3681,"tags":["bok","burgers","cabbage","choy","green","kale","leafy","lettuce","salad"],"version":11,"annotation":"leafy green","shortcodes":["leafy_green"]},{"emoji":"๐Ÿฅฆ","group":4,"order":3682,"tags":["cabbage","wild"],"version":5,"annotation":"broccoli","shortcodes":["broccoli"]},{"emoji":"๐Ÿง„","group":4,"order":3683,"tags":["flavoring"],"version":12,"annotation":"garlic","shortcodes":["garlic"]},{"emoji":"๐Ÿง…","group":4,"order":3684,"tags":["flavoring"],"version":12,"annotation":"onion","shortcodes":["onion"]},{"emoji":"๐Ÿฅœ","group":4,"order":3685,"tags":["food","nut","peanut","vegetable"],"version":3,"annotation":"peanuts","shortcodes":["peanuts"]},{"emoji":"๐Ÿซ˜","group":4,"order":3686,"tags":["food","kidney","legume","small"],"version":14,"annotation":"beans","shortcodes":["beans"]},{"emoji":"๐ŸŒฐ","group":4,"order":3687,"tags":["almond","plant"],"version":0.6,"annotation":"chestnut","shortcodes":["chestnut"]},{"emoji":"๐Ÿซš","group":4,"order":3688,"tags":["beer","ginger","health","herb","natural","root","spice"],"version":15,"annotation":"ginger root","shortcodes":["ginger"]},{"emoji":"๐Ÿซ›","group":4,"order":3689,"tags":["beans","beanstalk","edamame","legume","pea","pod","soybean","vegetable","veggie"],"version":15,"annotation":"pea pod","shortcodes":["pea"]},{"emoji":"๐Ÿ„โ€๐ŸŸซ","group":4,"order":3690,"tags":["food","fungi","fungus","mushroom","nature","pizza","portobello","shiitake","shroom","spore","sprout","toppings","truffle","vegetable","vegetarian","veggie"],"version":15.1,"annotation":"brown mushroom","shortcodes":["brown_mushroom"]},{"emoji":"๐Ÿซœ","group":4,"order":3691,"tags":["beet","food","garden","radish","root","salad","turnip","vegetable","vegetarian"],"version":16,"annotation":"root vegetable","shortcodes":["root_vegetable"]},{"emoji":"๐Ÿž","group":4,"order":3692,"tags":["carbs","food","grain","loaf","restaurant","toast","wheat"],"version":0.6,"annotation":"bread","shortcodes":["bread"]},{"emoji":"๐Ÿฅ","group":4,"order":3693,"tags":["bread","breakfast","crescent","food","french","roll"],"version":3,"annotation":"croissant","shortcodes":["croissant"]},{"emoji":"๐Ÿฅ–","group":4,"order":3694,"tags":["baguette","bread","food","french"],"version":3,"annotation":"baguette bread","shortcodes":["baguette_bread"]},{"emoji":"๐Ÿซ“","group":4,"order":3695,"tags":["arepa","bread","food","gordita","lavash","naan","pita"],"version":13,"annotation":"flatbread","shortcodes":["flatbread"]},{"emoji":"๐Ÿฅจ","group":4,"order":3696,"tags":["convoluted","twisted"],"version":5,"annotation":"pretzel","shortcodes":["pretzel"]},{"emoji":"๐Ÿฅฏ","group":4,"order":3697,"tags":["bakery","bread","breakfast","schmear"],"version":11,"annotation":"bagel","shortcodes":["bagel"]},{"emoji":"๐Ÿฅž","group":4,"order":3698,"tags":["breakfast","crรชpe","food","hotcake","pancake"],"version":3,"annotation":"pancakes","shortcodes":["pancakes"]},{"emoji":"๐Ÿง‡","group":4,"order":3699,"tags":["breakfast","indecisive","iron"],"version":12,"annotation":"waffle","shortcodes":["waffle"]},{"emoji":"๐Ÿง€","group":4,"order":3700,"tags":["cheese","wedge"],"version":1,"annotation":"cheese wedge","shortcodes":["cheese"]},{"emoji":"๐Ÿ–","group":4,"order":3701,"tags":["bone","meat"],"version":0.6,"annotation":"meat on bone","shortcodes":["meat_on_bone"]},{"emoji":"๐Ÿ—","group":4,"order":3702,"tags":["bone","chicken","drumstick","hungry","leg","poultry","turkey"],"version":0.6,"annotation":"poultry leg","shortcodes":["poultry_leg"]},{"emoji":"๐Ÿฅฉ","group":4,"order":3703,"tags":["chop","cut","lambchop","meat","porkchop","red","steak"],"version":5,"annotation":"cut of meat","shortcodes":["cut_of_meat"]},{"emoji":"๐Ÿฅ“","group":4,"order":3704,"tags":["breakfast","food","meat"],"version":3,"annotation":"bacon","shortcodes":["bacon"]},{"emoji":"๐Ÿ”","group":4,"order":3705,"tags":["burger","eat","fast","food","hungry"],"version":0.6,"annotation":"hamburger","shortcodes":["hamburger"]},{"emoji":"๐ŸŸ","group":4,"order":3706,"tags":["fast","food","french","fries"],"version":0.6,"annotation":"french fries","shortcodes":["french_fries","fries"]},{"emoji":"๐Ÿ•","group":4,"order":3707,"tags":["cheese","food","hungry","pepperoni","slice"],"version":0.6,"annotation":"pizza","shortcodes":["pizza"]},{"emoji":"๐ŸŒญ","group":4,"order":3708,"tags":["dog","frankfurter","hot","hotdog","sausage"],"version":1,"annotation":"hot dog","shortcodes":["hotdog"]},{"emoji":"๐Ÿฅช","group":4,"order":3709,"tags":["bread"],"version":5,"annotation":"sandwich","shortcodes":["sandwich"]},{"emoji":"๐ŸŒฎ","group":4,"order":3710,"tags":["mexican"],"version":1,"annotation":"taco","shortcodes":["taco"]},{"emoji":"๐ŸŒฏ","group":4,"order":3711,"tags":["mexican","wrap"],"version":1,"annotation":"burrito","shortcodes":["burrito"]},{"emoji":"๐Ÿซ”","group":4,"order":3712,"tags":["food","mexican","pamonha","wrapped"],"version":13,"annotation":"tamale","shortcodes":["tamale"]},{"emoji":"๐Ÿฅ™","group":4,"order":3713,"tags":["falafel","flatbread","food","gyro","kebab","stuffed"],"version":3,"annotation":"stuffed flatbread","shortcodes":["stuffed_flatbread"]},{"emoji":"๐Ÿง†","group":4,"order":3714,"tags":["chickpea","meatball"],"version":12,"annotation":"falafel","shortcodes":["falafel"]},{"emoji":"๐Ÿฅš","group":4,"order":3715,"tags":["breakfast","food"],"version":3,"annotation":"egg","shortcodes":["egg"]},{"emoji":"๐Ÿณ","group":4,"order":3716,"tags":["breakfast","easy","egg","fry","frying","over","pan","restaurant","side","sunny","up"],"version":0.6,"annotation":"cooking","shortcodes":["cooking","fried_egg"]},{"emoji":"๐Ÿฅ˜","group":4,"order":3717,"tags":["casserole","food","paella","pan","shallow"],"version":3,"annotation":"shallow pan of food","shortcodes":["shallow_pan_of_food"]},{"emoji":"๐Ÿฒ","group":4,"order":3718,"tags":["food","pot","soup","stew"],"version":0.6,"annotation":"pot of food","shortcodes":["pot_of_food","stew"]},{"emoji":"๐Ÿซ•","group":4,"order":3719,"tags":["cheese","chocolate","food","melted","pot","ski"],"version":13,"annotation":"fondue","shortcodes":["fondue"]},{"emoji":"๐Ÿฅฃ","group":4,"order":3720,"tags":["bowl","breakfast","cereal","congee","oatmeal","porridge","spoon"],"version":5,"annotation":"bowl with spoon","shortcodes":["bowl_with_spoon"]},{"emoji":"๐Ÿฅ—","group":4,"order":3721,"tags":["food","green","salad"],"version":3,"annotation":"green salad","shortcodes":["green_salad","salad"]},{"emoji":"๐Ÿฟ","group":4,"order":3722,"tags":["corn","movie","pop"],"version":1,"annotation":"popcorn","shortcodes":["popcorn"]},{"emoji":"๐Ÿงˆ","group":4,"order":3723,"tags":["dairy"],"version":12,"annotation":"butter","shortcodes":["butter"]},{"emoji":"๐Ÿง‚","group":4,"order":3724,"tags":["condiment","flavor","mad","salty","shaker","taste","upset"],"version":11,"annotation":"salt","shortcodes":["salt"]},{"emoji":"๐Ÿฅซ","group":4,"order":3725,"tags":["can","canned","food"],"version":5,"annotation":"canned food","shortcodes":["canned_food"]},{"emoji":"๐Ÿฑ","group":4,"order":3726,"tags":["bento","box","food"],"version":0.6,"annotation":"bento box","shortcodes":["bento","bento_box"]},{"emoji":"๐Ÿ˜","group":4,"order":3727,"tags":["cracker","food","rice"],"version":0.6,"annotation":"rice cracker","shortcodes":["rice_cracker"]},{"emoji":"๐Ÿ™","group":4,"order":3728,"tags":["ball","food","japanese","rice"],"version":0.6,"annotation":"rice ball","shortcodes":["rice_ball"]},{"emoji":"๐Ÿš","group":4,"order":3729,"tags":["cooked","food","rice"],"version":0.6,"annotation":"cooked rice","shortcodes":["cooked_rice","rice"]},{"emoji":"๐Ÿ›","group":4,"order":3730,"tags":["curry","food","rice"],"version":0.6,"annotation":"curry rice","shortcodes":["curry","curry_rice"]},{"emoji":"๐Ÿœ","group":4,"order":3731,"tags":["bowl","chopsticks","food","noodle","pho","ramen","soup","steaming"],"version":0.6,"annotation":"steaming bowl","shortcodes":["ramen","steaming_bowl"]},{"emoji":"๐Ÿ","group":4,"order":3732,"tags":["food","meatballs","pasta","restaurant"],"version":0.6,"annotation":"spaghetti","shortcodes":["spaghetti"]},{"emoji":"๐Ÿ ","group":4,"order":3733,"tags":["food","potato","roasted","sweet"],"version":0.6,"annotation":"roasted sweet potato","shortcodes":["sweet_potato"]},{"emoji":"๐Ÿข","group":4,"order":3734,"tags":["food","kebab","restaurant","seafood","skewer","stick"],"version":0.6,"annotation":"oden","shortcodes":["oden"]},{"emoji":"๐Ÿฃ","group":4,"order":3735,"tags":["food"],"version":0.6,"annotation":"sushi","shortcodes":["sushi"]},{"emoji":"๐Ÿค","group":4,"order":3736,"tags":["fried","prawn","shrimp","tempura"],"version":0.6,"annotation":"fried shrimp","shortcodes":["fried_shrimp"]},{"emoji":"๐Ÿฅ","group":4,"order":3737,"tags":["cake","fish","food","pastry","restaurant","swirl"],"version":0.6,"annotation":"fish cake with swirl","shortcodes":["fish_cake"]},{"emoji":"๐Ÿฅฎ","group":4,"order":3738,"tags":["autumn","cake","festival","moon","yuรจbวng"],"version":11,"annotation":"moon cake","shortcodes":["moon_cake"]},{"emoji":"๐Ÿก","group":4,"order":3739,"tags":["dessert","japanese","skewer","stick","sweet"],"version":0.6,"annotation":"dango","shortcodes":["dango"]},{"emoji":"๐ŸฅŸ","group":4,"order":3740,"tags":["empanada","gyลza","jiaozi","pierogi","potsticker"],"version":5,"annotation":"dumpling","shortcodes":["dumpling"]},{"emoji":"๐Ÿฅ ","group":4,"order":3741,"tags":["cookie","fortune","prophecy"],"version":5,"annotation":"fortune cookie","shortcodes":["fortune_cookie"]},{"emoji":"๐Ÿฅก","group":4,"order":3742,"tags":["box","chopsticks","delivery","food","oyster","pail","takeout"],"version":5,"annotation":"takeout box","shortcodes":["takeout_box"]},{"emoji":"๐Ÿฆ","group":4,"order":3743,"tags":["cream","dessert","food","ice","icecream","restaurant","serve","soft","sweet"],"version":0.6,"annotation":"soft ice cream","shortcodes":["icecream","soft_serve"]},{"emoji":"๐Ÿง","group":4,"order":3744,"tags":["dessert","ice","restaurant","shaved","sweet"],"version":0.6,"annotation":"shaved ice","shortcodes":["shaved_ice"]},{"emoji":"๐Ÿจ","group":4,"order":3745,"tags":["cream","dessert","food","ice","restaurant","sweet"],"version":0.6,"annotation":"ice cream","shortcodes":["ice_cream"]},{"emoji":"๐Ÿฉ","group":4,"order":3746,"tags":["breakfast","dessert","donut","food","sweet"],"version":0.6,"annotation":"doughnut","shortcodes":["doughnut"]},{"emoji":"๐Ÿช","group":4,"order":3747,"tags":["chip","chocolate","dessert","sweet"],"version":0.6,"annotation":"cookie","shortcodes":["cookie"]},{"emoji":"๐ŸŽ‚","group":4,"order":3748,"tags":["bday","birthday","cake","celebration","dessert","happy","pastry","sweet"],"version":0.6,"annotation":"birthday cake","shortcodes":["birthday","birthday_cake"]},{"emoji":"๐Ÿฐ","group":4,"order":3749,"tags":["cake","dessert","pastry","slice","sweet"],"version":0.6,"annotation":"shortcake","shortcodes":["cake","shortcake"]},{"emoji":"๐Ÿง","group":4,"order":3750,"tags":["bakery","dessert","sprinkles","sugar","sweet","treat"],"version":11,"annotation":"cupcake","shortcodes":["cupcake"]},{"emoji":"๐Ÿฅง","group":4,"order":3751,"tags":["apple","filling","fruit","meat","pastry","pumpkin","slice"],"version":5,"annotation":"pie","shortcodes":["pie"]},{"emoji":"๐Ÿซ","group":4,"order":3752,"tags":["bar","candy","chocolate","dessert","halloween","sweet","tooth"],"version":0.6,"annotation":"chocolate bar","shortcodes":["chocolate_bar"]},{"emoji":"๐Ÿฌ","group":4,"order":3753,"tags":["cavities","dessert","halloween","restaurant","sweet","tooth","wrapper"],"version":0.6,"annotation":"candy","shortcodes":["candy"]},{"emoji":"๐Ÿญ","group":4,"order":3754,"tags":["candy","dessert","food","restaurant","sweet"],"version":0.6,"annotation":"lollipop","shortcodes":["lollipop"]},{"emoji":"๐Ÿฎ","group":4,"order":3755,"tags":["dessert","pudding","sweet"],"version":0.6,"annotation":"custard","shortcodes":["custard"]},{"emoji":"๐Ÿฏ","group":4,"order":3756,"tags":["barrel","bear","food","honey","honeypot","jar","pot","sweet"],"version":0.6,"annotation":"honey pot","shortcodes":["honey_pot"]},{"emoji":"๐Ÿผ","group":4,"order":3757,"tags":["babies","baby","birth","born","bottle","drink","infant","milk","newborn"],"version":1,"annotation":"baby bottle","shortcodes":["baby_bottle"]},{"emoji":"๐Ÿฅ›","group":4,"order":3758,"tags":["drink","glass","milk"],"version":3,"annotation":"glass of milk","shortcodes":["glass_of_milk","milk"]},{"emoji":"โ˜•๏ธ","group":4,"order":3759,"tags":["beverage","cafe","caffeine","chai","coffee","drink","hot","morning","steaming","tea"],"version":0.6,"annotation":"hot beverage","shortcodes":["coffee"]},{"emoji":"๐Ÿซ–","group":4,"order":3760,"tags":["brew","drink","food","pot","tea"],"version":13,"annotation":"teapot","shortcodes":["teapot"]},{"emoji":"๐Ÿต","group":4,"order":3761,"tags":["beverage","cup","drink","handle","oolong","tea","teacup"],"version":0.6,"annotation":"teacup without handle","shortcodes":["tea"]},{"emoji":"๐Ÿถ","group":4,"order":3762,"tags":["bar","beverage","bottle","cup","drink","restaurant"],"version":0.6,"annotation":"sake","shortcodes":["sake"]},{"emoji":"๐Ÿพ","group":4,"order":3763,"tags":["bar","bottle","cork","drink","popping"],"version":1,"annotation":"bottle with popping cork","shortcodes":["champagne"]},{"emoji":"๐Ÿท","group":4,"order":3764,"tags":["alcohol","bar","beverage","booze","club","drink","drinking","drinks","glass","restaurant","wine"],"version":0.6,"annotation":"wine glass","shortcodes":["wine_glass"]},{"emoji":"๐Ÿธ๏ธ","group":4,"order":3765,"tags":["alcohol","bar","booze","club","cocktail","drink","drinking","drinks","glass","mad","martini","men"],"version":0.6,"annotation":"cocktail glass","shortcodes":["cocktail"]},{"emoji":"๐Ÿน","group":4,"order":3766,"tags":["alcohol","bar","booze","club","cocktail","drink","drinking","drinks","drunk","mai","party","tai","tropical","tropics"],"version":0.6,"annotation":"tropical drink","shortcodes":["tropical_drink"]},{"emoji":"๐Ÿบ","group":4,"order":3767,"tags":["alcohol","ale","bar","beer","booze","drink","drinking","drinks","mug","octoberfest","oktoberfest","pint","stein","summer"],"version":0.6,"annotation":"beer mug","shortcodes":["beer"]},{"emoji":"๐Ÿป","group":4,"order":3768,"tags":["alcohol","bar","beer","booze","bottoms","cheers","clink","clinking","drinking","drinks","mugs"],"version":0.6,"annotation":"clinking beer mugs","shortcodes":["beers"]},{"emoji":"๐Ÿฅ‚","group":4,"order":3769,"tags":["celebrate","clink","clinking","drink","glass","glasses"],"version":3,"annotation":"clinking glasses","shortcodes":["clinking_glasses"]},{"emoji":"๐Ÿฅƒ","group":4,"order":3770,"tags":["glass","liquor","scotch","shot","tumbler","whiskey","whisky"],"version":3,"annotation":"tumbler glass","shortcodes":["tumbler_glass","whisky"]},{"emoji":"๐Ÿซ—","group":4,"order":3771,"tags":["accident","drink","empty","glass","liquid","oops","pour","pouring","spill","water"],"version":14,"annotation":"pouring liquid","shortcodes":["pour","pouring_liquid"]},{"emoji":"๐Ÿฅค","group":4,"order":3772,"tags":["cup","drink","juice","malt","soda","soft","straw","water"],"version":5,"annotation":"cup with straw","shortcodes":["cup_with_straw"]},{"emoji":"๐Ÿง‹","group":4,"order":3773,"tags":["boba","bubble","food","milk","pearl","tea"],"version":13,"annotation":"bubble tea","shortcodes":["boba_drink","bubble_tea"]},{"emoji":"๐Ÿงƒ","group":4,"order":3774,"tags":["beverage","box","juice","straw","sweet"],"version":12,"annotation":"beverage box","shortcodes":["beverage_box","juice_box"]},{"emoji":"๐Ÿง‰","group":4,"order":3775,"tags":["drink"],"version":12,"annotation":"mate","shortcodes":["mate"]},{"emoji":"๐ŸงŠ","group":4,"order":3776,"tags":["cold","cube","iceberg"],"version":12,"annotation":"ice","shortcodes":["ice","ice_cube"]},{"emoji":"๐Ÿฅข","group":4,"order":3777,"tags":["hashi","jeotgarak","kuaizi"],"version":5,"annotation":"chopsticks","shortcodes":["chopsticks"]},{"emoji":"๐Ÿฝ๏ธ","group":4,"order":3779,"tags":["cooking","dinner","eat","fork","knife","plate"],"version":0.7,"annotation":"fork and knife with plate","shortcodes":["fork_knife_plate"]},{"emoji":"๐Ÿด","group":4,"order":3780,"tags":["breakfast","breaky","cooking","cutlery","delicious","dinner","eat","feed","food","fork","hungry","knife","lunch","restaurant","yum","yummy"],"version":0.6,"annotation":"fork and knife","shortcodes":["fork_and_knife"]},{"emoji":"๐Ÿฅ„","group":4,"order":3781,"tags":["eat","tableware"],"version":3,"annotation":"spoon","shortcodes":["spoon"]},{"emoji":"๐Ÿ”ช","group":4,"order":3782,"tags":["chef","cooking","hocho","kitchen","knife","tool","weapon"],"version":0.6,"annotation":"kitchen knife","shortcodes":["knife"]},{"emoji":"๐Ÿซ™","group":4,"order":3783,"tags":["condiment","container","empty","nothing","sauce","store"],"version":14,"annotation":"jar","shortcodes":["jar"]},{"emoji":"๐Ÿบ","group":4,"order":3784,"tags":["aquarius","cooking","drink","jug","tool","weapon","zodiac"],"version":1,"annotation":"amphora","shortcodes":["amphora"]},{"emoji":"๐ŸŒ๏ธ","group":5,"order":3785,"tags":["africa","earth","europe","europe-africa","globe","showing","world"],"version":0.7,"annotation":"globe showing Europe-Africa","shortcodes":["earth_africa","earth_europe"]},{"emoji":"๐ŸŒŽ๏ธ","group":5,"order":3786,"tags":["americas","earth","globe","showing","world"],"version":0.7,"annotation":"globe showing Americas","shortcodes":["earth_americas"]},{"emoji":"๐ŸŒ๏ธ","group":5,"order":3787,"tags":["asia","asia-australia","australia","earth","globe","showing","world"],"version":0.6,"annotation":"globe showing Asia-Australia","shortcodes":["earth_asia"]},{"emoji":"๐ŸŒ","group":5,"order":3788,"tags":["earth","globe","internet","meridians","web","world","worldwide"],"version":1,"annotation":"globe with meridians","shortcodes":["globe_with_meridians"]},{"emoji":"๐Ÿ—บ๏ธ","group":5,"order":3790,"tags":["map","world"],"version":0.7,"annotation":"world map","shortcodes":["world_map"]},{"emoji":"๐Ÿ—พ","group":5,"order":3791,"tags":["japan","map"],"version":0.6,"annotation":"map of Japan","shortcodes":["japan_map"]},{"emoji":"๐Ÿงญ","group":5,"order":3792,"tags":["direction","magnetic","navigation","orienteering"],"version":11,"annotation":"compass","shortcodes":["compass"]},{"emoji":"๐Ÿ”๏ธ","group":5,"order":3794,"tags":["cold","mountain","snow","snow-capped"],"version":0.7,"annotation":"snow-capped mountain","shortcodes":["mountain_snow"]},{"emoji":"โ›ฐ๏ธ","group":5,"order":3796,"tags":["mountain"],"version":0.7,"annotation":"mountain","shortcodes":["mountain"]},{"emoji":"๐ŸŒ‹","group":5,"order":3797,"tags":["eruption","mountain","nature"],"version":0.6,"annotation":"volcano","shortcodes":["volcano"]},{"emoji":"๐Ÿ—ป","group":5,"order":3798,"tags":["fuji","mount","mountain","nature"],"version":0.6,"annotation":"mount fuji","shortcodes":["mount_fuji"]},{"emoji":"๐Ÿ•๏ธ","group":5,"order":3800,"tags":["camping"],"version":0.7,"annotation":"camping","shortcodes":["camping"]},{"emoji":"๐Ÿ–๏ธ","group":5,"order":3802,"tags":["beach","umbrella"],"version":0.7,"annotation":"beach with umbrella","shortcodes":["beach","beach_with_umbrella"]},{"emoji":"๐Ÿœ๏ธ","group":5,"order":3804,"tags":["desert"],"version":0.7,"annotation":"desert","shortcodes":["desert"]},{"emoji":"๐Ÿ๏ธ","group":5,"order":3806,"tags":["desert","island"],"version":0.7,"annotation":"desert island","shortcodes":["desert_island","island"]},{"emoji":"๐Ÿž๏ธ","group":5,"order":3808,"tags":["national","park"],"version":0.7,"annotation":"national park","shortcodes":["national_park"]},{"emoji":"๐ŸŸ๏ธ","group":5,"order":3810,"tags":["stadium"],"version":0.7,"annotation":"stadium","shortcodes":["stadium"]},{"emoji":"๐Ÿ›๏ธ","group":5,"order":3812,"tags":["building","classical"],"version":0.7,"annotation":"classical building","shortcodes":["classical_building"]},{"emoji":"๐Ÿ—๏ธ","group":5,"order":3814,"tags":["building","construction","crane"],"version":0.7,"annotation":"building construction","shortcodes":["building_construction","construction_site"]},{"emoji":"๐Ÿงฑ","group":5,"order":3815,"tags":["bricks","clay","mortar","wall"],"version":11,"annotation":"brick","shortcodes":["bricks"]},{"emoji":"๐Ÿชจ","group":5,"order":3816,"tags":["boulder","heavy","solid","stone","tough"],"version":13,"annotation":"rock","shortcodes":["rock"]},{"emoji":"๐Ÿชต","group":5,"order":3817,"tags":["log","lumber","timber"],"version":13,"annotation":"wood","shortcodes":["wood"]},{"emoji":"๐Ÿ›–","group":5,"order":3818,"tags":["home","house","roundhouse","shelter","yurt"],"version":13,"annotation":"hut","shortcodes":["hut"]},{"emoji":"๐Ÿ˜๏ธ","group":5,"order":3820,"tags":["house"],"version":0.7,"annotation":"houses","shortcodes":["homes","houses"]},{"emoji":"๐Ÿš๏ธ","group":5,"order":3822,"tags":["derelict","home","house"],"version":0.7,"annotation":"derelict house","shortcodes":["derelict_house","house_abandoned"]},{"emoji":"๐Ÿ ๏ธ","group":5,"order":3823,"tags":["building","country","heart","home","ranch","settle","simple","suburban","suburbia","where"],"version":0.6,"annotation":"house","shortcodes":["house"]},{"emoji":"๐Ÿก","group":5,"order":3824,"tags":["building","country","garden","heart","home","house","ranch","settle","simple","suburban","suburbia","where"],"version":0.6,"annotation":"house with garden","shortcodes":["house_with_garden"]},{"emoji":"๐Ÿข","group":5,"order":3825,"tags":["building","city","cubical","job","office"],"version":0.6,"annotation":"office building","shortcodes":["office"]},{"emoji":"๐Ÿฃ","group":5,"order":3826,"tags":["building","japanese","office","post"],"version":0.6,"annotation":"Japanese post office","shortcodes":["post_office"]},{"emoji":"๐Ÿค","group":5,"order":3827,"tags":["building","european","office","post"],"version":1,"annotation":"post office","shortcodes":["european_post_office"]},{"emoji":"๐Ÿฅ","group":5,"order":3828,"tags":["building","doctor","medicine"],"version":0.6,"annotation":"hospital","shortcodes":["hospital"]},{"emoji":"๐Ÿฆ","group":5,"order":3829,"tags":["building"],"version":0.6,"annotation":"bank","shortcodes":["bank"]},{"emoji":"๐Ÿจ","group":5,"order":3830,"tags":["building"],"version":0.6,"annotation":"hotel","shortcodes":["hotel"]},{"emoji":"๐Ÿฉ","group":5,"order":3831,"tags":["building","hotel","love"],"version":0.6,"annotation":"love hotel","shortcodes":["love_hotel"]},{"emoji":"๐Ÿช","group":5,"order":3832,"tags":["24","building","convenience","hours","store"],"version":0.6,"annotation":"convenience store","shortcodes":["convenience_store"]},{"emoji":"๐Ÿซ","group":5,"order":3833,"tags":["building"],"version":0.6,"annotation":"school","shortcodes":["school"]},{"emoji":"๐Ÿฌ","group":5,"order":3834,"tags":["building","department","store"],"version":0.6,"annotation":"department store","shortcodes":["department_store"]},{"emoji":"๐Ÿญ๏ธ","group":5,"order":3835,"tags":["building"],"version":0.6,"annotation":"factory","shortcodes":["factory"]},{"emoji":"๐Ÿฏ","group":5,"order":3836,"tags":["building","castle","japanese"],"version":0.6,"annotation":"Japanese castle","shortcodes":["japanese_castle"]},{"emoji":"๐Ÿฐ","group":5,"order":3837,"tags":["building","european"],"version":0.6,"annotation":"castle","shortcodes":["castle","european_castle"]},{"emoji":"๐Ÿ’’","group":5,"order":3838,"tags":["chapel","hitched","nuptials","romance"],"version":0.6,"annotation":"wedding","shortcodes":["wedding"]},{"emoji":"๐Ÿ—ผ","group":5,"order":3839,"tags":["tokyo","tower"],"version":0.6,"annotation":"Tokyo tower","shortcodes":["tokyo_tower"]},{"emoji":"๐Ÿ—ฝ","group":5,"order":3840,"tags":["liberty","new","ny","nyc","statue","york"],"version":0.6,"annotation":"Statue of Liberty","shortcodes":["statue_of_liberty"]},{"emoji":"โ›ช๏ธ","group":5,"order":3841,"tags":["bless","chapel","christian","cross","religion"],"version":0.6,"annotation":"church","shortcodes":["church"]},{"emoji":"๐Ÿ•Œ","group":5,"order":3842,"tags":["islam","masjid","muslim","religion"],"version":1,"annotation":"mosque","shortcodes":["mosque"]},{"emoji":"๐Ÿ›•","group":5,"order":3843,"tags":["hindu","temple"],"version":12,"annotation":"hindu temple","shortcodes":["hindu_temple"]},{"emoji":"๐Ÿ•","group":5,"order":3844,"tags":["jew","jewish","judaism","religion","temple"],"version":1,"annotation":"synagogue","shortcodes":["synagogue"]},{"emoji":"โ›ฉ๏ธ","group":5,"order":3846,"tags":["religion","shinto","shrine"],"version":0.7,"annotation":"shinto shrine","shortcodes":["shinto_shrine"]},{"emoji":"๐Ÿ•‹","group":5,"order":3847,"tags":["hajj","islam","muslim","religion","umrah"],"version":1,"annotation":"kaaba","shortcodes":["kaaba"]},{"emoji":"โ›ฒ๏ธ","group":5,"order":3848,"tags":["fountain"],"version":0.6,"annotation":"fountain","shortcodes":["fountain"]},{"emoji":"โ›บ๏ธ","group":5,"order":3849,"tags":["camping"],"version":0.6,"annotation":"tent","shortcodes":["tent"]},{"emoji":"๐ŸŒ","group":5,"order":3850,"tags":["fog"],"version":0.6,"annotation":"foggy","shortcodes":["foggy"]},{"emoji":"๐ŸŒƒ","group":5,"order":3851,"tags":["night","star","stars"],"version":0.6,"annotation":"night with stars","shortcodes":["night_with_stars"]},{"emoji":"๐Ÿ™๏ธ","group":5,"order":3853,"tags":["city"],"version":0.7,"annotation":"cityscape","shortcodes":["cityscape"]},{"emoji":"๐ŸŒ„","group":5,"order":3854,"tags":["morning","mountains","over","sun","sunrise"],"version":0.6,"annotation":"sunrise over mountains","shortcodes":["sunrise_over_mountains"]},{"emoji":"๐ŸŒ…","group":5,"order":3855,"tags":["morning","nature","sun"],"version":0.6,"annotation":"sunrise","shortcodes":["sunrise"]},{"emoji":"๐ŸŒ†","group":5,"order":3856,"tags":["at","building","city","cityscape","dusk","evening","landscape","sun","sunset"],"version":0.6,"annotation":"cityscape at dusk","shortcodes":["city_dusk"]},{"emoji":"๐ŸŒ‡","group":5,"order":3857,"tags":["building","dusk","sun"],"version":0.6,"annotation":"sunset","shortcodes":["city_sunrise","city_sunset"]},{"emoji":"๐ŸŒ‰","group":5,"order":3858,"tags":["at","bridge","night"],"version":0.6,"annotation":"bridge at night","shortcodes":["bridge_at_night"]},{"emoji":"โ™จ๏ธ","group":5,"order":3860,"tags":["hot","hotsprings","springs","steaming"],"version":0.6,"annotation":"hot springs","shortcodes":["hotsprings"]},{"emoji":"๐ŸŽ ","group":5,"order":3861,"tags":["carousel","entertainment","horse"],"version":0.6,"annotation":"carousel horse","shortcodes":["carousel_horse"]},{"emoji":"๐Ÿ›","group":5,"order":3862,"tags":["amusement","park","play","playground","playing","slide","sliding","theme"],"version":14,"annotation":"playground slide","shortcodes":["playground_slide","slide"]},{"emoji":"๐ŸŽก","group":5,"order":3863,"tags":["amusement","ferris","park","theme","wheel"],"version":0.6,"annotation":"ferris wheel","shortcodes":["ferris_wheel"]},{"emoji":"๐ŸŽข","group":5,"order":3864,"tags":["amusement","coaster","park","roller","theme"],"version":0.6,"annotation":"roller coaster","shortcodes":["roller_coaster"]},{"emoji":"๐Ÿ’ˆ","group":5,"order":3865,"tags":["barber","cut","fresh","haircut","pole","shave"],"version":0.6,"annotation":"barber pole","shortcodes":["barber","barber_pole"]},{"emoji":"๐ŸŽช","group":5,"order":3866,"tags":["circus","tent"],"version":0.6,"annotation":"circus tent","shortcodes":["circus_tent"]},{"emoji":"๐Ÿš‚","group":5,"order":3867,"tags":["caboose","engine","railway","steam","train","trains","travel"],"version":1,"annotation":"locomotive","shortcodes":["steam_locomotive"]},{"emoji":"๐Ÿšƒ","group":5,"order":3868,"tags":["car","electric","railway","train","tram","travel","trolleybus"],"version":0.6,"annotation":"railway car","shortcodes":["railway_car"]},{"emoji":"๐Ÿš„","group":5,"order":3869,"tags":["high-speed","railway","shinkansen","speed","train"],"version":0.6,"annotation":"high-speed train","shortcodes":["bullettrain_side"]},{"emoji":"๐Ÿš…","group":5,"order":3870,"tags":["bullet","high-speed","nose","railway","shinkansen","speed","train","travel"],"version":0.6,"annotation":"bullet train","shortcodes":["bullettrain_front"]},{"emoji":"๐Ÿš†","group":5,"order":3871,"tags":["arrived","choo","railway"],"version":1,"annotation":"train","shortcodes":["train"]},{"emoji":"๐Ÿš‡๏ธ","group":5,"order":3872,"tags":["subway","travel"],"version":0.6,"annotation":"metro","shortcodes":["metro"]},{"emoji":"๐Ÿšˆ","group":5,"order":3873,"tags":["arrived","light","monorail","rail","railway"],"version":1,"annotation":"light rail","shortcodes":["light_rail"]},{"emoji":"๐Ÿš‰","group":5,"order":3874,"tags":["railway","train"],"version":0.6,"annotation":"station","shortcodes":["station"]},{"emoji":"๐ŸšŠ","group":5,"order":3875,"tags":["trolleybus"],"version":1,"annotation":"tram","shortcodes":["tram"]},{"emoji":"๐Ÿš","group":5,"order":3876,"tags":["vehicle"],"version":1,"annotation":"monorail","shortcodes":["monorail"]},{"emoji":"๐Ÿšž","group":5,"order":3877,"tags":["car","mountain","railway","trip"],"version":1,"annotation":"mountain railway","shortcodes":["mountain_railway"]},{"emoji":"๐Ÿš‹","group":5,"order":3878,"tags":["bus","car","tram","trolley","trolleybus"],"version":1,"annotation":"tram car","shortcodes":["tram_car"]},{"emoji":"๐ŸšŒ","group":5,"order":3879,"tags":["school","vehicle"],"version":0.6,"annotation":"bus","shortcodes":["bus"]},{"emoji":"๐Ÿš๏ธ","group":5,"order":3880,"tags":["bus","cars","oncoming"],"version":0.7,"annotation":"oncoming bus","shortcodes":["oncoming_bus"]},{"emoji":"๐ŸšŽ","group":5,"order":3881,"tags":["bus","tram","trolley"],"version":1,"annotation":"trolleybus","shortcodes":["trolleybus"]},{"emoji":"๐Ÿš","group":5,"order":3882,"tags":["bus","drive","van","vehicle"],"version":1,"annotation":"minibus","shortcodes":["minibus"]},{"emoji":"๐Ÿš‘๏ธ","group":5,"order":3883,"tags":["emergency","vehicle"],"version":0.6,"annotation":"ambulance","shortcodes":["ambulance"]},{"emoji":"๐Ÿš’","group":5,"order":3884,"tags":["engine","fire","truck"],"version":0.6,"annotation":"fire engine","shortcodes":["fire_engine"]},{"emoji":"๐Ÿš“","group":5,"order":3885,"tags":["5โ€“0","car","cops","patrol","police"],"version":0.6,"annotation":"police car","shortcodes":["police_car"]},{"emoji":"๐Ÿš”๏ธ","group":5,"order":3886,"tags":["car","oncoming","police"],"version":0.7,"annotation":"oncoming police car","shortcodes":["oncoming_police_car"]},{"emoji":"๐Ÿš•","group":5,"order":3887,"tags":["cab","cabbie","car","drive","vehicle","yellow"],"version":0.6,"annotation":"taxi","shortcodes":["taxi"]},{"emoji":"๐Ÿš–","group":5,"order":3888,"tags":["cab","cabbie","cars","drove","hail","oncoming","taxi","yellow"],"version":1,"annotation":"oncoming taxi","shortcodes":["oncoming_taxi"]},{"emoji":"๐Ÿš—","group":5,"order":3889,"tags":["car","driving","vehicle"],"version":0.6,"annotation":"automobile","shortcodes":["car","red_car"]},{"emoji":"๐Ÿš˜๏ธ","group":5,"order":3890,"tags":["automobile","car","cars","drove","oncoming","vehicle"],"version":0.7,"annotation":"oncoming automobile","shortcodes":["oncoming_automobile"]},{"emoji":"๐Ÿš™","group":5,"order":3891,"tags":["car","drive","recreational","sport","sportutility","utility","vehicle"],"version":0.6,"annotation":"sport utility vehicle","shortcodes":["blue_car","suv"]},{"emoji":"๐Ÿ›ป","group":5,"order":3892,"tags":["automobile","car","flatbed","pick-up","pickup","transportation","truck"],"version":13,"annotation":"pickup truck","shortcodes":["pickup_truck"]},{"emoji":"๐Ÿšš","group":5,"order":3893,"tags":["car","delivery","drive","truck","vehicle"],"version":0.6,"annotation":"delivery truck","shortcodes":["delivery_truck","truck"]},{"emoji":"๐Ÿš›","group":5,"order":3894,"tags":["articulated","car","drive","lorry","move","semi","truck","vehicle"],"version":1,"annotation":"articulated lorry","shortcodes":["articulated_lorry"]},{"emoji":"๐Ÿšœ","group":5,"order":3895,"tags":["vehicle"],"version":1,"annotation":"tractor","shortcodes":["tractor"]},{"emoji":"๐ŸŽ๏ธ","group":5,"order":3897,"tags":["car","racing","zoom"],"version":0.7,"annotation":"racing car","shortcodes":["racing_car"]},{"emoji":"๐Ÿ๏ธ","group":5,"order":3899,"tags":["racing"],"version":0.7,"annotation":"motorcycle","shortcodes":["motorcycle"]},{"emoji":"๐Ÿ›ต","group":5,"order":3900,"tags":["motor","scooter"],"version":3,"annotation":"motor scooter","shortcodes":["motor_scooter"]},{"emoji":"๐Ÿฆฝ","group":5,"order":3901,"tags":["accessibility","manual","wheelchair"],"version":12,"annotation":"manual wheelchair","shortcodes":["manual_wheelchair"]},{"emoji":"๐Ÿฆผ","group":5,"order":3902,"tags":["accessibility","motorized","wheelchair"],"version":12,"annotation":"motorized wheelchair","shortcodes":["motorized_wheelchair"]},{"emoji":"๐Ÿ›บ","group":5,"order":3903,"tags":["auto","rickshaw","tuk"],"version":12,"annotation":"auto rickshaw","shortcodes":["auto_rickshaw"]},{"emoji":"๐Ÿšฒ๏ธ","group":5,"order":3904,"tags":["bike","class","cycle","cycling","cyclist","gang","ride","spin","spinning"],"version":0.6,"annotation":"bicycle","shortcodes":["bicycle","bike"]},{"emoji":"๐Ÿ›ด","group":5,"order":3905,"tags":["kick","scooter"],"version":3,"annotation":"kick scooter","shortcodes":["scooter"]},{"emoji":"๐Ÿ›น","group":5,"order":3906,"tags":["board","skate","skater","wheels"],"version":11,"annotation":"skateboard","shortcodes":["skateboard"]},{"emoji":"๐Ÿ›ผ","group":5,"order":3907,"tags":["blades","roller","skate","skates","sport"],"version":13,"annotation":"roller skate","shortcodes":["roller_skate"]},{"emoji":"๐Ÿš","group":5,"order":3908,"tags":["bus","busstop","stop"],"version":0.6,"annotation":"bus stop","shortcodes":["busstop"]},{"emoji":"๐Ÿ›ฃ๏ธ","group":5,"order":3910,"tags":["highway","road"],"version":0.7,"annotation":"motorway","shortcodes":["motorway"]},{"emoji":"๐Ÿ›ค๏ธ","group":5,"order":3912,"tags":["railway","track","train"],"version":0.7,"annotation":"railway track","shortcodes":["railway_track"]},{"emoji":"๐Ÿ›ข๏ธ","group":5,"order":3914,"tags":["drum","oil"],"version":0.7,"annotation":"oil drum","shortcodes":["oil_drum"]},{"emoji":"โ›ฝ๏ธ","group":5,"order":3915,"tags":["diesel","fuel","fuelpump","gas","gasoline","pump","station"],"version":0.6,"annotation":"fuel pump","shortcodes":["fuelpump"]},{"emoji":"๐Ÿ›ž","group":5,"order":3916,"tags":["car","circle","tire","turn","vehicle"],"version":14,"annotation":"wheel","shortcodes":["wheel"]},{"emoji":"๐Ÿšจ","group":5,"order":3917,"tags":["alarm","alert","beacon","car","emergency","light","police","revolving","siren"],"version":0.6,"annotation":"police car light","shortcodes":["rotating_light"]},{"emoji":"๐Ÿšฅ","group":5,"order":3918,"tags":["horizontal","intersection","light","signal","stop","stoplight","traffic"],"version":0.6,"annotation":"horizontal traffic light","shortcodes":["traffic_light"]},{"emoji":"๐Ÿšฆ","group":5,"order":3919,"tags":["drove","intersection","light","signal","stop","stoplight","traffic","vertical"],"version":1,"annotation":"vertical traffic light","shortcodes":["vertical_traffic_light"]},{"emoji":"๐Ÿ›‘","group":5,"order":3920,"tags":["octagonal","sign","stop"],"version":3,"annotation":"stop sign","shortcodes":["octagonal_sign","stop_sign"]},{"emoji":"๐Ÿšง","group":5,"order":3921,"tags":["barrier"],"version":0.6,"annotation":"construction","shortcodes":["construction"]},{"emoji":"โš“๏ธ","group":5,"order":3922,"tags":["ship","tool"],"version":0.6,"annotation":"anchor","shortcodes":["anchor"]},{"emoji":"๐Ÿ›Ÿ","group":5,"order":3923,"tags":["buoy","float","life","lifesaver","preserver","rescue","ring","safety","save","saver","swim"],"version":14,"annotation":"ring buoy","shortcodes":["lifebuoy","ring_buoy"]},{"emoji":"โ›ต๏ธ","group":5,"order":3924,"tags":["boat","resort","sailing","sea","yacht"],"version":0.6,"annotation":"sailboat","shortcodes":["sailboat"]},{"emoji":"๐Ÿ›ถ","group":5,"order":3925,"tags":["boat"],"version":3,"annotation":"canoe","shortcodes":["canoe"]},{"emoji":"๐Ÿšค","group":5,"order":3926,"tags":["billionaire","boat","lake","luxury","millionaire","summer","travel"],"version":0.6,"annotation":"speedboat","shortcodes":["speedboat"]},{"emoji":"๐Ÿ›ณ๏ธ","group":5,"order":3928,"tags":["passenger","ship"],"version":0.7,"annotation":"passenger ship","shortcodes":["cruise_ship","passenger_ship"]},{"emoji":"โ›ด๏ธ","group":5,"order":3930,"tags":["boat","passenger"],"version":0.7,"annotation":"ferry","shortcodes":["ferry"]},{"emoji":"๐Ÿ›ฅ๏ธ","group":5,"order":3932,"tags":["boat","motor","motorboat"],"version":0.7,"annotation":"motor boat","shortcodes":["motorboat"]},{"emoji":"๐Ÿšข","group":5,"order":3933,"tags":["boat","passenger","travel"],"version":0.6,"annotation":"ship","shortcodes":["ship"]},{"emoji":"โœˆ๏ธ","group":5,"order":3935,"tags":["aeroplane","fly","flying","jet","plane","travel"],"version":0.6,"annotation":"airplane","shortcodes":["airplane"]},{"emoji":"๐Ÿ›ฉ๏ธ","group":5,"order":3937,"tags":["aeroplane","airplane","plane","small"],"version":0.7,"annotation":"small airplane","shortcodes":["small_airplane"]},{"emoji":"๐Ÿ›ซ","group":5,"order":3938,"tags":["aeroplane","airplane","check-in","departure","departures","plane"],"version":1,"annotation":"airplane departure","shortcodes":["airplane_departure"]},{"emoji":"๐Ÿ›ฌ","group":5,"order":3939,"tags":["aeroplane","airplane","arrival","arrivals","arriving","landing","plane"],"version":1,"annotation":"airplane arrival","shortcodes":["airplane_arriving"]},{"emoji":"๐Ÿช‚","group":5,"order":3940,"tags":["hang-glide","parasail","skydive"],"version":12,"annotation":"parachute","shortcodes":["parachute"]},{"emoji":"๐Ÿ’บ","group":5,"order":3941,"tags":["chair"],"version":0.6,"annotation":"seat","shortcodes":["seat"]},{"emoji":"๐Ÿš","group":5,"order":3942,"tags":["copter","roflcopter","travel","vehicle"],"version":1,"annotation":"helicopter","shortcodes":["helicopter"]},{"emoji":"๐ŸšŸ","group":5,"order":3943,"tags":["railway","suspension"],"version":1,"annotation":"suspension railway","shortcodes":["suspension_railway"]},{"emoji":"๐Ÿš ","group":5,"order":3944,"tags":["cable","cableway","gondola","lift","mountain","ski"],"version":1,"annotation":"mountain cableway","shortcodes":["mountain_cableway"]},{"emoji":"๐Ÿšก","group":5,"order":3945,"tags":["aerial","cable","car","gondola","ropeway","tramway"],"version":1,"annotation":"aerial tramway","shortcodes":["aerial_tramway"]},{"emoji":"๐Ÿ›ฐ๏ธ","group":5,"order":3947,"tags":["space"],"version":0.7,"annotation":"satellite","shortcodes":["satellite"]},{"emoji":"๐Ÿš€","group":5,"order":3948,"tags":["launch","rockets","space","travel"],"version":0.6,"annotation":"rocket","shortcodes":["rocket"]},{"emoji":"๐Ÿ›ธ","group":5,"order":3949,"tags":["aliens","extra","flying","saucer","terrestrial","ufo"],"version":5,"annotation":"flying saucer","shortcodes":["flying_saucer"]},{"emoji":"๐Ÿ›Ž๏ธ","group":5,"order":3951,"tags":["bell","bellhop","hotel"],"version":0.7,"annotation":"bellhop bell","shortcodes":["bellhop"]},{"emoji":"๐Ÿงณ","group":5,"order":3952,"tags":["bag","packing","roller","suitcase","travel"],"version":11,"annotation":"luggage","shortcodes":["luggage"]},{"emoji":"โŒ›๏ธ","group":5,"order":3953,"tags":["done","hourglass","sand","time","timer"],"version":0.6,"annotation":"hourglass done","shortcodes":["hourglass"]},{"emoji":"โณ๏ธ","group":5,"order":3954,"tags":["done","flowing","hourglass","hours","not","sand","timer","waiting","yolo"],"version":0.6,"annotation":"hourglass not done","shortcodes":["hourglass_flowing_sand"]},{"emoji":"โŒš๏ธ","group":5,"order":3955,"tags":["clock","time"],"version":0.6,"annotation":"watch","shortcodes":["watch"]},{"emoji":"โฐ๏ธ","group":5,"order":3956,"tags":["alarm","clock","hours","hrs","late","time","waiting"],"version":0.6,"annotation":"alarm clock","shortcodes":["alarm_clock"]},{"emoji":"โฑ๏ธ","group":5,"order":3958,"tags":["clock","time"],"version":1,"annotation":"stopwatch","shortcodes":["stopwatch"]},{"emoji":"โฒ๏ธ","group":5,"order":3960,"tags":["clock","timer"],"version":1,"annotation":"timer clock","shortcodes":["timer_clock"]},{"emoji":"๐Ÿ•ฐ๏ธ","group":5,"order":3962,"tags":["clock","mantelpiece","time"],"version":0.7,"annotation":"mantelpiece clock","shortcodes":["clock"]},{"emoji":"๐Ÿ•›๏ธ","group":5,"order":3963,"tags":["12","12:00","clock","oโ€™clock","time","twelve"],"version":0.6,"annotation":"twelve oโ€™clock","shortcodes":["clock12"]},{"emoji":"๐Ÿ•ง๏ธ","group":5,"order":3964,"tags":["12","12:30","30","clock","thirty","time","twelve"],"version":0.7,"annotation":"twelve-thirty","shortcodes":["clock1230"]},{"emoji":"๐Ÿ•๏ธ","group":5,"order":3965,"tags":["1","1:00","clock","one","oโ€™clock","time"],"version":0.6,"annotation":"one oโ€™clock","shortcodes":["clock1"]},{"emoji":"๐Ÿ•œ๏ธ","group":5,"order":3966,"tags":["1","1:30","30","clock","one","thirty","time"],"version":0.7,"annotation":"one-thirty","shortcodes":["clock130"]},{"emoji":"๐Ÿ•‘๏ธ","group":5,"order":3967,"tags":["2","2:00","clock","oโ€™clock","time","two"],"version":0.6,"annotation":"two oโ€™clock","shortcodes":["clock2"]},{"emoji":"๐Ÿ•๏ธ","group":5,"order":3968,"tags":["2","2:30","30","clock","thirty","time","two"],"version":0.7,"annotation":"two-thirty","shortcodes":["clock230"]},{"emoji":"๐Ÿ•’๏ธ","group":5,"order":3969,"tags":["3","3:00","clock","oโ€™clock","three","time"],"version":0.6,"annotation":"three oโ€™clock","shortcodes":["clock3"]},{"emoji":"๐Ÿ•ž๏ธ","group":5,"order":3970,"tags":["3","30","3:30","clock","thirty","three","time"],"version":0.7,"annotation":"three-thirty","shortcodes":["clock330"]},{"emoji":"๐Ÿ•“๏ธ","group":5,"order":3971,"tags":["4","4:00","clock","four","oโ€™clock","time"],"version":0.6,"annotation":"four oโ€™clock","shortcodes":["clock4"]},{"emoji":"๐Ÿ•Ÿ๏ธ","group":5,"order":3972,"tags":["30","4","4:30","clock","four","thirty","time"],"version":0.7,"annotation":"four-thirty","shortcodes":["clock430"]},{"emoji":"๐Ÿ•”๏ธ","group":5,"order":3973,"tags":["5","5:00","clock","five","oโ€™clock","time"],"version":0.6,"annotation":"five oโ€™clock","shortcodes":["clock5"]},{"emoji":"๐Ÿ• ๏ธ","group":5,"order":3974,"tags":["30","5","5:30","clock","five","thirty","time"],"version":0.7,"annotation":"five-thirty","shortcodes":["clock530"]},{"emoji":"๐Ÿ••๏ธ","group":5,"order":3975,"tags":["6","6:00","clock","oโ€™clock","six","time"],"version":0.6,"annotation":"six oโ€™clock","shortcodes":["clock6"]},{"emoji":"๐Ÿ•ก๏ธ","group":5,"order":3976,"tags":["30","6","6:30","clock","six","thirty"],"version":0.7,"annotation":"six-thirty","shortcodes":["clock630"]},{"emoji":"๐Ÿ•–๏ธ","group":5,"order":3977,"tags":["0","7","7:00","clock","oโ€™clock","seven"],"version":0.6,"annotation":"seven oโ€™clock","shortcodes":["clock7"]},{"emoji":"๐Ÿ•ข๏ธ","group":5,"order":3978,"tags":["30","7","7:30","clock","seven","thirty"],"version":0.7,"annotation":"seven-thirty","shortcodes":["clock730"]},{"emoji":"๐Ÿ•—๏ธ","group":5,"order":3979,"tags":["8","8:00","clock","eight","oโ€™clock","time"],"version":0.6,"annotation":"eight oโ€™clock","shortcodes":["clock8"]},{"emoji":"๐Ÿ•ฃ๏ธ","group":5,"order":3980,"tags":["30","8","8:30","clock","eight","thirty","time"],"version":0.7,"annotation":"eight-thirty","shortcodes":["clock830"]},{"emoji":"๐Ÿ•˜๏ธ","group":5,"order":3981,"tags":["9","9:00","clock","nine","oโ€™clock","time"],"version":0.6,"annotation":"nine oโ€™clock","shortcodes":["clock9"]},{"emoji":"๐Ÿ•ค๏ธ","group":5,"order":3982,"tags":["30","9","9:30","clock","nine","thirty","time"],"version":0.7,"annotation":"nine-thirty","shortcodes":["clock930"]},{"emoji":"๐Ÿ•™๏ธ","group":5,"order":3983,"tags":["0","10","10:00","clock","oโ€™clock","ten"],"version":0.6,"annotation":"ten oโ€™clock","shortcodes":["clock10"]},{"emoji":"๐Ÿ•ฅ๏ธ","group":5,"order":3984,"tags":["10","10:30","30","clock","ten","thirty","time"],"version":0.7,"annotation":"ten-thirty","shortcodes":["clock1030"]},{"emoji":"๐Ÿ•š๏ธ","group":5,"order":3985,"tags":["11","11:00","clock","eleven","oโ€™clock","time"],"version":0.6,"annotation":"eleven oโ€™clock","shortcodes":["clock11"]},{"emoji":"๐Ÿ•ฆ๏ธ","group":5,"order":3986,"tags":["11","11:30","30","clock","eleven","thirty","time"],"version":0.7,"annotation":"eleven-thirty","shortcodes":["clock1130"]},{"emoji":"๐ŸŒ‘","group":5,"order":3987,"tags":["dark","moon","new","space"],"version":0.6,"annotation":"new moon","shortcodes":["new_moon"]},{"emoji":"๐ŸŒ’","group":5,"order":3988,"tags":["crescent","dreams","moon","space","waxing"],"version":1,"annotation":"waxing crescent moon","shortcodes":["waxing_crescent_moon"]},{"emoji":"๐ŸŒ“","group":5,"order":3989,"tags":["first","moon","quarter","space"],"version":0.6,"annotation":"first quarter moon","shortcodes":["first_quarter_moon"]},{"emoji":"๐ŸŒ”","group":5,"order":3990,"tags":["gibbous","moon","space","waxing"],"version":0.6,"annotation":"waxing gibbous moon","shortcodes":["waxing_gibbous_moon"]},{"emoji":"๐ŸŒ•๏ธ","group":5,"order":3991,"tags":["full","moon","space"],"version":0.6,"annotation":"full moon","shortcodes":["full_moon"]},{"emoji":"๐ŸŒ–","group":5,"order":3992,"tags":["gibbous","moon","space","waning"],"version":1,"annotation":"waning gibbous moon","shortcodes":["waning_gibbous_moon"]},{"emoji":"๐ŸŒ—","group":5,"order":3993,"tags":["last","moon","quarter","space"],"version":1,"annotation":"last quarter moon","shortcodes":["last_quarter_moon"]},{"emoji":"๐ŸŒ˜","group":5,"order":3994,"tags":["crescent","moon","space","waning"],"version":1,"annotation":"waning crescent moon","shortcodes":["waning_crescent_moon"]},{"emoji":"๐ŸŒ™","group":5,"order":3995,"tags":["crescent","moon","ramadan","space"],"version":0.6,"annotation":"crescent moon","shortcodes":["crescent_moon"]},{"emoji":"๐ŸŒš","group":5,"order":3996,"tags":["face","moon","new","space"],"version":1,"annotation":"new moon face","shortcodes":["new_moon_with_face"]},{"emoji":"๐ŸŒ›","group":5,"order":3997,"tags":["face","first","moon","quarter","space"],"version":0.6,"annotation":"first quarter moon face","shortcodes":["first_quarter_moon_with_face"]},{"emoji":"๐ŸŒœ๏ธ","group":5,"order":3998,"tags":["dreams","face","last","moon","quarter"],"version":0.7,"annotation":"last quarter moon face","shortcodes":["last_quarter_moon_with_face"]},{"emoji":"๐ŸŒก๏ธ","group":5,"order":4000,"tags":["weather"],"version":0.7,"annotation":"thermometer","shortcodes":["thermometer"]},{"emoji":"โ˜€๏ธ","group":5,"order":4002,"tags":["bright","rays","space","sunny","weather"],"version":0.6,"annotation":"sun","shortcodes":["sun"]},{"emoji":"๐ŸŒ","group":5,"order":4003,"tags":["bright","face","full","moon"],"version":1,"annotation":"full moon face","shortcodes":["full_moon_with_face"]},{"emoji":"๐ŸŒž","group":5,"order":4004,"tags":["beach","bright","day","face","heat","shine","sun","sunny","sunshine","weather"],"version":1,"annotation":"sun with face","shortcodes":["sun_with_face"]},{"emoji":"๐Ÿช","group":5,"order":4005,"tags":["planet","ringed","saturn","saturnine"],"version":12,"annotation":"ringed planet","shortcodes":["ringed_planet","saturn"]},{"emoji":"โญ๏ธ","group":5,"order":4006,"tags":["astronomy","medium","stars","white"],"version":0.6,"annotation":"star","shortcodes":["star"]},{"emoji":"๐ŸŒŸ","group":5,"order":4007,"tags":["glittery","glow","glowing","night","shining","sparkle","star","win"],"version":0.6,"annotation":"glowing star","shortcodes":["glowing_star","star2"]},{"emoji":"๐ŸŒ ","group":5,"order":4008,"tags":["falling","night","shooting","space","star"],"version":0.6,"annotation":"shooting star","shortcodes":["shooting_star","stars"]},{"emoji":"๐ŸŒŒ","group":5,"order":4009,"tags":["milky","space","way"],"version":0.6,"annotation":"milky way","shortcodes":["milky_way"]},{"emoji":"โ˜๏ธ","group":5,"order":4011,"tags":["weather"],"version":0.6,"annotation":"cloud","shortcodes":["cloud"]},{"emoji":"โ›…๏ธ","group":5,"order":4012,"tags":["behind","cloud","cloudy","sun","weather"],"version":0.6,"annotation":"sun behind cloud","shortcodes":["partly_sunny","sun_behind_cloud"]},{"emoji":"โ›ˆ๏ธ","group":5,"order":4014,"tags":["cloud","lightning","rain","thunder","thunderstorm"],"version":0.7,"annotation":"cloud with lightning and rain","shortcodes":["stormy","thunder_cloud_and_rain"]},{"emoji":"๐ŸŒค๏ธ","group":5,"order":4016,"tags":["behind","cloud","sun","weather"],"version":0.7,"annotation":"sun behind small cloud","shortcodes":["sun_behind_small_cloud","sunny"]},{"emoji":"๐ŸŒฅ๏ธ","group":5,"order":4018,"tags":["behind","cloud","sun","weather"],"version":0.7,"annotation":"sun behind large cloud","shortcodes":["cloudy","sun_behind_large_cloud"]},{"emoji":"๐ŸŒฆ๏ธ","group":5,"order":4020,"tags":["behind","cloud","rain","sun","weather"],"version":0.7,"annotation":"sun behind rain cloud","shortcodes":["sun_and_rain","sun_behind_rain_cloud"]},{"emoji":"๐ŸŒง๏ธ","group":5,"order":4022,"tags":["cloud","rain","weather"],"version":0.7,"annotation":"cloud with rain","shortcodes":["cloud_with_rain","rainy"]},{"emoji":"๐ŸŒจ๏ธ","group":5,"order":4024,"tags":["cloud","cold","snow","weather"],"version":0.7,"annotation":"cloud with snow","shortcodes":["cloud_with_snow","snowy"]},{"emoji":"๐ŸŒฉ๏ธ","group":5,"order":4026,"tags":["cloud","lightning","weather"],"version":0.7,"annotation":"cloud with lightning","shortcodes":["cloud_with_lightning","lightning"]},{"emoji":"๐ŸŒช๏ธ","group":5,"order":4028,"tags":["cloud","weather","whirlwind"],"version":0.7,"annotation":"tornado","shortcodes":["tornado"]},{"emoji":"๐ŸŒซ๏ธ","group":5,"order":4030,"tags":["cloud","weather"],"version":0.7,"annotation":"fog","shortcodes":["fog"]},{"emoji":"๐ŸŒฌ๏ธ","group":5,"order":4032,"tags":["blow","cloud","face","wind"],"version":0.7,"annotation":"wind face","shortcodes":["wind_blowing_face"]},{"emoji":"๐ŸŒ€","group":5,"order":4033,"tags":["dizzy","hurricane","twister","typhoon","weather"],"version":0.6,"annotation":"cyclone","shortcodes":["cyclone"]},{"emoji":"๐ŸŒˆ","group":5,"order":4034,"tags":["gay","genderqueer","glbt","glbtq","lesbian","lgbt","lgbtq","lgbtqia","nature","pride","queer","rain","trans","transgender","weather"],"version":0.6,"annotation":"rainbow","shortcodes":["rainbow"]},{"emoji":"๐ŸŒ‚","group":5,"order":4035,"tags":["closed","clothing","rain","umbrella"],"version":0.6,"annotation":"closed umbrella","shortcodes":["closed_umbrella"]},{"emoji":"โ˜‚๏ธ","group":5,"order":4037,"tags":["clothing","rain"],"version":0.7,"annotation":"umbrella","shortcodes":["umbrella"]},{"emoji":"โ˜”๏ธ","group":5,"order":4038,"tags":["clothing","drop","drops","rain","umbrella","weather"],"version":0.6,"annotation":"umbrella with rain drops","shortcodes":["umbrella_with_rain"]},{"emoji":"โ›ฑ๏ธ","group":5,"order":4040,"tags":["ground","rain","sun","umbrella"],"version":0.7,"annotation":"umbrella on ground","shortcodes":["beach_umbrella","umbrella_on_ground"]},{"emoji":"โšก๏ธ","group":5,"order":4041,"tags":["danger","electric","electricity","high","lightning","nature","thunder","thunderbolt","voltage","zap"],"version":0.6,"annotation":"high voltage","shortcodes":["high_voltage","zap"]},{"emoji":"โ„๏ธ","group":5,"order":4043,"tags":["cold","snow","weather"],"version":0.6,"annotation":"snowflake","shortcodes":["snowflake"]},{"emoji":"โ˜ƒ๏ธ","group":5,"order":4045,"tags":["cold","man","snow"],"version":0.7,"annotation":"snowman","shortcodes":["snowman2"]},{"emoji":"โ›„๏ธ","group":5,"order":4046,"tags":["cold","man","snow","snowman"],"version":0.6,"annotation":"snowman without snow","shortcodes":["snowman"]},{"emoji":"โ˜„๏ธ","group":5,"order":4048,"tags":["space"],"version":1,"annotation":"comet","shortcodes":["comet"]},{"emoji":"๐Ÿ”ฅ","group":5,"order":4049,"tags":["af","burn","flame","hot","lit","litaf","tool"],"version":0.6,"annotation":"fire","shortcodes":["fire"]},{"emoji":"๐Ÿ’ง","group":5,"order":4050,"tags":["cold","comic","drop","nature","sad","sweat","tear","water","weather"],"version":0.6,"annotation":"droplet","shortcodes":["droplet"]},{"emoji":"๐ŸŒŠ","group":5,"order":4051,"tags":["nature","ocean","surf","surfer","surfing","water","wave"],"version":0.6,"annotation":"water wave","shortcodes":["ocean","water_wave"]},{"emoji":"๐ŸŽƒ","group":6,"order":4052,"tags":["celebration","halloween","jack","lantern","pumpkin"],"version":0.6,"annotation":"jack-o-lantern","shortcodes":["jack_o_lantern"]},{"emoji":"๐ŸŽ„","group":6,"order":4053,"tags":["celebration","christmas","tree"],"version":0.6,"annotation":"Christmas tree","shortcodes":["christmas_tree"]},{"emoji":"๐ŸŽ†","group":6,"order":4054,"tags":["boom","celebration","entertainment","yolo"],"version":0.6,"annotation":"fireworks","shortcodes":["fireworks"]},{"emoji":"๐ŸŽ‡","group":6,"order":4055,"tags":["boom","celebration","fireworks","sparkle"],"version":0.6,"annotation":"sparkler","shortcodes":["sparkler"]},{"emoji":"๐Ÿงจ","group":6,"order":4056,"tags":["dynamite","explosive","fire","fireworks","light","pop","popping","spark"],"version":11,"annotation":"firecracker","shortcodes":["firecracker"]},{"emoji":"โœจ๏ธ","group":6,"order":4057,"tags":["*","magic","sparkle","star"],"version":0.6,"annotation":"sparkles","shortcodes":["sparkles"]},{"emoji":"๐ŸŽˆ","group":6,"order":4058,"tags":["birthday","celebrate","celebration"],"version":0.6,"annotation":"balloon","shortcodes":["balloon"]},{"emoji":"๐ŸŽ‰","group":6,"order":4059,"tags":["awesome","birthday","celebrate","celebration","excited","hooray","party","popper","tada","woohoo"],"version":0.6,"annotation":"party popper","shortcodes":["party","party_popper","tada"]},{"emoji":"๐ŸŽŠ","group":6,"order":4060,"tags":["ball","celebrate","celebration","confetti","party","woohoo"],"version":0.6,"annotation":"confetti ball","shortcodes":["confetti_ball"]},{"emoji":"๐ŸŽ‹","group":6,"order":4061,"tags":["banner","celebration","japanese","tanabata","tree"],"version":0.6,"annotation":"tanabata tree","shortcodes":["tanabata_tree"]},{"emoji":"๐ŸŽ","group":6,"order":4062,"tags":["bamboo","celebration","decoration","japanese","pine","plant"],"version":0.6,"annotation":"pine decoration","shortcodes":["bamboo"]},{"emoji":"๐ŸŽŽ","group":6,"order":4063,"tags":["celebration","doll","dolls","festival","japanese"],"version":0.6,"annotation":"Japanese dolls","shortcodes":["dolls"]},{"emoji":"๐ŸŽ","group":6,"order":4064,"tags":["carp","celebration","streamer"],"version":0.6,"annotation":"carp streamer","shortcodes":["carp_streamer","flags"]},{"emoji":"๐ŸŽ","group":6,"order":4065,"tags":["bell","celebration","chime","wind"],"version":0.6,"annotation":"wind chime","shortcodes":["wind_chime"]},{"emoji":"๐ŸŽ‘","group":6,"order":4066,"tags":["celebration","ceremony","moon","viewing"],"version":0.6,"annotation":"moon viewing ceremony","shortcodes":["moon_ceremony","rice_scene"]},{"emoji":"๐Ÿงง","group":6,"order":4067,"tags":["envelope","gift","good","hรณngbฤo","lai","luck","money","red","see"],"version":11,"annotation":"red envelope","shortcodes":["red_envelope"]},{"emoji":"๐ŸŽ€","group":6,"order":4068,"tags":["celebration"],"version":0.6,"annotation":"ribbon","shortcodes":["ribbon"]},{"emoji":"๐ŸŽ","group":6,"order":4069,"tags":["birthday","bow","box","celebration","christmas","gift","present","surprise","wrapped"],"version":0.6,"annotation":"wrapped gift","shortcodes":["gift"]},{"emoji":"๐ŸŽ—๏ธ","group":6,"order":4071,"tags":["celebration","reminder","ribbon"],"version":0.7,"annotation":"reminder ribbon","shortcodes":["reminder_ribbon"]},{"emoji":"๐ŸŽŸ๏ธ","group":6,"order":4073,"tags":["admission","ticket","tickets"],"version":0.7,"annotation":"admission tickets","shortcodes":["admission_tickets","tickets"]},{"emoji":"๐ŸŽซ","group":6,"order":4074,"tags":["admission","stub"],"version":0.6,"annotation":"ticket","shortcodes":["ticket"]},{"emoji":"๐ŸŽ–๏ธ","group":6,"order":4076,"tags":["award","celebration","medal","military"],"version":0.7,"annotation":"military medal","shortcodes":["military_medal"]},{"emoji":"๐Ÿ†๏ธ","group":6,"order":4077,"tags":["champion","champs","prize","slay","sport","victory","win","winning"],"version":0.6,"annotation":"trophy","shortcodes":["trophy"]},{"emoji":"๐Ÿ…","group":6,"order":4078,"tags":["award","gold","medal","sports","winner"],"version":1,"annotation":"sports medal","shortcodes":["sports_medal"]},{"emoji":"๐Ÿฅ‡","group":6,"order":4079,"tags":["1st","first","gold","medal","place"],"version":3,"annotation":"1st place medal","shortcodes":["1st","first_place_medal"]},{"emoji":"๐Ÿฅˆ","group":6,"order":4080,"tags":["2nd","medal","place","second","silver"],"version":3,"annotation":"2nd place medal","shortcodes":["2nd","second_place_medal"]},{"emoji":"๐Ÿฅ‰","group":6,"order":4081,"tags":["3rd","bronze","medal","place","third"],"version":3,"annotation":"3rd place medal","shortcodes":["3rd","third_place_medal"]},{"emoji":"โšฝ๏ธ","group":6,"order":4082,"tags":["ball","football","futbol","soccer","sport"],"version":0.6,"annotation":"soccer ball","shortcodes":["soccer"]},{"emoji":"โšพ๏ธ","group":6,"order":4083,"tags":["ball","sport"],"version":0.6,"annotation":"baseball","shortcodes":["baseball"]},{"emoji":"๐ŸฅŽ","group":6,"order":4084,"tags":["ball","glove","sports","underarm"],"version":11,"annotation":"softball","shortcodes":["softball"]},{"emoji":"๐Ÿ€","group":6,"order":4085,"tags":["ball","hoop","sport"],"version":0.6,"annotation":"basketball","shortcodes":["basketball"]},{"emoji":"๐Ÿ","group":6,"order":4086,"tags":["ball","game"],"version":1,"annotation":"volleyball","shortcodes":["volleyball"]},{"emoji":"๐Ÿˆ","group":6,"order":4087,"tags":["american","ball","bowl","football","sport","super"],"version":0.6,"annotation":"american football","shortcodes":["football"]},{"emoji":"๐Ÿ‰","group":6,"order":4088,"tags":["ball","football","rugby","sport"],"version":1,"annotation":"rugby football","shortcodes":["rugby_football"]},{"emoji":"๐ŸŽพ","group":6,"order":4089,"tags":["ball","racquet","sport"],"version":0.6,"annotation":"tennis","shortcodes":["tennis"]},{"emoji":"๐Ÿฅ","group":6,"order":4090,"tags":["disc","flying","ultimate"],"version":11,"annotation":"flying disc","shortcodes":["flying_disc"]},{"emoji":"๐ŸŽณ","group":6,"order":4091,"tags":["ball","game","sport","strike"],"version":0.6,"annotation":"bowling","shortcodes":["bowling"]},{"emoji":"๐Ÿ","group":6,"order":4092,"tags":["ball","bat","cricket","game"],"version":1,"annotation":"cricket game","shortcodes":["cricket_game"]},{"emoji":"๐Ÿ‘","group":6,"order":4093,"tags":["ball","field","game","hockey","stick"],"version":1,"annotation":"field hockey","shortcodes":["field_hockey"]},{"emoji":"๐Ÿ’","group":6,"order":4094,"tags":["game","hockey","ice","puck","stick"],"version":1,"annotation":"ice hockey","shortcodes":["hockey"]},{"emoji":"๐Ÿฅ","group":6,"order":4095,"tags":["ball","goal","sports","stick"],"version":11,"annotation":"lacrosse","shortcodes":["lacrosse"]},{"emoji":"๐Ÿ“","group":6,"order":4096,"tags":["ball","bat","game","paddle","ping","pingpong","pong","table","tennis"],"version":1,"annotation":"ping pong","shortcodes":["ping_pong"]},{"emoji":"๐Ÿธ","group":6,"order":4097,"tags":["birdie","game","racquet","shuttlecock"],"version":1,"annotation":"badminton","shortcodes":["badminton"]},{"emoji":"๐ŸฅŠ","group":6,"order":4098,"tags":["boxing","glove"],"version":3,"annotation":"boxing glove","shortcodes":["boxing_glove"]},{"emoji":"๐Ÿฅ‹","group":6,"order":4099,"tags":["arts","judo","karate","martial","taekwondo","uniform"],"version":3,"annotation":"martial arts uniform","shortcodes":["martial_arts_uniform"]},{"emoji":"๐Ÿฅ…","group":6,"order":4100,"tags":["goal","net"],"version":3,"annotation":"goal net","shortcodes":["goal_net"]},{"emoji":"โ›ณ๏ธ","group":6,"order":4101,"tags":["flag","golf","hole","sport"],"version":0.6,"annotation":"flag in hole","shortcodes":["golf"]},{"emoji":"โ›ธ๏ธ","group":6,"order":4103,"tags":["ice","skate","skating"],"version":0.7,"annotation":"ice skate","shortcodes":["ice_skate"]},{"emoji":"๐ŸŽฃ","group":6,"order":4104,"tags":["entertainment","fish","fishing","pole","sport"],"version":0.6,"annotation":"fishing pole","shortcodes":["fishing_pole","fishing_pole_and_fish"]},{"emoji":"๐Ÿคฟ","group":6,"order":4105,"tags":["diving","mask","scuba","snorkeling"],"version":12,"annotation":"diving mask","shortcodes":["diving_mask"]},{"emoji":"๐ŸŽฝ","group":6,"order":4106,"tags":["athletics","running","sash","shirt"],"version":0.6,"annotation":"running shirt","shortcodes":["running_shirt","running_shirt_with_sash"]},{"emoji":"๐ŸŽฟ","group":6,"order":4107,"tags":["ski","snow","sport"],"version":0.6,"annotation":"skis","shortcodes":["ski"]},{"emoji":"๐Ÿ›ท","group":6,"order":4108,"tags":["luge","sledge","sleigh","snow","toboggan"],"version":5,"annotation":"sled","shortcodes":["sled"]},{"emoji":"๐ŸฅŒ","group":6,"order":4109,"tags":["curling","game","rock","stone"],"version":5,"annotation":"curling stone","shortcodes":["curling_stone"]},{"emoji":"๐ŸŽฏ","group":6,"order":4110,"tags":["bull","dart","direct","entertainment","game","hit","target"],"version":0.6,"annotation":"bullseye","shortcodes":["bullseye","dart","direct_hit"]},{"emoji":"๐Ÿช€","group":6,"order":4111,"tags":["fluctuate","toy"],"version":12,"annotation":"yo-yo","shortcodes":["yo_yo"]},{"emoji":"๐Ÿช","group":6,"order":4112,"tags":["fly","soar"],"version":12,"annotation":"kite","shortcodes":["kite"]},{"emoji":"๐Ÿ”ซ","group":6,"order":4113,"tags":["gun","handgun","pistol","revolver","tool","water","weapon"],"version":0.6,"annotation":"water pistol","shortcodes":["gun","pistol"]},{"emoji":"๐ŸŽฑ","group":6,"order":4114,"tags":["8","8ball","ball","billiard","eight","game","pool"],"version":0.6,"annotation":"pool 8 ball","shortcodes":["8ball","billiards"]},{"emoji":"๐Ÿ”ฎ","group":6,"order":4115,"tags":["ball","crystal","fairy","fairytale","fantasy","fortune","future","magic","tale","tool"],"version":0.6,"annotation":"crystal ball","shortcodes":["crystal_ball"]},{"emoji":"๐Ÿช„","group":6,"order":4116,"tags":["magic","magician","wand","witch","wizard"],"version":13,"annotation":"magic wand","shortcodes":["magic_wand"]},{"emoji":"๐ŸŽฎ๏ธ","group":6,"order":4117,"tags":["controller","entertainment","game","video"],"version":0.6,"annotation":"video game","shortcodes":["controller","video_game"]},{"emoji":"๐Ÿ•น๏ธ","group":6,"order":4119,"tags":["game","video","videogame"],"version":0.7,"annotation":"joystick","shortcodes":["joystick"]},{"emoji":"๐ŸŽฐ","group":6,"order":4120,"tags":["casino","gamble","gambling","game","machine","slot","slots"],"version":0.6,"annotation":"slot machine","shortcodes":["slot_machine"]},{"emoji":"๐ŸŽฒ","group":6,"order":4121,"tags":["dice","die","entertainment","game"],"version":0.6,"annotation":"game die","shortcodes":["game_die"]},{"emoji":"๐Ÿงฉ","group":6,"order":4122,"tags":["clue","interlocking","jigsaw","piece","puzzle"],"version":11,"annotation":"puzzle piece","shortcodes":["jigsaw","puzzle_piece"]},{"emoji":"๐Ÿงธ","group":6,"order":4123,"tags":["bear","plaything","plush","stuffed","teddy","toy"],"version":11,"annotation":"teddy bear","shortcodes":["teddy_bear"]},{"emoji":"๐Ÿช…","group":6,"order":4124,"tags":["candy","celebrate","celebration","cinco","de","festive","mayo","party","pinada","pinata"],"version":13,"annotation":"piรฑata","shortcodes":["pinata"]},{"emoji":"๐Ÿชฉ","group":6,"order":4125,"tags":["ball","dance","disco","glitter","mirror","party"],"version":14,"annotation":"mirror ball","shortcodes":["disco","disco_ball","mirror_ball"]},{"emoji":"๐Ÿช†","group":6,"order":4126,"tags":["babooshka","baboushka","babushka","doll","dolls","matryoshka","nesting","russia"],"version":13,"annotation":"nesting dolls","shortcodes":["nesting_dolls"]},{"emoji":"โ™ ๏ธ","group":6,"order":4128,"tags":["card","game","spade","suit"],"version":0.6,"annotation":"spade suit","shortcodes":["spades"]},{"emoji":"โ™ฅ๏ธ","group":6,"order":4130,"tags":["card","emotion","game","heart","hearts","suit"],"version":0.6,"annotation":"heart suit","shortcodes":["hearts"]},{"emoji":"โ™ฆ๏ธ","group":6,"order":4132,"tags":["card","diamond","game","suit"],"version":0.6,"annotation":"diamond suit","shortcodes":["diamonds"]},{"emoji":"โ™ฃ๏ธ","group":6,"order":4134,"tags":["card","club","clubs","game","suit"],"version":0.6,"annotation":"club suit","shortcodes":["clubs"]},{"emoji":"โ™Ÿ๏ธ","group":6,"order":4136,"tags":["chess","dupe","expendable","pawn"],"version":11,"annotation":"chess pawn","shortcodes":["chess_pawn"]},{"emoji":"๐Ÿƒ","group":6,"order":4137,"tags":["card","game","wildcard"],"version":0.6,"annotation":"joker","shortcodes":["black_joker"]},{"emoji":"๐Ÿ€„๏ธ","group":6,"order":4138,"tags":["dragon","game","mahjong","red"],"version":0.6,"annotation":"mahjong red dragon","shortcodes":["mahjong"]},{"emoji":"๐ŸŽด","group":6,"order":4139,"tags":["card","cards","flower","game","japanese","playing"],"version":0.6,"annotation":"flower playing cards","shortcodes":["flower_playing_cards"]},{"emoji":"๐ŸŽญ๏ธ","group":6,"order":4140,"tags":["actor","actress","art","arts","entertainment","mask","performing","theater","theatre","thespian"],"version":0.6,"annotation":"performing arts","shortcodes":["performing_arts"]},{"emoji":"๐Ÿ–ผ๏ธ","group":6,"order":4142,"tags":["art","frame","framed","museum","painting","picture"],"version":0.7,"annotation":"framed picture","shortcodes":["frame_with_picture","framed_picture"]},{"emoji":"๐ŸŽจ","group":6,"order":4143,"tags":["art","artist","artsy","arty","colorful","creative","entertainment","museum","painter","painting","palette"],"version":0.6,"annotation":"artist palette","shortcodes":["art","palette"]},{"emoji":"๐Ÿงต","group":6,"order":4144,"tags":["needle","sewing","spool","string"],"version":11,"annotation":"thread","shortcodes":["thread"]},{"emoji":"๐Ÿชก","group":6,"order":4145,"tags":["embroidery","needle","sew","sewing","stitches","sutures","tailoring","thread"],"version":13,"annotation":"sewing needle","shortcodes":["sewing_needle"]},{"emoji":"๐Ÿงถ","group":6,"order":4146,"tags":["ball","crochet","knit"],"version":11,"annotation":"yarn","shortcodes":["yarn"]},{"emoji":"๐Ÿชข","group":6,"order":4147,"tags":["cord","rope","tangled","tie","twine","twist"],"version":13,"annotation":"knot","shortcodes":["knot"]},{"emoji":"๐Ÿ‘“๏ธ","group":7,"order":4148,"tags":["clothing","eye","eyeglasses","eyewear"],"version":0.6,"annotation":"glasses","shortcodes":["eyeglasses","glasses"]},{"emoji":"๐Ÿ•ถ๏ธ","group":7,"order":4150,"tags":["dark","eye","eyewear","glasses"],"version":0.7,"annotation":"sunglasses","shortcodes":["sunglasses"]},{"emoji":"๐Ÿฅฝ","group":7,"order":4151,"tags":["dive","eye","protection","scuba","swimming","welding"],"version":11,"annotation":"goggles","shortcodes":["goggles"]},{"emoji":"๐Ÿฅผ","group":7,"order":4152,"tags":["clothes","coat","doctor","dr","experiment","jacket","lab","scientist","white"],"version":11,"annotation":"lab coat","shortcodes":["lab_coat"]},{"emoji":"๐Ÿฆบ","group":7,"order":4153,"tags":["emergency","safety","vest"],"version":12,"annotation":"safety vest","shortcodes":["safety_vest"]},{"emoji":"๐Ÿ‘”","group":7,"order":4154,"tags":["clothing","employed","serious","shirt","tie"],"version":0.6,"annotation":"necktie","shortcodes":["necktie"]},{"emoji":"๐Ÿ‘•","group":7,"order":4155,"tags":["blue","casual","clothes","clothing","collar","dressed","shirt","shopping","tshirt","weekend"],"version":0.6,"annotation":"t-shirt","shortcodes":["shirt"]},{"emoji":"๐Ÿ‘–","group":7,"order":4156,"tags":["blue","casual","clothes","clothing","denim","dressed","pants","shopping","trousers","weekend"],"version":0.6,"annotation":"jeans","shortcodes":["jeans"]},{"emoji":"๐Ÿงฃ","group":7,"order":4157,"tags":["bundle","cold","neck","up"],"version":5,"annotation":"scarf","shortcodes":["scarf"]},{"emoji":"๐Ÿงค","group":7,"order":4158,"tags":["hand"],"version":5,"annotation":"gloves","shortcodes":["gloves"]},{"emoji":"๐Ÿงฅ","group":7,"order":4159,"tags":["brr","bundle","cold","jacket","up"],"version":5,"annotation":"coat","shortcodes":["coat"]},{"emoji":"๐Ÿงฆ","group":7,"order":4160,"tags":["stocking"],"version":5,"annotation":"socks","shortcodes":["socks"]},{"emoji":"๐Ÿ‘—","group":7,"order":4161,"tags":["clothes","clothing","dressed","fancy","shopping"],"version":0.6,"annotation":"dress","shortcodes":["dress"]},{"emoji":"๐Ÿ‘˜","group":7,"order":4162,"tags":["clothing","comfortable"],"version":0.6,"annotation":"kimono","shortcodes":["kimono"]},{"emoji":"๐Ÿฅป","group":7,"order":4163,"tags":["clothing","dress"],"version":12,"annotation":"sari","shortcodes":["sari"]},{"emoji":"๐Ÿฉฑ","group":7,"order":4164,"tags":["bathing","one-piece","suit","swimsuit"],"version":12,"annotation":"one-piece swimsuit","shortcodes":["one_piece_swimsuit"]},{"emoji":"๐Ÿฉฒ","group":7,"order":4165,"tags":["bathing","one-piece","suit","swimsuit","underwear"],"version":12,"annotation":"briefs","shortcodes":["briefs"]},{"emoji":"๐Ÿฉณ","group":7,"order":4166,"tags":["bathing","pants","suit","swimsuit","underwear"],"version":12,"annotation":"shorts","shortcodes":["shorts"]},{"emoji":"๐Ÿ‘™","group":7,"order":4167,"tags":["bathing","beach","clothing","pool","suit","swim"],"version":0.6,"annotation":"bikini","shortcodes":["bikini"]},{"emoji":"๐Ÿ‘š","group":7,"order":4168,"tags":["blouse","clothes","clothing","collar","dress","dressed","lady","shirt","shopping","woman","womanโ€™s"],"version":0.6,"annotation":"womanโ€™s clothes","shortcodes":["womans_clothes"]},{"emoji":"๐Ÿชญ","group":7,"order":4169,"tags":["clack","clap","cool","cooling","dance","fan","flirt","flutter","folding","hand","hot","shy"],"version":15,"annotation":"folding hand fan","shortcodes":["folding_fan"]},{"emoji":"๐Ÿ‘›","group":7,"order":4170,"tags":["clothes","clothing","coin","dress","fancy","handbag","shopping"],"version":0.6,"annotation":"purse","shortcodes":["purse"]},{"emoji":"๐Ÿ‘œ","group":7,"order":4171,"tags":["bag","clothes","clothing","dress","lady","purse","shopping"],"version":0.6,"annotation":"handbag","shortcodes":["handbag"]},{"emoji":"๐Ÿ‘","group":7,"order":4172,"tags":["bag","clothes","clothing","clutch","dress","handbag","pouch","purse"],"version":0.6,"annotation":"clutch bag","shortcodes":["clutch_bag","pouch"]},{"emoji":"๐Ÿ›๏ธ","group":7,"order":4174,"tags":["bag","bags","hotel","shopping"],"version":0.7,"annotation":"shopping bags","shortcodes":["shopping_bags"]},{"emoji":"๐ŸŽ’","group":7,"order":4175,"tags":["backpacking","bag","bookbag","education","rucksack","satchel","school"],"version":0.6,"annotation":"backpack","shortcodes":["backpack","school_satchel"]},{"emoji":"๐Ÿฉด","group":7,"order":4176,"tags":["beach","flip","flop","sandal","sandals","shoe","thong","thongs","zลri"],"version":13,"annotation":"thong sandal","shortcodes":["thong_sandal"]},{"emoji":"๐Ÿ‘ž","group":7,"order":4177,"tags":["brown","clothes","clothing","feet","foot","kick","man","manโ€™s","shoe","shoes","shopping"],"version":0.6,"annotation":"manโ€™s shoe","shortcodes":["mans_shoe"]},{"emoji":"๐Ÿ‘Ÿ","group":7,"order":4178,"tags":["athletic","clothes","clothing","fast","kick","running","shoe","shoes","shopping","sneaker","tennis"],"version":0.6,"annotation":"running shoe","shortcodes":["athletic_shoe","sneaker"]},{"emoji":"๐Ÿฅพ","group":7,"order":4179,"tags":["backpacking","boot","brown","camping","hiking","outdoors","shoe"],"version":11,"annotation":"hiking boot","shortcodes":["hiking_boot"]},{"emoji":"๐Ÿฅฟ","group":7,"order":4180,"tags":["ballet","comfy","flat","flats","shoe","slip-on","slipper"],"version":11,"annotation":"flat shoe","shortcodes":["flat_shoe","womans_flat_shoe"]},{"emoji":"๐Ÿ‘ ","group":7,"order":4181,"tags":["clothes","clothing","dress","fashion","heel","heels","high-heeled","shoe","shoes","shopping","stiletto","woman"],"version":0.6,"annotation":"high-heeled shoe","shortcodes":["high_heel"]},{"emoji":"๐Ÿ‘ก","group":7,"order":4182,"tags":["clothing","sandal","shoe","woman","womanโ€™s"],"version":0.6,"annotation":"womanโ€™s sandal","shortcodes":["sandal"]},{"emoji":"๐Ÿฉฐ","group":7,"order":4183,"tags":["ballet","dance","shoes"],"version":12,"annotation":"ballet shoes","shortcodes":["ballet_shoes"]},{"emoji":"๐Ÿ‘ข","group":7,"order":4184,"tags":["boot","clothes","clothing","dress","shoe","shoes","shopping","woman","womanโ€™s"],"version":0.6,"annotation":"womanโ€™s boot","shortcodes":["boot"]},{"emoji":"๐Ÿชฎ","group":7,"order":4185,"tags":["afro","comb","groom","hair","pick"],"version":15,"annotation":"hair pick","shortcodes":["hair_pick"]},{"emoji":"๐Ÿ‘‘","group":7,"order":4186,"tags":["clothing","family","king","medieval","queen","royal","royalty","win"],"version":0.6,"annotation":"crown","shortcodes":["crown"]},{"emoji":"๐Ÿ‘’","group":7,"order":4187,"tags":["clothes","clothing","garden","hat","hats","party","woman","womanโ€™s"],"version":0.6,"annotation":"womanโ€™s hat","shortcodes":["womans_hat"]},{"emoji":"๐ŸŽฉ","group":7,"order":4188,"tags":["clothes","clothing","fancy","formal","hat","magic","top","tophat"],"version":0.6,"annotation":"top hat","shortcodes":["top_hat","tophat"]},{"emoji":"๐ŸŽ“๏ธ","group":7,"order":4189,"tags":["cap","celebration","clothing","education","graduation","hat","scholar"],"version":0.6,"annotation":"graduation cap","shortcodes":["graduation_cap","mortar_board"]},{"emoji":"๐Ÿงข","group":7,"order":4190,"tags":["baseball","bent","billed","cap","dad","hat"],"version":5,"annotation":"billed cap","shortcodes":["billed_cap"]},{"emoji":"๐Ÿช–","group":7,"order":4191,"tags":["army","helmet","military","soldier","war","warrior"],"version":13,"annotation":"military helmet","shortcodes":["military_helmet"]},{"emoji":"โ›‘๏ธ","group":7,"order":4193,"tags":["aid","cross","face","hat","helmet","rescue","workerโ€™s"],"version":0.7,"annotation":"rescue workerโ€™s helmet","shortcodes":["helmet_with_cross","rescue_worker_helmet"]},{"emoji":"๐Ÿ“ฟ","group":7,"order":4194,"tags":["beads","clothing","necklace","prayer","religion"],"version":1,"annotation":"prayer beads","shortcodes":["prayer_beads"]},{"emoji":"๐Ÿ’„","group":7,"order":4195,"tags":["cosmetics","date","makeup"],"version":0.6,"annotation":"lipstick","shortcodes":["lipstick"]},{"emoji":"๐Ÿ’","group":7,"order":4196,"tags":["diamond","engaged","engagement","married","romance","shiny","sparkling","wedding"],"version":0.6,"annotation":"ring","shortcodes":["ring"]},{"emoji":"๐Ÿ’Ž","group":7,"order":4197,"tags":["diamond","engagement","gem","jewel","money","romance","stone","wedding"],"version":0.6,"annotation":"gem stone","shortcodes":["gem"]},{"emoji":"๐Ÿ”‡","group":7,"order":4198,"tags":["mute","muted","quiet","silent","sound","speaker"],"version":1,"annotation":"muted speaker","shortcodes":["mute","no_sound"]},{"emoji":"๐Ÿ”ˆ๏ธ","group":7,"order":4199,"tags":["low","soft","sound","speaker","volume"],"version":0.7,"annotation":"speaker low volume","shortcodes":["low_volume","quiet_sound","speaker"]},{"emoji":"๐Ÿ”‰","group":7,"order":4200,"tags":["medium","sound","speaker","volume"],"version":1,"annotation":"speaker medium volume","shortcodes":["medium_volumne","sound"]},{"emoji":"๐Ÿ”Š","group":7,"order":4201,"tags":["high","loud","music","sound","speaker","volume"],"version":0.6,"annotation":"speaker high volume","shortcodes":["high_volume","loud_sound"]},{"emoji":"๐Ÿ“ข","group":7,"order":4202,"tags":["address","communication","loud","public","sound"],"version":0.6,"annotation":"loudspeaker","shortcodes":["loudspeaker"]},{"emoji":"๐Ÿ“ฃ","group":7,"order":4203,"tags":["cheering","sound"],"version":0.6,"annotation":"megaphone","shortcodes":["mega","megaphone"]},{"emoji":"๐Ÿ“ฏ","group":7,"order":4204,"tags":["horn","post","postal"],"version":1,"annotation":"postal horn","shortcodes":["postal_horn"]},{"emoji":"๐Ÿ””","group":7,"order":4205,"tags":["break","church","sound"],"version":0.6,"annotation":"bell","shortcodes":["bell"]},{"emoji":"๐Ÿ”•","group":7,"order":4206,"tags":["bell","forbidden","mute","no","not","prohibited","quiet","silent","slash","sound"],"version":1,"annotation":"bell with slash","shortcodes":["no_bell"]},{"emoji":"๐ŸŽผ","group":7,"order":4207,"tags":["music","musical","note","score"],"version":0.6,"annotation":"musical score","shortcodes":["musical_score"]},{"emoji":"๐ŸŽต","group":7,"order":4208,"tags":["music","musical","note","sound"],"version":0.6,"annotation":"musical note","shortcodes":["musical_note"]},{"emoji":"๐ŸŽถ","group":7,"order":4209,"tags":["music","musical","note","notes","sound"],"version":0.6,"annotation":"musical notes","shortcodes":["musical_notes","notes"]},{"emoji":"๐ŸŽ™๏ธ","group":7,"order":4211,"tags":["mic","microphone","music","studio"],"version":0.7,"annotation":"studio microphone","shortcodes":["studio_microphone"]},{"emoji":"๐ŸŽš๏ธ","group":7,"order":4213,"tags":["level","music","slider"],"version":0.7,"annotation":"level slider","shortcodes":["level_slider"]},{"emoji":"๐ŸŽ›๏ธ","group":7,"order":4215,"tags":["control","knobs","music"],"version":0.7,"annotation":"control knobs","shortcodes":["control_knobs"]},{"emoji":"๐ŸŽค","group":7,"order":4216,"tags":["karaoke","mic","music","sing","sound"],"version":0.6,"annotation":"microphone","shortcodes":["microphone"]},{"emoji":"๐ŸŽง๏ธ","group":7,"order":4217,"tags":["earbud","sound"],"version":0.6,"annotation":"headphone","shortcodes":["headphones"]},{"emoji":"๐Ÿ“ป๏ธ","group":7,"order":4218,"tags":["entertainment","tbt","video"],"version":0.6,"annotation":"radio","shortcodes":["radio"]},{"emoji":"๐ŸŽท","group":7,"order":4219,"tags":["instrument","music","sax"],"version":0.6,"annotation":"saxophone","shortcodes":["saxophone"]},{"emoji":"๐Ÿช—","group":7,"order":4220,"tags":["box","concertina","instrument","music","squeeze","squeezebox"],"version":13,"annotation":"accordion","shortcodes":["accordion"]},{"emoji":"๐ŸŽธ","group":7,"order":4221,"tags":["instrument","music","strat"],"version":0.6,"annotation":"guitar","shortcodes":["guitar"]},{"emoji":"๐ŸŽน","group":7,"order":4222,"tags":["instrument","keyboard","music","musical","piano"],"version":0.6,"annotation":"musical keyboard","shortcodes":["musical_keyboard"]},{"emoji":"๐ŸŽบ","group":7,"order":4223,"tags":["instrument","music"],"version":0.6,"annotation":"trumpet","shortcodes":["trumpet"]},{"emoji":"๐ŸŽป","group":7,"order":4224,"tags":["instrument","music"],"version":0.6,"annotation":"violin","shortcodes":["violin"]},{"emoji":"๐Ÿช•","group":7,"order":4225,"tags":["music","stringed"],"version":12,"annotation":"banjo","shortcodes":["banjo"]},{"emoji":"๐Ÿฅ","group":7,"order":4226,"tags":["drumsticks","music"],"version":3,"annotation":"drum","shortcodes":["drum"]},{"emoji":"๐Ÿช˜","group":7,"order":4227,"tags":["beat","conga","drum","instrument","long","rhythm"],"version":13,"annotation":"long drum","shortcodes":["long_drum"]},{"emoji":"๐Ÿช‡","group":7,"order":4228,"tags":["cha","dance","instrument","music","party","percussion","rattle","shake","shaker"],"version":15,"annotation":"maracas","shortcodes":["maracas"]},{"emoji":"๐Ÿชˆ","group":7,"order":4229,"tags":["band","fife","flautist","instrument","marching","music","orchestra","piccolo","pipe","recorder","woodwind"],"version":15,"annotation":"flute","shortcodes":["flute"]},{"emoji":"๐Ÿช‰","group":7,"order":4230,"tags":["cupid","instrument","love","music","orchestra"],"version":16,"annotation":"harp","shortcodes":["harp"]},{"emoji":"๐Ÿ“ฑ","group":7,"order":4231,"tags":["cell","communication","mobile","phone","telephone"],"version":0.6,"annotation":"mobile phone","shortcodes":["android","iphone","mobile_phone"]},{"emoji":"๐Ÿ“ฒ","group":7,"order":4232,"tags":["arrow","build","call","cell","communication","mobile","phone","receive","telephone"],"version":0.6,"annotation":"mobile phone with arrow","shortcodes":["calling","mobile_phone_arrow"]},{"emoji":"โ˜Ž๏ธ","group":7,"order":4234,"tags":["phone"],"version":0.6,"annotation":"telephone","shortcodes":["telephone"]},{"emoji":"๐Ÿ“ž","group":7,"order":4235,"tags":["communication","phone","receiver","telephone","voip"],"version":0.6,"annotation":"telephone receiver","shortcodes":["telephone_receiver"]},{"emoji":"๐Ÿ“Ÿ๏ธ","group":7,"order":4236,"tags":["communication"],"version":0.6,"annotation":"pager","shortcodes":["pager"]},{"emoji":"๐Ÿ“ ","group":7,"order":4237,"tags":["communication","fax","machine"],"version":0.6,"annotation":"fax machine","shortcodes":["fax","fax_machine"]},{"emoji":"๐Ÿ”‹","group":7,"order":4238,"tags":["battery"],"version":0.6,"annotation":"battery","shortcodes":["battery"]},{"emoji":"๐Ÿชซ","group":7,"order":4239,"tags":["battery","drained","electronic","energy","low","power"],"version":14,"annotation":"low battery","shortcodes":["low_battery"]},{"emoji":"๐Ÿ”Œ","group":7,"order":4240,"tags":["electric","electricity","plug"],"version":0.6,"annotation":"electric plug","shortcodes":["electric_plug"]},{"emoji":"๐Ÿ’ป๏ธ","group":7,"order":4241,"tags":["computer","office","pc","personal"],"version":0.6,"annotation":"laptop","shortcodes":["laptop"]},{"emoji":"๐Ÿ–ฅ๏ธ","group":7,"order":4243,"tags":["computer","desktop","monitor"],"version":0.7,"annotation":"desktop computer","shortcodes":["computer","desktop_computer"]},{"emoji":"๐Ÿ–จ๏ธ","group":7,"order":4245,"tags":["computer"],"version":0.7,"annotation":"printer","shortcodes":["printer"]},{"emoji":"โŒจ๏ธ","group":7,"order":4247,"tags":["computer"],"version":1,"annotation":"keyboard","shortcodes":["keyboard"]},{"emoji":"๐Ÿ–ฑ๏ธ","group":7,"order":4249,"tags":["computer","mouse"],"version":0.7,"annotation":"computer mouse","shortcodes":["computer_mouse"]},{"emoji":"๐Ÿ–ฒ๏ธ","group":7,"order":4251,"tags":["computer"],"version":0.7,"annotation":"trackball","shortcodes":["trackball"]},{"emoji":"๐Ÿ’ฝ","group":7,"order":4252,"tags":["computer","disk","minidisk","optical"],"version":0.6,"annotation":"computer disk","shortcodes":["computer_disk","minidisc"]},{"emoji":"๐Ÿ’พ","group":7,"order":4253,"tags":["computer","disk","floppy"],"version":0.6,"annotation":"floppy disk","shortcodes":["floppy_disk"]},{"emoji":"๐Ÿ’ฟ๏ธ","group":7,"order":4254,"tags":["blu-ray","cd","computer","disk","dvd","optical"],"version":0.6,"annotation":"optical disk","shortcodes":["cd","optical_disk"]},{"emoji":"๐Ÿ“€","group":7,"order":4255,"tags":["blu-ray","cd","computer","disk","optical"],"version":0.6,"annotation":"dvd","shortcodes":["dvd"]},{"emoji":"๐Ÿงฎ","group":7,"order":4256,"tags":["calculation","calculator"],"version":11,"annotation":"abacus","shortcodes":["abacus"]},{"emoji":"๐ŸŽฅ","group":7,"order":4257,"tags":["bollywood","camera","cinema","film","hollywood","movie","record"],"version":0.6,"annotation":"movie camera","shortcodes":["movie_camera"]},{"emoji":"๐ŸŽž๏ธ","group":7,"order":4259,"tags":["cinema","film","frames","movie"],"version":0.7,"annotation":"film frames","shortcodes":["film_frames"]},{"emoji":"๐Ÿ“ฝ๏ธ","group":7,"order":4261,"tags":["cinema","film","movie","projector","video"],"version":0.7,"annotation":"film projector","shortcodes":["film_projector"]},{"emoji":"๐ŸŽฌ๏ธ","group":7,"order":4262,"tags":["action","board","clapper","movie"],"version":0.6,"annotation":"clapper board","shortcodes":["clapper"]},{"emoji":"๐Ÿ“บ๏ธ","group":7,"order":4263,"tags":["tv","video"],"version":0.6,"annotation":"television","shortcodes":["tv"]},{"emoji":"๐Ÿ“ท๏ธ","group":7,"order":4264,"tags":["photo","selfie","snap","tbt","trip","video"],"version":0.6,"annotation":"camera","shortcodes":["camera"]},{"emoji":"๐Ÿ“ธ","group":7,"order":4265,"tags":["camera","flash","video"],"version":1,"annotation":"camera with flash","shortcodes":["camera_with_flash"]},{"emoji":"๐Ÿ“น๏ธ","group":7,"order":4266,"tags":["camcorder","camera","tbt","video"],"version":0.6,"annotation":"video camera","shortcodes":["video_camera"]},{"emoji":"๐Ÿ“ผ","group":7,"order":4267,"tags":["old","school","tape","vcr","vhs","video"],"version":0.6,"annotation":"videocassette","shortcodes":["vhs","videocassette"]},{"emoji":"๐Ÿ”๏ธ","group":7,"order":4268,"tags":["glass","lab","left","left-pointing","magnifying","science","search","tilted","tool"],"version":0.6,"annotation":"magnifying glass tilted left","shortcodes":["mag"]},{"emoji":"๐Ÿ”Ž","group":7,"order":4269,"tags":["contact","glass","lab","magnifying","right","right-pointing","science","search","tilted","tool"],"version":0.6,"annotation":"magnifying glass tilted right","shortcodes":["mag_right"]},{"emoji":"๐Ÿ•ฏ๏ธ","group":7,"order":4271,"tags":["light"],"version":0.7,"annotation":"candle","shortcodes":["candle"]},{"emoji":"๐Ÿ’ก","group":7,"order":4272,"tags":["bulb","comic","electric","idea","light"],"version":0.6,"annotation":"light bulb","shortcodes":["bulb","light_bulb"]},{"emoji":"๐Ÿ”ฆ","group":7,"order":4273,"tags":["electric","light","tool","torch"],"version":0.6,"annotation":"flashlight","shortcodes":["flashlight"]},{"emoji":"๐Ÿฎ","group":7,"order":4274,"tags":["bar","lantern","light","paper","red","restaurant"],"version":0.6,"annotation":"red paper lantern","shortcodes":["izakaya_lantern","red_paper_lantern"]},{"emoji":"๐Ÿช”","group":7,"order":4275,"tags":["diya","lamp","light","oil"],"version":12,"annotation":"diya lamp","shortcodes":["diya_lamp"]},{"emoji":"๐Ÿ“”","group":7,"order":4276,"tags":["book","cover","decorated","decorative","education","notebook","school","writing"],"version":0.6,"annotation":"notebook with decorative cover","shortcodes":["notebook_with_decorative_cover"]},{"emoji":"๐Ÿ“•","group":7,"order":4277,"tags":["book","closed","education"],"version":0.6,"annotation":"closed book","shortcodes":["closed_book"]},{"emoji":"๐Ÿ“–","group":7,"order":4278,"tags":["book","education","fantasy","knowledge","library","novels","open","reading"],"version":0.6,"annotation":"open book","shortcodes":["book","open_book"]},{"emoji":"๐Ÿ“—","group":7,"order":4279,"tags":["book","education","fantasy","green","library","reading"],"version":0.6,"annotation":"green book","shortcodes":["green_book"]},{"emoji":"๐Ÿ“˜","group":7,"order":4280,"tags":["blue","book","education","fantasy","library","reading"],"version":0.6,"annotation":"blue book","shortcodes":["blue_book"]},{"emoji":"๐Ÿ“™","group":7,"order":4281,"tags":["book","education","fantasy","library","orange","reading"],"version":0.6,"annotation":"orange book","shortcodes":["orange_book"]},{"emoji":"๐Ÿ“š๏ธ","group":7,"order":4282,"tags":["book","education","fantasy","knowledge","library","novels","reading","school","study"],"version":0.6,"annotation":"books","shortcodes":["books"]},{"emoji":"๐Ÿ““","group":7,"order":4283,"tags":["notebook"],"version":0.6,"annotation":"notebook","shortcodes":["notebook"]},{"emoji":"๐Ÿ“’","group":7,"order":4284,"tags":["notebook"],"version":0.6,"annotation":"ledger","shortcodes":["ledger"]},{"emoji":"๐Ÿ“ƒ","group":7,"order":4285,"tags":["curl","document","page","paper"],"version":0.6,"annotation":"page with curl","shortcodes":["page_with_curl"]},{"emoji":"๐Ÿ“œ","group":7,"order":4286,"tags":["paper"],"version":0.6,"annotation":"scroll","shortcodes":["scroll"]},{"emoji":"๐Ÿ“„","group":7,"order":4287,"tags":["document","facing","page","paper","up"],"version":0.6,"annotation":"page facing up","shortcodes":["page_facing_up"]},{"emoji":"๐Ÿ“ฐ","group":7,"order":4288,"tags":["communication","news","paper"],"version":0.6,"annotation":"newspaper","shortcodes":["newspaper"]},{"emoji":"๐Ÿ—ž๏ธ","group":7,"order":4290,"tags":["news","newspaper","paper","rolled","rolled-up"],"version":0.7,"annotation":"rolled-up newspaper","shortcodes":["rolled_up_newspaper"]},{"emoji":"๐Ÿ“‘","group":7,"order":4291,"tags":["bookmark","mark","marker","tabs"],"version":0.6,"annotation":"bookmark tabs","shortcodes":["bookmark_tabs"]},{"emoji":"๐Ÿ”–","group":7,"order":4292,"tags":["mark"],"version":0.6,"annotation":"bookmark","shortcodes":["bookmark"]},{"emoji":"๐Ÿท๏ธ","group":7,"order":4294,"tags":["tag"],"version":0.7,"annotation":"label","shortcodes":["label"]},{"emoji":"๐Ÿ’ฐ๏ธ","group":7,"order":4295,"tags":["bag","bank","bet","billion","cash","cost","dollar","gold","million","money","moneybag","paid","paying","pot","rich","win"],"version":0.6,"annotation":"money bag","shortcodes":["moneybag"]},{"emoji":"๐Ÿช™","group":7,"order":4296,"tags":["dollar","euro","gold","metal","money","rich","silver","treasure"],"version":13,"annotation":"coin","shortcodes":["coin"]},{"emoji":"๐Ÿ’ด","group":7,"order":4297,"tags":["bank","banknote","bill","currency","money","note","yen"],"version":0.6,"annotation":"yen banknote","shortcodes":["yen"]},{"emoji":"๐Ÿ’ต","group":7,"order":4298,"tags":["bank","banknote","bill","currency","dollar","money","note"],"version":0.6,"annotation":"dollar banknote","shortcodes":["dollar"]},{"emoji":"๐Ÿ’ถ","group":7,"order":4299,"tags":["100","bank","banknote","bill","currency","euro","money","note","rich"],"version":1,"annotation":"euro banknote","shortcodes":["euro"]},{"emoji":"๐Ÿ’ท","group":7,"order":4300,"tags":["bank","banknote","bill","billion","cash","currency","money","note","pound","pounds"],"version":1,"annotation":"pound banknote","shortcodes":["pound"]},{"emoji":"๐Ÿ’ธ","group":7,"order":4301,"tags":["bank","banknote","bill","billion","cash","dollar","fly","million","money","note","pay","wings"],"version":0.6,"annotation":"money with wings","shortcodes":["money_with_wings"]},{"emoji":"๐Ÿ’ณ๏ธ","group":7,"order":4302,"tags":["bank","card","cash","charge","credit","money","pay"],"version":0.6,"annotation":"credit card","shortcodes":["credit_card"]},{"emoji":"๐Ÿงพ","group":7,"order":4303,"tags":["accounting","bookkeeping","evidence","invoice","proof"],"version":11,"annotation":"receipt","shortcodes":["receipt"]},{"emoji":"๐Ÿ’น","group":7,"order":4304,"tags":["bank","chart","currency","graph","growth","increasing","market","money","rise","trend","upward","yen"],"version":0.6,"annotation":"chart increasing with yen","shortcodes":["chart"]},{"emoji":"โœ‰๏ธ","group":7,"order":4306,"tags":["e-mail","email","letter"],"version":0.6,"annotation":"envelope","shortcodes":["envelope"]},{"emoji":"๐Ÿ“ง","group":7,"order":4307,"tags":["email","letter","mail"],"version":0.6,"annotation":"e-mail","shortcodes":["e-mail","email"]},{"emoji":"๐Ÿ“จ","group":7,"order":4308,"tags":["delivering","e-mail","email","envelope","incoming","letter","mail","receive","sent"],"version":0.6,"annotation":"incoming envelope","shortcodes":["incoming_envelope"]},{"emoji":"๐Ÿ“ฉ","group":7,"order":4309,"tags":["arrow","communication","down","e-mail","email","envelope","letter","mail","outgoing","send","sent"],"version":0.6,"annotation":"envelope with arrow","shortcodes":["envelope_with_arrow"]},{"emoji":"๐Ÿ“ค๏ธ","group":7,"order":4310,"tags":["box","email","letter","mail","outbox","sent","tray"],"version":0.6,"annotation":"outbox tray","shortcodes":["outbox_tray"]},{"emoji":"๐Ÿ“ฅ๏ธ","group":7,"order":4311,"tags":["box","email","inbox","letter","mail","receive","tray","zero"],"version":0.6,"annotation":"inbox tray","shortcodes":["inbox_tray"]},{"emoji":"๐Ÿ“ฆ๏ธ","group":7,"order":4312,"tags":["box","communication","delivery","parcel","shipping"],"version":0.6,"annotation":"package","shortcodes":["package"]},{"emoji":"๐Ÿ“ซ๏ธ","group":7,"order":4313,"tags":["closed","communication","flag","mail","mailbox","postbox","raised"],"version":0.6,"annotation":"closed mailbox with raised flag","shortcodes":["mailbox"]},{"emoji":"๐Ÿ“ช๏ธ","group":7,"order":4314,"tags":["closed","flag","lowered","mail","mailbox","postbox"],"version":0.6,"annotation":"closed mailbox with lowered flag","shortcodes":["mailbox_closed"]},{"emoji":"๐Ÿ“ฌ๏ธ","group":7,"order":4315,"tags":["flag","mail","mailbox","open","postbox","raised"],"version":0.7,"annotation":"open mailbox with raised flag","shortcodes":["mailbox_with_mail"]},{"emoji":"๐Ÿ“ญ๏ธ","group":7,"order":4316,"tags":["flag","lowered","mail","mailbox","open","postbox"],"version":0.7,"annotation":"open mailbox with lowered flag","shortcodes":["mailbox_with_no_mail"]},{"emoji":"๐Ÿ“ฎ","group":7,"order":4317,"tags":["mail","mailbox"],"version":0.6,"annotation":"postbox","shortcodes":["postbox"]},{"emoji":"๐Ÿ—ณ๏ธ","group":7,"order":4319,"tags":["ballot","box"],"version":0.7,"annotation":"ballot box with ballot","shortcodes":["ballot_box"]},{"emoji":"โœ๏ธ","group":7,"order":4321,"tags":["pencil"],"version":0.6,"annotation":"pencil","shortcodes":["pencil"]},{"emoji":"โœ’๏ธ","group":7,"order":4323,"tags":["black","nib","pen"],"version":0.6,"annotation":"black nib","shortcodes":["black_nib"]},{"emoji":"๐Ÿ–‹๏ธ","group":7,"order":4325,"tags":["fountain","pen"],"version":0.7,"annotation":"fountain pen","shortcodes":["fountain_pen"]},{"emoji":"๐Ÿ–Š๏ธ","group":7,"order":4327,"tags":["ballpoint"],"version":0.7,"annotation":"pen","shortcodes":["pen"]},{"emoji":"๐Ÿ–Œ๏ธ","group":7,"order":4329,"tags":["painting"],"version":0.7,"annotation":"paintbrush","shortcodes":["paintbrush"]},{"emoji":"๐Ÿ–๏ธ","group":7,"order":4331,"tags":["crayon"],"version":0.7,"annotation":"crayon","shortcodes":["crayon"]},{"emoji":"๐Ÿ“","group":7,"order":4332,"tags":["communication","media","notes","pencil"],"version":0.6,"annotation":"memo","shortcodes":["memo"]},{"emoji":"๐Ÿ’ผ","group":7,"order":4333,"tags":["office"],"version":0.6,"annotation":"briefcase","shortcodes":["briefcase"]},{"emoji":"๐Ÿ“","group":7,"order":4334,"tags":["file","folder"],"version":0.6,"annotation":"file folder","shortcodes":["file_folder"]},{"emoji":"๐Ÿ“‚","group":7,"order":4335,"tags":["file","folder","open"],"version":0.6,"annotation":"open file folder","shortcodes":["open_file_folder"]},{"emoji":"๐Ÿ—‚๏ธ","group":7,"order":4337,"tags":["card","dividers","index"],"version":0.7,"annotation":"card index dividers","shortcodes":["card_index_dividers"]},{"emoji":"๐Ÿ“…","group":7,"order":4338,"tags":["date"],"version":0.6,"annotation":"calendar","shortcodes":["date"]},{"emoji":"๐Ÿ“†","group":7,"order":4339,"tags":["calendar","tear-off"],"version":0.6,"annotation":"tear-off calendar","shortcodes":["calendar"]},{"emoji":"๐Ÿ—’๏ธ","group":7,"order":4341,"tags":["note","notepad","pad","spiral"],"version":0.7,"annotation":"spiral notepad","shortcodes":["notepad_spiral"]},{"emoji":"๐Ÿ—“๏ธ","group":7,"order":4343,"tags":["calendar","pad","spiral"],"version":0.7,"annotation":"spiral calendar","shortcodes":["calendar_spiral"]},{"emoji":"๐Ÿ“‡","group":7,"order":4344,"tags":["card","index","old","rolodex","school"],"version":0.6,"annotation":"card index","shortcodes":["card_index"]},{"emoji":"๐Ÿ“ˆ","group":7,"order":4345,"tags":["chart","data","graph","growth","increasing","right","trend","up","upward"],"version":0.6,"annotation":"chart increasing","shortcodes":["chart_increasing","chart_with_upwards_trend"]},{"emoji":"๐Ÿ“‰","group":7,"order":4346,"tags":["chart","data","decreasing","down","downward","graph","negative","trend"],"version":0.6,"annotation":"chart decreasing","shortcodes":["chart_decreasing","chart_with_downwards_trend"]},{"emoji":"๐Ÿ“Š","group":7,"order":4347,"tags":["bar","chart","data","graph"],"version":0.6,"annotation":"bar chart","shortcodes":["bar_chart"]},{"emoji":"๐Ÿ“‹๏ธ","group":7,"order":4348,"tags":["do","list","notes"],"version":0.6,"annotation":"clipboard","shortcodes":["clipboard"]},{"emoji":"๐Ÿ“Œ","group":7,"order":4349,"tags":["collage","pin"],"version":0.6,"annotation":"pushpin","shortcodes":["pushpin"]},{"emoji":"๐Ÿ“","group":7,"order":4350,"tags":["location","map","pin","pushpin","round"],"version":0.6,"annotation":"round pushpin","shortcodes":["round_pushpin"]},{"emoji":"๐Ÿ“Ž","group":7,"order":4351,"tags":["paperclip"],"version":0.6,"annotation":"paperclip","shortcodes":["paperclip"]},{"emoji":"๐Ÿ–‡๏ธ","group":7,"order":4353,"tags":["link","linked","paperclip","paperclips"],"version":0.7,"annotation":"linked paperclips","shortcodes":["paperclips"]},{"emoji":"๐Ÿ“","group":7,"order":4354,"tags":["angle","edge","math","ruler","straight","straightedge"],"version":0.6,"annotation":"straight ruler","shortcodes":["straight_ruler"]},{"emoji":"๐Ÿ“","group":7,"order":4355,"tags":["angle","math","rule","ruler","set","slide","triangle","triangular"],"version":0.6,"annotation":"triangular ruler","shortcodes":["triangular_ruler"]},{"emoji":"โœ‚๏ธ","group":7,"order":4357,"tags":["cut","cutting","paper","tool"],"version":0.6,"annotation":"scissors","shortcodes":["scissors"]},{"emoji":"๐Ÿ—ƒ๏ธ","group":7,"order":4359,"tags":["box","card","file"],"version":0.7,"annotation":"card file box","shortcodes":["card_file_box"]},{"emoji":"๐Ÿ—„๏ธ","group":7,"order":4361,"tags":["cabinet","file","filing","paper"],"version":0.7,"annotation":"file cabinet","shortcodes":["file_cabinet"]},{"emoji":"๐Ÿ—‘๏ธ","group":7,"order":4363,"tags":["can","garbage","trash","waste"],"version":0.7,"annotation":"wastebasket","shortcodes":["trashcan","wastebasket"]},{"emoji":"๐Ÿ”’๏ธ","group":7,"order":4364,"tags":["closed","lock","private"],"version":0.6,"annotation":"locked","shortcodes":["lock","locked"]},{"emoji":"๐Ÿ”“๏ธ","group":7,"order":4365,"tags":["cracked","lock","open","unlock"],"version":0.6,"annotation":"unlocked","shortcodes":["unlock","unlocked"]},{"emoji":"๐Ÿ”","group":7,"order":4366,"tags":["ink","lock","locked","nib","pen","privacy"],"version":0.6,"annotation":"locked with pen","shortcodes":["lock_with_ink_pen","locked_with_pen"]},{"emoji":"๐Ÿ”","group":7,"order":4367,"tags":["bike","closed","key","lock","locked","secure"],"version":0.6,"annotation":"locked with key","shortcodes":["closed_lock_with_key","locked_with_key"]},{"emoji":"๐Ÿ”‘","group":7,"order":4368,"tags":["keys","lock","major","password","unlock"],"version":0.6,"annotation":"key","shortcodes":["key"]},{"emoji":"๐Ÿ—๏ธ","group":7,"order":4370,"tags":["clue","key","lock","old"],"version":0.7,"annotation":"old key","shortcodes":["old_key"]},{"emoji":"๐Ÿ”จ","group":7,"order":4371,"tags":["home","improvement","repairs","tool"],"version":0.6,"annotation":"hammer","shortcodes":["hammer"]},{"emoji":"๐Ÿช“","group":7,"order":4372,"tags":["ax","chop","hatchet","split","wood"],"version":12,"annotation":"axe","shortcodes":["axe"]},{"emoji":"โ›๏ธ","group":7,"order":4374,"tags":["hammer","mining","tool"],"version":0.7,"annotation":"pick","shortcodes":["pick"]},{"emoji":"โš’๏ธ","group":7,"order":4376,"tags":["hammer","pick","tool"],"version":1,"annotation":"hammer and pick","shortcodes":["hammer_and_pick"]},{"emoji":"๐Ÿ› ๏ธ","group":7,"order":4378,"tags":["hammer","spanner","tool","wrench"],"version":0.7,"annotation":"hammer and wrench","shortcodes":["hammer_and_wrench"]},{"emoji":"๐Ÿ—ก๏ธ","group":7,"order":4380,"tags":["knife","weapon"],"version":0.7,"annotation":"dagger","shortcodes":["dagger"]},{"emoji":"โš”๏ธ","group":7,"order":4382,"tags":["crossed","swords","weapon"],"version":1,"annotation":"crossed swords","shortcodes":["crossed_swords"]},{"emoji":"๐Ÿ’ฃ๏ธ","group":7,"order":4383,"tags":["boom","comic","dangerous","explosion","hot"],"version":0.6,"annotation":"bomb","shortcodes":["bomb"]},{"emoji":"๐Ÿชƒ","group":7,"order":4384,"tags":["rebound","repercussion","weapon"],"version":13,"annotation":"boomerang","shortcodes":["boomerang"]},{"emoji":"๐Ÿน","group":7,"order":4385,"tags":["archer","archery","arrow","bow","sagittarius","tool","weapon","zodiac"],"version":1,"annotation":"bow and arrow","shortcodes":["bow_and_arrow"]},{"emoji":"๐Ÿ›ก๏ธ","group":7,"order":4387,"tags":["weapon"],"version":0.7,"annotation":"shield","shortcodes":["shield"]},{"emoji":"๐Ÿชš","group":7,"order":4388,"tags":["carpenter","carpentry","cut","lumber","saw","tool","trim"],"version":13,"annotation":"carpentry saw","shortcodes":["carpentry_saw"]},{"emoji":"๐Ÿ”ง","group":7,"order":4389,"tags":["home","improvement","spanner","tool"],"version":0.6,"annotation":"wrench","shortcodes":["wrench"]},{"emoji":"๐Ÿช›","group":7,"order":4390,"tags":["flathead","handy","screw","tool"],"version":13,"annotation":"screwdriver","shortcodes":["screwdriver"]},{"emoji":"๐Ÿ”ฉ","group":7,"order":4391,"tags":["bolt","home","improvement","nut","tool"],"version":0.6,"annotation":"nut and bolt","shortcodes":["nut_and_bolt"]},{"emoji":"โš™๏ธ","group":7,"order":4393,"tags":["cog","cogwheel","tool"],"version":1,"annotation":"gear","shortcodes":["gear"]},{"emoji":"๐Ÿ—œ๏ธ","group":7,"order":4395,"tags":["compress","tool","vice"],"version":0.7,"annotation":"clamp","shortcodes":["clamp","compression"]},{"emoji":"โš–๏ธ","group":7,"order":4397,"tags":["balance","justice","libra","scale","scales","tool","weight","zodiac"],"version":1,"annotation":"balance scale","shortcodes":["scales"]},{"emoji":"๐Ÿฆฏ","group":7,"order":4398,"tags":["accessibility","blind","cane","probing","white"],"version":12,"annotation":"white cane","shortcodes":["probing_cane","white_cane"]},{"emoji":"๐Ÿ”—","group":7,"order":4399,"tags":["links"],"version":0.6,"annotation":"link","shortcodes":["link"]},{"emoji":"โ›“๏ธโ€๐Ÿ’ฅ","group":7,"order":4400,"tags":["break","breaking","broken","chain","cuffs","freedom"],"version":15.1,"annotation":"broken chain","shortcodes":["broken_chain"]},{"emoji":"โ›“๏ธ","group":7,"order":4403,"tags":["chain"],"version":0.7,"annotation":"chains","shortcodes":["chains"]},{"emoji":"๐Ÿช","group":7,"order":4404,"tags":["catch","crook","curve","ensnare","point","selling"],"version":13,"annotation":"hook","shortcodes":["hook"]},{"emoji":"๐Ÿงฐ","group":7,"order":4405,"tags":["box","chest","mechanic","red","tool"],"version":11,"annotation":"toolbox","shortcodes":["toolbox"]},{"emoji":"๐Ÿงฒ","group":7,"order":4406,"tags":["attraction","horseshoe","magnetic","negative","positive","shape","u"],"version":11,"annotation":"magnet","shortcodes":["magnet"]},{"emoji":"๐Ÿชœ","group":7,"order":4407,"tags":["climb","rung","step"],"version":13,"annotation":"ladder","shortcodes":["ladder"]},{"emoji":"๐Ÿช","group":7,"order":4408,"tags":["bury","dig","garden","hole","plant","scoop","snow","spade"],"version":16,"annotation":"shovel","shortcodes":["shovel"]},{"emoji":"โš—๏ธ","group":7,"order":4410,"tags":["chemistry","tool"],"version":1,"annotation":"alembic","shortcodes":["alembic"]},{"emoji":"๐Ÿงช","group":7,"order":4411,"tags":["chemist","chemistry","experiment","lab","science","test","tube"],"version":11,"annotation":"test tube","shortcodes":["test_tube"]},{"emoji":"๐Ÿงซ","group":7,"order":4412,"tags":["bacteria","biologist","biology","culture","dish","lab","petri"],"version":11,"annotation":"petri dish","shortcodes":["petri_dish"]},{"emoji":"๐Ÿงฌ","group":7,"order":4413,"tags":["biologist","evolution","gene","genetics","life"],"version":11,"annotation":"dna","shortcodes":["dna","double_helix"]},{"emoji":"๐Ÿ”ฌ","group":7,"order":4414,"tags":["experiment","lab","science","tool"],"version":1,"annotation":"microscope","shortcodes":["microscope"]},{"emoji":"๐Ÿ”ญ","group":7,"order":4415,"tags":["contact","extraterrestrial","science","tool"],"version":1,"annotation":"telescope","shortcodes":["telescope"]},{"emoji":"๐Ÿ“ก","group":7,"order":4416,"tags":["aliens","antenna","contact","dish","satellite","science"],"version":0.6,"annotation":"satellite antenna","shortcodes":["satellite_antenna"]},{"emoji":"๐Ÿ’‰","group":7,"order":4417,"tags":["doctor","flu","medicine","needle","shot","sick","tool","vaccination"],"version":0.6,"annotation":"syringe","shortcodes":["syringe"]},{"emoji":"๐Ÿฉธ","group":7,"order":4418,"tags":["bleed","blood","donation","drop","injury","medicine","menstruation"],"version":12,"annotation":"drop of blood","shortcodes":["drop_of_blood"]},{"emoji":"๐Ÿ’Š","group":7,"order":4419,"tags":["doctor","drugs","medicated","medicine","pills","sick","vitamin"],"version":0.6,"annotation":"pill","shortcodes":["pill"]},{"emoji":"๐Ÿฉน","group":7,"order":4420,"tags":["adhesive","bandage"],"version":12,"annotation":"adhesive bandage","shortcodes":["adhesive_bandage","bandaid"]},{"emoji":"๐Ÿฉผ","group":7,"order":4421,"tags":["aid","cane","disability","help","hurt","injured","mobility","stick"],"version":14,"annotation":"crutch","shortcodes":["crutch"]},{"emoji":"๐Ÿฉบ","group":7,"order":4422,"tags":["doctor","heart","medicine"],"version":12,"annotation":"stethoscope","shortcodes":["stethoscope"]},{"emoji":"๐Ÿฉป","group":7,"order":4423,"tags":["bones","doctor","medical","skeleton","skull","xray"],"version":14,"annotation":"x-ray","shortcodes":["x-ray","xray"]},{"emoji":"๐Ÿšช","group":7,"order":4424,"tags":["back","closet","front"],"version":0.6,"annotation":"door","shortcodes":["door"]},{"emoji":"๐Ÿ›—","group":7,"order":4425,"tags":["accessibility","hoist","lift"],"version":13,"annotation":"elevator","shortcodes":["elevator"]},{"emoji":"๐Ÿชž","group":7,"order":4426,"tags":["makeup","reflection","reflector","speculum"],"version":13,"annotation":"mirror","shortcodes":["mirror"]},{"emoji":"๐ŸชŸ","group":7,"order":4427,"tags":["air","frame","fresh","opening","transparent","view"],"version":13,"annotation":"window","shortcodes":["window"]},{"emoji":"๐Ÿ›๏ธ","group":7,"order":4429,"tags":["hotel","sleep"],"version":0.7,"annotation":"bed","shortcodes":["bed"]},{"emoji":"๐Ÿ›‹๏ธ","group":7,"order":4431,"tags":["couch","hotel","lamp"],"version":0.7,"annotation":"couch and lamp","shortcodes":["couch_and_lamp"]},{"emoji":"๐Ÿช‘","group":7,"order":4432,"tags":["seat","sit"],"version":12,"annotation":"chair","shortcodes":["chair"]},{"emoji":"๐Ÿšฝ","group":7,"order":4433,"tags":["bathroom"],"version":0.6,"annotation":"toilet","shortcodes":["toilet"]},{"emoji":"๐Ÿช ","group":7,"order":4434,"tags":["cup","force","plumber","poop","suction","toilet"],"version":13,"annotation":"plunger","shortcodes":["plunger"]},{"emoji":"๐Ÿšฟ","group":7,"order":4435,"tags":["water"],"version":1,"annotation":"shower","shortcodes":["shower"]},{"emoji":"๐Ÿ›","group":7,"order":4436,"tags":["bath"],"version":1,"annotation":"bathtub","shortcodes":["bathtub"]},{"emoji":"๐Ÿชค","group":7,"order":4437,"tags":["bait","cheese","lure","mouse","mousetrap","snare","trap"],"version":13,"annotation":"mouse trap","shortcodes":["mouse_trap"]},{"emoji":"๐Ÿช’","group":7,"order":4438,"tags":["sharp","shave"],"version":12,"annotation":"razor","shortcodes":["razor"]},{"emoji":"๐Ÿงด","group":7,"order":4439,"tags":["bottle","lotion","moisturizer","shampoo","sunscreen"],"version":11,"annotation":"lotion bottle","shortcodes":["lotion_bottle"]},{"emoji":"๐Ÿงท","group":7,"order":4440,"tags":["diaper","pin","punk","rock","safety"],"version":11,"annotation":"safety pin","shortcodes":["safety_pin"]},{"emoji":"๐Ÿงน","group":7,"order":4441,"tags":["cleaning","sweeping","witch"],"version":11,"annotation":"broom","shortcodes":["broom"]},{"emoji":"๐Ÿงบ","group":7,"order":4442,"tags":["farming","laundry","picnic"],"version":11,"annotation":"basket","shortcodes":["basket"]},{"emoji":"๐Ÿงป","group":7,"order":4443,"tags":["paper","roll","toilet","towels"],"version":11,"annotation":"roll of paper","shortcodes":["roll_of_paper","toilet_paper"]},{"emoji":"๐Ÿชฃ","group":7,"order":4444,"tags":["cask","pail","vat"],"version":13,"annotation":"bucket","shortcodes":["bucket"]},{"emoji":"๐Ÿงผ","group":7,"order":4445,"tags":["bar","bathing","clean","cleaning","lather","soapdish"],"version":11,"annotation":"soap","shortcodes":["soap"]},{"emoji":"๐Ÿซง","group":7,"order":4446,"tags":["bubble","burp","clean","floating","pearl","soap","underwater"],"version":14,"annotation":"bubbles","shortcodes":["bubbles"]},{"emoji":"๐Ÿชฅ","group":7,"order":4447,"tags":["bathroom","brush","clean","dental","hygiene","teeth","toiletry"],"version":13,"annotation":"toothbrush","shortcodes":["toothbrush"]},{"emoji":"๐Ÿงฝ","group":7,"order":4448,"tags":["absorbing","cleaning","porous","soak"],"version":11,"annotation":"sponge","shortcodes":["sponge"]},{"emoji":"๐Ÿงฏ","group":7,"order":4449,"tags":["extinguish","extinguisher","fire","quench"],"version":11,"annotation":"fire extinguisher","shortcodes":["fire_extinguisher"]},{"emoji":"๐Ÿ›’","group":7,"order":4450,"tags":["cart","shopping","trolley"],"version":3,"annotation":"shopping cart","shortcodes":["shopping_cart"]},{"emoji":"๐Ÿšฌ","group":7,"order":4451,"tags":["smoking"],"version":0.6,"annotation":"cigarette","shortcodes":["cigarette","smoking"]},{"emoji":"โšฐ๏ธ","group":7,"order":4453,"tags":["dead","death","vampire"],"version":1,"annotation":"coffin","shortcodes":["coffin"]},{"emoji":"๐Ÿชฆ","group":7,"order":4454,"tags":["cemetery","dead","grave","graveyard","memorial","rip","tomb","tombstone"],"version":13,"annotation":"headstone","shortcodes":["headstone"]},{"emoji":"โšฑ๏ธ","group":7,"order":4456,"tags":["ashes","death","funeral","urn"],"version":1,"annotation":"funeral urn","shortcodes":["funeral_urn"]},{"emoji":"๐Ÿงฟ","group":7,"order":4457,"tags":["amulet","bead","blue","charm","evil-eye","nazar","talisman"],"version":11,"annotation":"nazar amulet","shortcodes":["nazar_amulet"]},{"emoji":"๐Ÿชฌ","group":7,"order":4458,"tags":["amulet","fatima","fortune","guide","hand","mary","miriam","palm","protect","protection"],"version":14,"annotation":"hamsa","shortcodes":["hamsa"]},{"emoji":"๐Ÿ—ฟ","group":7,"order":4459,"tags":["face","moyai","statue","stoneface","travel"],"version":0.6,"annotation":"moai","shortcodes":["moai","moyai"]},{"emoji":"๐Ÿชง","group":7,"order":4460,"tags":["card","demonstration","notice","picket","plaque","protest","sign"],"version":13,"annotation":"placard","shortcodes":["placard"]},{"emoji":"๐Ÿชช","group":7,"order":4461,"tags":["card","credentials","document","id","identification","license","security"],"version":14,"annotation":"identification card","shortcodes":["id_card"]},{"emoji":"๐Ÿง","group":8,"order":4462,"tags":["atm","automated","bank","cash","money","sign","teller"],"version":0.6,"annotation":"ATM sign","shortcodes":["atm"]},{"emoji":"๐Ÿšฎ","group":8,"order":4463,"tags":["bin","litter","litterbin","sign"],"version":1,"annotation":"litter in bin sign","shortcodes":["litter_bin","put_litter_in_its_place"]},{"emoji":"๐Ÿšฐ","group":8,"order":4464,"tags":["drinking","potable","water"],"version":1,"annotation":"potable water","shortcodes":["potable_water"]},{"emoji":"โ™ฟ๏ธ","group":8,"order":4465,"tags":["access","handicap","symbol","wheelchair"],"version":0.6,"annotation":"wheelchair symbol","shortcodes":["handicapped","wheelchair"]},{"emoji":"๐Ÿšน๏ธ","group":8,"order":4466,"tags":["bathroom","lavatory","man","menโ€™s","restroom","room","toilet","wc"],"version":0.6,"annotation":"menโ€™s room","shortcodes":["mens"]},{"emoji":"๐Ÿšบ๏ธ","group":8,"order":4467,"tags":["bathroom","lavatory","restroom","room","toilet","wc","woman","womenโ€™s"],"version":0.6,"annotation":"womenโ€™s room","shortcodes":["womens"]},{"emoji":"๐Ÿšป","group":8,"order":4468,"tags":["bathroom","lavatory","toilet","wc"],"version":0.6,"annotation":"restroom","shortcodes":["bathroom","restroom"]},{"emoji":"๐Ÿšผ๏ธ","group":8,"order":4469,"tags":["baby","changing","symbol"],"version":0.6,"annotation":"baby symbol","shortcodes":["baby_symbol"]},{"emoji":"๐Ÿšพ","group":8,"order":4470,"tags":["bathroom","closet","lavatory","restroom","toilet","water","wc"],"version":0.6,"annotation":"water closet","shortcodes":["water_closet","wc"]},{"emoji":"๐Ÿ›‚","group":8,"order":4471,"tags":["control","passport"],"version":1,"annotation":"passport control","shortcodes":["passport_control"]},{"emoji":"๐Ÿ›ƒ","group":8,"order":4472,"tags":["packing"],"version":1,"annotation":"customs","shortcodes":["customs"]},{"emoji":"๐Ÿ›„","group":8,"order":4473,"tags":["arrived","baggage","bags","case","checked","claim","journey","packing","plane","ready","travel","trip"],"version":1,"annotation":"baggage claim","shortcodes":["baggage_claim"]},{"emoji":"๐Ÿ›…","group":8,"order":4474,"tags":["baggage","case","left","locker","luggage"],"version":1,"annotation":"left luggage","shortcodes":["left_luggage"]},{"emoji":"โš ๏ธ","group":8,"order":4476,"tags":["caution"],"version":0.6,"annotation":"warning","shortcodes":["warning"]},{"emoji":"๐Ÿšธ","group":8,"order":4477,"tags":["child","children","crossing","pedestrian","traffic"],"version":1,"annotation":"children crossing","shortcodes":["children_crossing"]},{"emoji":"โ›”๏ธ","group":8,"order":4478,"tags":["do","entry","fail","forbidden","no","not","pass","prohibited","traffic"],"version":0.6,"annotation":"no entry","shortcodes":["no_entry"]},{"emoji":"๐Ÿšซ","group":8,"order":4479,"tags":["entry","forbidden","no","not","smoke"],"version":0.6,"annotation":"prohibited","shortcodes":["no_entry_sign"]},{"emoji":"๐Ÿšณ","group":8,"order":4480,"tags":["bicycle","bicycles","bike","forbidden","no","not","prohibited"],"version":1,"annotation":"no bicycles","shortcodes":["no_bicycles"]},{"emoji":"๐Ÿšญ๏ธ","group":8,"order":4481,"tags":["forbidden","no","not","prohibited","smoke","smoking"],"version":0.6,"annotation":"no smoking","shortcodes":["no_smoking"]},{"emoji":"๐Ÿšฏ","group":8,"order":4482,"tags":["forbidden","litter","littering","no","not","prohibited"],"version":1,"annotation":"no littering","shortcodes":["do_not_litter","no_littering"]},{"emoji":"๐Ÿšฑ","group":8,"order":4483,"tags":["dry","non-drinking","non-potable","prohibited","water"],"version":1,"annotation":"non-potable water","shortcodes":["non-potable_water"]},{"emoji":"๐Ÿšท","group":8,"order":4484,"tags":["forbidden","no","not","pedestrian","pedestrians","prohibited"],"version":1,"annotation":"no pedestrians","shortcodes":["no_pedestrians"]},{"emoji":"๐Ÿ“ต","group":8,"order":4485,"tags":["cell","forbidden","mobile","no","not","phone","phones","prohibited","telephone"],"version":1,"annotation":"no mobile phones","shortcodes":["no_mobile_phones"]},{"emoji":"๐Ÿ”ž","group":8,"order":4486,"tags":["18","age","eighteen","forbidden","no","not","one","prohibited","restriction","underage"],"version":0.6,"annotation":"no one under eighteen","shortcodes":["no_one_under_18","underage"]},{"emoji":"โ˜ข๏ธ","group":8,"order":4488,"tags":["sign"],"version":1,"annotation":"radioactive","shortcodes":["radioactive"]},{"emoji":"โ˜ฃ๏ธ","group":8,"order":4490,"tags":["sign"],"version":1,"annotation":"biohazard","shortcodes":["biohazard"]},{"emoji":"โฌ†๏ธ","group":8,"order":4492,"tags":["arrow","cardinal","direction","north","up"],"version":0.6,"annotation":"up arrow","shortcodes":["arrow_up"]},{"emoji":"โ†—๏ธ","group":8,"order":4494,"tags":["arrow","direction","intercardinal","northeast","up-right"],"version":0.6,"annotation":"up-right arrow","shortcodes":["arrow_upper_right"]},{"emoji":"โžก๏ธ","group":8,"order":4496,"tags":["arrow","cardinal","direction","east","right"],"version":0.6,"annotation":"right arrow","shortcodes":["arrow_right"]},{"emoji":"โ†˜๏ธ","group":8,"order":4498,"tags":["arrow","direction","down-right","intercardinal","southeast"],"version":0.6,"annotation":"down-right arrow","shortcodes":["arrow_lower_right"]},{"emoji":"โฌ‡๏ธ","group":8,"order":4500,"tags":["arrow","cardinal","direction","down","south"],"version":0.6,"annotation":"down arrow","shortcodes":["arrow_down"]},{"emoji":"โ†™๏ธ","group":8,"order":4502,"tags":["arrow","direction","down-left","intercardinal","southwest"],"version":0.6,"annotation":"down-left arrow","shortcodes":["arrow_lower_left"]},{"emoji":"โฌ…๏ธ","group":8,"order":4504,"tags":["arrow","cardinal","direction","left","west"],"version":0.6,"annotation":"left arrow","shortcodes":["arrow_left"]},{"emoji":"โ†–๏ธ","group":8,"order":4506,"tags":["arrow","direction","intercardinal","northwest","up-left"],"version":0.6,"annotation":"up-left arrow","shortcodes":["arrow_upper_left"]},{"emoji":"โ†•๏ธ","group":8,"order":4508,"tags":["arrow","up-down"],"version":0.6,"annotation":"up-down arrow","shortcodes":["arrow_up_down"]},{"emoji":"โ†”๏ธ","group":8,"order":4510,"tags":["arrow","left-right"],"version":0.6,"annotation":"left-right arrow","shortcodes":["left_right_arrow"]},{"emoji":"โ†ฉ๏ธ","group":8,"order":4512,"tags":["arrow","curving","left","right"],"version":0.6,"annotation":"right arrow curving left","shortcodes":["arrow_left_hook","leftwards_arrow_with_hook"]},{"emoji":"โ†ช๏ธ","group":8,"order":4514,"tags":["arrow","curving","left","right"],"version":0.6,"annotation":"left arrow curving right","shortcodes":["arrow_right_hook","rightwards_arrow_with_hook"]},{"emoji":"โคด๏ธ","group":8,"order":4516,"tags":["arrow","curving","right","up"],"version":0.6,"annotation":"right arrow curving up","shortcodes":["arrow_heading_up"]},{"emoji":"โคต๏ธ","group":8,"order":4518,"tags":["arrow","curving","down","right"],"version":0.6,"annotation":"right arrow curving down","shortcodes":["arrow_heading_down"]},{"emoji":"๐Ÿ”ƒ","group":8,"order":4519,"tags":["arrow","arrows","clockwise","refresh","reload","vertical"],"version":0.6,"annotation":"clockwise vertical arrows","shortcodes":["arrows_clockwise","clockwise"]},{"emoji":"๐Ÿ”„","group":8,"order":4520,"tags":["again","anticlockwise","arrow","arrows","button","counterclockwise","deja","refresh","rewindershins","vu"],"version":1,"annotation":"counterclockwise arrows button","shortcodes":["arrows_counterclockwise","counterclockwise"]},{"emoji":"๐Ÿ”™","group":8,"order":4521,"tags":["arrow","back"],"version":0.6,"annotation":"BACK arrow","shortcodes":["back"]},{"emoji":"๐Ÿ”š","group":8,"order":4522,"tags":["arrow","end"],"version":0.6,"annotation":"END arrow","shortcodes":["end"]},{"emoji":"๐Ÿ”›","group":8,"order":4523,"tags":["arrow","mark","on!"],"version":0.6,"annotation":"ON! arrow","shortcodes":["on"]},{"emoji":"๐Ÿ”œ","group":8,"order":4524,"tags":["arrow","brb","omw","soon"],"version":0.6,"annotation":"SOON arrow","shortcodes":["soon"]},{"emoji":"๐Ÿ”","group":8,"order":4525,"tags":["arrow","homie","top","up"],"version":0.6,"annotation":"TOP arrow","shortcodes":["top"]},{"emoji":"๐Ÿ›","group":8,"order":4526,"tags":["place","pray","religion","worship"],"version":1,"annotation":"place of worship","shortcodes":["place_of_worship"]},{"emoji":"โš›๏ธ","group":8,"order":4528,"tags":["atheist","atom","symbol"],"version":1,"annotation":"atom symbol","shortcodes":["atom","atom_symbol"]},{"emoji":"๐Ÿ•‰๏ธ","group":8,"order":4530,"tags":["hindu","religion"],"version":0.7,"annotation":"om","shortcodes":["om"]},{"emoji":"โœก๏ธ","group":8,"order":4532,"tags":["david","jew","jewish","judaism","religion","star"],"version":0.7,"annotation":"star of David","shortcodes":["star_of_david"]},{"emoji":"โ˜ธ๏ธ","group":8,"order":4534,"tags":["buddhist","dharma","religion","wheel"],"version":0.7,"annotation":"wheel of dharma","shortcodes":["wheel_of_dharma"]},{"emoji":"โ˜ฏ๏ธ","group":8,"order":4536,"tags":["difficult","lives","religion","tao","taoist","total","yang","yin","yinyang"],"version":0.7,"annotation":"yin yang","shortcodes":["yin_yang"]},{"emoji":"โœ๏ธ","group":8,"order":4538,"tags":["christ","christian","cross","latin","religion"],"version":0.7,"annotation":"latin cross","shortcodes":["latin_cross"]},{"emoji":"โ˜ฆ๏ธ","group":8,"order":4540,"tags":["christian","cross","orthodox","religion"],"version":1,"annotation":"orthodox cross","shortcodes":["orthodox_cross"]},{"emoji":"โ˜ช๏ธ","group":8,"order":4542,"tags":["crescent","islam","muslim","ramadan","religion","star"],"version":0.7,"annotation":"star and crescent","shortcodes":["star_and_crescent"]},{"emoji":"โ˜ฎ๏ธ","group":8,"order":4544,"tags":["healing","peace","peaceful","symbol"],"version":1,"annotation":"peace symbol","shortcodes":["peace","peace_symbol"]},{"emoji":"๐Ÿ•Ž","group":8,"order":4545,"tags":["candelabrum","candlestick","hanukkah","jewish","judaism","religion"],"version":1,"annotation":"menorah","shortcodes":["menorah"]},{"emoji":"๐Ÿ”ฏ","group":8,"order":4546,"tags":["dotted","fortune","jewish","judaism","six-pointed","star"],"version":0.6,"annotation":"dotted six-pointed star","shortcodes":["six_pointed_star"]},{"emoji":"๐Ÿชฏ","group":8,"order":4547,"tags":["deg","fateh","khalsa","religion","sikh","sikhism","tegh"],"version":15,"annotation":"khanda","shortcodes":["khanda"]},{"emoji":"โ™ˆ๏ธ","group":8,"order":4548,"tags":["aries","horoscope","ram","zodiac"],"version":0.6,"annotation":"Aries","shortcodes":["aries"]},{"emoji":"โ™‰๏ธ","group":8,"order":4549,"tags":["bull","horoscope","ox","taurus","zodiac"],"version":0.6,"annotation":"Taurus","shortcodes":["taurus"]},{"emoji":"โ™Š๏ธ","group":8,"order":4550,"tags":["gemini","horoscope","twins","zodiac"],"version":0.6,"annotation":"Gemini","shortcodes":["gemini"]},{"emoji":"โ™‹๏ธ","group":8,"order":4551,"tags":["cancer","crab","horoscope","zodiac"],"version":0.6,"annotation":"Cancer","shortcodes":["cancer"]},{"emoji":"โ™Œ๏ธ","group":8,"order":4552,"tags":["horoscope","leo","lion","zodiac"],"version":0.6,"annotation":"Leo","shortcodes":["leo"]},{"emoji":"โ™๏ธ","group":8,"order":4553,"tags":["horoscope","virgo","zodiac"],"version":0.6,"annotation":"Virgo","shortcodes":["virgo"]},{"emoji":"โ™Ž๏ธ","group":8,"order":4554,"tags":["balance","horoscope","justice","libra","scales","zodiac"],"version":0.6,"annotation":"Libra","shortcodes":["libra"]},{"emoji":"โ™๏ธ","group":8,"order":4555,"tags":["horoscope","scorpio","scorpion","scorpius","zodiac"],"version":0.6,"annotation":"Scorpio","shortcodes":["scorpius"]},{"emoji":"โ™๏ธ","group":8,"order":4556,"tags":["archer","horoscope","sagittarius","zodiac"],"version":0.6,"annotation":"Sagittarius","shortcodes":["sagittarius"]},{"emoji":"โ™‘๏ธ","group":8,"order":4557,"tags":["capricorn","goat","horoscope","zodiac"],"version":0.6,"annotation":"Capricorn","shortcodes":["capricorn"]},{"emoji":"โ™’๏ธ","group":8,"order":4558,"tags":["aquarius","bearer","horoscope","water","zodiac"],"version":0.6,"annotation":"Aquarius","shortcodes":["aquarius"]},{"emoji":"โ™“๏ธ","group":8,"order":4559,"tags":["fish","horoscope","pisces","zodiac"],"version":0.6,"annotation":"Pisces","shortcodes":["pisces"]},{"emoji":"โ›Ž๏ธ","group":8,"order":4560,"tags":["bearer","ophiuchus","serpent","snake","zodiac"],"version":0.6,"annotation":"Ophiuchus","shortcodes":["ophiuchus"]},{"emoji":"๐Ÿ”€","group":8,"order":4561,"tags":["arrow","button","crossed","shuffle","tracks"],"version":1,"annotation":"shuffle tracks button","shortcodes":["shuffle","twisted_rightwards_arrows"]},{"emoji":"๐Ÿ”","group":8,"order":4562,"tags":["arrow","button","clockwise","repeat"],"version":1,"annotation":"repeat button","shortcodes":["repeat"]},{"emoji":"๐Ÿ”‚","group":8,"order":4563,"tags":["arrow","button","clockwise","once","repeat","single"],"version":1,"annotation":"repeat single button","shortcodes":["repeat_one"]},{"emoji":"โ–ถ๏ธ","group":8,"order":4565,"tags":["arrow","button","play","right","triangle"],"version":0.6,"annotation":"play button","shortcodes":["arrow_forward","play"]},{"emoji":"โฉ๏ธ","group":8,"order":4566,"tags":["arrow","button","double","fast","fast-forward","forward"],"version":0.6,"annotation":"fast-forward button","shortcodes":["fast_forward"]},{"emoji":"โญ๏ธ","group":8,"order":4568,"tags":["arrow","button","next","scene","track","triangle"],"version":0.7,"annotation":"next track button","shortcodes":["next_track"]},{"emoji":"โฏ๏ธ","group":8,"order":4570,"tags":["arrow","button","pause","play","right","triangle"],"version":1,"annotation":"play or pause button","shortcodes":["play_pause"]},{"emoji":"โ—€๏ธ","group":8,"order":4572,"tags":["arrow","button","left","reverse","triangle"],"version":0.6,"annotation":"reverse button","shortcodes":["arrow_backward","reverse"]},{"emoji":"โช๏ธ","group":8,"order":4573,"tags":["arrow","button","double","fast","reverse","rewind"],"version":0.6,"annotation":"fast reverse button","shortcodes":["fast_reverse","rewind"]},{"emoji":"โฎ๏ธ","group":8,"order":4575,"tags":["arrow","button","last","previous","scene","track","triangle"],"version":0.7,"annotation":"last track button","shortcodes":["previous_track"]},{"emoji":"๐Ÿ”ผ","group":8,"order":4576,"tags":["arrow","button","red","up","upwards"],"version":0.6,"annotation":"upwards button","shortcodes":["arrow_up_small","up"]},{"emoji":"โซ๏ธ","group":8,"order":4577,"tags":["arrow","button","double","fast","up"],"version":0.6,"annotation":"fast up button","shortcodes":["arrow_double_up","fast_up"]},{"emoji":"๐Ÿ”ฝ","group":8,"order":4578,"tags":["arrow","button","down","downwards","red"],"version":0.6,"annotation":"downwards button","shortcodes":["arrow_down_small","down"]},{"emoji":"โฌ๏ธ","group":8,"order":4579,"tags":["arrow","button","double","down","fast"],"version":0.6,"annotation":"fast down button","shortcodes":["arrow_double_down","fast_down"]},{"emoji":"โธ๏ธ","group":8,"order":4581,"tags":["bar","button","double","pause","vertical"],"version":0.7,"annotation":"pause button","shortcodes":["pause"]},{"emoji":"โน๏ธ","group":8,"order":4583,"tags":["button","square","stop"],"version":0.7,"annotation":"stop button","shortcodes":["stop"]},{"emoji":"โบ๏ธ","group":8,"order":4585,"tags":["button","circle","record"],"version":0.7,"annotation":"record button","shortcodes":["record"]},{"emoji":"โ๏ธ","group":8,"order":4587,"tags":["button","eject"],"version":1,"annotation":"eject button","shortcodes":["eject"]},{"emoji":"๐ŸŽฆ","group":8,"order":4588,"tags":["camera","film","movie"],"version":0.6,"annotation":"cinema","shortcodes":["cinema"]},{"emoji":"๐Ÿ”…","group":8,"order":4589,"tags":["brightness","button","dim","low"],"version":1,"annotation":"dim button","shortcodes":["dim_button","low_brightness"]},{"emoji":"๐Ÿ”†","group":8,"order":4590,"tags":["bright","brightness","button","light"],"version":1,"annotation":"bright button","shortcodes":["bright_button","high_brightness"]},{"emoji":"๐Ÿ“ถ","group":8,"order":4591,"tags":["antenna","bar","bars","cell","communication","mobile","phone","signal","telephone"],"version":0.6,"annotation":"antenna bars","shortcodes":["antenna_bars","signal_strength"]},{"emoji":"๐Ÿ›œ","group":8,"order":4592,"tags":["broadband","computer","connectivity","hotspot","internet","network","router","smartphone","wi-fi","wifi","wlan"],"version":15,"annotation":"wireless","shortcodes":["wireless"]},{"emoji":"๐Ÿ“ณ","group":8,"order":4593,"tags":["cell","communication","mobile","mode","phone","telephone","vibration"],"version":0.6,"annotation":"vibration mode","shortcodes":["vibration_mode"]},{"emoji":"๐Ÿ“ด","group":8,"order":4594,"tags":["cell","mobile","off","phone","telephone"],"version":0.6,"annotation":"mobile phone off","shortcodes":["mobile_phone_off"]},{"emoji":"โ™€๏ธ","group":8,"order":4596,"tags":["female","sign","woman"],"version":4,"annotation":"female sign","shortcodes":["female","female_sign"]},{"emoji":"โ™‚๏ธ","group":8,"order":4598,"tags":["male","man","sign"],"version":4,"annotation":"male sign","shortcodes":["male","male_sign"]},{"emoji":"โšง๏ธ","group":8,"order":4600,"tags":["symbol","transgender"],"version":13,"annotation":"transgender symbol","shortcodes":["transgender_symbol"]},{"emoji":"โœ–๏ธ","group":8,"order":4602,"tags":["cancel","multiplication","sign","x","ร—"],"version":0.6,"annotation":"multiply","shortcodes":["multiplication","multiply"]},{"emoji":"โž•๏ธ","group":8,"order":4603,"tags":["+"],"version":0.6,"annotation":"plus","shortcodes":["plus"]},{"emoji":"โž–๏ธ","group":8,"order":4604,"tags":["-","heavy","math","sign","โˆ’"],"version":0.6,"annotation":"minus","shortcodes":["minus"]},{"emoji":"โž—๏ธ","group":8,"order":4605,"tags":["division","heavy","math","sign","รท"],"version":0.6,"annotation":"divide","shortcodes":["divide","division"]},{"emoji":"๐ŸŸฐ","group":8,"order":4606,"tags":["answer","equal","equality","equals","heavy","math","sign"],"version":14,"annotation":"heavy equals sign","shortcodes":["heavy_equals_sign"]},{"emoji":"โ™พ๏ธ","group":8,"order":4608,"tags":["forever","unbounded","universal"],"version":11,"annotation":"infinity","shortcodes":["infinity"]},{"emoji":"โ€ผ๏ธ","group":8,"order":4610,"tags":["!","!!","bangbang","double","exclamation","mark","punctuation"],"version":0.6,"annotation":"double exclamation mark","shortcodes":["bangbang","double_exclamation"]},{"emoji":"โ‰๏ธ","group":8,"order":4612,"tags":["!","!?","?","exclamation","interrobang","mark","punctuation","question"],"version":0.6,"annotation":"exclamation question mark","shortcodes":["exclamation_question","interrobang"]},{"emoji":"โ“๏ธ","group":8,"order":4613,"tags":["?","mark","punctuation","question","red"],"version":0.6,"annotation":"red question mark","shortcodes":["question"]},{"emoji":"โ”๏ธ","group":8,"order":4614,"tags":["?","mark","outlined","punctuation","question","white"],"version":0.6,"annotation":"white question mark","shortcodes":["white_question"]},{"emoji":"โ•๏ธ","group":8,"order":4615,"tags":["!","exclamation","mark","outlined","punctuation","white"],"version":0.6,"annotation":"white exclamation mark","shortcodes":["white_exclamation"]},{"emoji":"โ—๏ธ","group":8,"order":4616,"tags":["!","exclamation","mark","punctuation","red"],"version":0.6,"annotation":"red exclamation mark","shortcodes":["exclamation"]},{"emoji":"ใ€ฐ๏ธ","group":8,"order":4618,"tags":["dash","punctuation","wavy"],"version":0.6,"annotation":"wavy dash","shortcodes":["wavy_dash"]},{"emoji":"๐Ÿ’ฑ","group":8,"order":4619,"tags":["bank","currency","exchange","money"],"version":0.6,"annotation":"currency exchange","shortcodes":["currency_exchange"]},{"emoji":"๐Ÿ’ฒ","group":8,"order":4620,"tags":["billion","cash","charge","currency","dollar","heavy","million","money","pay","sign"],"version":0.6,"annotation":"heavy dollar sign","shortcodes":["heavy_dollar_sign"]},{"emoji":"โš•๏ธ","group":8,"order":4622,"tags":["aesculapius","medical","medicine","staff","symbol"],"version":4,"annotation":"medical symbol","shortcodes":["medical","medical_symbol"]},{"emoji":"โ™ป๏ธ","group":8,"order":4624,"tags":["recycle","recycling","symbol"],"version":0.6,"annotation":"recycling symbol","shortcodes":["recycle","recycling_symbol"]},{"emoji":"โšœ๏ธ","group":8,"order":4626,"tags":["knights"],"version":1,"annotation":"fleur-de-lis","shortcodes":["fleur-de-lis"]},{"emoji":"๐Ÿ”ฑ","group":8,"order":4627,"tags":["anchor","emblem","poseidon","ship","tool","trident"],"version":0.6,"annotation":"trident emblem","shortcodes":["trident"]},{"emoji":"๐Ÿ“›","group":8,"order":4628,"tags":["badge","name"],"version":0.6,"annotation":"name badge","shortcodes":["name_badge"]},{"emoji":"๐Ÿ”ฐ","group":8,"order":4629,"tags":["beginner","chevron","green","japanese","leaf","symbol","tool","yellow"],"version":0.6,"annotation":"Japanese symbol for beginner","shortcodes":["beginner"]},{"emoji":"โญ•๏ธ","group":8,"order":4630,"tags":["circle","heavy","hollow","large","o","red"],"version":0.6,"annotation":"hollow red circle","shortcodes":["hollow_red_circle","red_o"]},{"emoji":"โœ…๏ธ","group":8,"order":4631,"tags":["button","check","checked","checkmark","complete","completed","done","fixed","mark","tick","โœ“"],"version":0.6,"annotation":"check mark button","shortcodes":["check_mark_button","white_check_mark"]},{"emoji":"โ˜‘๏ธ","group":8,"order":4633,"tags":["ballot","box","check","checked","done","off","tick","โœ“"],"version":0.6,"annotation":"check box with check","shortcodes":["ballot_box_with_check"]},{"emoji":"โœ”๏ธ","group":8,"order":4635,"tags":["check","checked","checkmark","done","heavy","mark","tick","โœ“"],"version":0.6,"annotation":"check mark","shortcodes":["check_mark","heavy_check_mark"]},{"emoji":"โŒ๏ธ","group":8,"order":4636,"tags":["cancel","cross","mark","multiplication","multiply","x","ร—"],"version":0.6,"annotation":"cross mark","shortcodes":["cross_mark","x"]},{"emoji":"โŽ๏ธ","group":8,"order":4637,"tags":["button","cross","mark","multiplication","multiply","square","x","ร—"],"version":0.6,"annotation":"cross mark button","shortcodes":["cross_mark_button","negative_squared_cross_mark"]},{"emoji":"โžฐ๏ธ","group":8,"order":4638,"tags":["curl","curly","loop"],"version":0.6,"annotation":"curly loop","shortcodes":["curly_loop"]},{"emoji":"โžฟ๏ธ","group":8,"order":4639,"tags":["curl","curly","double","loop"],"version":1,"annotation":"double curly loop","shortcodes":["double_curly_loop","loop"]},{"emoji":"ใ€ฝ๏ธ","group":8,"order":4641,"tags":["alternation","mark","part"],"version":0.6,"annotation":"part alternation mark","shortcodes":["part_alternation_mark"]},{"emoji":"โœณ๏ธ","group":8,"order":4643,"tags":["*","asterisk","eight-spoked"],"version":0.6,"annotation":"eight-spoked asterisk","shortcodes":["eight_spoked_asterisk"]},{"emoji":"โœด๏ธ","group":8,"order":4645,"tags":["*","eight-pointed","star"],"version":0.6,"annotation":"eight-pointed star","shortcodes":["eight_pointed_black_star"]},{"emoji":"โ‡๏ธ","group":8,"order":4647,"tags":["*"],"version":0.6,"annotation":"sparkle","shortcodes":["sparkle"]},{"emoji":"ยฉ๏ธ","group":8,"order":4649,"tags":["c"],"version":0.6,"annotation":"copyright","shortcodes":["copyright"]},{"emoji":"ยฎ๏ธ","group":8,"order":4651,"tags":["r"],"version":0.6,"annotation":"registered","shortcodes":["registered"]},{"emoji":"โ„ข๏ธ","group":8,"order":4653,"tags":["mark","tm","trade","trademark"],"version":0.6,"annotation":"trade mark","shortcodes":["tm","trade_mark"]},{"emoji":"๐ŸซŸ","group":8,"order":4654,"tags":["drip","holi","ink","liquid","mess","paint","spill","stain"],"version":16,"annotation":"splatter","shortcodes":["splatter"]},{"emoji":"#๏ธโƒฃ","group":8,"order":4655,"tags":["keycap"],"version":0.6,"annotation":"keycap: #","shortcodes":["hash","number_sign"]},{"emoji":"*๏ธโƒฃ","group":8,"order":4657,"tags":["keycap"],"version":2,"annotation":"keycap: *","shortcodes":["asterisk"]},{"emoji":"0๏ธโƒฃ","group":8,"order":4659,"tags":["keycap"],"version":0.6,"annotation":"keycap: 0","shortcodes":["zero"]},{"emoji":"1๏ธโƒฃ","group":8,"order":4661,"tags":["keycap"],"version":0.6,"annotation":"keycap: 1","shortcodes":["one"]},{"emoji":"2๏ธโƒฃ","group":8,"order":4663,"tags":["keycap"],"version":0.6,"annotation":"keycap: 2","shortcodes":["two"]},{"emoji":"3๏ธโƒฃ","group":8,"order":4665,"tags":["keycap"],"version":0.6,"annotation":"keycap: 3","shortcodes":["three"]},{"emoji":"4๏ธโƒฃ","group":8,"order":4667,"tags":["keycap"],"version":0.6,"annotation":"keycap: 4","shortcodes":["four"]},{"emoji":"5๏ธโƒฃ","group":8,"order":4669,"tags":["keycap"],"version":0.6,"annotation":"keycap: 5","shortcodes":["five"]},{"emoji":"6๏ธโƒฃ","group":8,"order":4671,"tags":["keycap"],"version":0.6,"annotation":"keycap: 6","shortcodes":["six"]},{"emoji":"7๏ธโƒฃ","group":8,"order":4673,"tags":["keycap"],"version":0.6,"annotation":"keycap: 7","shortcodes":["seven"]},{"emoji":"8๏ธโƒฃ","group":8,"order":4675,"tags":["keycap"],"version":0.6,"annotation":"keycap: 8","shortcodes":["eight"]},{"emoji":"9๏ธโƒฃ","group":8,"order":4677,"tags":["keycap"],"version":0.6,"annotation":"keycap: 9","shortcodes":["nine"]},{"emoji":"๐Ÿ”Ÿ","group":8,"order":4679,"tags":["keycap"],"version":0.6,"annotation":"keycap: 10","shortcodes":["ten"]},{"emoji":"๐Ÿ” ","group":8,"order":4680,"tags":["abcd","input","latin","letters","uppercase"],"version":0.6,"annotation":"input latin uppercase","shortcodes":["capital_abcd"]},{"emoji":"๐Ÿ”ก","group":8,"order":4681,"tags":["abcd","input","latin","letters","lowercase"],"version":0.6,"annotation":"input latin lowercase","shortcodes":["abcd"]},{"emoji":"๐Ÿ”ข","group":8,"order":4682,"tags":["1234","input","numbers"],"version":0.6,"annotation":"input numbers","shortcodes":["1234"]},{"emoji":"๐Ÿ”ฃ","group":8,"order":4683,"tags":["%","&","input","symbols","โ™ช","ใ€’"],"version":0.6,"annotation":"input symbols","shortcodes":["symbols"]},{"emoji":"๐Ÿ”ค","group":8,"order":4684,"tags":["abc","alphabet","input","latin","letters"],"version":0.6,"annotation":"input latin letters","shortcodes":["abc"]},{"emoji":"๐Ÿ…ฐ๏ธ","group":8,"order":4686,"tags":["blood","button","type"],"version":0.6,"annotation":"A button (blood type)","shortcodes":["a","a_blood"]},{"emoji":"๐Ÿ†Ž","group":8,"order":4687,"tags":["ab","blood","button","type"],"version":0.6,"annotation":"AB button (blood type)","shortcodes":["ab","ab_blood"]},{"emoji":"๐Ÿ…ฑ๏ธ","group":8,"order":4689,"tags":["b","blood","button","type"],"version":0.6,"annotation":"B button (blood type)","shortcodes":["b","b_blood"]},{"emoji":"๐Ÿ†‘","group":8,"order":4690,"tags":["button","cl"],"version":0.6,"annotation":"CL button","shortcodes":["cl"]},{"emoji":"๐Ÿ†’","group":8,"order":4691,"tags":["button","cool"],"version":0.6,"annotation":"COOL button","shortcodes":["cool"]},{"emoji":"๐Ÿ†“","group":8,"order":4692,"tags":["button","free"],"version":0.6,"annotation":"FREE button","shortcodes":["free"]},{"emoji":"โ„น๏ธ","group":8,"order":4694,"tags":["i"],"version":0.6,"annotation":"information","shortcodes":["info","information_source"]},{"emoji":"๐Ÿ†”","group":8,"order":4695,"tags":["button","id","identity"],"version":0.6,"annotation":"ID button","shortcodes":["id"]},{"emoji":"โ“‚๏ธ","group":8,"order":4697,"tags":["circle","circled","m"],"version":0.6,"annotation":"circled M","shortcodes":["m"]},{"emoji":"๐Ÿ†•","group":8,"order":4698,"tags":["button","new"],"version":0.6,"annotation":"NEW button","shortcodes":["new"]},{"emoji":"๐Ÿ†–","group":8,"order":4699,"tags":["button","ng"],"version":0.6,"annotation":"NG button","shortcodes":["ng"]},{"emoji":"๐Ÿ…พ๏ธ","group":8,"order":4701,"tags":["blood","button","o","type"],"version":0.6,"annotation":"O button (blood type)","shortcodes":["o","o_blood"]},{"emoji":"๐Ÿ†—","group":8,"order":4702,"tags":["button","ok","okay"],"version":0.6,"annotation":"OK button","shortcodes":["ok"]},{"emoji":"๐Ÿ…ฟ๏ธ","group":8,"order":4704,"tags":["button","p","parking"],"version":0.6,"annotation":"P button","shortcodes":["parking"]},{"emoji":"๐Ÿ†˜","group":8,"order":4705,"tags":["button","help","sos"],"version":0.6,"annotation":"SOS button","shortcodes":["sos"]},{"emoji":"๐Ÿ†™","group":8,"order":4706,"tags":["button","mark","up","up!"],"version":0.6,"annotation":"UP! button","shortcodes":["up2"]},{"emoji":"๐Ÿ†š","group":8,"order":4707,"tags":["button","versus","vs"],"version":0.6,"annotation":"VS button","shortcodes":["vs"]},{"emoji":"๐Ÿˆ","group":8,"order":4708,"tags":["button","here","japanese","katakana"],"version":0.6,"annotation":"Japanese โ€œhereโ€ button","shortcodes":["ja_here","koko"]},{"emoji":"๐Ÿˆ‚๏ธ","group":8,"order":4710,"tags":["button","charge","japanese","katakana","service"],"version":0.6,"annotation":"Japanese โ€œservice chargeโ€ button","shortcodes":["ja_service_charge"]},{"emoji":"๐Ÿˆท๏ธ","group":8,"order":4712,"tags":["amount","button","ideograph","japanese","monthly"],"version":0.6,"annotation":"Japanese โ€œmonthly amountโ€ button","shortcodes":["ja_monthly_amount"]},{"emoji":"๐Ÿˆถ","group":8,"order":4713,"tags":["button","charge","free","ideograph","japanese","not"],"version":0.6,"annotation":"Japanese โ€œnot free of chargeโ€ button","shortcodes":["ja_not_free_of_carge"]},{"emoji":"๐Ÿˆฏ๏ธ","group":8,"order":4714,"tags":["button","ideograph","japanese","reserved"],"version":0.6,"annotation":"Japanese โ€œreservedโ€ button","shortcodes":["ja_reserved"]},{"emoji":"๐Ÿ‰","group":8,"order":4715,"tags":["bargain","button","ideograph","japanese"],"version":0.6,"annotation":"Japanese โ€œbargainโ€ button","shortcodes":["ideograph_advantage","ja_bargain"]},{"emoji":"๐Ÿˆน","group":8,"order":4716,"tags":["button","discount","ideograph","japanese"],"version":0.6,"annotation":"Japanese โ€œdiscountโ€ button","shortcodes":["ja_discount"]},{"emoji":"๐Ÿˆš๏ธ","group":8,"order":4717,"tags":["button","charge","free","ideograph","japanese"],"version":0.6,"annotation":"Japanese โ€œfree of chargeโ€ button","shortcodes":["ja_free_of_charge"]},{"emoji":"๐Ÿˆฒ","group":8,"order":4718,"tags":["button","ideograph","japanese","prohibited"],"version":0.6,"annotation":"Japanese โ€œprohibitedโ€ button","shortcodes":["ja_prohibited"]},{"emoji":"๐Ÿ‰‘","group":8,"order":4719,"tags":["acceptable","button","ideograph","japanese"],"version":0.6,"annotation":"Japanese โ€œacceptableโ€ button","shortcodes":["accept","ja_acceptable"]},{"emoji":"๐Ÿˆธ","group":8,"order":4720,"tags":["application","button","ideograph","japanese"],"version":0.6,"annotation":"Japanese โ€œapplicationโ€ button","shortcodes":["ja_application"]},{"emoji":"๐Ÿˆด","group":8,"order":4721,"tags":["button","grade","ideograph","japanese","passing"],"version":0.6,"annotation":"Japanese โ€œpassing gradeโ€ button","shortcodes":["ja_passing_grade"]},{"emoji":"๐Ÿˆณ","group":8,"order":4722,"tags":["button","ideograph","japanese","vacancy"],"version":0.6,"annotation":"Japanese โ€œvacancyโ€ button","shortcodes":["ja_vacancy"]},{"emoji":"ใŠ—๏ธ","group":8,"order":4724,"tags":["button","congratulations","ideograph","japanese"],"version":0.6,"annotation":"Japanese โ€œcongratulationsโ€ button","shortcodes":["congratulations","ja_congratulations"]},{"emoji":"ใŠ™๏ธ","group":8,"order":4726,"tags":["button","ideograph","japanese","secret"],"version":0.6,"annotation":"Japanese โ€œsecretโ€ button","shortcodes":["ja_secret","secret"]},{"emoji":"๐Ÿˆบ","group":8,"order":4727,"tags":["business","button","ideograph","japanese","open"],"version":0.6,"annotation":"Japanese โ€œopen for businessโ€ button","shortcodes":["ja_open_for_business"]},{"emoji":"๐Ÿˆต","group":8,"order":4728,"tags":["button","ideograph","japanese","no","vacancy"],"version":0.6,"annotation":"Japanese โ€œno vacancyโ€ button","shortcodes":["ja_no_vacancy"]},{"emoji":"๐Ÿ”ด","group":8,"order":4729,"tags":["circle","geometric","red"],"version":0.6,"annotation":"red circle","shortcodes":["red_circle"]},{"emoji":"๐ŸŸ ","group":8,"order":4730,"tags":["circle","orange"],"version":12,"annotation":"orange circle","shortcodes":["orange_circle"]},{"emoji":"๐ŸŸก","group":8,"order":4731,"tags":["circle","yellow"],"version":12,"annotation":"yellow circle","shortcodes":["yellow_circle"]},{"emoji":"๐ŸŸข","group":8,"order":4732,"tags":["circle","green"],"version":12,"annotation":"green circle","shortcodes":["green_circle"]},{"emoji":"๐Ÿ”ต","group":8,"order":4733,"tags":["blue","circle","geometric"],"version":0.6,"annotation":"blue circle","shortcodes":["blue_circle"]},{"emoji":"๐ŸŸฃ","group":8,"order":4734,"tags":["circle","purple"],"version":12,"annotation":"purple circle","shortcodes":["purple_circle"]},{"emoji":"๐ŸŸค","group":8,"order":4735,"tags":["brown","circle"],"version":12,"annotation":"brown circle","shortcodes":["brown_circle"]},{"emoji":"โšซ๏ธ","group":8,"order":4736,"tags":["black","circle","geometric"],"version":0.6,"annotation":"black circle","shortcodes":["black_circle"]},{"emoji":"โšช๏ธ","group":8,"order":4737,"tags":["circle","geometric","white"],"version":0.6,"annotation":"white circle","shortcodes":["white_circle"]},{"emoji":"๐ŸŸฅ","group":8,"order":4738,"tags":["card","penalty","red","square"],"version":12,"annotation":"red square","shortcodes":["red_square"]},{"emoji":"๐ŸŸง","group":8,"order":4739,"tags":["orange","square"],"version":12,"annotation":"orange square","shortcodes":["orange_square"]},{"emoji":"๐ŸŸจ","group":8,"order":4740,"tags":["card","penalty","square","yellow"],"version":12,"annotation":"yellow square","shortcodes":["yellow_square"]},{"emoji":"๐ŸŸฉ","group":8,"order":4741,"tags":["green","square"],"version":12,"annotation":"green square","shortcodes":["green_square"]},{"emoji":"๐ŸŸฆ","group":8,"order":4742,"tags":["blue","square"],"version":12,"annotation":"blue square","shortcodes":["blue_square"]},{"emoji":"๐ŸŸช","group":8,"order":4743,"tags":["purple","square"],"version":12,"annotation":"purple square","shortcodes":["purple_square"]},{"emoji":"๐ŸŸซ","group":8,"order":4744,"tags":["brown","square"],"version":12,"annotation":"brown square","shortcodes":["brown_square"]},{"emoji":"โฌ›๏ธ","group":8,"order":4745,"tags":["black","geometric","large","square"],"version":0.6,"annotation":"black large square","shortcodes":["black_large_square"]},{"emoji":"โฌœ๏ธ","group":8,"order":4746,"tags":["geometric","large","square","white"],"version":0.6,"annotation":"white large square","shortcodes":["white_large_square"]},{"emoji":"โ—ผ๏ธ","group":8,"order":4748,"tags":["black","geometric","medium","square"],"version":0.6,"annotation":"black medium square","shortcodes":["black_medium_square"]},{"emoji":"โ—ป๏ธ","group":8,"order":4750,"tags":["geometric","medium","square","white"],"version":0.6,"annotation":"white medium square","shortcodes":["white_medium_square"]},{"emoji":"โ—พ๏ธ","group":8,"order":4751,"tags":["black","geometric","medium-small","square"],"version":0.6,"annotation":"black medium-small square","shortcodes":["black_medium_small_square"]},{"emoji":"โ—ฝ๏ธ","group":8,"order":4752,"tags":["geometric","medium-small","square","white"],"version":0.6,"annotation":"white medium-small square","shortcodes":["white_medium_small_square"]},{"emoji":"โ–ช๏ธ","group":8,"order":4754,"tags":["black","geometric","small","square"],"version":0.6,"annotation":"black small square","shortcodes":["black_small_square"]},{"emoji":"โ–ซ๏ธ","group":8,"order":4756,"tags":["geometric","small","square","white"],"version":0.6,"annotation":"white small square","shortcodes":["white_small_square"]},{"emoji":"๐Ÿ”ถ","group":8,"order":4757,"tags":["diamond","geometric","large","orange"],"version":0.6,"annotation":"large orange diamond","shortcodes":["large_orange_diamond"]},{"emoji":"๐Ÿ”ท","group":8,"order":4758,"tags":["blue","diamond","geometric","large"],"version":0.6,"annotation":"large blue diamond","shortcodes":["large_blue_diamond"]},{"emoji":"๐Ÿ”ธ","group":8,"order":4759,"tags":["diamond","geometric","orange","small"],"version":0.6,"annotation":"small orange diamond","shortcodes":["small_orange_diamond"]},{"emoji":"๐Ÿ”น","group":8,"order":4760,"tags":["blue","diamond","geometric","small"],"version":0.6,"annotation":"small blue diamond","shortcodes":["small_blue_diamond"]},{"emoji":"๐Ÿ”บ","group":8,"order":4761,"tags":["geometric","pointed","red","triangle","up"],"version":0.6,"annotation":"red triangle pointed up","shortcodes":["small_red_triangle"]},{"emoji":"๐Ÿ”ป","group":8,"order":4762,"tags":["down","geometric","pointed","red","triangle"],"version":0.6,"annotation":"red triangle pointed down","shortcodes":["small_red_triangle_down"]},{"emoji":"๐Ÿ’ ","group":8,"order":4763,"tags":["comic","diamond","dot","geometric"],"version":0.6,"annotation":"diamond with a dot","shortcodes":["diamond_shape_with_a_dot_inside","diamond_with_a_dot"]},{"emoji":"๐Ÿ”˜","group":8,"order":4764,"tags":["button","geometric","radio"],"version":0.6,"annotation":"radio button","shortcodes":["radio_button"]},{"emoji":"๐Ÿ”ณ","group":8,"order":4765,"tags":["button","geometric","outlined","square","white"],"version":0.6,"annotation":"white square button","shortcodes":["white_square_button"]},{"emoji":"๐Ÿ”ฒ","group":8,"order":4766,"tags":["black","button","geometric","square"],"version":0.6,"annotation":"black square button","shortcodes":["black_square_button"]},{"emoji":"๐Ÿ","group":9,"order":4767,"tags":["checkered","chequered","finish","flag","flags","game","race","racing","sport","win"],"version":0.6,"annotation":"chequered flag","shortcodes":["checkered_flag"]},{"emoji":"๐Ÿšฉ","group":9,"order":4768,"tags":["construction","flag","golf","post","triangular"],"version":0.6,"annotation":"triangular flag","shortcodes":["triangular_flag","triangular_flag_on_post"]},{"emoji":"๐ŸŽŒ","group":9,"order":4769,"tags":["celebration","cross","crossed","flags","japanese"],"version":0.6,"annotation":"crossed flags","shortcodes":["crossed_flags"]},{"emoji":"๐Ÿด","group":9,"order":4770,"tags":["black","flag","waving"],"version":1,"annotation":"black flag","shortcodes":["black_flag"]},{"emoji":"๐Ÿณ๏ธ","group":9,"order":4772,"tags":["flag","waving","white"],"version":0.7,"annotation":"white flag","shortcodes":["white_flag"]},{"emoji":"๐Ÿณ๏ธโ€๐ŸŒˆ","group":9,"order":4773,"tags":["bisexual","flag","gay","genderqueer","glbt","glbtq","lesbian","lgbt","lgbtq","lgbtqia","pride","queer","rainbow","trans","transgender"],"version":4,"annotation":"rainbow flag","shortcodes":["rainbow_flag"]},{"emoji":"๐Ÿณ๏ธโ€โšง๏ธ","group":9,"order":4775,"tags":["blue","flag","light","pink","transgender","white"],"version":13,"annotation":"transgender flag","shortcodes":["transgender_flag"]},{"emoji":"๐Ÿดโ€โ˜ ๏ธ","group":9,"order":4779,"tags":["flag","jolly","pirate","plunder","roger","treasure"],"version":11,"annotation":"pirate flag","shortcodes":["jolly_roger","pirate_flag"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡จ","group":9,"order":4781,"tags":["AC","flag"],"version":2,"annotation":"flag: Ascension Island","shortcodes":["ascension_island","flag_ac"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฉ","group":9,"order":4782,"tags":["AD","flag"],"version":2,"annotation":"flag: Andorra","shortcodes":["andorra","flag_ad"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ช","group":9,"order":4783,"tags":["AE","flag"],"version":2,"annotation":"flag: United Arab Emirates","shortcodes":["flag_ae","united_arab_emirates"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ซ","group":9,"order":4784,"tags":["AF","flag"],"version":2,"annotation":"flag: Afghanistan","shortcodes":["afghanistan","flag_af"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฌ","group":9,"order":4785,"tags":["AG","flag"],"version":2,"annotation":"flag: Antigua & Barbuda","shortcodes":["antigua_barbuda","flag_ag"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฎ","group":9,"order":4786,"tags":["AI","flag"],"version":2,"annotation":"flag: Anguilla","shortcodes":["anguilla","flag_ai"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฑ","group":9,"order":4787,"tags":["AL","flag"],"version":2,"annotation":"flag: Albania","shortcodes":["albania","flag_al"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฒ","group":9,"order":4788,"tags":["AM","flag"],"version":2,"annotation":"flag: Armenia","shortcodes":["armenia","flag_am"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ด","group":9,"order":4789,"tags":["AO","flag"],"version":2,"annotation":"flag: Angola","shortcodes":["angola","flag_ao"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ถ","group":9,"order":4790,"tags":["AQ","flag"],"version":2,"annotation":"flag: Antarctica","shortcodes":["antarctica","flag_aq"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ท","group":9,"order":4791,"tags":["AR","flag"],"version":2,"annotation":"flag: Argentina","shortcodes":["argentina","flag_ar"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ธ","group":9,"order":4792,"tags":["AS","flag"],"version":2,"annotation":"flag: American Samoa","shortcodes":["american_samoa","flag_as"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡น","group":9,"order":4793,"tags":["AT","flag"],"version":2,"annotation":"flag: Austria","shortcodes":["austria","flag_at"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡บ","group":9,"order":4794,"tags":["AU","flag"],"version":2,"annotation":"flag: Australia","shortcodes":["australia","flag_au"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ผ","group":9,"order":4795,"tags":["AW","flag"],"version":2,"annotation":"flag: Aruba","shortcodes":["aruba","flag_aw"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฝ","group":9,"order":4796,"tags":["AX","flag"],"version":2,"annotation":"flag: ร…land Islands","shortcodes":["aland_islands","flag_ax"]},{"emoji":"๐Ÿ‡ฆ๐Ÿ‡ฟ","group":9,"order":4797,"tags":["AZ","flag"],"version":2,"annotation":"flag: Azerbaijan","shortcodes":["azerbaijan","flag_az"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ฆ","group":9,"order":4798,"tags":["BA","flag"],"version":2,"annotation":"flag: Bosnia & Herzegovina","shortcodes":["bosnia_herzegovina","flag_ba"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ง","group":9,"order":4799,"tags":["BB","flag"],"version":2,"annotation":"flag: Barbados","shortcodes":["barbados","flag_bb"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ฉ","group":9,"order":4800,"tags":["BD","flag"],"version":2,"annotation":"flag: Bangladesh","shortcodes":["bangladesh","flag_bd"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ช","group":9,"order":4801,"tags":["BE","flag"],"version":2,"annotation":"flag: Belgium","shortcodes":["belgium","flag_be"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ซ","group":9,"order":4802,"tags":["BF","flag"],"version":2,"annotation":"flag: Burkina Faso","shortcodes":["burkina_faso","flag_bf"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ฌ","group":9,"order":4803,"tags":["BG","flag"],"version":2,"annotation":"flag: Bulgaria","shortcodes":["bulgaria","flag_bg"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ญ","group":9,"order":4804,"tags":["BH","flag"],"version":2,"annotation":"flag: Bahrain","shortcodes":["bahrain","flag_bh"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ฎ","group":9,"order":4805,"tags":["BI","flag"],"version":2,"annotation":"flag: Burundi","shortcodes":["burundi","flag_bi"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ฏ","group":9,"order":4806,"tags":["BJ","flag"],"version":2,"annotation":"flag: Benin","shortcodes":["benin","flag_bj"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ฑ","group":9,"order":4807,"tags":["BL","flag"],"version":2,"annotation":"flag: St. Barthรฉlemy","shortcodes":["flag_bl","st_barthelemy"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ฒ","group":9,"order":4808,"tags":["BM","flag"],"version":2,"annotation":"flag: Bermuda","shortcodes":["bermuda","flag_bm"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ณ","group":9,"order":4809,"tags":["BN","flag"],"version":2,"annotation":"flag: Brunei","shortcodes":["brunei","flag_bn"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ด","group":9,"order":4810,"tags":["BO","flag"],"version":2,"annotation":"flag: Bolivia","shortcodes":["bolivia","flag_bo"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ถ","group":9,"order":4811,"tags":["BQ","flag"],"version":2,"annotation":"flag: Caribbean Netherlands","shortcodes":["caribbean_netherlands","flag_bq"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ท","group":9,"order":4812,"tags":["BR","flag"],"version":2,"annotation":"flag: Brazil","shortcodes":["brazil","flag_br"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ธ","group":9,"order":4813,"tags":["BS","flag"],"version":2,"annotation":"flag: Bahamas","shortcodes":["bahamas","flag_bs"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡น","group":9,"order":4814,"tags":["BT","flag"],"version":2,"annotation":"flag: Bhutan","shortcodes":["bhutan","flag_bt"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ป","group":9,"order":4815,"tags":["BV","flag"],"version":2,"annotation":"flag: Bouvet Island","shortcodes":["bouvet_island","flag_bv"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ผ","group":9,"order":4816,"tags":["BW","flag"],"version":2,"annotation":"flag: Botswana","shortcodes":["botswana","flag_bw"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡พ","group":9,"order":4817,"tags":["BY","flag"],"version":2,"annotation":"flag: Belarus","shortcodes":["belarus","flag_by"]},{"emoji":"๐Ÿ‡ง๐Ÿ‡ฟ","group":9,"order":4818,"tags":["BZ","flag"],"version":2,"annotation":"flag: Belize","shortcodes":["belize","flag_bz"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ฆ","group":9,"order":4819,"tags":["CA","flag"],"version":2,"annotation":"flag: Canada","shortcodes":["canada","flag_ca"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡จ","group":9,"order":4820,"tags":["CC","flag"],"version":2,"annotation":"flag: Cocos (Keeling) Islands","shortcodes":["cocos_islands","flag_cc"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ฉ","group":9,"order":4821,"tags":["CD","flag"],"version":2,"annotation":"flag: Congo - Kinshasa","shortcodes":["congo_kinshasa","flag_cd"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ซ","group":9,"order":4822,"tags":["CF","flag"],"version":2,"annotation":"flag: Central African Republic","shortcodes":["central_african_republic","flag_cf"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ฌ","group":9,"order":4823,"tags":["CG","flag"],"version":2,"annotation":"flag: Congo - Brazzaville","shortcodes":["congo_brazzaville","flag_cg"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ญ","group":9,"order":4824,"tags":["CH","flag"],"version":2,"annotation":"flag: Switzerland","shortcodes":["flag_ch","switzerland"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ฎ","group":9,"order":4825,"tags":["CI","flag"],"version":2,"annotation":"flag: Cรดte dโ€™Ivoire","shortcodes":["cote_divoire","flag_ci"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ฐ","group":9,"order":4826,"tags":["CK","flag"],"version":2,"annotation":"flag: Cook Islands","shortcodes":["cook_islands","flag_ck"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ฑ","group":9,"order":4827,"tags":["CL","flag"],"version":2,"annotation":"flag: Chile","shortcodes":["chile","flag_cl"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ฒ","group":9,"order":4828,"tags":["CM","flag"],"version":2,"annotation":"flag: Cameroon","shortcodes":["cameroon","flag_cm"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ณ","group":9,"order":4829,"tags":["CN","flag"],"version":0.6,"annotation":"flag: China","shortcodes":["china","flag_cn"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ด","group":9,"order":4830,"tags":["CO","flag"],"version":2,"annotation":"flag: Colombia","shortcodes":["colombia","flag_co"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ต","group":9,"order":4831,"tags":["CP","flag"],"version":2,"annotation":"flag: Clipperton Island","shortcodes":["clipperton_island","flag_cp"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ถ","group":9,"order":4832,"tags":["CQ","flag"],"version":16,"annotation":"flag: Sark","shortcodes":["flag_cq","sark"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ท","group":9,"order":4833,"tags":["CR","flag"],"version":2,"annotation":"flag: Costa Rica","shortcodes":["costa_rica","flag_cr"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡บ","group":9,"order":4834,"tags":["CU","flag"],"version":2,"annotation":"flag: Cuba","shortcodes":["cuba","flag_cu"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ป","group":9,"order":4835,"tags":["CV","flag"],"version":2,"annotation":"flag: Cape Verde","shortcodes":["cape_verde","flag_cv"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ผ","group":9,"order":4836,"tags":["CW","flag"],"version":2,"annotation":"flag: Curaรงao","shortcodes":["curacao","flag_cw"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ฝ","group":9,"order":4837,"tags":["CX","flag"],"version":2,"annotation":"flag: Christmas Island","shortcodes":["christmas_island","flag_cx"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡พ","group":9,"order":4838,"tags":["CY","flag"],"version":2,"annotation":"flag: Cyprus","shortcodes":["cyprus","flag_cy"]},{"emoji":"๐Ÿ‡จ๐Ÿ‡ฟ","group":9,"order":4839,"tags":["CZ","flag"],"version":2,"annotation":"flag: Czechia","shortcodes":["czech_republic","czechia","flag_cz"]},{"emoji":"๐Ÿ‡ฉ๐Ÿ‡ช","group":9,"order":4840,"tags":["DE","flag"],"version":0.6,"annotation":"flag: Germany","shortcodes":["flag_de","germany"]},{"emoji":"๐Ÿ‡ฉ๐Ÿ‡ฌ","group":9,"order":4841,"tags":["DG","flag"],"version":2,"annotation":"flag: Diego Garcia","shortcodes":["diego_garcia","flag_dg"]},{"emoji":"๐Ÿ‡ฉ๐Ÿ‡ฏ","group":9,"order":4842,"tags":["DJ","flag"],"version":2,"annotation":"flag: Djibouti","shortcodes":["djibouti","flag_dj"]},{"emoji":"๐Ÿ‡ฉ๐Ÿ‡ฐ","group":9,"order":4843,"tags":["DK","flag"],"version":2,"annotation":"flag: Denmark","shortcodes":["denmark","flag_dk"]},{"emoji":"๐Ÿ‡ฉ๐Ÿ‡ฒ","group":9,"order":4844,"tags":["DM","flag"],"version":2,"annotation":"flag: Dominica","shortcodes":["dominica","flag_dm"]},{"emoji":"๐Ÿ‡ฉ๐Ÿ‡ด","group":9,"order":4845,"tags":["DO","flag"],"version":2,"annotation":"flag: Dominican Republic","shortcodes":["dominican_republic","flag_do"]},{"emoji":"๐Ÿ‡ฉ๐Ÿ‡ฟ","group":9,"order":4846,"tags":["DZ","flag"],"version":2,"annotation":"flag: Algeria","shortcodes":["algeria","flag_dz"]},{"emoji":"๐Ÿ‡ช๐Ÿ‡ฆ","group":9,"order":4847,"tags":["EA","flag"],"version":2,"annotation":"flag: Ceuta & Melilla","shortcodes":["ceuta_melilla","flag_ea"]},{"emoji":"๐Ÿ‡ช๐Ÿ‡จ","group":9,"order":4848,"tags":["EC","flag"],"version":2,"annotation":"flag: Ecuador","shortcodes":["ecuador","flag_ec"]},{"emoji":"๐Ÿ‡ช๐Ÿ‡ช","group":9,"order":4849,"tags":["EE","flag"],"version":2,"annotation":"flag: Estonia","shortcodes":["estonia","flag_ee"]},{"emoji":"๐Ÿ‡ช๐Ÿ‡ฌ","group":9,"order":4850,"tags":["EG","flag"],"version":2,"annotation":"flag: Egypt","shortcodes":["egypt","flag_eg"]},{"emoji":"๐Ÿ‡ช๐Ÿ‡ญ","group":9,"order":4851,"tags":["EH","flag"],"version":2,"annotation":"flag: Western Sahara","shortcodes":["flag_eh","western_sahara"]},{"emoji":"๐Ÿ‡ช๐Ÿ‡ท","group":9,"order":4852,"tags":["ER","flag"],"version":2,"annotation":"flag: Eritrea","shortcodes":["eritrea","flag_er"]},{"emoji":"๐Ÿ‡ช๐Ÿ‡ธ","group":9,"order":4853,"tags":["ES","flag"],"version":0.6,"annotation":"flag: Spain","shortcodes":["flag_es","spain"]},{"emoji":"๐Ÿ‡ช๐Ÿ‡น","group":9,"order":4854,"tags":["ET","flag"],"version":2,"annotation":"flag: Ethiopia","shortcodes":["ethiopia","flag_et"]},{"emoji":"๐Ÿ‡ช๐Ÿ‡บ","group":9,"order":4855,"tags":["EU","flag"],"version":2,"annotation":"flag: European Union","shortcodes":["european_union","flag_eu"]},{"emoji":"๐Ÿ‡ซ๐Ÿ‡ฎ","group":9,"order":4856,"tags":["FI","flag"],"version":2,"annotation":"flag: Finland","shortcodes":["finland","flag_fi"]},{"emoji":"๐Ÿ‡ซ๐Ÿ‡ฏ","group":9,"order":4857,"tags":["FJ","flag"],"version":2,"annotation":"flag: Fiji","shortcodes":["fiji","flag_fj"]},{"emoji":"๐Ÿ‡ซ๐Ÿ‡ฐ","group":9,"order":4858,"tags":["FK","flag"],"version":2,"annotation":"flag: Falkland Islands","shortcodes":["falkland_islands","flag_fk"]},{"emoji":"๐Ÿ‡ซ๐Ÿ‡ฒ","group":9,"order":4859,"tags":["FM","flag"],"version":2,"annotation":"flag: Micronesia","shortcodes":["flag_fm","micronesia"]},{"emoji":"๐Ÿ‡ซ๐Ÿ‡ด","group":9,"order":4860,"tags":["FO","flag"],"version":2,"annotation":"flag: Faroe Islands","shortcodes":["faroe_islands","flag_fo"]},{"emoji":"๐Ÿ‡ซ๐Ÿ‡ท","group":9,"order":4861,"tags":["FR","flag"],"version":0.6,"annotation":"flag: France","shortcodes":["flag_fr","france"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฆ","group":9,"order":4862,"tags":["GA","flag"],"version":2,"annotation":"flag: Gabon","shortcodes":["flag_ga","gabon"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ง","group":9,"order":4863,"tags":["GB","flag"],"version":0.6,"annotation":"flag: United Kingdom","shortcodes":["flag_gb","uk","united_kingdom"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฉ","group":9,"order":4864,"tags":["GD","flag"],"version":2,"annotation":"flag: Grenada","shortcodes":["flag_gd","grenada"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ช","group":9,"order":4865,"tags":["GE","flag"],"version":2,"annotation":"flag: Georgia","shortcodes":["flag_ge","georgia"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ซ","group":9,"order":4866,"tags":["GF","flag"],"version":2,"annotation":"flag: French Guiana","shortcodes":["flag_gf","french_guiana"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฌ","group":9,"order":4867,"tags":["GG","flag"],"version":2,"annotation":"flag: Guernsey","shortcodes":["flag_gg","guernsey"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ญ","group":9,"order":4868,"tags":["GH","flag"],"version":2,"annotation":"flag: Ghana","shortcodes":["flag_gh","ghana"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฎ","group":9,"order":4869,"tags":["GI","flag"],"version":2,"annotation":"flag: Gibraltar","shortcodes":["flag_gi","gibraltar"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฑ","group":9,"order":4870,"tags":["GL","flag"],"version":2,"annotation":"flag: Greenland","shortcodes":["flag_gl","greenland"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ฒ","group":9,"order":4871,"tags":["GM","flag"],"version":2,"annotation":"flag: Gambia","shortcodes":["flag_gm","gambia"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ณ","group":9,"order":4872,"tags":["GN","flag"],"version":2,"annotation":"flag: Guinea","shortcodes":["flag_gn","guinea"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ต","group":9,"order":4873,"tags":["GP","flag"],"version":2,"annotation":"flag: Guadeloupe","shortcodes":["flag_gp","guadeloupe"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ถ","group":9,"order":4874,"tags":["GQ","flag"],"version":2,"annotation":"flag: Equatorial Guinea","shortcodes":["equatorial_guinea","flag_gq"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ท","group":9,"order":4875,"tags":["GR","flag"],"version":2,"annotation":"flag: Greece","shortcodes":["flag_gr","greece"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ธ","group":9,"order":4876,"tags":["GS","flag"],"version":2,"annotation":"flag: South Georgia & South Sandwich Islands","shortcodes":["flag_gs","south_georgia_south_sandwich_islands"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡น","group":9,"order":4877,"tags":["GT","flag"],"version":2,"annotation":"flag: Guatemala","shortcodes":["flag_gt","guatemala"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡บ","group":9,"order":4878,"tags":["GU","flag"],"version":2,"annotation":"flag: Guam","shortcodes":["flag_gu","guam"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡ผ","group":9,"order":4879,"tags":["GW","flag"],"version":2,"annotation":"flag: Guinea-Bissau","shortcodes":["flag_gw","guinea_bissau"]},{"emoji":"๐Ÿ‡ฌ๐Ÿ‡พ","group":9,"order":4880,"tags":["GY","flag"],"version":2,"annotation":"flag: Guyana","shortcodes":["flag_gy","guyana"]},{"emoji":"๐Ÿ‡ญ๐Ÿ‡ฐ","group":9,"order":4881,"tags":["HK","flag"],"version":2,"annotation":"flag: Hong Kong SAR China","shortcodes":["flag_hk","hong_kong"]},{"emoji":"๐Ÿ‡ญ๐Ÿ‡ฒ","group":9,"order":4882,"tags":["HM","flag"],"version":2,"annotation":"flag: Heard & McDonald Islands","shortcodes":["flag_hm","heard_mcdonald_islands"]},{"emoji":"๐Ÿ‡ญ๐Ÿ‡ณ","group":9,"order":4883,"tags":["HN","flag"],"version":2,"annotation":"flag: Honduras","shortcodes":["flag_hn","honduras"]},{"emoji":"๐Ÿ‡ญ๐Ÿ‡ท","group":9,"order":4884,"tags":["HR","flag"],"version":2,"annotation":"flag: Croatia","shortcodes":["croatia","flag_hr"]},{"emoji":"๐Ÿ‡ญ๐Ÿ‡น","group":9,"order":4885,"tags":["HT","flag"],"version":2,"annotation":"flag: Haiti","shortcodes":["flag_ht","haiti"]},{"emoji":"๐Ÿ‡ญ๐Ÿ‡บ","group":9,"order":4886,"tags":["HU","flag"],"version":2,"annotation":"flag: Hungary","shortcodes":["flag_hu","hungary"]},{"emoji":"๐Ÿ‡ฎ๐Ÿ‡จ","group":9,"order":4887,"tags":["IC","flag"],"version":2,"annotation":"flag: Canary Islands","shortcodes":["canary_islands","flag_ic"]},{"emoji":"๐Ÿ‡ฎ๐Ÿ‡ฉ","group":9,"order":4888,"tags":["ID","flag"],"version":2,"annotation":"flag: Indonesia","shortcodes":["flag_id","indonesia"]},{"emoji":"๐Ÿ‡ฎ๐Ÿ‡ช","group":9,"order":4889,"tags":["IE","flag"],"version":2,"annotation":"flag: Ireland","shortcodes":["flag_ie","ireland"]},{"emoji":"๐Ÿ‡ฎ๐Ÿ‡ฑ","group":9,"order":4890,"tags":["IL","flag"],"version":2,"annotation":"flag: Israel","shortcodes":["flag_il","israel"]},{"emoji":"๐Ÿ‡ฎ๐Ÿ‡ฒ","group":9,"order":4891,"tags":["IM","flag"],"version":2,"annotation":"flag: Isle of Man","shortcodes":["flag_im","isle_of_man"]},{"emoji":"๐Ÿ‡ฎ๐Ÿ‡ณ","group":9,"order":4892,"tags":["IN","flag"],"version":2,"annotation":"flag: India","shortcodes":["flag_in","india"]},{"emoji":"๐Ÿ‡ฎ๐Ÿ‡ด","group":9,"order":4893,"tags":["IO","flag"],"version":2,"annotation":"flag: British Indian Ocean Territory","shortcodes":["british_indian_ocean_territory","flag_io"]},{"emoji":"๐Ÿ‡ฎ๐Ÿ‡ถ","group":9,"order":4894,"tags":["IQ","flag"],"version":2,"annotation":"flag: Iraq","shortcodes":["flag_iq","iraq"]},{"emoji":"๐Ÿ‡ฎ๐Ÿ‡ท","group":9,"order":4895,"tags":["IR","flag"],"version":2,"annotation":"flag: Iran","shortcodes":["flag_ir","iran"]},{"emoji":"๐Ÿ‡ฎ๐Ÿ‡ธ","group":9,"order":4896,"tags":["IS","flag"],"version":2,"annotation":"flag: Iceland","shortcodes":["flag_is","iceland"]},{"emoji":"๐Ÿ‡ฎ๐Ÿ‡น","group":9,"order":4897,"tags":["IT","flag"],"version":0.6,"annotation":"flag: Italy","shortcodes":["flag_it","italy"]},{"emoji":"๐Ÿ‡ฏ๐Ÿ‡ช","group":9,"order":4898,"tags":["JE","flag"],"version":2,"annotation":"flag: Jersey","shortcodes":["flag_je","jersey"]},{"emoji":"๐Ÿ‡ฏ๐Ÿ‡ฒ","group":9,"order":4899,"tags":["JM","flag"],"version":2,"annotation":"flag: Jamaica","shortcodes":["flag_jm","jamaica"]},{"emoji":"๐Ÿ‡ฏ๐Ÿ‡ด","group":9,"order":4900,"tags":["JO","flag"],"version":2,"annotation":"flag: Jordan","shortcodes":["flag_jo","jordan"]},{"emoji":"๐Ÿ‡ฏ๐Ÿ‡ต","group":9,"order":4901,"tags":["JP","flag"],"version":0.6,"annotation":"flag: Japan","shortcodes":["flag_jp","japan"]},{"emoji":"๐Ÿ‡ฐ๐Ÿ‡ช","group":9,"order":4902,"tags":["KE","flag"],"version":2,"annotation":"flag: Kenya","shortcodes":["flag_ke","kenya"]},{"emoji":"๐Ÿ‡ฐ๐Ÿ‡ฌ","group":9,"order":4903,"tags":["KG","flag"],"version":2,"annotation":"flag: Kyrgyzstan","shortcodes":["flag_kg","kyrgyzstan"]},{"emoji":"๐Ÿ‡ฐ๐Ÿ‡ญ","group":9,"order":4904,"tags":["KH","flag"],"version":2,"annotation":"flag: Cambodia","shortcodes":["cambodia","flag_kh"]},{"emoji":"๐Ÿ‡ฐ๐Ÿ‡ฎ","group":9,"order":4905,"tags":["KI","flag"],"version":2,"annotation":"flag: Kiribati","shortcodes":["flag_ki","kiribati"]},{"emoji":"๐Ÿ‡ฐ๐Ÿ‡ฒ","group":9,"order":4906,"tags":["KM","flag"],"version":2,"annotation":"flag: Comoros","shortcodes":["comoros","flag_km"]},{"emoji":"๐Ÿ‡ฐ๐Ÿ‡ณ","group":9,"order":4907,"tags":["KN","flag"],"version":2,"annotation":"flag: St. Kitts & Nevis","shortcodes":["flag_kn","st_kitts_nevis"]},{"emoji":"๐Ÿ‡ฐ๐Ÿ‡ต","group":9,"order":4908,"tags":["KP","flag"],"version":2,"annotation":"flag: North Korea","shortcodes":["flag_kp","north_korea"]},{"emoji":"๐Ÿ‡ฐ๐Ÿ‡ท","group":9,"order":4909,"tags":["KR","flag"],"version":0.6,"annotation":"flag: South Korea","shortcodes":["flag_kr","south_korea"]},{"emoji":"๐Ÿ‡ฐ๐Ÿ‡ผ","group":9,"order":4910,"tags":["KW","flag"],"version":2,"annotation":"flag: Kuwait","shortcodes":["flag_kw","kuwait"]},{"emoji":"๐Ÿ‡ฐ๐Ÿ‡พ","group":9,"order":4911,"tags":["KY","flag"],"version":2,"annotation":"flag: Cayman Islands","shortcodes":["cayman_islands","flag_ky"]},{"emoji":"๐Ÿ‡ฐ๐Ÿ‡ฟ","group":9,"order":4912,"tags":["KZ","flag"],"version":2,"annotation":"flag: Kazakhstan","shortcodes":["flag_kz","kazakhstan"]},{"emoji":"๐Ÿ‡ฑ๐Ÿ‡ฆ","group":9,"order":4913,"tags":["LA","flag"],"version":2,"annotation":"flag: Laos","shortcodes":["flag_la","laos"]},{"emoji":"๐Ÿ‡ฑ๐Ÿ‡ง","group":9,"order":4914,"tags":["LB","flag"],"version":2,"annotation":"flag: Lebanon","shortcodes":["flag_lb","lebanon"]},{"emoji":"๐Ÿ‡ฑ๐Ÿ‡จ","group":9,"order":4915,"tags":["LC","flag"],"version":2,"annotation":"flag: St. Lucia","shortcodes":["flag_lc","st_lucia"]},{"emoji":"๐Ÿ‡ฑ๐Ÿ‡ฎ","group":9,"order":4916,"tags":["LI","flag"],"version":2,"annotation":"flag: Liechtenstein","shortcodes":["flag_li","liechtenstein"]},{"emoji":"๐Ÿ‡ฑ๐Ÿ‡ฐ","group":9,"order":4917,"tags":["LK","flag"],"version":2,"annotation":"flag: Sri Lanka","shortcodes":["flag_lk","sri_lanka"]},{"emoji":"๐Ÿ‡ฑ๐Ÿ‡ท","group":9,"order":4918,"tags":["LR","flag"],"version":2,"annotation":"flag: Liberia","shortcodes":["flag_lr","liberia"]},{"emoji":"๐Ÿ‡ฑ๐Ÿ‡ธ","group":9,"order":4919,"tags":["LS","flag"],"version":2,"annotation":"flag: Lesotho","shortcodes":["flag_ls","lesotho"]},{"emoji":"๐Ÿ‡ฑ๐Ÿ‡น","group":9,"order":4920,"tags":["LT","flag"],"version":2,"annotation":"flag: Lithuania","shortcodes":["flag_lt","lithuania"]},{"emoji":"๐Ÿ‡ฑ๐Ÿ‡บ","group":9,"order":4921,"tags":["LU","flag"],"version":2,"annotation":"flag: Luxembourg","shortcodes":["flag_lu","luxembourg"]},{"emoji":"๐Ÿ‡ฑ๐Ÿ‡ป","group":9,"order":4922,"tags":["LV","flag"],"version":2,"annotation":"flag: Latvia","shortcodes":["flag_lv","latvia"]},{"emoji":"๐Ÿ‡ฑ๐Ÿ‡พ","group":9,"order":4923,"tags":["LY","flag"],"version":2,"annotation":"flag: Libya","shortcodes":["flag_ly","libya"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฆ","group":9,"order":4924,"tags":["MA","flag"],"version":2,"annotation":"flag: Morocco","shortcodes":["flag_ma","morocco"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡จ","group":9,"order":4925,"tags":["MC","flag"],"version":2,"annotation":"flag: Monaco","shortcodes":["flag_mc","monaco"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฉ","group":9,"order":4926,"tags":["MD","flag"],"version":2,"annotation":"flag: Moldova","shortcodes":["flag_md","moldova"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ช","group":9,"order":4927,"tags":["ME","flag"],"version":2,"annotation":"flag: Montenegro","shortcodes":["flag_me","montenegro"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ซ","group":9,"order":4928,"tags":["MF","flag"],"version":2,"annotation":"flag: St. Martin","shortcodes":["flag_mf","st_martin"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฌ","group":9,"order":4929,"tags":["MG","flag"],"version":2,"annotation":"flag: Madagascar","shortcodes":["flag_mg","madagascar"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ญ","group":9,"order":4930,"tags":["MH","flag"],"version":2,"annotation":"flag: Marshall Islands","shortcodes":["flag_mh","marshall_islands"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฐ","group":9,"order":4931,"tags":["MK","flag"],"version":2,"annotation":"flag: North Macedonia","shortcodes":["flag_mk","macedonia"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฑ","group":9,"order":4932,"tags":["ML","flag"],"version":2,"annotation":"flag: Mali","shortcodes":["flag_ml","mali"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฒ","group":9,"order":4933,"tags":["MM","flag"],"version":2,"annotation":"flag: Myanmar (Burma)","shortcodes":["burma","flag_mm","myanmar"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ณ","group":9,"order":4934,"tags":["MN","flag"],"version":2,"annotation":"flag: Mongolia","shortcodes":["flag_mn","mongolia"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ด","group":9,"order":4935,"tags":["MO","flag"],"version":2,"annotation":"flag: Macao SAR China","shortcodes":["flag_mo","macao","macau"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ต","group":9,"order":4936,"tags":["MP","flag"],"version":2,"annotation":"flag: Northern Mariana Islands","shortcodes":["flag_mp","northern_mariana_islands"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ถ","group":9,"order":4937,"tags":["MQ","flag"],"version":2,"annotation":"flag: Martinique","shortcodes":["flag_mq","martinique"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ท","group":9,"order":4938,"tags":["MR","flag"],"version":2,"annotation":"flag: Mauritania","shortcodes":["flag_mr","mauritania"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ธ","group":9,"order":4939,"tags":["MS","flag"],"version":2,"annotation":"flag: Montserrat","shortcodes":["flag_ms","montserrat"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡น","group":9,"order":4940,"tags":["MT","flag"],"version":2,"annotation":"flag: Malta","shortcodes":["flag_mt","malta"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡บ","group":9,"order":4941,"tags":["MU","flag"],"version":2,"annotation":"flag: Mauritius","shortcodes":["flag_mu","mauritius"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ป","group":9,"order":4942,"tags":["MV","flag"],"version":2,"annotation":"flag: Maldives","shortcodes":["flag_mv","maldives"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ผ","group":9,"order":4943,"tags":["MW","flag"],"version":2,"annotation":"flag: Malawi","shortcodes":["flag_mw","malawi"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฝ","group":9,"order":4944,"tags":["MX","flag"],"version":2,"annotation":"flag: Mexico","shortcodes":["flag_mx","mexico"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡พ","group":9,"order":4945,"tags":["MY","flag"],"version":2,"annotation":"flag: Malaysia","shortcodes":["flag_my","malaysia"]},{"emoji":"๐Ÿ‡ฒ๐Ÿ‡ฟ","group":9,"order":4946,"tags":["MZ","flag"],"version":2,"annotation":"flag: Mozambique","shortcodes":["flag_mz","mozambique"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡ฆ","group":9,"order":4947,"tags":["NA","flag"],"version":2,"annotation":"flag: Namibia","shortcodes":["flag_na","namibia"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡จ","group":9,"order":4948,"tags":["NC","flag"],"version":2,"annotation":"flag: New Caledonia","shortcodes":["flag_nc","new_caledonia"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡ช","group":9,"order":4949,"tags":["NE","flag"],"version":2,"annotation":"flag: Niger","shortcodes":["flag_ne","niger"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡ซ","group":9,"order":4950,"tags":["NF","flag"],"version":2,"annotation":"flag: Norfolk Island","shortcodes":["flag_nf","norfolk_island"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡ฌ","group":9,"order":4951,"tags":["NG","flag"],"version":2,"annotation":"flag: Nigeria","shortcodes":["flag_ng","nigeria"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡ฎ","group":9,"order":4952,"tags":["NI","flag"],"version":2,"annotation":"flag: Nicaragua","shortcodes":["flag_ni","nicaragua"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡ฑ","group":9,"order":4953,"tags":["NL","flag"],"version":2,"annotation":"flag: Netherlands","shortcodes":["flag_nl","netherlands"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡ด","group":9,"order":4954,"tags":["NO","flag"],"version":2,"annotation":"flag: Norway","shortcodes":["flag_no","norway"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡ต","group":9,"order":4955,"tags":["NP","flag"],"version":2,"annotation":"flag: Nepal","shortcodes":["flag_np","nepal"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡ท","group":9,"order":4956,"tags":["NR","flag"],"version":2,"annotation":"flag: Nauru","shortcodes":["flag_nr","nauru"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡บ","group":9,"order":4957,"tags":["NU","flag"],"version":2,"annotation":"flag: Niue","shortcodes":["flag_nu","niue"]},{"emoji":"๐Ÿ‡ณ๐Ÿ‡ฟ","group":9,"order":4958,"tags":["NZ","flag"],"version":2,"annotation":"flag: New Zealand","shortcodes":["flag_nz","new_zealand"]},{"emoji":"๐Ÿ‡ด๐Ÿ‡ฒ","group":9,"order":4959,"tags":["OM","flag"],"version":2,"annotation":"flag: Oman","shortcodes":["flag_om","oman"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ฆ","group":9,"order":4960,"tags":["PA","flag"],"version":2,"annotation":"flag: Panama","shortcodes":["flag_pa","panama"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ช","group":9,"order":4961,"tags":["PE","flag"],"version":2,"annotation":"flag: Peru","shortcodes":["flag_pe","peru"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ซ","group":9,"order":4962,"tags":["PF","flag"],"version":2,"annotation":"flag: French Polynesia","shortcodes":["flag_pf","french_polynesia"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ฌ","group":9,"order":4963,"tags":["PG","flag"],"version":2,"annotation":"flag: Papua New Guinea","shortcodes":["flag_pg","papua_new_guinea"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ญ","group":9,"order":4964,"tags":["PH","flag"],"version":2,"annotation":"flag: Philippines","shortcodes":["flag_ph","philippines"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ฐ","group":9,"order":4965,"tags":["PK","flag"],"version":2,"annotation":"flag: Pakistan","shortcodes":["flag_pk","pakistan"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ฑ","group":9,"order":4966,"tags":["PL","flag"],"version":2,"annotation":"flag: Poland","shortcodes":["flag_pl","poland"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ฒ","group":9,"order":4967,"tags":["PM","flag"],"version":2,"annotation":"flag: St. Pierre & Miquelon","shortcodes":["flag_pm","st_pierre_miquelon"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ณ","group":9,"order":4968,"tags":["PN","flag"],"version":2,"annotation":"flag: Pitcairn Islands","shortcodes":["flag_pn","pitcairn_islands"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ท","group":9,"order":4969,"tags":["PR","flag"],"version":2,"annotation":"flag: Puerto Rico","shortcodes":["flag_pr","puerto_rico"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ธ","group":9,"order":4970,"tags":["PS","flag"],"version":2,"annotation":"flag: Palestinian Territories","shortcodes":["flag_ps","palestinian_territories"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡น","group":9,"order":4971,"tags":["PT","flag"],"version":2,"annotation":"flag: Portugal","shortcodes":["flag_pt","portugal"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡ผ","group":9,"order":4972,"tags":["PW","flag"],"version":2,"annotation":"flag: Palau","shortcodes":["flag_pw","palau"]},{"emoji":"๐Ÿ‡ต๐Ÿ‡พ","group":9,"order":4973,"tags":["PY","flag"],"version":2,"annotation":"flag: Paraguay","shortcodes":["flag_py","paraguay"]},{"emoji":"๐Ÿ‡ถ๐Ÿ‡ฆ","group":9,"order":4974,"tags":["QA","flag"],"version":2,"annotation":"flag: Qatar","shortcodes":["flag_qa","qatar"]},{"emoji":"๐Ÿ‡ท๐Ÿ‡ช","group":9,"order":4975,"tags":["RE","flag"],"version":2,"annotation":"flag: Rรฉunion","shortcodes":["flag_re","reunion"]},{"emoji":"๐Ÿ‡ท๐Ÿ‡ด","group":9,"order":4976,"tags":["RO","flag"],"version":2,"annotation":"flag: Romania","shortcodes":["flag_ro","romania"]},{"emoji":"๐Ÿ‡ท๐Ÿ‡ธ","group":9,"order":4977,"tags":["RS","flag"],"version":2,"annotation":"flag: Serbia","shortcodes":["flag_rs","serbia"]},{"emoji":"๐Ÿ‡ท๐Ÿ‡บ","group":9,"order":4978,"tags":["RU","flag"],"version":0.6,"annotation":"flag: Russia","shortcodes":["flag_ru","russia"]},{"emoji":"๐Ÿ‡ท๐Ÿ‡ผ","group":9,"order":4979,"tags":["RW","flag"],"version":2,"annotation":"flag: Rwanda","shortcodes":["flag_rw","rwanda"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ฆ","group":9,"order":4980,"tags":["SA","flag"],"version":2,"annotation":"flag: Saudi Arabia","shortcodes":["flag_sa","saudi_arabia"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ง","group":9,"order":4981,"tags":["SB","flag"],"version":2,"annotation":"flag: Solomon Islands","shortcodes":["flag_sb","solomon_islands"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡จ","group":9,"order":4982,"tags":["SC","flag"],"version":2,"annotation":"flag: Seychelles","shortcodes":["flag_sc","seychelles"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ฉ","group":9,"order":4983,"tags":["SD","flag"],"version":2,"annotation":"flag: Sudan","shortcodes":["flag_sd","sudan"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ช","group":9,"order":4984,"tags":["SE","flag"],"version":2,"annotation":"flag: Sweden","shortcodes":["flag_se","sweden"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ฌ","group":9,"order":4985,"tags":["SG","flag"],"version":2,"annotation":"flag: Singapore","shortcodes":["flag_sg","singapore"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ญ","group":9,"order":4986,"tags":["SH","flag"],"version":2,"annotation":"flag: St. Helena","shortcodes":["flag_sh","st_helena"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ฎ","group":9,"order":4987,"tags":["SI","flag"],"version":2,"annotation":"flag: Slovenia","shortcodes":["flag_si","slovenia"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ฏ","group":9,"order":4988,"tags":["SJ","flag"],"version":2,"annotation":"flag: Svalbard & Jan Mayen","shortcodes":["flag_sj","svalbard_jan_mayen"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ฐ","group":9,"order":4989,"tags":["SK","flag"],"version":2,"annotation":"flag: Slovakia","shortcodes":["flag_sk","slovakia"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ฑ","group":9,"order":4990,"tags":["SL","flag"],"version":2,"annotation":"flag: Sierra Leone","shortcodes":["flag_sl","sierra_leone"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ฒ","group":9,"order":4991,"tags":["SM","flag"],"version":2,"annotation":"flag: San Marino","shortcodes":["flag_sm","san_marino"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ณ","group":9,"order":4992,"tags":["SN","flag"],"version":2,"annotation":"flag: Senegal","shortcodes":["flag_sn","senegal"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ด","group":9,"order":4993,"tags":["SO","flag"],"version":2,"annotation":"flag: Somalia","shortcodes":["flag_so","somalia"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ท","group":9,"order":4994,"tags":["SR","flag"],"version":2,"annotation":"flag: Suriname","shortcodes":["flag_sr","suriname"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ธ","group":9,"order":4995,"tags":["SS","flag"],"version":2,"annotation":"flag: South Sudan","shortcodes":["flag_ss","south_sudan"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡น","group":9,"order":4996,"tags":["ST","flag"],"version":2,"annotation":"flag: Sรฃo Tomรฉ & Prรญncipe","shortcodes":["flag_st","sao_tome_principe"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ป","group":9,"order":4997,"tags":["SV","flag"],"version":2,"annotation":"flag: El Salvador","shortcodes":["el_salvador","flag_sv"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ฝ","group":9,"order":4998,"tags":["SX","flag"],"version":2,"annotation":"flag: Sint Maarten","shortcodes":["flag_sx","sint_maarten"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡พ","group":9,"order":4999,"tags":["SY","flag"],"version":2,"annotation":"flag: Syria","shortcodes":["flag_sy","syria"]},{"emoji":"๐Ÿ‡ธ๐Ÿ‡ฟ","group":9,"order":5000,"tags":["SZ","flag"],"version":2,"annotation":"flag: Eswatini","shortcodes":["eswatini","flag_sz","swaziland"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ฆ","group":9,"order":5001,"tags":["TA","flag"],"version":2,"annotation":"flag: Tristan da Cunha","shortcodes":["flag_ta","tristan_da_cunha"]},{"emoji":"๐Ÿ‡น๐Ÿ‡จ","group":9,"order":5002,"tags":["TC","flag"],"version":2,"annotation":"flag: Turks & Caicos Islands","shortcodes":["flag_tc","turks_caicos_islands"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ฉ","group":9,"order":5003,"tags":["TD","flag"],"version":2,"annotation":"flag: Chad","shortcodes":["chad","flag_td"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ซ","group":9,"order":5004,"tags":["TF","flag"],"version":2,"annotation":"flag: French Southern Territories","shortcodes":["flag_tf","french_southern_territories"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ฌ","group":9,"order":5005,"tags":["TG","flag"],"version":2,"annotation":"flag: Togo","shortcodes":["flag_tg","togo"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ญ","group":9,"order":5006,"tags":["TH","flag"],"version":2,"annotation":"flag: Thailand","shortcodes":["flag_th","thailand"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ฏ","group":9,"order":5007,"tags":["TJ","flag"],"version":2,"annotation":"flag: Tajikistan","shortcodes":["flag_tj","tajikistan"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ฐ","group":9,"order":5008,"tags":["TK","flag"],"version":2,"annotation":"flag: Tokelau","shortcodes":["flag_tk","tokelau"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ฑ","group":9,"order":5009,"tags":["TL","flag"],"version":2,"annotation":"flag: Timor-Leste","shortcodes":["flag_tl","timor_leste"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ฒ","group":9,"order":5010,"tags":["TM","flag"],"version":2,"annotation":"flag: Turkmenistan","shortcodes":["flag_tm","turkmenistan"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ณ","group":9,"order":5011,"tags":["TN","flag"],"version":2,"annotation":"flag: Tunisia","shortcodes":["flag_tn","tunisia"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ด","group":9,"order":5012,"tags":["TO","flag"],"version":2,"annotation":"flag: Tonga","shortcodes":["flag_to","tonga"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ท","group":9,"order":5013,"tags":["TR","flag"],"version":2,"annotation":"flag: Tรผrkiye","shortcodes":["flag_tr","turkey_tr"]},{"emoji":"๐Ÿ‡น๐Ÿ‡น","group":9,"order":5014,"tags":["TT","flag"],"version":2,"annotation":"flag: Trinidad & Tobago","shortcodes":["flag_tt","trinidad_tobago"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ป","group":9,"order":5015,"tags":["TV","flag"],"version":2,"annotation":"flag: Tuvalu","shortcodes":["flag_tv","tuvalu"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ผ","group":9,"order":5016,"tags":["TW","flag"],"version":2,"annotation":"flag: Taiwan","shortcodes":["flag_tw","taiwan"]},{"emoji":"๐Ÿ‡น๐Ÿ‡ฟ","group":9,"order":5017,"tags":["TZ","flag"],"version":2,"annotation":"flag: Tanzania","shortcodes":["flag_tz","tanzania"]},{"emoji":"๐Ÿ‡บ๐Ÿ‡ฆ","group":9,"order":5018,"tags":["UA","flag"],"version":2,"annotation":"flag: Ukraine","shortcodes":["flag_ua","ukraine"]},{"emoji":"๐Ÿ‡บ๐Ÿ‡ฌ","group":9,"order":5019,"tags":["UG","flag"],"version":2,"annotation":"flag: Uganda","shortcodes":["flag_ug","uganda"]},{"emoji":"๐Ÿ‡บ๐Ÿ‡ฒ","group":9,"order":5020,"tags":["UM","flag"],"version":2,"annotation":"flag: U.S. Outlying Islands","shortcodes":["flag_um","us_outlying_islands"]},{"emoji":"๐Ÿ‡บ๐Ÿ‡ณ","group":9,"order":5021,"tags":["UN","flag"],"version":4,"annotation":"flag: United Nations","shortcodes":["flag_un","un","united_nations"]},{"emoji":"๐Ÿ‡บ๐Ÿ‡ธ","group":9,"order":5022,"tags":["US","flag"],"version":0.6,"annotation":"flag: United States","shortcodes":["flag_us","united_states","usa"]},{"emoji":"๐Ÿ‡บ๐Ÿ‡พ","group":9,"order":5023,"tags":["UY","flag"],"version":2,"annotation":"flag: Uruguay","shortcodes":["flag_uy","uruguay"]},{"emoji":"๐Ÿ‡บ๐Ÿ‡ฟ","group":9,"order":5024,"tags":["UZ","flag"],"version":2,"annotation":"flag: Uzbekistan","shortcodes":["flag_uz","uzbekistan"]},{"emoji":"๐Ÿ‡ป๐Ÿ‡ฆ","group":9,"order":5025,"tags":["VA","flag"],"version":2,"annotation":"flag: Vatican City","shortcodes":["flag_va","vatican_city"]},{"emoji":"๐Ÿ‡ป๐Ÿ‡จ","group":9,"order":5026,"tags":["VC","flag"],"version":2,"annotation":"flag: St. Vincent & Grenadines","shortcodes":["flag_vc","st_vincent_grenadines"]},{"emoji":"๐Ÿ‡ป๐Ÿ‡ช","group":9,"order":5027,"tags":["VE","flag"],"version":2,"annotation":"flag: Venezuela","shortcodes":["flag_ve","venezuela"]},{"emoji":"๐Ÿ‡ป๐Ÿ‡ฌ","group":9,"order":5028,"tags":["VG","flag"],"version":2,"annotation":"flag: British Virgin Islands","shortcodes":["british_virgin_islands","flag_vg"]},{"emoji":"๐Ÿ‡ป๐Ÿ‡ฎ","group":9,"order":5029,"tags":["VI","flag"],"version":2,"annotation":"flag: U.S. Virgin Islands","shortcodes":["flag_vi","us_virgin_islands"]},{"emoji":"๐Ÿ‡ป๐Ÿ‡ณ","group":9,"order":5030,"tags":["VN","flag"],"version":2,"annotation":"flag: Vietnam","shortcodes":["flag_vn","vietnam"]},{"emoji":"๐Ÿ‡ป๐Ÿ‡บ","group":9,"order":5031,"tags":["VU","flag"],"version":2,"annotation":"flag: Vanuatu","shortcodes":["flag_vu","vanuatu"]},{"emoji":"๐Ÿ‡ผ๐Ÿ‡ซ","group":9,"order":5032,"tags":["WF","flag"],"version":2,"annotation":"flag: Wallis & Futuna","shortcodes":["flag_wf","wallis_futuna"]},{"emoji":"๐Ÿ‡ผ๐Ÿ‡ธ","group":9,"order":5033,"tags":["WS","flag"],"version":2,"annotation":"flag: Samoa","shortcodes":["flag_ws","samoa"]},{"emoji":"๐Ÿ‡ฝ๐Ÿ‡ฐ","group":9,"order":5034,"tags":["XK","flag"],"version":2,"annotation":"flag: Kosovo","shortcodes":["flag_xk","kosovo"]},{"emoji":"๐Ÿ‡พ๐Ÿ‡ช","group":9,"order":5035,"tags":["YE","flag"],"version":2,"annotation":"flag: Yemen","shortcodes":["flag_ye","yemen"]},{"emoji":"๐Ÿ‡พ๐Ÿ‡น","group":9,"order":5036,"tags":["YT","flag"],"version":2,"annotation":"flag: Mayotte","shortcodes":["flag_yt","mayotte"]},{"emoji":"๐Ÿ‡ฟ๐Ÿ‡ฆ","group":9,"order":5037,"tags":["ZA","flag"],"version":2,"annotation":"flag: South Africa","shortcodes":["flag_za","south_africa"]},{"emoji":"๐Ÿ‡ฟ๐Ÿ‡ฒ","group":9,"order":5038,"tags":["ZM","flag"],"version":2,"annotation":"flag: Zambia","shortcodes":["flag_zm","zambia"]},{"emoji":"๐Ÿ‡ฟ๐Ÿ‡ผ","group":9,"order":5039,"tags":["ZW","flag"],"version":2,"annotation":"flag: Zimbabwe","shortcodes":["flag_zw","zimbabwe"]},{"emoji":"๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ","group":9,"order":5040,"tags":["flag","gbeng"],"version":5,"annotation":"flag: England","shortcodes":["england","flag_gbeng"]},{"emoji":"๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ","group":9,"order":5041,"tags":["flag","gbsct"],"version":5,"annotation":"flag: Scotland","shortcodes":["flag_gbsct","scotland"]},{"emoji":"๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ","group":9,"order":5042,"tags":["flag","gbwls"],"version":5,"annotation":"flag: Wales","shortcodes":["flag_gbwls","wales"]}] diff --git a/assets/ckeditor/html_label.js b/assets/ckeditor/html_label.js index 9040f3c7..72d1126e 100644 --- a/assets/ckeditor/html_label.js +++ b/assets/ckeditor/html_label.js @@ -1,66 +1,63 @@ -/** - * @license Copyright (c) 2014-2022, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ -import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor.js'; -import Alignment from '@ckeditor/ckeditor5-alignment/src/alignment.js'; -import Autoformat from '@ckeditor/ckeditor5-autoformat/src/autoformat.js'; -import Base64UploadAdapter from '@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter.js'; -import BlockQuote from '@ckeditor/ckeditor5-block-quote/src/blockquote.js'; -import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold.js'; -import Code from '@ckeditor/ckeditor5-basic-styles/src/code.js'; -import CodeBlock from '@ckeditor/ckeditor5-code-block/src/codeblock.js'; -import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials.js'; -import FindAndReplace from '@ckeditor/ckeditor5-find-and-replace/src/findandreplace.js'; -import FontBackgroundColor from '@ckeditor/ckeditor5-font/src/fontbackgroundcolor.js'; -import FontColor from '@ckeditor/ckeditor5-font/src/fontcolor.js'; -import FontFamily from '@ckeditor/ckeditor5-font/src/fontfamily.js'; -import FontSize from '@ckeditor/ckeditor5-font/src/fontsize.js'; -import GeneralHtmlSupport from '@ckeditor/ckeditor5-html-support/src/generalhtmlsupport.js'; -import Heading from '@ckeditor/ckeditor5-heading/src/heading.js'; -import Highlight from '@ckeditor/ckeditor5-highlight/src/highlight.js'; -import HorizontalLine from '@ckeditor/ckeditor5-horizontal-line/src/horizontalline.js'; -import HtmlComment from '@ckeditor/ckeditor5-html-support/src/htmlcomment.js'; -import HtmlEmbed from '@ckeditor/ckeditor5-html-embed/src/htmlembed.js'; -import Image from '@ckeditor/ckeditor5-image/src/image.js'; -import ImageResize from '@ckeditor/ckeditor5-image/src/imageresize.js'; -import ImageStyle from '@ckeditor/ckeditor5-image/src/imagestyle.js'; -import ImageToolbar from '@ckeditor/ckeditor5-image/src/imagetoolbar.js'; -import ImageUpload from '@ckeditor/ckeditor5-image/src/imageupload.js'; -import Indent from '@ckeditor/ckeditor5-indent/src/indent.js'; -import IndentBlock from '@ckeditor/ckeditor5-indent/src/indentblock.js'; -import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic.js'; -import Link from '@ckeditor/ckeditor5-link/src/link.js'; -import LinkImage from '@ckeditor/ckeditor5-link/src/linkimage.js'; -import List from '@ckeditor/ckeditor5-list/src/list.js'; -import ListProperties from '@ckeditor/ckeditor5-list/src/listproperties.js'; -import Markdown from '@ckeditor/ckeditor5-markdown-gfm/src/markdown.js'; -import MediaEmbed from '@ckeditor/ckeditor5-media-embed/src/mediaembed.js'; -import MediaEmbedToolbar from '@ckeditor/ckeditor5-media-embed/src/mediaembedtoolbar.js'; -import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph.js'; -import PasteFromOffice from '@ckeditor/ckeditor5-paste-from-office/src/pastefromoffice.js'; -import RemoveFormat from '@ckeditor/ckeditor5-remove-format/src/removeformat.js'; -import SourceEditing from '@ckeditor/ckeditor5-source-editing/src/sourceediting.js'; -import SpecialCharacters from '@ckeditor/ckeditor5-special-characters/src/specialcharacters.js'; -import SpecialCharactersArrows from '@ckeditor/ckeditor5-special-characters/src/specialcharactersarrows.js'; -import SpecialCharactersCurrency from '@ckeditor/ckeditor5-special-characters/src/specialcharacterscurrency.js'; -import SpecialCharactersEssentials from '@ckeditor/ckeditor5-special-characters/src/specialcharactersessentials.js'; -import SpecialCharactersLatin from '@ckeditor/ckeditor5-special-characters/src/specialcharacterslatin.js'; -import SpecialCharactersMathematical from '@ckeditor/ckeditor5-special-characters/src/specialcharactersmathematical.js'; -import SpecialCharactersText from '@ckeditor/ckeditor5-special-characters/src/specialcharacterstext.js'; -import Strikethrough from '@ckeditor/ckeditor5-basic-styles/src/strikethrough.js'; -import Subscript from '@ckeditor/ckeditor5-basic-styles/src/subscript.js'; -import Superscript from '@ckeditor/ckeditor5-basic-styles/src/superscript.js'; -import Table from '@ckeditor/ckeditor5-table/src/table.js'; -import TableCaption from '@ckeditor/ckeditor5-table/src/tablecaption.js'; -import TableCellProperties from '@ckeditor/ckeditor5-table/src/tablecellproperties'; -import TableColumnResize from '@ckeditor/ckeditor5-table/src/tablecolumnresize.js'; -import TableProperties from '@ckeditor/ckeditor5-table/src/tableproperties'; -import TableToolbar from '@ckeditor/ckeditor5-table/src/tabletoolbar.js'; -import Underline from '@ckeditor/ckeditor5-basic-styles/src/underline.js'; -import WordCount from '@ckeditor/ckeditor5-word-count/src/wordcount.js'; -import EditorWatchdog from '@ckeditor/ckeditor5-watchdog/src/editorwatchdog.js'; +import {ClassicEditor} from 'ckeditor5' +import {Alignment} from 'ckeditor5'; +import {Autoformat} from 'ckeditor5'; +import {Base64UploadAdapter} from 'ckeditor5'; +import {BlockQuote} from 'ckeditor5'; +import {Bold} from 'ckeditor5'; +import {Code} from 'ckeditor5'; +import {CodeBlock} from 'ckeditor5'; +import {Essentials} from 'ckeditor5'; +import {FindAndReplace} from 'ckeditor5'; +import {FontBackgroundColor} from 'ckeditor5'; +import {FontColor} from 'ckeditor5'; +import {FontFamily} from 'ckeditor5'; +import {FontSize} from 'ckeditor5'; +import {GeneralHtmlSupport} from 'ckeditor5'; +import {Heading} from 'ckeditor5'; +import {Highlight} from 'ckeditor5'; +import {HorizontalLine} from 'ckeditor5'; +import {HtmlComment} from 'ckeditor5'; +import {HtmlEmbed} from 'ckeditor5'; +import {Image} from 'ckeditor5'; +import {ImageResize} from 'ckeditor5'; +import {ImageStyle} from 'ckeditor5'; +import {ImageToolbar} from 'ckeditor5'; +import {ImageUpload} from 'ckeditor5'; +import {Indent} from 'ckeditor5'; +import {IndentBlock} from 'ckeditor5'; +import {Italic} from 'ckeditor5'; +import {Link} from 'ckeditor5'; +import {LinkImage} from 'ckeditor5'; +import {List} from 'ckeditor5'; +import {ListProperties} from 'ckeditor5'; +import {Markdown} from 'ckeditor5'; +import {MediaEmbed} from 'ckeditor5'; +import {MediaEmbedToolbar} from 'ckeditor5'; +import {Paragraph} from 'ckeditor5'; +import {PasteFromOffice} from 'ckeditor5'; +import {RemoveFormat} from 'ckeditor5'; +import {SourceEditing} from 'ckeditor5'; +import {SpecialCharacters} from 'ckeditor5'; +import {SpecialCharactersArrows} from 'ckeditor5'; +import {SpecialCharactersCurrency} from 'ckeditor5'; +import {SpecialCharactersEssentials} from 'ckeditor5'; +import {SpecialCharactersLatin} from 'ckeditor5'; +import {SpecialCharactersMathematical} from 'ckeditor5'; +import {SpecialCharactersText} from 'ckeditor5'; +import {Strikethrough} from 'ckeditor5'; +import {Subscript} from 'ckeditor5'; +import {Superscript} from 'ckeditor5'; +import {Table} from 'ckeditor5'; +import {TableCaption} from 'ckeditor5'; +import {TableCellProperties} from 'ckeditor5'; +import {TableColumnResize} from 'ckeditor5'; +import {TableProperties} from 'ckeditor5'; +import {TableToolbar} from 'ckeditor5'; +import {Underline} from 'ckeditor5'; +import {WordCount} from 'ckeditor5'; +import {EditorWatchdog} from 'ckeditor5'; import PartDBLabel from "./plugins/PartDBLabel/PartDBLabel"; +import SpecialCharactersGreek from "./plugins/special_characters_emoji"; class Editor extends ClassicEditor {} @@ -122,7 +119,8 @@ Editor.builtinPlugins = [ Underline, WordCount, - PartDBLabel + PartDBLabel, + SpecialCharactersGreek ]; // Editor configuration. diff --git a/assets/ckeditor/markdown_full.js b/assets/ckeditor/markdown_full.js index 784bd688..76944b86 100644 --- a/assets/ckeditor/markdown_full.js +++ b/assets/ckeditor/markdown_full.js @@ -2,68 +2,69 @@ * @license Copyright (c) 2014-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor.js'; -import Alignment from '@ckeditor/ckeditor5-alignment/src/alignment.js'; -import Autoformat from '@ckeditor/ckeditor5-autoformat/src/autoformat.js'; -import Base64UploadAdapter from '@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter.js'; -import BlockQuote from '@ckeditor/ckeditor5-block-quote/src/blockquote.js'; -import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold.js'; -import Code from '@ckeditor/ckeditor5-basic-styles/src/code.js'; -import CodeBlock from '@ckeditor/ckeditor5-code-block/src/codeblock.js'; -import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials.js'; -import FindAndReplace from '@ckeditor/ckeditor5-find-and-replace/src/findandreplace.js'; -import FontBackgroundColor from '@ckeditor/ckeditor5-font/src/fontbackgroundcolor.js'; -import FontColor from '@ckeditor/ckeditor5-font/src/fontcolor.js'; -import FontFamily from '@ckeditor/ckeditor5-font/src/fontfamily.js'; -import FontSize from '@ckeditor/ckeditor5-font/src/fontsize.js'; -import GeneralHtmlSupport from '@ckeditor/ckeditor5-html-support/src/generalhtmlsupport.js'; -import Heading from '@ckeditor/ckeditor5-heading/src/heading.js'; -import Highlight from '@ckeditor/ckeditor5-highlight/src/highlight.js'; -import HorizontalLine from '@ckeditor/ckeditor5-horizontal-line/src/horizontalline.js'; -import HtmlComment from '@ckeditor/ckeditor5-html-support/src/htmlcomment.js'; -import HtmlEmbed from '@ckeditor/ckeditor5-html-embed/src/htmlembed.js'; -import Image from '@ckeditor/ckeditor5-image/src/image.js'; -import ImageResize from '@ckeditor/ckeditor5-image/src/imageresize.js'; -import ImageStyle from '@ckeditor/ckeditor5-image/src/imagestyle.js'; -import ImageToolbar from '@ckeditor/ckeditor5-image/src/imagetoolbar.js'; -import ImageUpload from '@ckeditor/ckeditor5-image/src/imageupload.js'; -import Indent from '@ckeditor/ckeditor5-indent/src/indent.js'; -import IndentBlock from '@ckeditor/ckeditor5-indent/src/indentblock.js'; -import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic.js'; -import Link from '@ckeditor/ckeditor5-link/src/link.js'; -import LinkImage from '@ckeditor/ckeditor5-link/src/linkimage.js'; -import List from '@ckeditor/ckeditor5-list/src/list.js'; -import ListProperties from '@ckeditor/ckeditor5-list/src/listproperties.js'; -import Markdown from '@ckeditor/ckeditor5-markdown-gfm/src/markdown.js'; -import MediaEmbed from '@ckeditor/ckeditor5-media-embed/src/mediaembed.js'; -import MediaEmbedToolbar from '@ckeditor/ckeditor5-media-embed/src/mediaembedtoolbar.js'; -import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph.js'; -import PasteFromOffice from '@ckeditor/ckeditor5-paste-from-office/src/pastefromoffice.js'; -import RemoveFormat from '@ckeditor/ckeditor5-remove-format/src/removeformat.js'; -import SourceEditing from '@ckeditor/ckeditor5-source-editing/src/sourceediting.js'; -import SpecialCharacters from '@ckeditor/ckeditor5-special-characters/src/specialcharacters.js'; -import SpecialCharactersArrows from '@ckeditor/ckeditor5-special-characters/src/specialcharactersarrows.js'; -import SpecialCharactersCurrency from '@ckeditor/ckeditor5-special-characters/src/specialcharacterscurrency.js'; -import SpecialCharactersEssentials from '@ckeditor/ckeditor5-special-characters/src/specialcharactersessentials.js'; -import SpecialCharactersLatin from '@ckeditor/ckeditor5-special-characters/src/specialcharacterslatin.js'; -import SpecialCharactersMathematical from '@ckeditor/ckeditor5-special-characters/src/specialcharactersmathematical.js'; -import SpecialCharactersText from '@ckeditor/ckeditor5-special-characters/src/specialcharacterstext.js'; -import Strikethrough from '@ckeditor/ckeditor5-basic-styles/src/strikethrough.js'; -import Subscript from '@ckeditor/ckeditor5-basic-styles/src/subscript.js'; -import Superscript from '@ckeditor/ckeditor5-basic-styles/src/superscript.js'; -import Table from '@ckeditor/ckeditor5-table/src/table.js'; -import TableCaption from '@ckeditor/ckeditor5-table/src/tablecaption.js'; -import TableCellProperties from '@ckeditor/ckeditor5-table/src/tablecellproperties'; -import TableColumnResize from '@ckeditor/ckeditor5-table/src/tablecolumnresize.js'; -import TableProperties from '@ckeditor/ckeditor5-table/src/tableproperties'; -import TableToolbar from '@ckeditor/ckeditor5-table/src/tabletoolbar.js'; -import Underline from '@ckeditor/ckeditor5-basic-styles/src/underline.js'; -import WordCount from '@ckeditor/ckeditor5-word-count/src/wordcount.js'; -import EditorWatchdog from '@ckeditor/ckeditor5-watchdog/src/editorwatchdog.js'; -import TodoList from '@ckeditor/ckeditor5-list/src/todolist'; +import {ClassicEditor} from 'ckeditor5'; +import {Alignment} from 'ckeditor5'; +import {Autoformat} from 'ckeditor5'; +import {Base64UploadAdapter} from 'ckeditor5'; +import {BlockQuote} from 'ckeditor5'; +import {Bold} from 'ckeditor5'; +import {Code} from 'ckeditor5'; +import {CodeBlock} from 'ckeditor5'; +import {Essentials} from 'ckeditor5'; +import {FindAndReplace} from 'ckeditor5'; +import {FontBackgroundColor} from 'ckeditor5'; +import {FontColor} from 'ckeditor5'; +import {FontFamily} from 'ckeditor5'; +import {FontSize} from 'ckeditor5'; +import {GeneralHtmlSupport} from 'ckeditor5'; +import {Heading} from 'ckeditor5'; +import {Highlight} from 'ckeditor5'; +import {HorizontalLine} from 'ckeditor5'; +import {HtmlComment} from 'ckeditor5'; +import {HtmlEmbed} from 'ckeditor5'; +import {Image} from 'ckeditor5'; +import {ImageResize} from 'ckeditor5'; +import {ImageStyle} from 'ckeditor5'; +import {ImageToolbar} from 'ckeditor5'; +import {ImageUpload} from 'ckeditor5'; +import {Indent} from 'ckeditor5'; +import {IndentBlock} from 'ckeditor5'; +import {Italic} from 'ckeditor5'; +import {Link} from 'ckeditor5'; +import {LinkImage} from 'ckeditor5'; +import {List} from 'ckeditor5'; +import {ListProperties} from 'ckeditor5'; +import {Markdown} from 'ckeditor5'; +import {MediaEmbed} from 'ckeditor5'; +import {MediaEmbedToolbar} from 'ckeditor5'; +import {Paragraph} from 'ckeditor5'; +import {PasteFromOffice} from 'ckeditor5'; +import {RemoveFormat} from 'ckeditor5'; +import {SourceEditing} from 'ckeditor5'; +import {SpecialCharacters} from 'ckeditor5'; +import {SpecialCharactersArrows} from 'ckeditor5'; +import {SpecialCharactersCurrency} from 'ckeditor5'; +import {SpecialCharactersEssentials} from 'ckeditor5'; +import {SpecialCharactersLatin} from 'ckeditor5'; +import {SpecialCharactersMathematical} from 'ckeditor5'; +import {SpecialCharactersText} from 'ckeditor5'; +import {Strikethrough} from 'ckeditor5'; +import {Subscript} from 'ckeditor5'; +import {Superscript} from 'ckeditor5'; +import {Table} from 'ckeditor5'; +import {TableCaption} from 'ckeditor5'; +import {TableCellProperties} from 'ckeditor5'; +import {TableColumnResize} from 'ckeditor5'; +import {TableProperties} from 'ckeditor5'; +import {TableToolbar} from 'ckeditor5'; +import {Underline} from 'ckeditor5'; +import {WordCount} from 'ckeditor5'; +import {EditorWatchdog} from 'ckeditor5'; +import {TodoList} from 'ckeditor5'; import ExtendedMarkdown from "./plugins/extendedMarkdown.js"; -import SpecialCharactersEmoji from "./plugins/special_characters_emoji"; +import SpecialCharactersGreek from "./plugins/special_characters_emoji"; +import {Mention, Emoji} from "ckeditor5"; class Editor extends ClassicEditor {} @@ -117,9 +118,11 @@ Editor.builtinPlugins = [ Underline, TodoList, + Mention, Emoji, + //Our own extensions ExtendedMarkdown, - SpecialCharactersEmoji + SpecialCharactersGreek ]; // Editor configuration. @@ -148,6 +151,7 @@ Editor.defaultConfig = { 'indent', '|', 'specialCharacters', + "emoji", 'horizontalLine', '|', 'imageUpload', diff --git a/assets/ckeditor/markdown_single_line.js b/assets/ckeditor/markdown_single_line.js index f7e91aa9..f05983a2 100644 --- a/assets/ckeditor/markdown_single_line.js +++ b/assets/ckeditor/markdown_single_line.js @@ -2,35 +2,36 @@ * @license Copyright (c) 2014-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor.js'; -import Autoformat from '@ckeditor/ckeditor5-autoformat/src/autoformat.js'; -import AutoLink from '@ckeditor/ckeditor5-link/src/autolink.js'; -import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold.js'; -import Code from '@ckeditor/ckeditor5-basic-styles/src/code.js'; -import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials.js'; -import FindAndReplace from '@ckeditor/ckeditor5-find-and-replace/src/findandreplace.js'; -import Highlight from '@ckeditor/ckeditor5-highlight/src/highlight.js'; -import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic.js'; -import Link from '@ckeditor/ckeditor5-link/src/link.js'; -import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph.js'; -import RemoveFormat from '@ckeditor/ckeditor5-remove-format/src/removeformat.js'; -import SourceEditing from '@ckeditor/ckeditor5-source-editing/src/sourceediting.js'; -import SpecialCharacters from '@ckeditor/ckeditor5-special-characters/src/specialcharacters.js'; -import SpecialCharactersArrows from '@ckeditor/ckeditor5-special-characters/src/specialcharactersarrows.js'; -import SpecialCharactersCurrency from '@ckeditor/ckeditor5-special-characters/src/specialcharacterscurrency.js'; -import SpecialCharactersEssentials from '@ckeditor/ckeditor5-special-characters/src/specialcharactersessentials.js'; -import SpecialCharactersLatin from '@ckeditor/ckeditor5-special-characters/src/specialcharacterslatin.js'; -import SpecialCharactersMathematical from '@ckeditor/ckeditor5-special-characters/src/specialcharactersmathematical.js'; -import SpecialCharactersText from '@ckeditor/ckeditor5-special-characters/src/specialcharacterstext.js'; -import Strikethrough from '@ckeditor/ckeditor5-basic-styles/src/strikethrough.js'; -import Subscript from '@ckeditor/ckeditor5-basic-styles/src/subscript.js'; -import Superscript from '@ckeditor/ckeditor5-basic-styles/src/superscript.js'; -import Underline from '@ckeditor/ckeditor5-basic-styles/src/underline.js'; -import EditorWatchdog from '@ckeditor/ckeditor5-watchdog/src/editorwatchdog.js'; +import {ClassicEditor} from 'ckeditor5'; +import {Autoformat} from 'ckeditor5'; +import {AutoLink} from 'ckeditor5'; +import {Bold} from 'ckeditor5'; +import {Code} from 'ckeditor5'; +import {Essentials} from 'ckeditor5'; +import {FindAndReplace} from 'ckeditor5'; +import {Highlight} from 'ckeditor5'; +import {Italic} from 'ckeditor5'; +import {Link} from 'ckeditor5'; +import {Paragraph} from 'ckeditor5'; +import {RemoveFormat} from 'ckeditor5'; +import {SourceEditing} from 'ckeditor5'; +import {SpecialCharacters} from 'ckeditor5'; +import {SpecialCharactersArrows} from 'ckeditor5'; +import {SpecialCharactersCurrency} from 'ckeditor5'; +import {SpecialCharactersEssentials} from 'ckeditor5'; +import {SpecialCharactersLatin} from 'ckeditor5'; +import {SpecialCharactersMathematical} from 'ckeditor5'; +import {SpecialCharactersText} from 'ckeditor5'; +import {Strikethrough} from 'ckeditor5'; +import {Subscript} from 'ckeditor5'; +import {Superscript} from 'ckeditor5'; +import {Underline} from 'ckeditor5'; +import {EditorWatchdog} from 'ckeditor5'; +import {Mention, Emoji} from "ckeditor5"; import ExtendedMarkdownInline from "./plugins/extendedMarkdownInline"; import SingleLinePlugin from "./plugins/singleLine"; -import SpecialCharactersEmoji from "./plugins/special_characters_emoji"; +import SpecialCharactersGreek from "./plugins/special_characters_emoji"; class Editor extends ClassicEditor {} @@ -62,7 +63,8 @@ Editor.builtinPlugins = [ ExtendedMarkdownInline, SingleLinePlugin, - SpecialCharactersEmoji + SpecialCharactersGreek, + Mention, Emoji ]; // Editor configuration. @@ -81,6 +83,7 @@ Editor.defaultConfig = { 'link', 'code', 'specialCharacters', + 'emoji', '|', 'undo', 'redo', diff --git a/assets/ckeditor/plugins/PartDBLabel/PartDBLabel.js b/assets/ckeditor/plugins/PartDBLabel/PartDBLabel.js index 01e1c7bf..708d4ebb 100644 --- a/assets/ckeditor/plugins/PartDBLabel/PartDBLabel.js +++ b/assets/ckeditor/plugins/PartDBLabel/PartDBLabel.js @@ -22,7 +22,7 @@ import PartDBLabelEditing from "./PartDBLabelEditing"; import "./PartDBLabel.css"; -import Plugin from "@ckeditor/ckeditor5-core/src/plugin"; +import {Plugin} from "ckeditor5"; export default class PartDBLabel extends Plugin { static get requires() { @@ -32,4 +32,4 @@ export default class PartDBLabel extends Plugin { static get pluginName() { return 'PartDBLabel'; } -} \ No newline at end of file +} diff --git a/assets/ckeditor/plugins/PartDBLabel/PartDBLabelCommand.js b/assets/ckeditor/plugins/PartDBLabel/PartDBLabelCommand.js index 4c3af3ef..7b9797e7 100644 --- a/assets/ckeditor/plugins/PartDBLabel/PartDBLabelCommand.js +++ b/assets/ckeditor/plugins/PartDBLabel/PartDBLabelCommand.js @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -import Command from '@ckeditor/ckeditor5-core/src/command'; +import {Command} from 'ckeditor5'; export default class PartDBLabelCommand extends Command { execute( { value } ) { @@ -47,4 +47,4 @@ export default class PartDBLabelCommand extends Command { this.isEnabled = isAllowed; } -} \ No newline at end of file +} diff --git a/assets/ckeditor/plugins/PartDBLabel/PartDBLabelEditing.js b/assets/ckeditor/plugins/PartDBLabel/PartDBLabelEditing.js index e61fb895..5cb4860f 100644 --- a/assets/ckeditor/plugins/PartDBLabel/PartDBLabelEditing.js +++ b/assets/ckeditor/plugins/PartDBLabel/PartDBLabelEditing.js @@ -17,11 +17,11 @@ * along with this program. If not, see . */ -import Plugin from '@ckeditor/ckeditor5-core/src/plugin'; +import {Plugin} from 'ckeditor5'; import PartDBLabelCommand from "./PartDBLabelCommand"; -import { toWidget } from '@ckeditor/ckeditor5-widget/src/utils'; -import Widget from '@ckeditor/ckeditor5-widget/src/widget'; +import { toWidget } from 'ckeditor5'; +import {Widget} from 'ckeditor5'; export default class PartDBLabelEditing extends Plugin { static get requires() { // ADDED @@ -102,4 +102,4 @@ export default class PartDBLabelEditing extends Plugin { } } -} \ No newline at end of file +} diff --git a/assets/ckeditor/plugins/PartDBLabel/PartDBLabelUI.js b/assets/ckeditor/plugins/PartDBLabel/PartDBLabelUI.js index 37e1dcbe..095b0d25 100644 --- a/assets/ckeditor/plugins/PartDBLabel/PartDBLabelUI.js +++ b/assets/ckeditor/plugins/PartDBLabel/PartDBLabelUI.js @@ -17,14 +17,14 @@ * along with this program. If not, see . */ -import Plugin from '@ckeditor/ckeditor5-core/src/plugin'; +import {Plugin} from 'ckeditor5'; require('./lang/de.js'); -import { addListToDropdown, createDropdown } from '@ckeditor/ckeditor5-ui/src/dropdown/utils'; +import { addListToDropdown, createDropdown } from 'ckeditor5'; -import Collection from '@ckeditor/ckeditor5-utils/src/collection'; -import Model from '@ckeditor/ckeditor5-ui/src/model'; +import {Collection} from 'ckeditor5'; +import {Model} from 'ckeditor5'; export default class PartDBLabelUI extends Plugin { init() { @@ -187,4 +187,4 @@ function getDropdownItemsDefinitions(t) { } return itemDefinitions; -} \ No newline at end of file +} diff --git a/assets/ckeditor/plugins/extendedMarkdown.js b/assets/ckeditor/plugins/extendedMarkdown.js index 987388cd..fc861175 100644 --- a/assets/ckeditor/plugins/extendedMarkdown.js +++ b/assets/ckeditor/plugins/extendedMarkdown.js @@ -17,8 +17,7 @@ * along with this program. If not, see . */ -import { Plugin } from 'ckeditor5/src/core'; -import GFMDataProcessor from '@ckeditor/ckeditor5-markdown-gfm/src/gfmdataprocessor'; +import { Plugin, MarkdownGfmDataProcessor } from 'ckeditor5'; const ALLOWED_TAGS = [ //Common elements @@ -34,7 +33,6 @@ const ALLOWED_TAGS = [ //Block elements 'span', - 'p', 'img', @@ -57,7 +55,7 @@ export default class ExtendedMarkdown extends Plugin { constructor( editor ) { super( editor ); - editor.data.processor = new GFMDataProcessor( editor.data.viewDocument ); + editor.data.processor = new MarkdownGfmDataProcessor( editor.data.viewDocument ); for (const tag of ALLOWED_TAGS) { editor.data.processor.keepHtml(tag); } diff --git a/assets/ckeditor/plugins/extendedMarkdownInline.js b/assets/ckeditor/plugins/extendedMarkdownInline.js index 21d4074c..695e7089 100644 --- a/assets/ckeditor/plugins/extendedMarkdownInline.js +++ b/assets/ckeditor/plugins/extendedMarkdownInline.js @@ -17,8 +17,8 @@ * along with this program. If not, see . */ -import { Plugin } from 'ckeditor5/src/core'; -import GFMDataProcessor from '@ckeditor/ckeditor5-markdown-gfm/src/gfmdataprocessor'; +import {Plugin} from 'ckeditor5'; +import {MarkdownGfmDataProcessor} from 'ckeditor5'; const ALLOWED_TAGS = [ //Common elements @@ -46,7 +46,7 @@ export default class ExtendedMarkdownInline extends Plugin { constructor( editor ) { super( editor ); - editor.data.processor = new GFMDataProcessor( editor.data.viewDocument ); + editor.data.processor = new MarkdownGfmDataProcessor( editor.data.viewDocument ); for (const tag of ALLOWED_TAGS) { editor.data.processor.keepHtml(tag); } diff --git a/assets/ckeditor/plugins/singleLine.js b/assets/ckeditor/plugins/singleLine.js index 79ac9c6f..be84dd22 100644 --- a/assets/ckeditor/plugins/singleLine.js +++ b/assets/ckeditor/plugins/singleLine.js @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -import Plugin from '@ckeditor/ckeditor5-core/src/plugin'; +import {Plugin} from 'ckeditor5'; export default class SingleLinePlugin extends Plugin { init() { @@ -42,7 +42,7 @@ export default class SingleLinePlugin extends Plugin { //We can not use the dataTransfer.setData method because the old object is somehow protected data.dataTransfer = new DataTransfer(); data.dataTransfer.setData("text", cleaned); - + }, { priority: 'high' } ); } -} \ No newline at end of file +} diff --git a/assets/ckeditor/plugins/special_characters_emoji.js b/assets/ckeditor/plugins/special_characters_emoji.js index 1d4ec000..1a57def2 100644 --- a/assets/ckeditor/plugins/special_characters_emoji.js +++ b/assets/ckeditor/plugins/special_characters_emoji.js @@ -17,14 +17,12 @@ * along with this program. If not, see . */ -import SpecialCharacters from '@ckeditor/ckeditor5-special-characters/src/specialcharacters'; -import SpecialCharactersEssentials from '@ckeditor/ckeditor5-special-characters/src/specialcharactersessentials'; +import SpecialCharacters from 'ckeditor5'; +import SpecialCharactersEssentials from 'ckeditor5'; -import Plugin from '@ckeditor/ckeditor5-core/src/plugin'; +import {Plugin} from 'ckeditor5'; -const emoji = require('emoji.json'); - -export default class SpecialCharactersEmoji extends Plugin { +export default class SpecialCharactersGreek extends Plugin { init() { const editor = this.editor; @@ -32,9 +30,6 @@ export default class SpecialCharactersEmoji extends Plugin { //Add greek characters to special characters specialCharsPlugin.addItems('Greek', this.getGreek()); - - //Add Emojis to special characters - specialCharsPlugin.addItems('Emoji', this.getEmojis()); } getGreek() { @@ -96,14 +91,4 @@ export default class SpecialCharactersEmoji extends Plugin { { title: 'san', character: 'ฯบ' }, ]; } - - getEmojis() { - //Map our emoji data to the format the plugin expects - return emoji.map(emoji => { - return { - title: emoji.name, - character: emoji.char - }; - }); - } -} \ No newline at end of file +} diff --git a/assets/controllers/csrf_protection_controller.js b/assets/controllers/csrf_protection_controller.js new file mode 100644 index 00000000..c722f024 --- /dev/null +++ b/assets/controllers/csrf_protection_controller.js @@ -0,0 +1,79 @@ +const nameCheck = /^[-_a-zA-Z0-9]{4,22}$/; +const tokenCheck = /^[-_/+a-zA-Z0-9]{24,}$/; + +// Generate and double-submit a CSRF token in a form field and a cookie, as defined by Symfony's SameOriginCsrfTokenManager +document.addEventListener('submit', function (event) { + generateCsrfToken(event.target); +}, true); + +// When @hotwired/turbo handles form submissions, send the CSRF token in a header in addition to a cookie +// The `framework.csrf_protection.check_header` config option needs to be enabled for the header to be checked +document.addEventListener('turbo:submit-start', function (event) { + const h = generateCsrfHeaders(event.detail.formSubmission.formElement); + Object.keys(h).map(function (k) { + event.detail.formSubmission.fetchRequest.headers[k] = h[k]; + }); +}); + +// When @hotwired/turbo handles form submissions, remove the CSRF cookie once a form has been submitted +document.addEventListener('turbo:submit-end', function (event) { + removeCsrfToken(event.detail.formSubmission.formElement); +}); + +export function generateCsrfToken (formElement) { + const csrfField = formElement.querySelector('input[data-controller="csrf-protection"], input[name="_csrf_token"]'); + + if (!csrfField) { + return; + } + + let csrfCookie = csrfField.getAttribute('data-csrf-protection-cookie-value'); + let csrfToken = csrfField.value; + + if (!csrfCookie && nameCheck.test(csrfToken)) { + csrfField.setAttribute('data-csrf-protection-cookie-value', csrfCookie = csrfToken); + csrfField.defaultValue = csrfToken = btoa(String.fromCharCode.apply(null, (window.crypto || window.msCrypto).getRandomValues(new Uint8Array(18)))); + csrfField.dispatchEvent(new Event('change', { bubbles: true })); + } + + if (csrfCookie && tokenCheck.test(csrfToken)) { + const cookie = csrfCookie + '_' + csrfToken + '=' + csrfCookie + '; path=/; samesite=strict'; + document.cookie = window.location.protocol === 'https:' ? '__Host-' + cookie + '; secure' : cookie; + } +} + +export function generateCsrfHeaders (formElement) { + const headers = {}; + const csrfField = formElement.querySelector('input[data-controller="csrf-protection"], input[name="_csrf_token"]'); + + if (!csrfField) { + return headers; + } + + const csrfCookie = csrfField.getAttribute('data-csrf-protection-cookie-value'); + + if (tokenCheck.test(csrfField.value) && nameCheck.test(csrfCookie)) { + headers[csrfCookie] = csrfField.value; + } + + return headers; +} + +export function removeCsrfToken (formElement) { + const csrfField = formElement.querySelector('input[data-controller="csrf-protection"], input[name="_csrf_token"]'); + + if (!csrfField) { + return; + } + + const csrfCookie = csrfField.getAttribute('data-csrf-protection-cookie-value'); + + if (tokenCheck.test(csrfField.value) && nameCheck.test(csrfCookie)) { + const cookie = csrfCookie + '_' + csrfField.value + '=0; path=/; samesite=strict; max-age=0'; + + document.cookie = window.location.protocol === 'https:' ? '__Host-' + cookie + '; secure' : cookie; + } +} + +/* stimulusFetch: 'lazy' */ +export default 'csrf-protection-controller'; diff --git a/assets/controllers/elements/ckeditor_controller.js b/assets/controllers/elements/ckeditor_controller.js index 079ee2ad..62a48b15 100644 --- a/assets/controllers/elements/ckeditor_controller.js +++ b/assets/controllers/elements/ckeditor_controller.js @@ -23,8 +23,9 @@ import { default as FullEditor } from "../../ckeditor/markdown_full"; import { default as SingleLineEditor} from "../../ckeditor/markdown_single_line"; import { default as HTMLLabelEditor } from "../../ckeditor/html_label"; -import EditorWatchdog from '@ckeditor/ckeditor5-watchdog/src/editorwatchdog'; +import {EditorWatchdog} from 'ckeditor5'; +import "ckeditor5/ckeditor5.css";; import "../../css/components/ckeditor.css"; /* stimulusFetch: 'lazy' */ @@ -51,9 +52,15 @@ export default class extends Controller { const language = document.body.dataset.locale ?? "en"; + const emojiURL = new URL('../../ckeditor/emojis.json', import.meta.url).href; + const config = { language: language, licenseKey: "GPL", + + emoji: { + definitionsUrl: emojiURL + } } const watchdog = new EditorWatchdog(); @@ -84,4 +91,4 @@ export default class extends Controller { console.error(error); }); } -} \ No newline at end of file +} diff --git a/assets/controllers/toggle_password_controller.js b/assets/controllers/toggle_password_controller.js new file mode 100644 index 00000000..bef87e11 --- /dev/null +++ b/assets/controllers/toggle_password_controller.js @@ -0,0 +1,86 @@ +/* + * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony). + * + * Copyright (C) 2019 - 2025 Jan Bรถhmer (https://github.com/jbtronics) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { Controller } from '@hotwired/stimulus'; +import '../css/components/toggle_password.css'; + +export default class extends Controller { + static values = { + visibleLabel: { type: String, default: 'Show' }, + visibleIcon: { type: String, default: 'Default' }, + hiddenLabel: { type: String, default: 'Hide' }, + hiddenIcon: { type: String, default: 'Default' }, + buttonClasses: Array, + }; + + isDisplayed = false; + visibleIcon = ` + + +`; + hiddenIcon = ` + + +`; + + connect() { + if (this.visibleIconValue !== 'Default') { + this.visibleIcon = this.visibleIconValue; + } + + if (this.hiddenIconValue !== 'Default') { + this.hiddenIcon = this.hiddenIconValue; + } + + const button = this.createButton(); + + this.element.insertAdjacentElement('afterend', button); + this.dispatchEvent('connect', { element: this.element, button }); + } + + /** + * @returns {HTMLButtonElement} + */ + createButton() { + const button = document.createElement('button'); + button.type = 'button'; + button.classList.add(...this.buttonClassesValue); + button.setAttribute('tabindex', '-1'); + button.addEventListener('click', this.toggle.bind(this)); + button.innerHTML = `${this.visibleIcon} ${this.visibleLabelValue}`; + return button; + } + + /** + * Toggle input type between "text" or "password" and update label accordingly + */ + toggle(event) { + this.isDisplayed = !this.isDisplayed; + const toggleButtonElement = event.currentTarget; + toggleButtonElement.innerHTML = this.isDisplayed + ? `${this.hiddenIcon} ${this.hiddenLabelValue}` + : `${this.visibleIcon} ${this.visibleLabelValue}`; + this.element.setAttribute('type', this.isDisplayed ? 'text' : 'password'); + this.dispatchEvent(this.isDisplayed ? 'show' : 'hide', { element: this.element, button: toggleButtonElement }); + } + + dispatchEvent(name, payload) { + this.dispatch(name, { detail: payload, prefix: 'toggle-password' }); + } +} diff --git a/assets/css/app/bs-overrides.css b/assets/css/app/bs-overrides.css index 070f353d..ec5a8f7c 100644 --- a/assets/css/app/bs-overrides.css +++ b/assets/css/app/bs-overrides.css @@ -120,4 +120,11 @@ ins { del { background-color: #f09595; font-weight: bold; -} \ No newline at end of file +} + +/**************************************** + * Password toggle + ****************************************/ +.toggle-password-button { + top: 0.7rem !important; +} diff --git a/assets/css/components/toggle_password.css b/assets/css/components/toggle_password.css new file mode 100644 index 00000000..f1f4a889 --- /dev/null +++ b/assets/css/components/toggle_password.css @@ -0,0 +1,41 @@ +/* + * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony). + * + * Copyright (C) 2019 - 2025 Jan Bรถhmer (https://github.com/jbtronics) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +.toggle-password-container { + position: relative; +} +.toggle-password-icon { + height: 1rem; + width: 1rem; +} +.toggle-password-button { + align-items: center; + background-color: transparent; + border: none; + column-gap: 0.25rem; + display: flex; + flex-direction: row; + font-size: 0.875rem; + justify-items: center; + height: 1rem; + line-height: 1.25rem; + position: absolute; + right: 0.5rem; + top: -1.25rem; +} diff --git a/assets/js/app.js b/assets/js/app.js index 43acec5d..54b73676 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -49,7 +49,7 @@ window.$ = window.jQuery = require("jquery"); //Use the local WASM file for the ZXing library import { setZXingModuleOverrides, -} from "barcode-detector/pure"; +} from "barcode-detector/ponyfill"; import wasmFile from "../../node_modules/zxing-wasm/dist/reader/zxing_reader.wasm"; setZXingModuleOverrides({ locateFile: (path, prefix) => { @@ -58,4 +58,4 @@ setZXingModuleOverrides({ } return prefix + path; }, -}); \ No newline at end of file +}); diff --git a/assets/js/lib/datatables.js b/assets/js/lib/datatables.js index 8e39548b..67bab02d 100644 --- a/assets/js/lib/datatables.js +++ b/assets/js/lib/datatables.js @@ -75,11 +75,10 @@ request._dt = config.name; //Try to resolve the original column index when the column was reordered (using the ColReorder plugin) - //Only do this when _ColReorder_iOrigCol is available - if (settings.aoColumns && settings.aoColumns.length && settings.aoColumns[0]._ColReorder_iOrigCol !== undefined) { + if (dt.colReorder && dt.colReorder.transpose) { if (request.order && request.order.length) { request.order.forEach(function (order) { - order.column = settings.aoColumns[order.column]._ColReorder_iOrigCol; + order.column = dt.colReorder.transpose(order.column, "toOriginal"); }); } } diff --git a/composer.json b/composer.json index 525075a7..8e3d1194 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "type": "project", "license": "AGPL-3.0-or-later", "require": { - "php": "^8.1", + "php": "^8.2", "ext-ctype": "*", "ext-dom": "*", "ext-gd": "*", @@ -12,9 +12,11 @@ "ext-json": "*", "ext-mbstring": "*", "amphp/http-client": "^5.1", - "api-platform/core": "^3.1", + "api-platform/doctrine-orm": "^4.1", + "api-platform/json-api": "^4.0.0", + "api-platform/symfony": "^4.0.0", "beberlei/doctrineextensions": "^1.2", - "brick/math": "0.12.1 as 0.11.0", + "brick/math": "^0.13.1", "composer/ca-bundle": "^1.5", "composer/package-versions-deprecated": "^1.11.99.5", "doctrine/data-fixtures": "^2.0.0", @@ -23,67 +25,68 @@ "doctrine/doctrine-migrations-bundle": "^3.0", "doctrine/orm": "^3.2.0", "dompdf/dompdf": "^v3.0.0", - "erusev/parsedown": "^1.7", "florianv/swap": "^4.0", "florianv/swap-bundle": "dev-master", "gregwar/captcha-bundle": "^2.1.0", "hshn/base64-encoded-file": "^5.0", - "jbtronics/2fa-webauthn": "^v2.2.0", + "jbtronics/2fa-webauthn": "^3.0.0", "jbtronics/dompdf-font-loader-bundle": "^1.0.0", - "jbtronics/settings-bundle": "dev-master", + "jbtronics/settings-bundle": "^3.0.0", "jfcherng/php-diff": "^6.14", "knpuniversity/oauth2-client-bundle": "^2.15", + "league/commonmark": "^2.7", "league/csv": "^9.8.0", "league/html-to-markdown": "^5.0.1", "liip/imagine-bundle": "^2.2", - "nbgrp/onelogin-saml-bundle": "^1.3", + "nbgrp/onelogin-saml-bundle": "^v2.0.2", "nelexa/zip": "^4.0", "nelmio/cors-bundle": "^2.3", "nelmio/security-bundle": "^3.0", "nyholm/psr7": "^1.1", - "omines/datatables-bundle": "^0.9.1", + "omines/datatables-bundle": "^0.10.0", "paragonie/sodium_compat": "^1.21", "part-db/label-fonts": "^1.0", "rhukster/dom-sanitizer": "^1.0", "runtime/frankenphp-symfony": "^0.2.0", "s9e/text-formatter": "^2.1", - "scheb/2fa-backup-code": "^6.8.0", - "scheb/2fa-bundle": "^6.8.0", - "scheb/2fa-google-authenticator": "^6.8.0", - "scheb/2fa-trusted-device": "^6.8.0", + "scheb/2fa-backup-code": "^v7.11.0", + "scheb/2fa-bundle": "^v7.11.0", + "scheb/2fa-google-authenticator": "^v7.11.0", + "scheb/2fa-trusted-device": "^v7.11.0", "shivas/versioning-bundle": "^4.0", "spatie/db-dumper": "^3.3.1", "symfony/apache-pack": "^1.0", - "symfony/asset": "6.4.*", - "symfony/console": "6.4.*", - "symfony/css-selector": "6.4.*", - "symfony/dom-crawler": "6.4.*", - "symfony/dotenv": "6.4.*", - "symfony/expression-language": "6.4.*", + "symfony/asset": "7.3.*", + "symfony/console": "7.3.*", + "symfony/css-selector": "7.3.*", + "symfony/dom-crawler": "7.3.*", + "symfony/dotenv": "7.3.*", + "symfony/expression-language": "7.3.*", "symfony/flex": "^v2.3.1", - "symfony/form": "6.4.*", - "symfony/framework-bundle": "6.4.*", - "symfony/http-client": "6.4.*", - "symfony/http-kernel": "6.4.*", - "symfony/mailer": "6.4.*", + "symfony/form": "7.3.*", + "symfony/framework-bundle": "7.3.*", + "symfony/http-client": "7.3.*", + "symfony/http-kernel": "7.3.*", + "symfony/mailer": "7.3.*", "symfony/monolog-bundle": "^3.1", "symfony/polyfill-php82": "^1.28", - "symfony/process": "6.4.*", - "symfony/property-access": "6.4.*", - "symfony/property-info": "6.4.*", - "symfony/rate-limiter": "6.4.*", - "symfony/runtime": "6.4.*", - "symfony/security-bundle": "6.4.*", - "symfony/serializer": "6.4.*", - "symfony/string": "6.4.8", - "symfony/translation": "6.4.*", - "symfony/twig-bundle": "6.4.*", + "symfony/process": "7.3.*", + "symfony/property-access": "7.3.*", + "symfony/property-info": "7.3.*", + "symfony/rate-limiter": "7.3.*", + "symfony/runtime": "7.3.*", + "symfony/security-bundle": "7.3.*", + "symfony/serializer": "7.3.*", + "symfony/string": "7.3.*", + "symfony/translation": "7.3.*", + "symfony/twig-bundle": "7.3.*", "symfony/ux-translator": "^2.10", "symfony/ux-turbo": "^2.0", - "symfony/validator": "6.4.*", - "symfony/web-link": "6.4.*", + "symfony/validator": "7.3.*", + "symfony/web-link": "7.3.*", "symfony/webpack-encore-bundle": "^v2.0.1", - "symfony/yaml": "6.4.*", + "symfony/yaml": "7.3.*", + "symplify/easy-coding-standard": "^12.5.20", "tecnickcom/tc-lib-barcode": "^2.1.4", "twig/cssinliner-extra": "^3.0", "twig/extra-bundle": "^3.8", @@ -92,7 +95,7 @@ "twig/intl-extra": "^3.8", "twig/markdown-extra": "^3.8", "twig/string-extra": "^3.8", - "web-auth/webauthn-symfony-bundle": "^4.0.0" + "web-auth/webauthn-symfony-bundle": "^5.0.0" }, "require-dev": { "dama/doctrine-test-bundle": "^v8.0.0", @@ -104,16 +107,15 @@ "phpstan/phpstan-doctrine": "^2.0.1", "phpstan/phpstan-strict-rules": "^2.0.1", "phpstan/phpstan-symfony": "^2.0.0", - "phpunit/phpunit": "^9.5", + "phpunit/phpunit": "^11.5.0", "rector/rector": "^2.0.4", "roave/security-advisories": "dev-latest", - "symfony/browser-kit": "6.4.*", - "symfony/debug-bundle": "6.4.*", + "symfony/browser-kit": "7.3.*", + "symfony/debug-bundle": "7.3.*", "symfony/maker-bundle": "^1.13", - "symfony/phpunit-bridge": "6.4.*", - "symfony/stopwatch": "6.4.*", - "symfony/web-profiler-bundle": "6.4.*", - "symplify/easy-coding-standard": "^12.0" + "symfony/phpunit-bridge": "7.3.*", + "symfony/stopwatch": "7.3.*", + "symfony/web-profiler-bundle": "7.3.*" }, "suggest": { "ext-bcmath": "Used to improve price calculation performance", @@ -124,7 +126,7 @@ "*": "dist" }, "platform": { - "php": "8.1.0" + "php": "8.2.0" }, "sort-packages": true, "allow-plugins": { @@ -164,7 +166,7 @@ "extra": { "symfony": { "allow-contrib": false, - "require": "6.4.*", + "require": "7.3.*", "docker": true } } diff --git a/composer.lock b/composer.lock index aad48c6d..6b9888d7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "27cd0d915eab5e7cb57215a4c0b529fb", + "content-hash": "09b78f345ea8115b5b29ea3e67dcb579", "packages": [ { "name": "amphp/amp", - "version": "v3.1.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", - "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9" + "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", - "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", + "url": "https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f", + "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f", "shasum": "" }, "require": { @@ -77,7 +77,7 @@ ], "support": { "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v3.1.0" + "source": "https://github.com/amphp/amp/tree/v3.1.1" }, "funding": [ { @@ -85,7 +85,7 @@ "type": "github" } ], - "time": "2025-01-26T16:07:39+00:00" + "time": "2025-08-27T21:42:00+00:00" }, { "name": "amphp/byte-stream", @@ -456,16 +456,16 @@ }, { "name": "amphp/http-client", - "version": "v5.3.3", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/amphp/http-client.git", - "reference": "09212ebc2f34efb5e1eaac4374fef6b11a7d2fbc" + "reference": "75ad21574fd632594a2dd914496647816d5106bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/http-client/zipball/09212ebc2f34efb5e1eaac4374fef6b11a7d2fbc", - "reference": "09212ebc2f34efb5e1eaac4374fef6b11a7d2fbc", + "url": "https://api.github.com/repos/amphp/http-client/zipball/75ad21574fd632594a2dd914496647816d5106bc", + "reference": "75ad21574fd632594a2dd914496647816d5106bc", "shasum": "" }, "require": { @@ -542,7 +542,7 @@ ], "support": { "issues": "https://github.com/amphp/http-client/issues", - "source": "https://github.com/amphp/http-client/tree/v5.3.3" + "source": "https://github.com/amphp/http-client/tree/v5.3.4" }, "funding": [ { @@ -550,7 +550,7 @@ "type": "github" } ], - "time": "2025-05-21T03:24:20+00:00" + "time": "2025-08-16T20:41:23+00:00" }, { "name": "amphp/parser", @@ -967,194 +967,62 @@ "time": "2024-08-03T19:31:26+00:00" }, { - "name": "api-platform/core", - "version": "v3.4.17", + "name": "api-platform/doctrine-common", + "version": "v4.1.22", "source": { "type": "git", - "url": "https://github.com/api-platform/core.git", - "reference": "c5fb664d17ed9ae919394514ea69a5039d2ad9ab" + "url": "https://github.com/api-platform/doctrine-common.git", + "reference": "e0ef3f5d1c4a9d023da519ea120a1d7732e0b1a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/core/zipball/c5fb664d17ed9ae919394514ea69a5039d2ad9ab", - "reference": "c5fb664d17ed9ae919394514ea69a5039d2ad9ab", + "url": "https://api.github.com/repos/api-platform/doctrine-common/zipball/e0ef3f5d1c4a9d023da519ea120a1d7732e0b1a7", + "reference": "e0ef3f5d1c4a9d023da519ea120a1d7732e0b1a7", "shasum": "" }, "require": { - "doctrine/inflector": "^1.0 || ^2.0", - "php": ">=8.1", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "psr/container": "^1.0 || ^2.0", - "symfony/deprecation-contracts": "^3.1", - "symfony/http-foundation": "^6.4 || ^7.1", - "symfony/http-kernel": "^6.4 || ^7.1", - "symfony/property-access": "^6.4 || ^7.1", - "symfony/property-info": "^6.4 || ^7.1", - "symfony/serializer": "^6.4 || ^7.1", - "symfony/translation-contracts": "^3.3", - "symfony/web-link": "^6.4 || ^7.1", - "willdurand/negotiation": "^3.0" + "api-platform/metadata": "^4.1.11", + "api-platform/state": "^4.1.11", + "doctrine/collections": "^2.1", + "doctrine/common": "^3.2.2", + "doctrine/persistence": "^3.2 || ^4.0", + "php": ">=8.2" }, "conflict": { - "doctrine/common": "<3.2.2", - "doctrine/dbal": "<2.10", - "doctrine/mongodb-odm": "<2.4", - "doctrine/orm": "<2.14.0", - "doctrine/persistence": "<1.3", - "elasticsearch/elasticsearch": ">=8.0,<8.4", - "phpspec/prophecy": "<1.15", - "phpunit/phpunit": "<9.5", - "symfony/framework-bundle": "6.4.6 || 7.0.6", - "symfony/var-exporter": "<6.1.1" - }, - "replace": { - "api-platform/doctrine-common": "self.version", - "api-platform/doctrine-odm": "self.version", - "api-platform/doctrine-orm": "self.version", - "api-platform/documentation": "self.version", - "api-platform/elasticsearch": "self.version", - "api-platform/graphql": "self.version", - "api-platform/http-cache": "self.version", - "api-platform/hydra": "self.version", - "api-platform/json-api": "self.version", - "api-platform/json-hal": "self.version", - "api-platform/json-schema": "self.version", - "api-platform/jsonld": "self.version", - "api-platform/laravel": "self.version", - "api-platform/metadata": "self.version", - "api-platform/openapi": "self.version", - "api-platform/parameter-validator": "self.version", - "api-platform/ramsey-uuid": "self.version", - "api-platform/serializer": "self.version", - "api-platform/state": "self.version", - "api-platform/symfony": "self.version", - "api-platform/validator": "self.version" + "doctrine/persistence": "<1.3" }, "require-dev": { - "api-platform/doctrine-common": "^3.4 || ^4.0", - "api-platform/doctrine-odm": "^3.4 || ^4.0", - "api-platform/doctrine-orm": "^3.4 || ^4.0", - "api-platform/documentation": "^3.4 || ^4.0", - "api-platform/elasticsearch": "^3.4 || ^4.0", - "api-platform/graphql": "^3.4 || ^4.0", - "api-platform/http-cache": "^3.4 || ^4.0", - "api-platform/hydra": "^3.4 || ^4.0", - "api-platform/json-api": "^3.3 || ^4.0", - "api-platform/json-schema": "^3.4 || ^4.0", - "api-platform/jsonld": "^3.4 || ^4.0", - "api-platform/metadata": "^3.4 || ^4.0", - "api-platform/openapi": "^3.4 || ^4.0", - "api-platform/parameter-validator": "^3.4", - "api-platform/ramsey-uuid": "^3.4 || ^4.0", - "api-platform/serializer": "^3.4 || ^4.0", - "api-platform/state": "^3.4 || ^4.0", - "api-platform/validator": "^3.4 || ^4.0", - "behat/behat": "^3.11", - "behat/mink": "^1.9", - "doctrine/cache": "^1.11 || ^2.1", - "doctrine/common": "^3.2.2", - "doctrine/dbal": "^3.4.0 || ^4.0", - "doctrine/doctrine-bundle": "^1.12 || ^2.0", - "doctrine/mongodb-odm": "^2.2", - "doctrine/mongodb-odm-bundle": "^4.0 || ^5.0", - "doctrine/orm": "^2.14 || ^3.0", - "elasticsearch/elasticsearch": "^7.11 || ^8.4", - "friends-of-behat/mink-browserkit-driver": "^1.3.1", - "friends-of-behat/mink-extension": "^2.2", - "friends-of-behat/symfony-extension": "^2.1", - "guzzlehttp/guzzle": "^6.0 || ^7.1", - "jangregor/phpstan-prophecy": "^1.0", - "justinrainbow/json-schema": "^5.2.1", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpdoc-parser": "^1.13|^2.0", - "phpstan/phpstan": "^1.10", - "phpstan/phpstan-doctrine": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-symfony": "^1.0", - "phpunit/phpunit": "^9.6", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "ramsey/uuid": "^3.9.7 || ^4.0", - "ramsey/uuid-doctrine": "^1.4 || ^2.0 || ^3.0", - "sebastian/comparator": "<5.0", - "soyuka/contexts": "v3.3.9", - "soyuka/pmu": "^0.0.12", - "soyuka/stubs-mongodb": "^1.0", - "symfony/asset": "^6.4 || ^7.1", - "symfony/browser-kit": "^6.4 || ^7.1", - "symfony/cache": "^6.4 || ^7.1", - "symfony/config": "^6.4 || ^7.1", - "symfony/console": "^6.4 || ^7.1", - "symfony/css-selector": "^6.4 || ^7.1", - "symfony/dependency-injection": "^6.4 || ^7.1", - "symfony/doctrine-bridge": "^6.4 || ^7.1", - "symfony/dom-crawler": "^6.4 || ^7.1", - "symfony/error-handler": "^6.4 || ^7.1", - "symfony/event-dispatcher": "^6.4 || ^7.1", - "symfony/expression-language": "^6.4 || ^7.1", - "symfony/finder": "^6.4 || ^7.1", - "symfony/form": "^6.4 || ^7.1", - "symfony/framework-bundle": "^6.4 || ^7.1", - "symfony/http-client": "^6.4 || ^7.1", - "symfony/intl": "^6.4 || ^7.1", - "symfony/maker-bundle": "^1.24", - "symfony/mercure-bundle": "*", - "symfony/messenger": "^6.4 || ^7.1", - "symfony/phpunit-bridge": "^6.4.1 || ^7.1", - "symfony/routing": "^6.4 || ^7.1", - "symfony/security-bundle": "^6.4 || ^7.1", - "symfony/security-core": "^6.4 || ^7.1", - "symfony/stopwatch": "^6.4 || ^7.1", - "symfony/string": "^6.4 || ^7.1", - "symfony/twig-bundle": "^6.4 || ^7.1", - "symfony/uid": "^6.4 || ^7.1", - "symfony/validator": "^6.4 || ^7.1", - "symfony/web-profiler-bundle": "^6.4 || ^7.1", - "symfony/yaml": "^6.4 || ^7.1", - "twig/twig": "^1.42.3 || ^2.12 || ^3.0", - "webonyx/graphql-php": "^14.0 || ^15.0" + "doctrine/mongodb-odm": "^2.10", + "doctrine/orm": "^2.17 || ^3.0", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "11.5.x-dev" }, "suggest": { - "doctrine/mongodb-odm-bundle": "To support MongoDB. Only versions 4.0 and later are supported.", - "elasticsearch/elasticsearch": "To support Elasticsearch.", - "ocramius/package-versions": "To display the API Platform's version in the debug bar.", - "phpstan/phpdoc-parser": "To support extracting metadata from PHPDoc.", - "psr/cache-implementation": "To use metadata caching.", - "ramsey/uuid": "To support Ramsey's UUID identifiers.", - "symfony/cache": "To have metadata caching when using Symfony integration.", - "symfony/config": "To load XML configuration files.", - "symfony/expression-language": "To use authorization features.", - "symfony/http-client": "To use the HTTP cache invalidation system.", - "symfony/messenger": "To support messenger integration.", - "symfony/security": "To use authorization features.", - "symfony/twig-bundle": "To use the Swagger UI integration.", - "symfony/uid": "To support Symfony UUID/ULID identifiers.", - "symfony/web-profiler-bundle": "To use the data collector.", - "webonyx/graphql-php": "To support GraphQL." + "api-platform/graphql": "For GraphQl mercure subscriptions.", + "api-platform/http-cache": "For HTTP cache invalidation.", + "phpstan/phpdoc-parser": "For PHP documentation support.", + "symfony/config": "For XML resource configuration.", + "symfony/mercure-bundle": "For mercure updates publisher.", + "symfony/yaml": "For YAML resource configuration." }, "type": "library", "extra": { - "pmu": { - "projects": [ - "./src/*/composer.json", - "src/Doctrine/*/composer.json" - ] - }, "thanks": { "url": "https://github.com/api-platform/api-platform", "name": "api-platform/api-platform" }, "symfony": { - "require": "^6.4 || ^7.1" + "require": "^6.4 || ^7.0" }, "branch-alias": { "dev-3.4": "3.4.x-dev", - "dev-main": "4.0.x-dev" + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" } }, "autoload": { "psr-4": { - "ApiPlatform\\": "src/" + "ApiPlatform\\Doctrine\\Common\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1166,9 +1034,652 @@ "name": "Kรฉvin Dunglas", "email": "kevin@dunglas.fr", "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" } ], - "description": "Build a fully-featured hypermedia or GraphQL API in minutes!", + "description": "Common files used by api-platform/doctrine-orm and api-platform/doctrine-odm", + "homepage": "https://api-platform.com", + "keywords": [ + "doctrine", + "graphql", + "odm", + "orm", + "rest" + ], + "support": { + "source": "https://github.com/api-platform/doctrine-common/tree/v4.1.22" + }, + "time": "2025-08-18T13:30:43+00:00" + }, + { + "name": "api-platform/doctrine-orm", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/doctrine-orm.git", + "reference": "61a199da6f6014dba2da43ea1a66b2c9dda27263" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/doctrine-orm/zipball/61a199da6f6014dba2da43ea1a66b2c9dda27263", + "reference": "61a199da6f6014dba2da43ea1a66b2c9dda27263", + "shasum": "" + }, + "require": { + "api-platform/doctrine-common": "^4.1.11", + "api-platform/metadata": "^4.1.11", + "api-platform/state": "^4.1.11", + "doctrine/orm": "^2.17 || ^3.0", + "php": ">=8.2", + "symfony/property-info": "^6.4 || ^7.1" + }, + "require-dev": { + "doctrine/doctrine-bundle": "^2.11", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "11.5.x-dev", + "ramsey/uuid": "^4.7", + "ramsey/uuid-doctrine": "^2.0", + "symfony/cache": "^6.4 || ^7.0", + "symfony/framework-bundle": "^6.4 || ^7.0", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/serializer": "^6.4 || ^7.0", + "symfony/uid": "^6.4 || ^7.0", + "symfony/validator": "^6.4 || ^7.0", + "symfony/yaml": "^6.4 || ^7.0" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Doctrine\\Orm\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "Doctrine ORM bridge", + "homepage": "https://api-platform.com", + "keywords": [ + "api", + "doctrine", + "graphql", + "orm", + "rest" + ], + "support": { + "source": "https://github.com/api-platform/doctrine-orm/tree/v4.1.22" + }, + "time": "2025-06-06T14:56:47+00:00" + }, + { + "name": "api-platform/documentation", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/documentation.git", + "reference": "1a0ac988d659008ef8667d05bc9978863026bab8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/documentation/zipball/1a0ac988d659008ef8667d05bc9978863026bab8", + "reference": "1a0ac988d659008ef8667d05bc9978863026bab8", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1.11", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "11.5.x-dev" + }, + "type": "project", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Documentation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Platform documentation controller.", + "support": { + "source": "https://github.com/api-platform/documentation/tree/v4.2.0-alpha.1" + }, + "time": "2025-06-06T14:56:47+00:00" + }, + { + "name": "api-platform/http-cache", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/http-cache.git", + "reference": "f65f092c90311a87ebb6dda87db3ca08b57c10d6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/http-cache/zipball/f65f092c90311a87ebb6dda87db3ca08b57c10d6", + "reference": "f65f092c90311a87ebb6dda87db3ca08b57c10d6", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1.11", + "api-platform/state": "^4.1.11", + "php": ">=8.2", + "symfony/http-foundation": "^6.4 || ^7.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "11.5.x-dev", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/http-client": "^6.4 || ^7.0" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\HttpCache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/comunnity/contributors" + } + ], + "description": "API Platform HttpCache component", + "homepage": "https://api-platform.com", + "keywords": [ + "api", + "cache", + "http", + "rest" + ], + "support": { + "source": "https://github.com/api-platform/http-cache/tree/v4.1.22" + }, + "time": "2025-06-06T14:56:47+00:00" + }, + { + "name": "api-platform/hydra", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/hydra.git", + "reference": "8c75b814af143c95ffc1857565169ff5b6f1b421" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/hydra/zipball/8c75b814af143c95ffc1857565169ff5b6f1b421", + "reference": "8c75b814af143c95ffc1857565169ff5b6f1b421", + "shasum": "" + }, + "require": { + "api-platform/documentation": "^4.1.11", + "api-platform/json-schema": "^4.1.11", + "api-platform/jsonld": "^4.1.11", + "api-platform/metadata": "^4.1.11", + "api-platform/serializer": "^4.1.11", + "api-platform/state": "^4.1.11", + "php": ">=8.2", + "symfony/web-link": "^6.4 || ^7.1" + }, + "require-dev": { + "api-platform/doctrine-common": "^4.1", + "api-platform/doctrine-odm": "^4.1", + "api-platform/doctrine-orm": "^4.1", + "phpspec/prophecy": "^1.19", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "11.5.x-dev" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Hydra\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Hydra support", + "homepage": "https://api-platform.com", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "jsonapi", + "rest" + ], + "support": { + "source": "https://github.com/api-platform/hydra/tree/v4.1.22" + }, + "time": "2025-07-15T14:10:59+00:00" + }, + { + "name": "api-platform/json-api", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/json-api.git", + "reference": "7ea9bbe5f801f58b3f78730f6e6cd4b168b450d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/json-api/zipball/7ea9bbe5f801f58b3f78730f6e6cd4b168b450d4", + "reference": "7ea9bbe5f801f58b3f78730f6e6cd4b168b450d4", + "shasum": "" + }, + "require": { + "api-platform/documentation": "^4.1.11", + "api-platform/json-schema": "^4.1.11", + "api-platform/metadata": "^4.1.11", + "api-platform/serializer": "^4.1.11", + "api-platform/state": "^4.1.11", + "php": ">=8.2", + "symfony/error-handler": "^6.4 || ^7.0", + "symfony/http-foundation": "^6.4 || ^7.0" + }, + "require-dev": { + "phpspec/prophecy": "^1.19", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "11.5.x-dev" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\JsonApi\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API JSON-API support", + "homepage": "https://api-platform.com", + "keywords": [ + "api", + "jsonapi", + "rest" + ], + "support": { + "source": "https://github.com/api-platform/json-api/tree/v4.1.22" + }, + "time": "2025-08-06T07:56:58+00:00" + }, + { + "name": "api-platform/json-schema", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/json-schema.git", + "reference": "1d1c6eaa4841f3989e2bec4cdf8167fb0ca42a8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/json-schema/zipball/1d1c6eaa4841f3989e2bec4cdf8167fb0ca42a8f", + "reference": "1d1c6eaa4841f3989e2bec4cdf8167fb0ca42a8f", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1.11", + "php": ">=8.2", + "symfony/console": "^6.4 || ^7.0", + "symfony/property-info": "^6.4 || ^7.1", + "symfony/serializer": "^6.4 || ^7.0", + "symfony/uid": "^6.4 || ^7.0" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "11.5.x-dev" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\JsonSchema\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "Generate a JSON Schema from a PHP class", + "homepage": "https://api-platform.com", + "keywords": [ + "JSON Schema", + "api", + "json", + "openapi", + "rest", + "swagger" + ], + "support": { + "source": "https://github.com/api-platform/json-schema/tree/v4.1.22" + }, + "time": "2025-06-29T12:24:14+00:00" + }, + { + "name": "api-platform/jsonld", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/jsonld.git", + "reference": "e122bf1f04f895e80e6469e0f09d1f06f7508ca6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/jsonld/zipball/e122bf1f04f895e80e6469e0f09d1f06f7508ca6", + "reference": "e122bf1f04f895e80e6469e0f09d1f06f7508ca6", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1.11", + "api-platform/serializer": "^4.1.11", + "api-platform/state": "^4.1.11", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "11.5.x-dev" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "files": [ + "./HydraContext.php" + ], + "psr-4": { + "ApiPlatform\\JsonLd\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API JSON-LD support", + "homepage": "https://api-platform.com", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "rest" + ], + "support": { + "source": "https://github.com/api-platform/jsonld/tree/v4.1.22" + }, + "time": "2025-07-25T10:05:30+00:00" + }, + { + "name": "api-platform/metadata", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/metadata.git", + "reference": "782477dd28cc675909597bfa47af7c1f85659ffa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/metadata/zipball/782477dd28cc675909597bfa47af7c1f85659ffa", + "reference": "782477dd28cc675909597bfa47af7c1f85659ffa", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "php": ">=8.2", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/property-info": "^6.4 || ^7.1", + "symfony/string": "^6.4 || ^7.0", + "symfony/type-info": "^7.3" + }, + "require-dev": { + "api-platform/json-schema": "^4.1.11", + "api-platform/openapi": "^4.1.11", + "api-platform/state": "^4.1.11", + "phpspec/prophecy-phpunit": "^2.2", + "phpstan/phpdoc-parser": "^1.29 || ^2.0", + "phpunit/phpunit": "11.5.x-dev", + "symfony/config": "^6.4 || ^7.0", + "symfony/routing": "^6.4 || ^7.0", + "symfony/var-dumper": "^6.4 || ^7.0", + "symfony/web-link": "^6.4 || ^7.1", + "symfony/yaml": "^6.4 || ^7.0" + }, + "suggest": { + "phpstan/phpdoc-parser": "For PHP documentation support.", + "symfony/config": "For XML resource configuration.", + "symfony/yaml": "For YAML resource configuration." + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Metadata\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Resource-oriented metadata attributes and factories", "homepage": "https://api-platform.com", "keywords": [ "Hydra", @@ -1182,10 +1693,478 @@ "swagger" ], "support": { - "issues": "https://github.com/api-platform/core/issues", - "source": "https://github.com/api-platform/core/tree/v3.4.17" + "source": "https://github.com/api-platform/metadata/tree/v4.1.22" }, - "time": "2025-04-07T08:40:57+00:00" + "time": "2025-08-29T15:13:26+00:00" + }, + { + "name": "api-platform/openapi", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/openapi.git", + "reference": "793b53e51a5c24076d4024b6aa77de29e74015cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/openapi/zipball/793b53e51a5c24076d4024b6aa77de29e74015cd", + "reference": "793b53e51a5c24076d4024b6aa77de29e74015cd", + "shasum": "" + }, + "require": { + "api-platform/json-schema": "^4.1.11", + "api-platform/metadata": "^4.1.11", + "api-platform/state": "^4.1.11", + "php": ">=8.2", + "symfony/console": "^6.4 || ^7.0", + "symfony/filesystem": "^6.4 || ^7.0", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/serializer": "^6.4 || ^7.0" + }, + "require-dev": { + "api-platform/doctrine-common": "^4.1", + "api-platform/doctrine-odm": "^4.1", + "api-platform/doctrine-orm": "^4.1", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "11.5.x-dev" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\OpenApi\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "Models to build and serialize an OpenAPI specification.", + "homepage": "https://api-platform.com", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "hal", + "jsonapi", + "openapi", + "rest", + "swagger" + ], + "support": { + "source": "https://github.com/api-platform/openapi/tree/v4.1.22" + }, + "time": "2025-07-29T08:53:27+00:00" + }, + { + "name": "api-platform/serializer", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/serializer.git", + "reference": "70dbdeac9584870be444d78c1a796b6edb9e46a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/serializer/zipball/70dbdeac9584870be444d78c1a796b6edb9e46a5", + "reference": "70dbdeac9584870be444d78c1a796b6edb9e46a5", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1.11", + "api-platform/state": "^4.1.11", + "php": ">=8.2", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/property-info": "^6.4 || ^7.1", + "symfony/serializer": "^6.4 || ^7.0", + "symfony/validator": "^6.4 || ^7.0" + }, + "require-dev": { + "api-platform/doctrine-common": "^4.1", + "api-platform/doctrine-odm": "^4.1", + "api-platform/doctrine-orm": "^4.1", + "api-platform/json-schema": "^4.1", + "api-platform/openapi": "^4.1", + "doctrine/collections": "^2.1", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "11.5.x-dev", + "symfony/mercure-bundle": "*", + "symfony/var-dumper": "^6.4 || ^7.0", + "symfony/yaml": "^6.4 || ^7.0" + }, + "suggest": { + "api-platform/doctrine-odm": "To support Doctrine MongoDB ODM state options.", + "api-platform/doctrine-orm": "To support Doctrine ORM state options." + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Platform core Serializer", + "homepage": "https://api-platform.com", + "keywords": [ + "api", + "graphql", + "rest", + "serializer" + ], + "support": { + "source": "https://github.com/api-platform/serializer/tree/v4.1.22" + }, + "time": "2025-08-29T15:13:26+00:00" + }, + { + "name": "api-platform/state", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/state.git", + "reference": "056b07285cdc904984fb44c2614f7df8f4620a95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/state/zipball/056b07285cdc904984fb44c2614f7df8f4620a95", + "reference": "056b07285cdc904984fb44c2614f7df8f4620a95", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1.18", + "php": ">=8.2", + "psr/container": "^1.0 || ^2.0", + "symfony/http-kernel": "^6.4 || ^7.0", + "symfony/serializer": "^6.4 || ^7.0", + "symfony/translation-contracts": "^3.0" + }, + "require-dev": { + "api-platform/validator": "^4.1", + "phpunit/phpunit": "11.5.x-dev", + "symfony/http-foundation": "^6.4 || ^7.0", + "symfony/web-link": "^6.4 || ^7.1", + "willdurand/negotiation": "^3.1" + }, + "suggest": { + "api-platform/serializer": "To use API Platform serializer.", + "api-platform/validator": "To use API Platform validation.", + "symfony/http-foundation": "To use our HTTP providers and processor.", + "symfony/web-link": "To support adding web links to the response headers.", + "willdurand/negotiation": "To use the API Platform content negoatiation provider." + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\State\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Platform State component ", + "homepage": "https://api-platform.com", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "hal", + "jsonapi", + "openapi", + "rest", + "swagger" + ], + "support": { + "source": "https://github.com/api-platform/state/tree/v4.1.22" + }, + "time": "2025-07-16T14:01:52+00:00" + }, + { + "name": "api-platform/symfony", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/symfony.git", + "reference": "735b9a80f3b7a5f528b663cd28489fbe52f52416" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/symfony/zipball/735b9a80f3b7a5f528b663cd28489fbe52f52416", + "reference": "735b9a80f3b7a5f528b663cd28489fbe52f52416", + "shasum": "" + }, + "require": { + "api-platform/documentation": "^4.1.11", + "api-platform/http-cache": "^4.1.11", + "api-platform/hydra": "^4.1.11", + "api-platform/json-schema": "^4.1.11", + "api-platform/jsonld": "^4.1.11", + "api-platform/metadata": "^4.1.11", + "api-platform/openapi": "^4.1.11", + "api-platform/serializer": "^4.1.11", + "api-platform/state": "^4.1.11", + "api-platform/validator": "^4.1.11", + "php": ">=8.2", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/property-info": "^6.4 || ^7.1", + "symfony/security-core": "^6.4 || ^7.0", + "symfony/serializer": "^6.4 || ^7.0", + "willdurand/negotiation": "^3.1" + }, + "require-dev": { + "api-platform/doctrine-common": "^4.1", + "api-platform/doctrine-odm": "^4.1", + "api-platform/doctrine-orm": "^4.1", + "api-platform/elasticsearch": "^4.1", + "api-platform/graphql": "^4.1", + "api-platform/parameter-validator": "^3.1", + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "11.5.x-dev", + "symfony/expression-language": "^6.4 || ^7.0", + "symfony/mercure-bundle": "*", + "symfony/routing": "^6.4 || ^7.0", + "symfony/validator": "^6.4 || ^7.0", + "webonyx/graphql-php": "^15.0" + }, + "suggest": { + "api-platform/doctrine-odm": "To support MongoDB. Only versions 4.0 and later are supported.", + "api-platform/doctrine-orm": "To support Doctrine ORM.", + "api-platform/elasticsearch": "To support Elasticsearch.", + "api-platform/graphql": "To support GraphQL.", + "api-platform/ramsey-uuid": "To support Ramsey's UUID identifiers.", + "ocramius/package-versions": "To display the API Platform's version in the debug bar.", + "phpstan/phpdoc-parser": "To support extracting metadata from PHPDoc.", + "psr/cache-implementation": "To use metadata caching.", + "symfony/cache": "To have metadata caching when using Symfony integration.", + "symfony/config": "To load XML configuration files.", + "symfony/expression-language": "To use authorization and mercure advanced features.", + "symfony/http-client": "To use the HTTP cache invalidation system.", + "symfony/mercure-bundle": "To support mercure integration.", + "symfony/messenger": "To support messenger integration and asynchronous Mercure updates.", + "symfony/security": "To use authorization features.", + "symfony/twig-bundle": "To use the Swagger UI integration.", + "symfony/uid": "To support Symfony UUID/ULID identifiers.", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Symfony\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "Symfony API Platform integration", + "homepage": "https://api-platform.com", + "keywords": [ + "Hydra", + "JSON-LD", + "api", + "graphql", + "hal", + "jsonapi", + "openapi", + "rest", + "swagger", + "symfony" + ], + "support": { + "source": "https://github.com/api-platform/symfony/tree/v4.1.22" + }, + "time": "2025-07-16T14:01:52+00:00" + }, + { + "name": "api-platform/validator", + "version": "v4.1.22", + "source": { + "type": "git", + "url": "https://github.com/api-platform/validator.git", + "reference": "9f0bde95dccf1d86e6a6165543d601a4a46eaa9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/api-platform/validator/zipball/9f0bde95dccf1d86e6a6165543d601a4a46eaa9a", + "reference": "9f0bde95dccf1d86e6a6165543d601a4a46eaa9a", + "shasum": "" + }, + "require": { + "api-platform/metadata": "^4.1.11", + "php": ">=8.2", + "symfony/http-kernel": "^6.4 || ^7.1", + "symfony/serializer": "^6.4 || ^7.1", + "symfony/type-info": "^7.2", + "symfony/validator": "^6.4 || ^7.1", + "symfony/web-link": "^6.4 || ^7.1" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.2", + "phpunit/phpunit": "11.5.x-dev" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/api-platform/api-platform", + "name": "api-platform/api-platform" + }, + "symfony": { + "require": "^6.4 || ^7.0" + }, + "branch-alias": { + "dev-3.4": "3.4.x-dev", + "dev-4.1": "4.1.x-dev", + "dev-main": "4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ApiPlatform\\Validator\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kรฉvin Dunglas", + "email": "kevin@dunglas.fr", + "homepage": "https://dunglas.fr" + }, + { + "name": "API Platform Community", + "homepage": "https://api-platform.com/community/contributors" + } + ], + "description": "API Platform validator component", + "homepage": "https://api-platform.com", + "keywords": [ + "api", + "graphql", + "rest", + "validator" + ], + "support": { + "source": "https://github.com/api-platform/validator/tree/v4.1.22" + }, + "time": "2025-07-16T14:01:52+00:00" }, { "name": "beberlei/assert", @@ -1318,16 +2297,16 @@ }, { "name": "brick/math", - "version": "0.12.1", + "version": "0.13.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "url": "https://api.github.com/repos/brick/math/zipball/fc7ed316430118cc7836bf45faff18d5dfc8de04", + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04", "shasum": "" }, "require": { @@ -1336,7 +2315,7 @@ "require-dev": { "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^10.1", - "vimeo/psalm": "5.16.0" + "vimeo/psalm": "6.8.8" }, "type": "library", "autoload": { @@ -1366,7 +2345,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.1" + "source": "https://github.com/brick/math/tree/0.13.1" }, "funding": [ { @@ -1374,20 +2353,20 @@ "type": "github" } ], - "time": "2023-11-29T23:19:16+00:00" + "time": "2025-03-29T13:50:30+00:00" }, { "name": "composer/ca-bundle", - "version": "1.5.7", + "version": "1.5.8", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "d665d22c417056996c59019579f1967dfe5c1e82" + "reference": "719026bb30813accb68271fee7e39552a58e9f65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/d665d22c417056996c59019579f1967dfe5c1e82", - "reference": "d665d22c417056996c59019579f1967dfe5c1e82", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/719026bb30813accb68271fee7e39552a58e9f65", + "reference": "719026bb30813accb68271fee7e39552a58e9f65", "shasum": "" }, "require": { @@ -1434,7 +2413,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.7" + "source": "https://github.com/composer/ca-bundle/tree/1.5.8" }, "funding": [ { @@ -1444,13 +2423,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-05-26T15:08:54+00:00" + "time": "2025-08-20T18:49:47+00:00" }, { "name": "composer/package-versions-deprecated", @@ -1569,6 +2544,81 @@ }, "time": "2024-04-12T12:12:48+00:00" }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, { "name": "doctrine/collections", "version": "2.3.0", @@ -1655,6 +2705,97 @@ ], "time": "2025-03-22T10:17:19+00:00" }, + { + "name": "doctrine/common", + "version": "3.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "d9ea4a54ca2586db781f0265d36bea731ac66ec5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/d9ea4a54ca2586db781f0265d36bea731ac66ec5", + "reference": "d9ea4a54ca2586db781f0265d36bea731ac66ec5", + "shasum": "" + }, + "require": { + "doctrine/persistence": "^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0 || ^10.0", + "doctrine/collections": "^1", + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^6.1", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/3.5.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "type": "tidelift" + } + ], + "time": "2025-01-01T22:12:03+00:00" + }, { "name": "doctrine/data-fixtures", "version": "2.1.0", @@ -1740,21 +2881,21 @@ }, { "name": "doctrine/dbal", - "version": "4.2.5", + "version": "4.3.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "acb68b388b2577bb211bb26dc22d20a8ad93d97d" + "reference": "7669f131d43b880de168b2d2df9687d152d6c762" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/acb68b388b2577bb211bb26dc22d20a8ad93d97d", - "reference": "acb68b388b2577bb211bb26dc22d20a8ad93d97d", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/7669f131d43b880de168b2d2df9687d152d6c762", + "reference": "7669f131d43b880de168b2d2df9687d152d6c762", "shasum": "" }, "require": { - "doctrine/deprecations": "^0.5.3|^1", - "php": "^8.1", + "doctrine/deprecations": "^1.1.5", + "php": "^8.2", "psr/cache": "^1|^2|^3", "psr/log": "^1|^2|^3" }, @@ -1765,7 +2906,7 @@ "phpstan/phpstan": "2.1.17", "phpstan/phpstan-phpunit": "2.0.6", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "10.5.46", + "phpunit/phpunit": "11.5.23", "slevomat/coding-standard": "8.16.2", "squizlabs/php_codesniffer": "3.13.1", "symfony/cache": "^6.3.8|^7.0", @@ -1826,7 +2967,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.2.5" + "source": "https://github.com/doctrine/dbal/tree/4.3.2" }, "funding": [ { @@ -1842,7 +2983,7 @@ "type": "tidelift" } ], - "time": "2025-06-26T22:51:46+00:00" + "time": "2025-08-05T13:30:38+00:00" }, { "name": "doctrine/deprecations", @@ -2429,16 +3570,16 @@ }, { "name": "doctrine/migrations", - "version": "3.9.2", + "version": "3.9.4", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "fa94c6f06b1bc6d4759481ec20b8b81d13e861be" + "reference": "1b88fcb812f2cd6e77c83d16db60e3cf1e35c66c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/fa94c6f06b1bc6d4759481ec20b8b81d13e861be", - "reference": "fa94c6f06b1bc6d4759481ec20b8b81d13e861be", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/1b88fcb812f2cd6e77c83d16db60e3cf1e35c66c", + "reference": "1b88fcb812f2cd6e77c83d16db60e3cf1e35c66c", "shasum": "" }, "require": { @@ -2512,7 +3653,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.9.2" + "source": "https://github.com/doctrine/migrations/tree/3.9.4" }, "funding": [ { @@ -2528,7 +3669,7 @@ "type": "tidelift" } ], - "time": "2025-07-29T11:36:14+00:00" + "time": "2025-08-19T06:41:07+00:00" }, { "name": "doctrine/orm", @@ -2622,16 +3763,16 @@ }, { "name": "doctrine/persistence", - "version": "4.0.0", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "45004aca79189474f113cbe3a53847c2115a55fa" + "reference": "dcbdfe4b211ae09478e192289cae7ab0987b29a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/45004aca79189474f113cbe3a53847c2115a55fa", - "reference": "45004aca79189474f113cbe3a53847c2115a55fa", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/dcbdfe4b211ae09478e192289cae7ab0987b29a4", + "reference": "dcbdfe4b211ae09478e192289cae7ab0987b29a4", "shasum": "" }, "require": { @@ -2639,16 +3780,14 @@ "php": "^8.1", "psr/cache": "^1.0 || ^2.0 || ^3.0" }, - "conflict": { - "doctrine/common": "<2.10" - }, "require-dev": { "doctrine/coding-standard": "^12", "phpstan/phpstan": "1.12.7", "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-strict-rules": "^1.6", "phpunit/phpunit": "^9.6", - "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" }, "type": "library", "autoload": { @@ -2697,7 +3836,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/4.0.0" + "source": "https://github.com/doctrine/persistence/tree/4.1.0" }, "funding": [ { @@ -2713,7 +3852,7 @@ "type": "tidelift" } ], - "time": "2024-11-01T21:49:07+00:00" + "time": "2025-08-21T16:00:31+00:00" }, { "name": "doctrine/sql-formatter", @@ -2993,30 +4132,43 @@ "time": "2025-03-06T22:45:56+00:00" }, { - "name": "erusev/parsedown", - "version": "1.7.4", + "name": "ergebnis/classy", + "version": "1.8.0", "source": { "type": "git", - "url": "https://github.com/erusev/parsedown.git", - "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3" + "url": "https://github.com/ergebnis/classy.git", + "reference": "e5a695e44b083d4a4b4f2a40427301cd2916699d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3", - "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3", + "url": "https://api.github.com/repos/ergebnis/classy/zipball/e5a695e44b083d4a4b4f2a40427301cd2916699d", + "reference": "e5a695e44b083d4a4b4f2a40427301cd2916699d", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": ">=5.3.0" + "ext-tokenizer": "*", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35" + "ergebnis/composer-normalize": "^2.47.0", + "ergebnis/license": "^2.6.0", + "ergebnis/php-cs-fixer-config": "^6.51.0", + "ergebnis/phpstan-rules": "^2.10.5", + "ergebnis/phpunit-slow-test-detector": "^2.19.1", + "fakerphp/faker": "^1.24.1", + "infection/infection": "~0.26.6", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpstan/phpstan-strict-rules": "^2.0.6", + "phpunit/phpunit": "^9.6.19", + "rector/rector": "^2.1.2" }, "type": "library", "autoload": { - "psr-0": { - "Parsedown": "" + "psr-4": { + "Ergebnis\\Classy\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3025,22 +4177,26 @@ ], "authors": [ { - "name": "Emanuil Rusev", - "email": "hello@erusev.com", - "homepage": "http://erusev.com" + "name": "Andreas Mรถller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" } ], - "description": "Parser for Markdown.", - "homepage": "http://parsedown.org", + "description": "Provides a finder for classy constructs (classes, enums, interfaces, and traits).", + "homepage": "https://github.com/ergebnis/classy", "keywords": [ - "markdown", - "parser" + "classes", + "classy", + "constructs", + "finder", + "interfaces", + "traits" ], "support": { - "issues": "https://github.com/erusev/parsedown/issues", - "source": "https://github.com/erusev/parsedown/tree/1.7.x" + "issues": "https://github.com/ergebnis/classy/issues", + "source": "https://github.com/ergebnis/classy" }, - "time": "2019-12-30T22:54:17+00:00" + "time": "2025-08-19T06:14:25+00:00" }, { "name": "florianv/exchanger", @@ -3370,22 +4526,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.9.3", + "version": "7.10.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", - "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -3476,7 +4632,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.3" + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" }, "funding": [ { @@ -3492,20 +4648,20 @@ "type": "tidelift" } ], - "time": "2025-03-27T13:37:11+00:00" + "time": "2025-08-23T22:36:01+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.2.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" + "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", - "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", "shasum": "" }, "require": { @@ -3513,7 +4669,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "type": "library", "extra": { @@ -3559,7 +4715,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.2.0" + "source": "https://github.com/guzzle/promises/tree/2.3.0" }, "funding": [ { @@ -3575,20 +4731,20 @@ "type": "tidelift" } ], - "time": "2025-03-27T13:27:01+00:00" + "time": "2025-08-22T14:34:08+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.1", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", - "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { @@ -3604,7 +4760,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -3675,7 +4831,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.1" + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, "funding": [ { @@ -3691,7 +4847,7 @@ "type": "tidelift" } ], - "time": "2025-03-27T12:30:47+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { "name": "hshn/base64-encoded-file", @@ -3819,28 +4975,28 @@ }, { "name": "jbtronics/2fa-webauthn", - "version": "v2.2.3", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/jbtronics/2fa-webauthn.git", - "reference": "fda6f39e70784cbf1f93cf758bf798563219d451" + "reference": "542424bcc51f06932cbecfd7b75afbb5e107c9ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jbtronics/2fa-webauthn/zipball/fda6f39e70784cbf1f93cf758bf798563219d451", - "reference": "fda6f39e70784cbf1f93cf758bf798563219d451", + "url": "https://api.github.com/repos/jbtronics/2fa-webauthn/zipball/542424bcc51f06932cbecfd7b75afbb5e107c9ce", + "reference": "542424bcc51f06932cbecfd7b75afbb5e107c9ce", "shasum": "" }, "require": { "ext-json": "*", "nyholm/psr7": "^1.5", - "php": "^8.1", + "php": "^8.2", "psr/log": "^3.0.0|^2.0.0", "scheb/2fa-bundle": "^6.0.0|^7.0.0", "symfony/framework-bundle": "^6.0|^7.0", "symfony/psr-http-message-bridge": "^2.1|^6.1|^7.0", "symfony/uid": "^6.0|^7.0", - "web-auth/webauthn-lib": "^4.7" + "web-auth/webauthn-lib": "^5.2" }, "require-dev": { "phpunit/phpunit": "^9.5", @@ -3862,7 +5018,7 @@ "email": "mail@jan-boehmer.de" } ], - "description": "Webauthn Two-Factor-Authentictication Plugin for scheb/2fa", + "description": "Webauthn Two-Factor-Authentication Plugin for scheb/2fa", "keywords": [ "2fa", "scheb-2fa", @@ -3873,9 +5029,9 @@ ], "support": { "issues": "https://github.com/jbtronics/2fa-webauthn/issues", - "source": "https://github.com/jbtronics/2fa-webauthn/tree/v2.2.3" + "source": "https://github.com/jbtronics/2fa-webauthn/tree/v3.0.0" }, - "time": "2025-03-27T19:23:40+00:00" + "time": "2025-08-14T15:12:48+00:00" }, { "name": "jbtronics/dompdf-font-loader-bundle", @@ -3932,6 +5088,92 @@ }, "time": "2025-07-07T20:39:34+00:00" }, + { + "name": "jbtronics/settings-bundle", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/jbtronics/settings-bundle.git", + "reference": "9103bd7f78f0b223d1c7167feb824004fc2a9f07" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jbtronics/settings-bundle/zipball/9103bd7f78f0b223d1c7167feb824004fc2a9f07", + "reference": "9103bd7f78f0b223d1c7167feb824004fc2a9f07", + "shasum": "" + }, + "require": { + "ergebnis/classy": "^1.6", + "ext-json": "*", + "php": "^8.1", + "symfony/deprecation-contracts": "^3.4", + "symfony/form": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/translation": "^7.0|^6.4", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "require-dev": { + "doctrine/doctrine-bundle": "^2.11", + "doctrine/doctrine-fixtures-bundle": "^3.5", + "doctrine/orm": "^3.0", + "ekino/phpstan-banned-code": "^1.0", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-strict-rules": "^1.5", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^9.5", + "roave/security-advisories": "dev-latest", + "symfony/console": "^6.4|^7.0", + "symfony/phpunit-bridge": "^6.4|^7.0", + "symfony/security-csrf": "^7.0|^6.4", + "symfony/twig-bridge": "^6.4|^7.0" + }, + "suggest": { + "doctrine/doctrine-bundle": "To use the doctrine ORM storage", + "symfony/twig-bridge": "Allows to access settings in twig templates" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Jbtronics\\SettingsBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Bรถhmer", + "email": "mail@jan-boehmer.de" + } + ], + "description": "A symfony bundle to easily create typesafe, user-configurable settings for symfony applications", + "keywords": [ + "Settings", + "config", + "symfony", + "symfony-bundle", + "user-configurable" + ], + "support": { + "issues": "https://github.com/jbtronics/settings-bundle/issues", + "source": "https://github.com/jbtronics/settings-bundle/tree/v3.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/do9jhb", + "type": "custom" + }, + { + "url": "https://github.com/jbtronics", + "type": "github" + } + ], + "time": "2025-08-24T21:20:15+00:00" + }, { "name": "jfcherng/php-color-output", "version": "3.0.0", @@ -4229,16 +5471,16 @@ }, { "name": "knpuniversity/oauth2-client-bundle", - "version": "v2.18.3", + "version": "v2.18.4", "source": { "type": "git", "url": "https://github.com/knpuniversity/oauth2-client-bundle.git", - "reference": "c38ca88a70aae3694ca346a41b13b9a8f6e33ed4" + "reference": "2f48e1ff7969ef0252482d0f6af874eca639ea2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/knpuniversity/oauth2-client-bundle/zipball/c38ca88a70aae3694ca346a41b13b9a8f6e33ed4", - "reference": "c38ca88a70aae3694ca346a41b13b9a8f6e33ed4", + "url": "https://api.github.com/repos/knpuniversity/oauth2-client-bundle/zipball/2f48e1ff7969ef0252482d0f6af874eca639ea2d", + "reference": "2f48e1ff7969ef0252482d0f6af874eca639ea2d", "shasum": "" }, "require": { @@ -4282,40 +5524,40 @@ ], "support": { "issues": "https://github.com/knpuniversity/oauth2-client-bundle/issues", - "source": "https://github.com/knpuniversity/oauth2-client-bundle/tree/v2.18.3" + "source": "https://github.com/knpuniversity/oauth2-client-bundle/tree/v2.18.4" }, - "time": "2024-10-02T14:26:09+00:00" + "time": "2025-08-18T15:33:00+00:00" }, { "name": "lcobucci/clock", - "version": "3.0.0", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/lcobucci/clock.git", - "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc" + "reference": "db3713a61addfffd615b79bf0bc22f0ccc61b86b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/clock/zipball/039ef98c6b57b101d10bd11d8fdfda12cbd996dc", - "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/db3713a61addfffd615b79bf0bc22f0ccc61b86b", + "reference": "db3713a61addfffd615b79bf0bc22f0ccc61b86b", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", "psr/clock": "^1.0" }, "provide": { "psr/clock-implementation": "1.0" }, "require-dev": { - "infection/infection": "^0.26", - "lcobucci/coding-standard": "^9.0", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.9.4", - "phpstan/phpstan-deprecation-rules": "^1.1.1", - "phpstan/phpstan-phpunit": "^1.3.2", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^9.5.27" + "infection/infection": "^0.29", + "lcobucci/coding-standard": "^11.1.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.10.25", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.13", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^11.3.6" }, "type": "library", "autoload": { @@ -4336,7 +5578,7 @@ "description": "Yet another clock abstraction", "support": { "issues": "https://github.com/lcobucci/clock/issues", - "source": "https://github.com/lcobucci/clock/tree/3.0.0" + "source": "https://github.com/lcobucci/clock/tree/3.3.1" }, "funding": [ { @@ -4348,42 +5590,42 @@ "type": "patreon" } ], - "time": "2022-12-19T15:00:24+00:00" + "time": "2024-09-24T20:45:14+00:00" }, { "name": "lcobucci/jwt", - "version": "5.3.0", + "version": "5.5.0", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83" + "reference": "a835af59b030d3f2967725697cf88300f579088e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", - "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/a835af59b030d3f2967725697cf88300f579088e", + "reference": "a835af59b030d3f2967725697cf88300f579088e", "shasum": "" }, "require": { "ext-openssl": "*", "ext-sodium": "*", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", "psr/clock": "^1.0" }, "require-dev": { - "infection/infection": "^0.27.0", - "lcobucci/clock": "^3.0", + "infection/infection": "^0.29", + "lcobucci/clock": "^3.2", "lcobucci/coding-standard": "^11.0", - "phpbench/phpbench": "^1.2.9", + "phpbench/phpbench": "^1.2", "phpstan/extension-installer": "^1.2", "phpstan/phpstan": "^1.10.7", "phpstan/phpstan-deprecation-rules": "^1.1.3", "phpstan/phpstan-phpunit": "^1.3.10", "phpstan/phpstan-strict-rules": "^1.5.0", - "phpunit/phpunit": "^10.2.6" + "phpunit/phpunit": "^11.1" }, "suggest": { - "lcobucci/clock": ">= 3.0" + "lcobucci/clock": ">= 3.2" }, "type": "library", "autoload": { @@ -4409,7 +5651,7 @@ ], "support": { "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/5.3.0" + "source": "https://github.com/lcobucci/jwt/tree/5.5.0" }, "funding": [ { @@ -4421,39 +5663,235 @@ "type": "patreon" } ], - "time": "2024-04-11T23:07:54+00:00" + "time": "2025-01-26T21:29:45+00:00" }, { - "name": "league/csv", - "version": "9.8.0", + "name": "league/commonmark", + "version": "2.7.1", "source": { "type": "git", - "url": "https://github.com/thephpleague/csv.git", - "reference": "9d2e0265c5d90f5dd601bc65ff717e05cec19b47" + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/9d2e0265c5d90f5dd601bc65ff717e05cec19b47", - "reference": "9d2e0265c5d90f5dd601bc65ff717e05cec19b47", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/10732241927d3971d28e7ea7b5712721fa2296ca", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca", "shasum": "" }, "require": { - "ext-json": "*", "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2025-07-20T12:47:49+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", "php": "^7.4 || ^8.0" }, "require-dev": { - "ext-curl": "*", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/csv", + "version": "9.24.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/csv.git", + "reference": "e0221a3f16aa2a823047d59fab5809d552e29bc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/e0221a3f16aa2a823047d59fab5809d552e29bc8", + "reference": "e0221a3f16aa2a823047d59fab5809d552e29bc8", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1.2" + }, + "require-dev": { "ext-dom": "*", - "friendsofphp/php-cs-fixer": "^v3.4.0", - "phpstan/phpstan": "^1.3.0", - "phpstan/phpstan-phpunit": "^1.0.0", - "phpstan/phpstan-strict-rules": "^1.1.0", - "phpunit/phpunit": "^9.5.11" + "ext-xdebug": "*", + "friendsofphp/php-cs-fixer": "^3.75.0", + "phpbench/phpbench": "^1.4.1", + "phpstan/phpstan": "^1.12.27", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.2", + "phpstan/phpstan-strict-rules": "^1.6.2", + "phpunit/phpunit": "^10.5.16 || ^11.5.22", + "symfony/var-dumper": "^6.4.8 || ^7.3.0" }, "suggest": { - "ext-dom": "Required to use the XMLConverter and or the HTMLConverter classes", - "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters" + "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", + "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters", + "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters", + "ext-mysqli": "Requiered to use the package with the MySQLi extension", + "ext-pdo": "Required to use the package with the PDO extension", + "ext-pgsql": "Requiered to use the package with the PgSQL extension", + "ext-sqlite3": "Required to use the package with the SQLite3 extension" }, "type": "library", "extra": { @@ -4505,7 +5943,7 @@ "type": "github" } ], - "time": "2022-01-04T00:13:07+00:00" + "time": "2025-06-25T14:53:51+00:00" }, { "name": "league/html-to-markdown", @@ -5248,37 +6686,37 @@ }, { "name": "nbgrp/onelogin-saml-bundle", - "version": "v1.4.0", + "version": "v2.0.2", "source": { "type": "git", "url": "https://github.com/nbgrp/onelogin-saml-bundle.git", - "reference": "3341544e72b699ab69357ab38cee9c80941ce1c6" + "reference": "d2feeb7de6ab5b98e69deeea31ad0ceb20a1c4dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nbgrp/onelogin-saml-bundle/zipball/3341544e72b699ab69357ab38cee9c80941ce1c6", - "reference": "3341544e72b699ab69357ab38cee9c80941ce1c6", + "url": "https://api.github.com/repos/nbgrp/onelogin-saml-bundle/zipball/d2feeb7de6ab5b98e69deeea31ad0ceb20a1c4dc", + "reference": "d2feeb7de6ab5b98e69deeea31ad0ceb20a1c4dc", "shasum": "" }, "require": { "onelogin/php-saml": "^4", - "php": "^8.1", + "php": "^8.2", "psr/log": "^1 || ^2 || ^3", - "symfony/config": "^6.4", - "symfony/dependency-injection": "^6.4", + "symfony/config": "^7", + "symfony/dependency-injection": "^7", "symfony/deprecation-contracts": "^3", "symfony/event-dispatcher-contracts": "^3", - "symfony/http-foundation": "^6.4", - "symfony/http-kernel": "^6.4", - "symfony/routing": "^6.4", - "symfony/security-bundle": "^6.4", - "symfony/security-core": "^6.4", - "symfony/security-http": "^6.4" + "symfony/http-foundation": "^7", + "symfony/http-kernel": "^7", + "symfony/routing": "^7", + "symfony/security-bundle": "^7", + "symfony/security-core": "^7", + "symfony/security-http": "^7" }, "require-dev": { "doctrine/orm": "^2.3 || ^3", - "symfony/event-dispatcher": "^6.4", - "symfony/phpunit-bridge": "^6.4" + "phpunit/phpunit": "^11.2", + "symfony/event-dispatcher": "^7" }, "type": "symfony-bundle", "autoload": { @@ -5305,9 +6743,9 @@ ], "support": { "issues": "https://github.com/nbgrp/onelogin-saml-bundle/issues", - "source": "https://github.com/nbgrp/onelogin-saml-bundle/tree/v1.4.0" + "source": "https://github.com/nbgrp/onelogin-saml-bundle/tree/v2.0.2" }, - "time": "2023-11-29T12:22:32+00:00" + "time": "2024-09-01T22:16:27+00:00" }, { "name": "nelexa/zip", @@ -5518,6 +6956,157 @@ }, "time": "2025-03-13T09:17:16+00:00" }, + { + "name": "nette/schema", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.4" + }, + "require-dev": { + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "๐Ÿ“ Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.2" + }, + "time": "2024-10-06T23:10:23+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.8", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/tester": "^2.5", + "phpstan/phpstan-nette": "^2.0@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "๐Ÿ›  Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.8" + }, + "time": "2025-08-06T21:43:34+00:00" + }, { "name": "nikolaposa/version", "version": "4.2.1", @@ -5659,20 +7248,20 @@ }, { "name": "omines/datatables-bundle", - "version": "0.9.2", + "version": "0.10.3", "source": { "type": "git", "url": "https://github.com/omines/datatables-bundle.git", - "reference": "15974fc7dde750f8a3eff32d9ad4d9de6028583f" + "reference": "d64e7d5c72303995ada7365b467166f3cdf4757c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/omines/datatables-bundle/zipball/15974fc7dde750f8a3eff32d9ad4d9de6028583f", - "reference": "15974fc7dde750f8a3eff32d9ad4d9de6028583f", + "url": "https://api.github.com/repos/omines/datatables-bundle/zipball/d64e7d5c72303995ada7365b467166f3cdf4757c", + "reference": "d64e7d5c72303995ada7365b467166f3cdf4757c", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/event-dispatcher": "^6.4|^7.1", "symfony/framework-bundle": "^6.4|^7.1", "symfony/options-resolver": "^6.4|^7.1", @@ -5684,38 +7273,38 @@ "doctrine/orm": "^3.0 <3.3" }, "require-dev": { - "doctrine/common": "^3.4.5", - "doctrine/doctrine-bundle": "^2.13.1", - "doctrine/orm": "^2.19.3|^3.3.0", - "doctrine/persistence": "^3.4.0", + "doctrine/common": "^3.5.0", + "doctrine/doctrine-bundle": "^2.15.0", + "doctrine/orm": "^2.19.3|^3.4.1", + "doctrine/persistence": "^3.4.0|^4.0.0", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", "ext-mongodb": "*", "ext-pdo_sqlite": "*", "ext-zip": "*", - "friendsofphp/php-cs-fixer": "^3.65.0", - "mongodb/mongodb": "^1.20.0", + "friendsofphp/php-cs-fixer": "^3.75.0", + "mongodb/mongodb": "^1.20.0|^2.1.0", "ocramius/package-versions": "^2.9", "openspout/openspout": "^4.23", - "phpoffice/phpspreadsheet": "^2.3.3|^3.5", + "phpoffice/phpspreadsheet": "^2.3.3|^3.9.2|^4.4.0", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^2.0.3", - "phpstan/phpstan-doctrine": "^2.0.1", - "phpstan/phpstan-phpunit": "^2.0.1", - "phpstan/phpstan-symfony": "^2.0.0", - "phpunit/phpunit": "^10.5.38|^11.4.4", - "ruflin/elastica": "^6.2|^7.3.2", - "symfony/browser-kit": "^6.4.13|^7.1", - "symfony/css-selector": "^6.4.13|^7.1", - "symfony/doctrine-bridge": "^6.4.13|^7.1", - "symfony/dom-crawler": "^6.4.13|^7.1", - "symfony/intl": "^6.4.13|^7.1", - "symfony/mime": "^6.4.13|^7.1", - "symfony/phpunit-bridge": "^7.2", - "symfony/twig-bundle": "^6.4|^7.1", - "symfony/var-dumper": "^6.4.13|^7.1", - "symfony/yaml": "^6.4.13|^7.1" + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-doctrine": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.6", + "phpstan/phpstan-symfony": "^2.0.6", + "phpunit/phpunit": "^10.5.38|^11.5.24", + "ruflin/elastica": "^7.3.2", + "symfony/browser-kit": "^6.4.13|^7.3", + "symfony/css-selector": "^6.4.13|^7.3", + "symfony/doctrine-bridge": "^6.4.13|^7.3", + "symfony/dom-crawler": "^6.4.13|^7.3", + "symfony/intl": "^6.4.13|^7.3", + "symfony/mime": "^6.4.13|^7.3", + "symfony/phpunit-bridge": "^7.3", + "symfony/twig-bundle": "^6.4|^7.3", + "symfony/var-dumper": "^6.4.13|^7.3", + "symfony/yaml": "^6.4.13|^7.3" }, "suggest": { "doctrine/doctrine-bundle": "For integrated access to Doctrine object managers", @@ -5729,7 +7318,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "0.9-dev" + "dev-master": "0.10-dev" } }, "autoload": { @@ -5767,7 +7356,7 @@ ], "support": { "issues": "https://github.com/omines/datatables-bundle/issues", - "source": "https://github.com/omines/datatables-bundle/tree/0.9.2" + "source": "https://github.com/omines/datatables-bundle/tree/0.10.3" }, "funding": [ { @@ -5775,7 +7364,7 @@ "type": "github" } ], - "time": "2025-01-23T14:53:20+00:00" + "time": "2025-07-24T19:50:46+00:00" }, { "name": "onelogin/php-saml", @@ -5843,24 +7432,24 @@ }, { "name": "paragonie/constant_time_encoding", - "version": "v2.7.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105" + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/52a0d99e69f56b9ec27ace92ba56897fe6993105", - "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512", + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512", "shasum": "" }, "require": { - "php": "^7|^8" + "php": "^8" }, "require-dev": { - "phpunit/phpunit": "^6|^7|^8|^9", - "vimeo/psalm": "^1|^2|^3|^4" + "phpunit/phpunit": "^9", + "vimeo/psalm": "^4|^5" }, "type": "library", "autoload": { @@ -5906,7 +7495,7 @@ "issues": "https://github.com/paragonie/constant_time_encoding/issues", "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2024-05-08T12:18:48+00:00" + "time": "2024-05-08T12:36:18+00:00" }, { "name": "paragonie/random_compat", @@ -6325,16 +7914,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.2", + "version": "5.6.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" + "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94f8051919d1b0369a6bcc7931d679a511c03fe9", + "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9", "shasum": "" }, "require": { @@ -6383,9 +7972,9 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.3" }, - "time": "2025-04-13T19:20:35+00:00" + "time": "2025-08-01T19:43:32+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -6447,16 +8036,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.2.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8" + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b9e61a61e39e02dd90944e9115241c7f7e76bfd8", - "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", "shasum": "" }, "require": { @@ -6488,9 +8077,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.2.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" }, - "time": "2025-07-13T07:04:09+00:00" + "time": "2025-08-30T15:50:23+00:00" }, { "name": "psr/cache", @@ -7495,20 +9084,20 @@ }, { "name": "scheb/2fa-backup-code", - "version": "v6.13.1", + "version": "v7.11.0", "source": { "type": "git", "url": "https://github.com/scheb/2fa-backup-code.git", - "reference": "6dceeb5be0f6339d76f8e380ee09631c8bbebc7e" + "reference": "62c6099b179903db5ab03b8059068cdb28659294" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scheb/2fa-backup-code/zipball/6dceeb5be0f6339d76f8e380ee09631c8bbebc7e", - "reference": "6dceeb5be0f6339d76f8e380ee09631c8bbebc7e", + "url": "https://api.github.com/repos/scheb/2fa-backup-code/zipball/62c6099b179903db5ab03b8059068cdb28659294", + "reference": "62c6099b179903db5ab03b8059068cdb28659294", "shasum": "" }, "require": { - "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", "scheb/2fa-bundle": "self.version" }, "type": "library", @@ -7538,40 +9127,40 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-backup-code/tree/v6.13.1" + "source": "https://github.com/scheb/2fa-backup-code/tree/v7.11.0" }, - "time": "2024-11-29T19:22:48+00:00" + "time": "2025-04-20T08:27:40+00:00" }, { "name": "scheb/2fa-bundle", - "version": "v6.13.1", + "version": "v7.11.0", "source": { "type": "git", "url": "https://github.com/scheb/2fa-bundle.git", - "reference": "8eadd57ebc2078ef273dca72b1ac4bd283812346" + "reference": "06a343d14dad8cdd1670157d384738f9cfba29e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scheb/2fa-bundle/zipball/8eadd57ebc2078ef273dca72b1ac4bd283812346", - "reference": "8eadd57ebc2078ef273dca72b1ac4bd283812346", + "url": "https://api.github.com/repos/scheb/2fa-bundle/zipball/06a343d14dad8cdd1670157d384738f9cfba29e5", + "reference": "06a343d14dad8cdd1670157d384738f9cfba29e5", "shasum": "" }, "require": { "ext-json": "*", - "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", - "symfony/config": "^5.4 || ^6.0", - "symfony/dependency-injection": "^5.4 || ^6.0", - "symfony/event-dispatcher": "^5.4 || ^6.0", - "symfony/framework-bundle": "^5.4 || ^6.0", - "symfony/http-foundation": "^5.4 || ^6.0", - "symfony/http-kernel": "^5.4 || ^6.0", - "symfony/property-access": "^5.4 || ^6.0", - "symfony/security-bundle": "^5.4 || ^6.0", - "symfony/twig-bundle": "^5.4 || ^6.0" + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "symfony/config": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/event-dispatcher": "^6.4 || ^7.0", + "symfony/framework-bundle": "^6.4 || ^7.0", + "symfony/http-foundation": "^6.4 || ^7.0", + "symfony/http-kernel": "^6.4 || ^7.0", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/security-bundle": "^6.4 || ^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/twig-bundle": "^6.4 || ^7.0" }, "conflict": { - "scheb/two-factor-bundle": "*", - "symfony/security-core": "^7" + "scheb/two-factor-bundle": "*" }, "suggest": { "scheb/2fa-backup-code": "Emergency codes when you have no access to other methods", @@ -7606,29 +9195,28 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-bundle/tree/v6.13.1" + "source": "https://github.com/scheb/2fa-bundle/tree/v7.11.0" }, - "time": "2024-11-29T19:29:49+00:00" + "time": "2025-06-27T12:14:20+00:00" }, { "name": "scheb/2fa-google-authenticator", - "version": "v6.13.1", + "version": "v7.11.0", "source": { "type": "git", "url": "https://github.com/scheb/2fa-google-authenticator.git", - "reference": "2c960a5cb32edb4c37f719f10180df378a44fd6f" + "reference": "01a446eb68a76c3d0528a190029afa5e6ce5c384" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scheb/2fa-google-authenticator/zipball/2c960a5cb32edb4c37f719f10180df378a44fd6f", - "reference": "2c960a5cb32edb4c37f719f10180df378a44fd6f", + "url": "https://api.github.com/repos/scheb/2fa-google-authenticator/zipball/01a446eb68a76c3d0528a190029afa5e6ce5c384", + "reference": "01a446eb68a76c3d0528a190029afa5e6ce5c384", "shasum": "" }, "require": { - "paragonie/constant_time_encoding": "^2.4", - "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", "scheb/2fa-bundle": "self.version", - "spomky-labs/otphp": "^10.0 || ^11.0" + "spomky-labs/otphp": "^11.0" }, "type": "library", "autoload": { @@ -7657,28 +9245,28 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-google-authenticator/tree/v6.13.1" + "source": "https://github.com/scheb/2fa-google-authenticator/tree/v7.11.0" }, - "time": "2024-11-29T19:22:48+00:00" + "time": "2025-04-20T08:38:44+00:00" }, { "name": "scheb/2fa-trusted-device", - "version": "v6.13.1", + "version": "v7.11.0", "source": { "type": "git", "url": "https://github.com/scheb/2fa-trusted-device.git", - "reference": "38e690325232a4037ff4aec8de926c938906942c" + "reference": "6ab98fdee3aa001ca6598eeb422d9abf2c85b5b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scheb/2fa-trusted-device/zipball/38e690325232a4037ff4aec8de926c938906942c", - "reference": "38e690325232a4037ff4aec8de926c938906942c", + "url": "https://api.github.com/repos/scheb/2fa-trusted-device/zipball/6ab98fdee3aa001ca6598eeb422d9abf2c85b5b3", + "reference": "6ab98fdee3aa001ca6598eeb422d9abf2c85b5b3", "shasum": "" }, "require": { - "lcobucci/clock": "^2.0 || ^3.0", - "lcobucci/jwt": "^4.1 || ^5.0", - "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "lcobucci/clock": "^3.0", + "lcobucci/jwt": "^5.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", "scheb/2fa-bundle": "self.version" }, "type": "library", @@ -7708,9 +9296,9 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-trusted-device/tree/v6.13.1" + "source": "https://github.com/scheb/2fa-trusted-device/tree/v7.11.0" }, - "time": "2024-11-29T19:22:48+00:00" + "time": "2025-06-27T12:14:20+00:00" }, { "name": "shivas/versioning-bundle", @@ -8137,28 +9725,28 @@ }, { "name": "symfony/asset", - "version": "v6.4.24", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "cfee7c0d64be113383db74a2fdd65d426b7f3aab" + "reference": "56c4d9f759247c4e07d8549e3baf7493cb9c3e4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/cfee7c0d64be113383db74a2fdd65d426b7f3aab", - "reference": "cfee7c0d64be113383db74a2fdd65d426b7f3aab", + "url": "https://api.github.com/repos/symfony/asset/zipball/56c4d9f759247c4e07d8549e3baf7493cb9c3e4b", + "reference": "56c4d9f759247c4e07d8549e3baf7493cb9c3e4b", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "conflict": { - "symfony/http-foundation": "<5.4" + "symfony/http-foundation": "<6.4" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0" + "symfony/http-client": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8186,7 +9774,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v6.4.24" + "source": "https://github.com/symfony/asset/tree/v7.3.0" }, "funding": [ { @@ -8197,44 +9785,41 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-03-05T10:15:41+00:00" }, { "name": "symfony/cache", - "version": "v6.4.24", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "d038cd3054aeaf1c674022a77048b2ef6376a175" + "reference": "6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d038cd3054aeaf1c674022a77048b2ef6376a175", - "reference": "d038cd3054aeaf1c674022a77048b2ef6376a175", + "url": "https://api.github.com/repos/symfony/cache/zipball/6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6", + "reference": "6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", + "symfony/cache-contracts": "^3.6", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.3.6|^7.0" + "symfony/var-exporter": "^6.4|^7.0" }, "conflict": { - "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/var-dumper": "<5.4" + "doctrine/dbal": "<3.6", + "symfony/dependency-injection": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/var-dumper": "<6.4" }, "provide": { "psr/cache-implementation": "2.0|3.0", @@ -8243,15 +9828,16 @@ }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8286,7 +9872,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.24" + "source": "https://github.com/symfony/cache/tree/v7.3.2" }, "funding": [ { @@ -8306,7 +9892,7 @@ "type": "tidelift" } ], - "time": "2025-07-30T09:32:03+00:00" + "time": "2025-07-30T17:13:41+00:00" }, { "name": "symfony/cache-contracts", @@ -8386,20 +9972,20 @@ }, { "name": "symfony/clock", - "version": "v6.4.24", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "5e15a9c9aeeb44a99f7cf24aa75aa9607795f6f8" + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/5e15a9c9aeeb44a99f7cf24aa75aa9607795f6f8", - "reference": "5e15a9c9aeeb44a99f7cf24aa75aa9607795f6f8", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/clock": "^1.0", "symfony/polyfill-php83": "^1.28" }, @@ -8440,7 +10026,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v6.4.24" + "source": "https://github.com/symfony/clock/tree/v7.3.0" }, "funding": [ { @@ -8451,47 +10037,43 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/config", - "version": "v6.4.24", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "80e2cf005cf17138c97193be0434cdcfd1b2212e" + "reference": "faef36e271bbeb74a9d733be4b56419b157762e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/80e2cf005cf17138c97193be0434cdcfd1b2212e", - "reference": "80e2cf005cf17138c97193be0434cdcfd1b2212e", + "url": "https://api.github.com/repos/symfony/config/zipball/faef36e271bbeb74a9d733be4b56419b157762e2", + "reference": "faef36e271bbeb74a9d733be4b56419b157762e2", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^7.1", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<5.4", + "symfony/finder": "<6.4", "symfony/service-contracts": "<2.5" }, "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8519,7 +10101,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.24" + "source": "https://github.com/symfony/config/tree/v7.3.2" }, "funding": [ { @@ -8539,51 +10121,51 @@ "type": "tidelift" } ], - "time": "2025-07-26T13:50:30+00:00" + "time": "2025-07-26T13:55:06+00:00" }, { "name": "symfony/console", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "59266a5bf6a596e3e0844fd95e6ad7ea3c1d3350" + "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/59266a5bf6a596e3e0844fd95e6ad7ea3c1d3350", - "reference": "59266a5bf6a596e3e0844fd95e6ad7ea3c1d3350", + "url": "https://api.github.com/repos/symfony/console/zipball/cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", + "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" + "symfony/string": "^7.2" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8617,7 +10199,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.24" + "source": "https://github.com/symfony/console/tree/v7.3.3" }, "funding": [ { @@ -8637,24 +10219,24 @@ "type": "tidelift" } ], - "time": "2025-07-30T10:38:54+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.24", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "9b784413143701aa3c94ac1869a159a9e53e8761" + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/9b784413143701aa3c94ac1869a159a9e53e8761", - "reference": "9b784413143701aa3c94ac1869a159a9e53e8761", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -8686,7 +10268,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.24" + "source": "https://github.com/symfony/css-selector/tree/v7.3.0" }, "funding": [ { @@ -8697,53 +10279,48 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "929ab73b93247a15166ee79e807ccee4f930322d" + "reference": "ab6c38dad5da9b15b1f7afb2f5c5814112e70261" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/929ab73b93247a15166ee79e807ccee4f930322d", - "reference": "929ab73b93247a15166ee79e807ccee4f930322d", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/ab6c38dad5da9b15b1f7afb2f5c5814112e70261", + "reference": "ab6c38dad5da9b15b1f7afb2f5c5814112e70261", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3.0", + "symfony/service-contracts": "^3.5", "symfony/var-exporter": "^6.4.20|^7.2.5" }, "conflict": { "ext-psr": "<1.1|>=2", - "symfony/config": "<6.1", - "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.3", - "symfony/yaml": "<5.4" + "symfony/config": "<6.4", + "symfony/finder": "<6.4", + "symfony/yaml": "<6.4" }, "provide": { "psr/container-implementation": "1.1|2.0", "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^6.1|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/config": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8771,7 +10348,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.24" + "source": "https://github.com/symfony/dependency-injection/tree/v7.3.3" }, "funding": [ { @@ -8791,7 +10368,7 @@ "type": "tidelift" } ], - "time": "2025-07-30T17:30:48+00:00" + "time": "2025-08-14T09:54:27+00:00" }, { "name": "symfony/deprecation-contracts", @@ -8862,67 +10439,68 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "eb0b8e3d326b6155a64599d44c879bef270ef58e" + "reference": "b371ded46da25415e1a3a7422e4acd2ec34214c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/eb0b8e3d326b6155a64599d44c879bef270ef58e", - "reference": "eb0b8e3d326b6155a64599d44c879bef270ef58e", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b371ded46da25415e1a3a7422e4acd2ec34214c5", + "reference": "b371ded46da25415e1a3a7422e4acd2ec34214c5", "shasum": "" }, "require": { - "doctrine/event-manager": "^1.2|^2", - "doctrine/persistence": "^2.5|^3.1|^4", - "php": ">=8.1", + "doctrine/event-manager": "^2", + "doctrine/persistence": "^3.1|^4", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "doctrine/dbal": "<2.13.1", + "doctrine/collections": "<1.8", + "doctrine/dbal": "<3.6", "doctrine/lexer": "<1.1", "doctrine/orm": "<2.15", - "symfony/cache": "<5.4", - "symfony/dependency-injection": "<6.2", - "symfony/form": "<5.4.38|>=6,<6.4.6|>=7,<7.0.6", - "symfony/http-foundation": "<6.3", - "symfony/http-kernel": "<6.2", - "symfony/lock": "<6.3", - "symfony/messenger": "<5.4", - "symfony/property-info": "<5.4", - "symfony/security-bundle": "<5.4", + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/form": "<6.4.6|>=7,<7.0.6", + "symfony/http-foundation": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/lock": "<6.4", + "symfony/messenger": "<6.4", + "symfony/property-info": "<6.4", + "symfony/security-bundle": "<6.4", "symfony/security-core": "<6.4", "symfony/validator": "<6.4" }, "require-dev": { - "doctrine/collections": "^1.0|^2.0", + "doctrine/collections": "^1.8|^2.0", "doctrine/data-fixtures": "^1.1|^2", - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "doctrine/orm": "^2.15|^3", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.2|^7.0", - "symfony/doctrine-messenger": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4.38|^6.4.6|^7.0.6", - "symfony/http-kernel": "^6.3|^7.0", - "symfony/lock": "^6.3|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/proxy-manager-bridge": "^6.4", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/doctrine-messenger": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/form": "^6.4.6|^7.0.6", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", "symfony/security-core": "^6.4|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/type-info": "^7.1.8", + "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/var-dumper": "^6.4|^7.0" }, "type": "symfony-bridge", "autoload": { @@ -8950,7 +10528,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.24" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.3" }, "funding": [ { @@ -8970,30 +10548,30 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-18T13:10:53+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "202a37e973b7e789604b96fba6473f74c43da045" + "reference": "efa076ea0eeff504383ff0dcf827ea5ce15690ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/202a37e973b7e789604b96fba6473f74c43da045", - "reference": "202a37e973b7e789604b96fba6473f74c43da045", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/efa076ea0eeff504383ff0dcf827ea5ce15690ba", + "reference": "efa076ea0eeff504383ff0dcf827ea5ce15690ba", "shasum": "" }, "require": { "masterminds/html5": "^2.6", - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0|^7.0" + "symfony/css-selector": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -9021,7 +10599,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.24" + "source": "https://github.com/symfony/dom-crawler/tree/v7.3.3" }, "funding": [ { @@ -9041,32 +10619,32 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-06T20:13:54+00:00" }, { "name": "symfony/dotenv", - "version": "v6.4.24", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "234b6c602f12b00693f4b0d1054386fb30dfc8ff" + "reference": "2192790a11f9e22cbcf9dc705a3ff22a5503923a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/234b6c602f12b00693f4b0d1054386fb30dfc8ff", - "reference": "234b6c602f12b00693f4b0d1054386fb30dfc8ff", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/2192790a11f9e22cbcf9dc705a3ff22a5503923a", + "reference": "2192790a11f9e22cbcf9dc705a3ff22a5503923a", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "conflict": { - "symfony/console": "<5.4", - "symfony/process": "<5.4" + "symfony/console": "<6.4", + "symfony/process": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -9099,7 +10677,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.24" + "source": "https://github.com/symfony/dotenv/tree/v7.3.2" }, "funding": [ { @@ -9119,35 +10697,37 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-07-10T08:29:33+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.24", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "30fd0b3cf0e972e82636038ce4db0e4fe777112c" + "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/30fd0b3cf0e972e82636038ce4db0e4fe777112c", - "reference": "30fd0b3cf0e972e82636038ce4db0e4fe777112c", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/0b31a944fcd8759ae294da4d2808cbc53aebd0c3", + "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/var-dumper": "^6.4|^7.0" }, "conflict": { "symfony/deprecation-contracts": "<2.5", "symfony/http-kernel": "<6.4" }, "require-dev": { + "symfony/console": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^5.4|^6.0|^7.0" + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -9178,7 +10758,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.24" + "source": "https://github.com/symfony/error-handler/tree/v7.3.2" }, "funding": [ { @@ -9198,28 +10778,28 @@ "type": "tidelift" } ], - "time": "2025-07-24T08:25:04+00:00" + "time": "2025-07-07T08:17:57+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "307a09d8d7228d14a05e5e05b95fffdacab032b2" + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/307a09d8d7228d14a05e5e05b95fffdacab032b2", - "reference": "307a09d8d7228d14a05e5e05b95fffdacab032b2", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -9228,13 +10808,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -9262,7 +10842,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.24" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" }, "funding": [ { @@ -9282,7 +10862,7 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -9362,21 +10942,21 @@ }, { "name": "symfony/expression-language", - "version": "v6.4.24", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "1ea0adaa53539ea7e70821ae9de49ebe03ae7091" + "reference": "32d2d19c62e58767e6552166c32fb259975d2b23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/1ea0adaa53539ea7e70821ae9de49ebe03ae7091", - "reference": "1ea0adaa53539ea7e70821ae9de49ebe03ae7091", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/32d2d19c62e58767e6552166c32fb259975d2b23", + "reference": "32d2d19c62e58767e6552166c32fb259975d2b23", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/cache": "^5.4|^6.0|^7.0", + "php": ">=8.2", + "symfony/cache": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3" }, @@ -9406,7 +10986,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v6.4.24" + "source": "https://github.com/symfony/expression-language/tree/v7.3.2" }, "funding": [ { @@ -9426,29 +11006,29 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-07-10T08:29:33+00:00" }, { "name": "symfony/filesystem", - "version": "v6.4.24", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8" + "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/75ae2edb7cdcc0c53766c30b0a2512b8df574bd8", - "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd", + "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^5.4|^6.4|^7.0" + "symfony/process": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -9476,7 +11056,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.24" + "source": "https://github.com/symfony/filesystem/tree/v7.3.2" }, "funding": [ { @@ -9496,27 +11076,27 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-07-07T08:17:47+00:00" }, { "name": "symfony/finder", - "version": "v6.4.24", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "73089124388c8510efb8d2d1689285d285937b08" + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/73089124388c8510efb8d2d1689285d285937b08", - "reference": "73089124388c8510efb8d2d1689285d285937b08", + "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "symfony/filesystem": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -9544,7 +11124,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.24" + "source": "https://github.com/symfony/finder/tree/v7.3.2" }, "funding": [ { @@ -9564,20 +11144,20 @@ "type": "tidelift" } ], - "time": "2025-07-15T12:02:45+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/flex", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "423c36e369361003dc31ef11c5f15fb589e52c01" + "reference": "f356aa35f3cf3d2f46c31d344c1098eb2d260426" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/423c36e369361003dc31ef11c5f15fb589e52c01", - "reference": "423c36e369361003dc31ef11c5f15fb589e52c01", + "url": "https://api.github.com/repos/symfony/flex/zipball/f356aa35f3cf3d2f46c31d344c1098eb2d260426", + "reference": "f356aa35f3cf3d2f46c31d344c1098eb2d260426", "shasum": "" }, "require": { @@ -9616,7 +11196,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.8.1" + "source": "https://github.com/symfony/flex/tree/v2.8.2" }, "funding": [ { @@ -9627,65 +11207,69 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-05T07:45:19+00:00" + "time": "2025-08-22T07:17:23+00:00" }, { "name": "symfony/form", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "7db222a6e0b05793971560a7d015b5162eeed3bc" + "reference": "f151b4a027fa67769268b80111f7fdb63edb5e79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/7db222a6e0b05793971560a7d015b5162eeed3bc", - "reference": "7db222a6e0b05793971560a7d015b5162eeed3bc", + "url": "https://api.github.com/repos/symfony/form/zipball/f151b4a027fa67769268b80111f7fdb63edb5e79", + "reference": "f151b4a027fa67769268b80111f7fdb63edb5e79", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/options-resolver": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/options-resolver": "^7.3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-icu": "^1.21", "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-access": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7", - "symfony/error-handler": "<5.4", - "symfony/framework-bundle": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/error-handler": "<6.4", + "symfony/framework-bundle": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<6.3" + "symfony/twig-bridge": "<6.4" }, "require-dev": { "doctrine/collections": "^1.0|^2.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/html-sanitizer": "^6.1|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/security-core": "^6.2|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/security-csrf": "^6.4|^7.0", + "symfony/translation": "^6.4.3|^7.0.3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -9713,7 +11297,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.4.24" + "source": "https://github.com/symfony/form/tree/v7.3.3" }, "funding": [ { @@ -9733,112 +11317,117 @@ "type": "tidelift" } ], - "time": "2025-07-24T08:25:04+00:00" + "time": "2025-08-18T13:10:53+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "869b94902dd38f2f33718908f2b5d4868e3b9241" + "reference": "19ec4ab6be90322ed190e041e2404a976ed22571" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/869b94902dd38f2f33718908f2b5d4868e3b9241", - "reference": "869b94902dd38f2f33718908f2b5d4868e3b9241", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/19ec4ab6be90322ed190e041e2404a976ed22571", + "reference": "19ec4ab6be90322ed190e041e2404a976ed22571", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.1", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.4.12|^7.0", + "php": ">=8.2", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^7.3", + "symfony/dependency-injection": "^7.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.1|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4", + "symfony/error-handler": "^7.3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/filesystem": "^7.1", + "symfony/finder": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", + "symfony/http-kernel": "^7.2", "symfony/polyfill-mbstring": "~1.0", "symfony/routing": "^6.4|^7.0" }, "conflict": { - "doctrine/annotations": "<1.13.1", "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/asset": "<5.4", + "symfony/asset": "<6.4", "symfony/asset-mapper": "<6.4", - "symfony/clock": "<6.3", - "symfony/console": "<5.4|>=7.0", + "symfony/clock": "<6.4", + "symfony/console": "<6.4", "symfony/dom-crawler": "<6.4", - "symfony/dotenv": "<5.4", - "symfony/form": "<5.4", - "symfony/http-client": "<6.3", - "symfony/lock": "<5.4", - "symfony/mailer": "<5.4", - "symfony/messenger": "<6.3", + "symfony/dotenv": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/json-streamer": ">=7.4", + "symfony/lock": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", "symfony/mime": "<6.4", - "symfony/property-access": "<5.4", - "symfony/property-info": "<5.4", - "symfony/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6", + "symfony/object-mapper": ">=7.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", - "symfony/security-core": "<5.4", - "symfony/security-csrf": "<5.4", - "symfony/serializer": "<6.4", - "symfony/stopwatch": "<5.4", - "symfony/translation": "<6.4", - "symfony/twig-bridge": "<5.4", - "symfony/twig-bundle": "<5.4", + "symfony/security-core": "<6.4", + "symfony/security-csrf": "<7.2", + "symfony/serializer": "<7.2.5", + "symfony/stopwatch": "<6.4", + "symfony/translation": "<7.3", + "symfony/twig-bridge": "<6.4", + "symfony/twig-bundle": "<6.4", "symfony/validator": "<6.4", "symfony/web-profiler-bundle": "<6.4", - "symfony/workflow": "<6.4" + "symfony/webhook": "<7.2", + "symfony/workflow": "<7.3.0-beta2" }, "require-dev": { - "doctrine/annotations": "^1.13.1|^2", "doctrine/persistence": "^1.3|^2|^3", "dragonmantank/cron-expression": "^3.1", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "seld/jsonlint": "^1.10", - "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/asset": "^6.4|^7.0", "symfony/asset-mapper": "^6.4|^7.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.2|^7.0", - "symfony/console": "^5.4.9|^6.0.9|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", "symfony/dom-crawler": "^6.4|^7.0", - "symfony/dotenv": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/html-sanitizer": "^6.1|^7.0", - "symfony/http-client": "^6.3|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/mailer": "^5.4|^6.0|^7.0", - "symfony/messenger": "^6.3|^7.0", + "symfony/dotenv": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/json-streamer": "7.3.*", + "symfony/lock": "^6.4|^7.0", + "symfony/mailer": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", - "symfony/notifier": "^5.4|^6.0|^7.0", + "symfony/notifier": "^6.4|^7.0", + "symfony/object-mapper": "^v7.3.0-beta2", "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", "symfony/scheduler": "^6.4.4|^7.0.4", - "symfony/security-bundle": "^5.4|^6.0|^7.0", - "symfony/semaphore": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/string": "^5.4|^6.0|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/security-bundle": "^6.4|^7.0", + "symfony/semaphore": "^6.4|^7.0", + "symfony/serializer": "^7.2.5", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", + "symfony/translation": "^7.3", + "symfony/twig-bundle": "^6.4|^7.0", + "symfony/type-info": "^7.1.8", + "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", - "symfony/web-link": "^5.4|^6.0|^7.0", - "symfony/workflow": "^6.4|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/twig": "^2.10|^3.0.4" + "symfony/web-link": "^6.4|^7.0", + "symfony/webhook": "^7.2", + "symfony/workflow": "^7.3", + "symfony/yaml": "^6.4|^7.0", + "twig/twig": "^3.12" }, "type": "symfony-bundle", "autoload": { @@ -9866,7 +11455,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.24" + "source": "https://github.com/symfony/framework-bundle/tree/v7.3.3" }, "funding": [ { @@ -9886,32 +11475,35 @@ "type": "tidelift" } ], - "time": "2025-07-30T07:06:12+00:00" + "time": "2025-08-27T07:45:05+00:00" }, { "name": "symfony/http-client", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "6d78fe8abecd547c159b8a49f7c88610630b7da2" + "reference": "333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/6d78fe8abecd547c159b8a49f7c88610630b7da2", - "reference": "6d78fe8abecd547c159b8a49f7c88610630b7da2", + "url": "https://api.github.com/repos/symfony/http-client/zipball/333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019", + "reference": "333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.3" + "symfony/http-foundation": "<6.4" }, "provide": { "php-http/async-client-implementation": "*", @@ -9920,19 +11512,19 @@ "symfony/http-client-implementation": "3.0" }, "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -9963,7 +11555,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.24" + "source": "https://github.com/symfony/http-client/tree/v7.3.3" }, "funding": [ { @@ -9983,7 +11575,7 @@ "type": "tidelift" } ], - "time": "2025-07-14T16:38:25+00:00" + "time": "2025-08-27T07:45:05+00:00" }, { "name": "symfony/http-client-contracts", @@ -10065,36 +11657,38 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "0341e41d8d8830c31a1dff5cbc5bdb3ec872a073" + "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0341e41d8d8830c31a1dff5cbc5bdb3ec872a073", - "reference": "0341e41d8d8830c31a1dff5cbc5bdb3ec872a073", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7475561ec27020196c49bb7c4f178d33d7d3dc00", + "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, "conflict": { + "doctrine/dbal": "<3.6", "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, "require-dev": { - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.4.12|^7.1.5", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0" + "symfony/clock": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -10122,7 +11716,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.24" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.3" }, "funding": [ { @@ -10142,77 +11736,77 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-20T08:04:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b81dcdbe34b8e8f7b3fc7b2a47fa065d5bf30726" + "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b81dcdbe34b8e8f7b3fc7b2a47fa065d5bf30726", - "reference": "b81dcdbe34b8e8f7b3fc7b2a47fa065d5bf30726", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/72c304de37e1a1cec6d5d12b81187ebd4850a17b", + "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.4", - "symfony/config": "<6.1", - "symfony/console": "<5.4", + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", - "symfony/doctrine-bridge": "<5.4", - "symfony/form": "<5.4", - "symfony/http-client": "<5.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4", - "symfony/translation": "<5.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<5.4", + "symfony/twig-bridge": "<6.4", "symfony/validator": "<6.4", - "symfony/var-dumper": "<6.3", - "twig/twig": "<2.13" + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.2|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4.5|^6.0.5|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.4|^7.0.4", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.4|^7.0", - "symfony/var-exporter": "^6.2|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.12" }, "type": "library", "autoload": { @@ -10240,7 +11834,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.24" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.3" }, "funding": [ { @@ -10260,29 +11854,32 @@ "type": "tidelift" } ], - "time": "2025-07-31T09:23:30+00:00" + "time": "2025-08-29T08:23:45+00:00" }, { "name": "symfony/intl", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "c0938cd29804e65308051a42d1387f0dd57e1eaf" + "reference": "754d5ad02c889e380efc5a74fa3f6cfe56b7454d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/c0938cd29804e65308051a42d1387f0dd57e1eaf", - "reference": "c0938cd29804e65308051a42d1387f0dd57e1eaf", + "url": "https://api.github.com/repos/symfony/intl/zipball/754d5ad02c889e380efc5a74fa3f6cfe56b7454d", + "reference": "754d5ad02c889e380efc5a74fa3f6cfe56b7454d", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/string": "<7.1" }, "require-dev": { - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/filesystem": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -10327,7 +11924,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.4.24" + "source": "https://github.com/symfony/intl/tree/v7.3.3" }, "funding": [ { @@ -10347,43 +11944,43 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-19T14:06:46+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "b4d7fa2c69641109979ed06e98a588d245362062" + "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/b4d7fa2c69641109979ed06e98a588d245362062", - "reference": "b4d7fa2c69641109979ed06e98a588d245362062", + "url": "https://api.github.com/repos/symfony/mailer/zipball/a32f3f45f1990db8c4341d5122a7d3a381c7e575", + "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575", "shasum": "" }, "require": { "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.1", + "php": ">=8.2", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/mime": "^6.2|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^7.2", "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", - "symfony/messenger": "<6.2", - "symfony/mime": "<6.2", - "symfony/twig-bridge": "<6.2.1" + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/messenger": "^6.2|^7.0", - "symfony/twig-bridge": "^6.2|^7.0" + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -10411,7 +12008,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.24" + "source": "https://github.com/symfony/mailer/tree/v7.3.3" }, "funding": [ { @@ -10431,25 +12028,24 @@ "type": "tidelift" } ], - "time": "2025-07-24T08:25:04+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/mime", - "version": "v6.4.24", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "664d5e844a2de5e11c8255d0aef6bc15a9660ac7" + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/664d5e844a2de5e11c8255d0aef6bc15a9660ac7", - "reference": "664d5e844a2de5e11c8255d0aef6bc15a9660ac7", + "url": "https://api.github.com/repos/symfony/mime/zipball/e0a0f859148daf1edf6c60b398eb40bfc96697d1", + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -10457,17 +12053,17 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<5.4", + "symfony/mailer": "<6.4", "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.4|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", @@ -10500,7 +12096,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.24" + "source": "https://github.com/symfony/mime/tree/v7.3.2" }, "funding": [ { @@ -10520,42 +12116,41 @@ "type": "tidelift" } ], - "time": "2025-07-15T12:02:45+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "b0ff45e8d9289062a963deaf8b55e92488322e3f" + "reference": "6f3745e887659b46a8b7bb5ade8356a41700f095" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/b0ff45e8d9289062a963deaf8b55e92488322e3f", - "reference": "b0ff45e8d9289062a963deaf8b55e92488322e3f", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/6f3745e887659b46a8b7bb5ade8356a41700f095", + "reference": "6f3745e887659b46a8b7bb5ade8356a41700f095", "shasum": "" }, "require": { - "monolog/monolog": "^1.25.1|^2|^3", - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^5.4|^6.0|^7.0", + "monolog/monolog": "^3", + "php": ">=8.2", + "symfony/http-kernel": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/console": "<5.4", - "symfony/http-foundation": "<5.4", - "symfony/security-core": "<5.4" + "symfony/console": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/security-core": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/mailer": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/security-core": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/mailer": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "symfony-bridge", "autoload": { @@ -10583,7 +12178,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v6.4.24" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.3" }, "funding": [ { @@ -10603,7 +12198,7 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/monolog-bundle", @@ -10688,20 +12283,20 @@ }, { "name": "symfony/options-resolver", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "baee5736ddf7a0486dd68ca05aa4fd7e64458d3d" + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/baee5736ddf7a0486dd68ca05aa4fd7e64458d3d", - "reference": "baee5736ddf7a0486dd68ca05aa4fd7e64458d3d", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d", + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", @@ -10735,7 +12330,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.4.24" + "source": "https://github.com/symfony/options-resolver/tree/v7.3.3" }, "funding": [ { @@ -10755,31 +12350,31 @@ "type": "tidelift" } ], - "time": "2025-07-14T16:38:25+00:00" + "time": "2025-08-05T10:16:07+00:00" }, { "name": "symfony/password-hasher", - "version": "v6.4.24", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557" + "reference": "31fbe66af859582a20b803f38be96be8accdf2c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/dcab5ac87450aaed26483ba49c2ce86808da7557", - "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/31fbe66af859582a20b803f38be96be8accdf2c3", + "reference": "31fbe66af859582a20b803f38be96be8accdf2c3", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "conflict": { - "symfony/security-core": "<5.4" + "symfony/security-core": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/security-core": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -10811,7 +12406,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.4.24" + "source": "https://github.com/symfony/password-hasher/tree/v7.3.0" }, "funding": [ { @@ -10822,20 +12417,16 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-02-04T08:22:58+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -10894,7 +12485,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -10905,6 +12496,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -10914,16 +12509,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { @@ -10972,7 +12567,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -10983,25 +12578,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "763d2a91fea5681509ca01acbc1c5e450d127811" + "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/763d2a91fea5681509ca01acbc1c5e450d127811", - "reference": "763d2a91fea5681509ca01acbc1c5e450d127811", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", + "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", "shasum": "" }, "require": { @@ -11056,7 +12655,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0" }, "funding": [ { @@ -11067,16 +12666,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-21T18:38:29+00:00" + "time": "2025-06-20T22:24:30+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", @@ -11139,7 +12742,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" }, "funding": [ { @@ -11150,6 +12753,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -11159,7 +12766,7 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -11220,7 +12827,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -11231,6 +12838,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -11240,7 +12851,7 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", @@ -11301,7 +12912,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -11312,6 +12923,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -11319,9 +12934,93 @@ ], "time": "2024-12-23T08:48:59+00:00" }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, { "name": "symfony/polyfill-php82", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php82.git", @@ -11377,7 +13076,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php82/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php82/tree/v1.33.0" }, "funding": [ { @@ -11388,6 +13087,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -11397,16 +13100,16 @@ }, { "name": "symfony/polyfill-php83", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { @@ -11453,7 +13156,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" }, "funding": [ { @@ -11464,25 +13167,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-07-08T02:45:35+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "000df7860439609837bbe28670b0be15783b7fbf" + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf", - "reference": "000df7860439609837bbe28670b0be15783b7fbf", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", "shasum": "" }, "require": { @@ -11529,7 +13236,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" }, "funding": [ { @@ -11540,16 +13247,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-20T12:04:08+00:00" + "time": "2025-06-24T13:30:11+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", @@ -11608,7 +13319,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" }, "funding": [ { @@ -11619,6 +13330,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -11628,20 +13343,20 @@ }, { "name": "symfony/process", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8eb6dc555bfb49b2703438d5de65cc9f138ff50b" + "reference": "32241012d521e2e8a9d713adb0812bb773b907f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8eb6dc555bfb49b2703438d5de65cc9f138ff50b", - "reference": "8eb6dc555bfb49b2703438d5de65cc9f138ff50b", + "url": "https://api.github.com/repos/symfony/process/zipball/32241012d521e2e8a9d713adb0812bb773b907f1", + "reference": "32241012d521e2e8a9d713adb0812bb773b907f1", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -11669,7 +13384,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.24" + "source": "https://github.com/symfony/process/tree/v7.3.3" }, "funding": [ { @@ -11689,29 +13404,28 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-18T09:42:54+00:00" }, { "name": "symfony/property-access", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "a33acdae7c76f837c1db5465cc3445adf3ace94a" + "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/a33acdae7c76f837c1db5465cc3445adf3ace94a", - "reference": "a33acdae7c76f837c1db5465cc3445adf3ace94a", + "url": "https://api.github.com/repos/symfony/property-access/zipball/4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7", + "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/property-info": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/property-info": "^6.4|^7.0" }, "require-dev": { - "symfony/cache": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -11750,7 +13464,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.4.24" + "source": "https://github.com/symfony/property-access/tree/v7.3.3" }, "funding": [ { @@ -11770,41 +13484,41 @@ "type": "tidelift" } ], - "time": "2025-07-15T12:03:16+00:00" + "time": "2025-08-04T15:15:28+00:00" }, { "name": "symfony/property-info", - "version": "v6.4.24", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "1056ae3621eeddd78d7c5ec074f1c1784324eec6" + "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/1056ae3621eeddd78d7c5ec074f1c1784324eec6", - "reference": "1056ae3621eeddd78d7c5ec074f1c1784324eec6", + "url": "https://api.github.com/repos/symfony/property-info/zipball/90586acbf2a6dd13bee4f09f09111c8bd4773970", + "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/string": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0", + "symfony/type-info": "~7.2.8|^7.3.1" }, "conflict": { - "doctrine/annotations": "<1.12", "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/cache": "<5.4", - "symfony/dependency-injection": "<5.4|>=6.0,<6.4", - "symfony/serializer": "<5.4" + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/serializer": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "phpdocumentor/reflection-docblock": "^5.2", "phpstan/phpdoc-parser": "^1.0|^2.0", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/serializer": "^5.4|^6.4|^7.0" + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -11840,7 +13554,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.24" + "source": "https://github.com/symfony/property-info/tree/v7.3.1" }, "funding": [ { @@ -11851,49 +13565,45 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-14T16:38:25+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v6.4.24", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "6954b4e8aef0e5d46f8558c90edcf27bb01b4724" + "reference": "03f2f72319e7acaf2a9f6fcbe30ef17eec51594f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/6954b4e8aef0e5d46f8558c90edcf27bb01b4724", - "reference": "6954b4e8aef0e5d46f8558c90edcf27bb01b4724", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/03f2f72319e7acaf2a9f6fcbe30ef17eec51594f", + "reference": "03f2f72319e7acaf2a9f6fcbe30ef17eec51594f", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/http-message": "^1.0|^2.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0" + "symfony/http-foundation": "^6.4|^7.0" }, "conflict": { "php-http/discovery": "<1.15", - "symfony/http-kernel": "<6.2" + "symfony/http-kernel": "<6.4" }, "require-dev": { "nyholm/psr7": "^1.1", "php-http/discovery": "^1.15", "psr/log": "^1.1.4|^2|^3", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^6.2|^7.0", - "symfony/http-kernel": "^6.2|^7.0" + "symfony/browser-kit": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" }, "type": "symfony-bridge", "autoload": { @@ -11927,7 +13637,7 @@ "psr-7" ], "support": { - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.24" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.3.0" }, "funding": [ { @@ -11938,39 +13648,34 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2024-09-26T08:57:56+00:00" }, { "name": "symfony/rate-limiter", - "version": "v6.4.24", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "15a9a10fd0f060243c88ce98d5c29e9cc4b886e7" + "reference": "7e855541d302ba752f86fb0e97932e7969fe9c04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/15a9a10fd0f060243c88ce98d5c29e9cc4b886e7", - "reference": "15a9a10fd0f060243c88ce98d5c29e9cc4b886e7", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/7e855541d302ba752f86fb0e97932e7969fe9c04", + "reference": "7e855541d302ba752f86fb0e97932e7969fe9c04", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/options-resolver": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/options-resolver": "^7.3" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/lock": "^5.4|^6.0|^7.0" + "symfony/lock": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -12002,7 +13707,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v6.4.24" + "source": "https://github.com/symfony/rate-limiter/tree/v7.3.2" }, "funding": [ { @@ -12022,40 +13727,38 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-07-07T08:17:57+00:00" }, { "name": "symfony/routing", - "version": "v6.4.24", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e4f94e625c8e6f910aa004a0042f7b2d398278f5" + "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e4f94e625c8e6f910aa004a0042f7b2d398278f5", - "reference": "e4f94e625c8e6f910aa004a0042f7b2d398278f5", + "url": "https://api.github.com/repos/symfony/routing/zipball/7614b8ca5fa89b9cd233e21b627bfc5774f586e4", + "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { - "doctrine/annotations": "<1.12", - "symfony/config": "<6.2", - "symfony/dependency-injection": "<5.4", - "symfony/yaml": "<5.4" + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^6.2|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -12089,7 +13792,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.24" + "source": "https://github.com/symfony/routing/tree/v7.3.2" }, "funding": [ { @@ -12109,35 +13812,35 @@ "type": "tidelift" } ], - "time": "2025-07-15T08:46:37+00:00" + "time": "2025-07-15T11:36:08+00:00" }, { "name": "symfony/runtime", - "version": "v6.4.24", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "c1cc6721646f546627236c57f835272806087337" + "reference": "9516056d432f8acdac9458eb41b80097da7a05c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/c1cc6721646f546627236c57f835272806087337", - "reference": "c1cc6721646f546627236c57f835272806087337", + "url": "https://api.github.com/repos/symfony/runtime/zipball/9516056d432f8acdac9458eb41b80097da7a05c9", + "reference": "9516056d432f8acdac9458eb41b80097da7a05c9", "shasum": "" }, "require": { "composer-plugin-api": "^1.0|^2.0", - "php": ">=8.1" + "php": ">=8.2" }, "conflict": { - "symfony/dotenv": "<5.4" + "symfony/dotenv": "<6.4" }, "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "symfony/console": "^5.4.9|^6.0.9|^7.0", - "symfony/dotenv": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0" + "composer/composer": "^2.6", + "symfony/console": "^6.4|^7.0", + "symfony/dotenv": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" }, "type": "composer-plugin", "extra": { @@ -12172,7 +13875,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v6.4.24" + "source": "https://github.com/symfony/runtime/tree/v7.3.1" }, "funding": [ { @@ -12183,84 +13886,74 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-06-13T07:48:40+00:00" }, { "name": "symfony/security-bundle", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "3b1b64ab12e74d76fedddd1df1fa68bd014d3efb" + "reference": "fbecca9a10af8d886e116f74e860e19b7583689c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/3b1b64ab12e74d76fedddd1df1fa68bd014d3efb", - "reference": "3b1b64ab12e74d76fedddd1df1fa68bd014d3efb", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/fbecca9a10af8d886e116f74e860e19b7583689c", + "reference": "fbecca9a10af8d886e116f74e860e19b7583689c", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.1", - "symfony/clock": "^6.3|^7.0", - "symfony/config": "^6.1|^7.0", + "php": ">=8.2", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4.11|^7.1.4", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.2|^7.0", - "symfony/http-kernel": "^6.2", - "symfony/password-hasher": "^5.4|^6.0|^7.0", - "symfony/security-core": "^6.2|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/security-http": "^6.3.6|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/password-hasher": "^6.4|^7.0", + "symfony/security-core": "^7.3", + "symfony/security-csrf": "^6.4|^7.0", + "symfony/security-http": "^7.3", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/console": "<5.4", + "symfony/browser-kit": "<6.4", + "symfony/console": "<6.4", "symfony/framework-bundle": "<6.4", - "symfony/http-client": "<5.4", - "symfony/ldap": "<5.4", + "symfony/http-client": "<6.4", + "symfony/ldap": "<6.4", "symfony/serializer": "<6.4", - "symfony/twig-bundle": "<5.4", + "symfony/twig-bundle": "<6.4", "symfony/validator": "<6.4" }, "require-dev": { - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", + "symfony/asset": "^6.4|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/ldap": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/ldap": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", "symfony/serializer": "^6.4|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/twig-bridge": "^5.4|^6.0|^7.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0", + "symfony/twig-bundle": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4", - "web-token/jwt-checker": "^3.1", - "web-token/jwt-signature-algorithm-ecdsa": "^3.1", - "web-token/jwt-signature-algorithm-eddsa": "^3.1", - "web-token/jwt-signature-algorithm-hmac": "^3.1", - "web-token/jwt-signature-algorithm-none": "^3.1", - "web-token/jwt-signature-algorithm-rsa": "^3.1" + "symfony/yaml": "^6.4|^7.0", + "twig/twig": "^3.12", + "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "symfony-bundle", "autoload": { @@ -12288,7 +13981,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v6.4.24" + "source": "https://github.com/symfony/security-bundle/tree/v7.3.3" }, "funding": [ { @@ -12308,48 +14001,49 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-06T08:34:58+00:00" }, { "name": "symfony/security-core", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "8ff659ffd3b823f0b3969b6c7a602b80b6ec2e53" + "reference": "4465a3b9cefbaebaeeeb98c2becfdb4b59d22488" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/8ff659ffd3b823f0b3969b6c7a602b80b6ec2e53", - "reference": "8ff659ffd3b823f0b3969b6c7a602b80b6ec2e53", + "url": "https://api.github.com/repos/symfony/security-core/zipball/4465a3b9cefbaebaeeeb98c2becfdb4b59d22488", + "reference": "4465a3b9cefbaebaeeeb98c2becfdb4b59d22488", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher-contracts": "^2.5|^3", - "symfony/password-hasher": "^5.4|^6.0|^7.0", + "symfony/password-hasher": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/event-dispatcher": "<5.4", - "symfony/http-foundation": "<5.4", - "symfony/ldap": "<5.4", - "symfony/security-guard": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", - "symfony/validator": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/ldap": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/validator": "<6.4" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "psr/container": "^1.1|^2.0", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/ldap": "^5.4|^6.0|^7.0", - "symfony/string": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/ldap": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", + "symfony/translation": "^6.4.3|^7.0.3", "symfony/validator": "^6.4|^7.0" }, "type": "library", @@ -12378,7 +14072,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.4.24" + "source": "https://github.com/symfony/security-core/tree/v7.3.3" }, "funding": [ { @@ -12398,31 +14092,33 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/security-csrf", - "version": "v6.4.24", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "9a1efc8c10b86bcedc9233affd10c716b54ca1b7" + "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/9a1efc8c10b86bcedc9233affd10c716b54ca1b7", - "reference": "9a1efc8c10b86bcedc9233affd10c716b54ca1b7", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/2b4b0c46c901729e4e90719eacd980381f53e0a3", + "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/security-core": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/security-core": "^6.4|^7.0" }, "conflict": { - "symfony/http-foundation": "<5.4" + "symfony/http-foundation": "<6.4" }, "require-dev": { - "symfony/http-foundation": "^5.4|^6.0|^7.0" + "psr/log": "^1|^2|^3", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -12450,7 +14146,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v6.4.24" + "source": "https://github.com/symfony/security-csrf/tree/v7.3.0" }, "funding": [ { @@ -12461,60 +14157,56 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-01-02T18:42:10+00:00" }, { "name": "symfony/security-http", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "bd6ce061b70071afea0a4805903b6ed3f6f64e07" + "reference": "1bf0dc10f27d4776c47f18f98236c619793a9260" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/bd6ce061b70071afea0a4805903b6ed3f6f64e07", - "reference": "bd6ce061b70071afea0a4805903b6ed3f6f64e07", + "url": "https://api.github.com/repos/symfony/security-http/zipball/1bf0dc10f27d4776c47f18f98236c619793a9260", + "reference": "1bf0dc10f27d4776c47f18f98236c619793a9260", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-foundation": "^6.2|^7.0", - "symfony/http-kernel": "^6.3|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/security-core": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/security-core": "^7.3", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/clock": "<6.3", - "symfony/event-dispatcher": "<5.4.9|>=6,<6.0.9", + "symfony/clock": "<6.4", + "symfony/event-dispatcher": "<6.4", "symfony/http-client-contracts": "<3.0", - "symfony/security-bundle": "<5.4", - "symfony/security-csrf": "<5.4" + "symfony/security-bundle": "<6.4", + "symfony/security-csrf": "<6.4" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.3|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/cache": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", "symfony/http-client-contracts": "^3.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "web-token/jwt-checker": "^3.1", - "web-token/jwt-signature-algorithm-ecdsa": "^3.1" + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/security-csrf": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "library", "autoload": { @@ -12542,7 +14234,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.4.24" + "source": "https://github.com/symfony/security-http/tree/v7.3.3" }, "funding": [ { @@ -12562,61 +14254,62 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/serializer", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "c01c719c8a837173dc100f2bd141a6271ea68a1d" + "reference": "5608b04d8daaf29432d76ecc618b0fac169c2dfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/c01c719c8a837173dc100f2bd141a6271ea68a1d", - "reference": "c01c719c8a837173dc100f2bd141a6271ea68a1d", + "url": "https://api.github.com/repos/symfony/serializer/zipball/5608b04d8daaf29432d76ecc618b0fac169c2dfb", + "reference": "5608b04d8daaf29432d76ecc618b0fac169c2dfb", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php84": "^1.30" }, "conflict": { - "doctrine/annotations": "<1.12", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<5.4", - "symfony/property-access": "<5.4", - "symfony/property-info": "<5.4.24|>=6,<6.2.11", - "symfony/uid": "<5.4", + "symfony/dependency-injection": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/uid": "<6.4", "symfony/validator": "<6.4", - "symfony/yaml": "<5.4" + "symfony/yaml": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", "seld/jsonlint": "^1.10", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4.26|^6.3|^7.0", - "symfony/property-info": "^5.4.24|^6.2.11|^7.0", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^7.2", + "symfony/error-handler": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/type-info": "^7.1.8", + "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -12644,7 +14337,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v6.4.24" + "source": "https://github.com/symfony/serializer/tree/v7.3.3" }, "funding": [ { @@ -12664,7 +14357,7 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-27T11:34:33+00:00" }, { "name": "symfony/service-contracts", @@ -12751,16 +14444,16 @@ }, { "name": "symfony/stimulus-bundle", - "version": "v2.29.1", + "version": "v2.30.0", "source": { "type": "git", "url": "https://github.com/symfony/stimulus-bundle.git", - "reference": "fedf396824a29f9c3bcf475b148aaf2db79521c9" + "reference": "668b9efe9d0ab8b4e50091263171609e0459c0c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/fedf396824a29f9c3bcf475b148aaf2db79521c9", - "reference": "fedf396824a29f9c3bcf475b148aaf2db79521c9", + "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/668b9efe9d0ab8b4e50091263171609e0459c0c8", + "reference": "668b9efe9d0ab8b4e50091263171609e0459c0c8", "shasum": "" }, "require": { @@ -12800,7 +14493,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/stimulus-bundle/tree/v2.29.1" + "source": "https://github.com/symfony/stimulus-bundle/tree/v2.30.0" }, "funding": [ { @@ -12820,24 +14513,24 @@ "type": "tidelift" } ], - "time": "2025-08-08T11:38:41+00:00" + "time": "2025-08-27T15:25:48+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.4.24", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898" + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b67e94e06a05d9572c2fa354483b3e13e3cb1898", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/service-contracts": "^2.5|^3" }, "type": "library", @@ -12866,7 +14559,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.24" + "source": "https://github.com/symfony/stopwatch/tree/v7.3.0" }, "funding": [ { @@ -12877,33 +14570,29 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-02-24T10:49:57+00:00" }, { "name": "symfony/string", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f0ce0bd36a3accb4a225435be077b4b4875587f4" + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f0ce0bd36a3accb4a225435be077b4b4875587f4", - "reference": "f0ce0bd36a3accb4a225435be077b4b4875587f4", + "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", @@ -12913,11 +14602,12 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/var-exporter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -12956,7 +14646,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.24" + "source": "https://github.com/symfony/string/tree/v7.3.3" }, "funding": [ { @@ -12976,55 +14666,56 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/translation", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "300b72643e89de0734d99a9e3f8494a3ef6936e1" + "reference": "e0837b4cbcef63c754d89a4806575cada743a38d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/300b72643e89de0734d99a9e3f8494a3ef6936e1", - "reference": "300b72643e89de0734d99a9e3f8494a3ef6936e1", + "url": "https://api.github.com/repos/symfony/translation/zipball/e0837b4cbcef63c754d89a4806575cada743a38d", + "reference": "e0837b4cbcef63c754d89a4806575cada743a38d", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { - "symfony/config": "<5.4", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", + "symfony/http-kernel": "<6.4", "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<5.4", - "symfony/yaml": "<5.4" + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" }, "provide": { "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/routing": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -13055,7 +14746,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.24" + "source": "https://github.com/symfony/translation/tree/v7.3.3" }, "funding": [ { @@ -13075,7 +14766,7 @@ "type": "tidelift" } ], - "time": "2025-07-30T17:30:48+00:00" + "time": "2025-08-01T21:02:37+00:00" }, { "name": "symfony/translation-contracts", @@ -13157,68 +14848,70 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "af9ef04e348f93410c83d04d2806103689a3d924" + "reference": "33558f013b7f6ed72805527c8405cae0062e47c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/af9ef04e348f93410c83d04d2806103689a3d924", - "reference": "af9ef04e348f93410c83d04d2806103689a3d924", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/33558f013b7f6ed72805527c8405cae0062e47c5", + "reference": "33558f013b7f6ed72805527c8405cae0062e47c5", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^2.13|^3.0.4" + "twig/twig": "^3.21" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/console": "<5.4", - "symfony/form": "<6.3", - "symfony/http-foundation": "<5.4", + "symfony/console": "<6.4", + "symfony/form": "<6.4", + "symfony/http-foundation": "<6.4", "symfony/http-kernel": "<6.4", - "symfony/mime": "<6.2", + "symfony/mime": "<6.4", "symfony/serializer": "<6.4", - "symfony/translation": "<5.4", - "symfony/workflow": "<5.4" + "symfony/translation": "<6.4", + "symfony/workflow": "<6.4" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/asset-mapper": "^6.3|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/asset": "^6.4|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/emoji": "^7.1", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", "symfony/form": "^6.4.20|^7.2.5", - "symfony/html-sanitizer": "^6.1|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/mime": "^6.2|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^5.4|^6.0|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/security-http": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/security-csrf": "^6.4|^7.0", + "symfony/security-http": "^6.4|^7.0", "symfony/serializer": "^6.4.3|^7.0.3", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^6.1|^7.0", - "symfony/web-link": "^5.4|^6.0|^7.0", - "symfony/workflow": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/cssinliner-extra": "^2.12|^3", - "twig/inky-extra": "^2.12|^3", - "twig/markdown-extra": "^2.12|^3" + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/cssinliner-extra": "^3", + "twig/inky-extra": "^3", + "twig/markdown-extra": "^3" }, "type": "symfony-bridge", "autoload": { @@ -13246,7 +14939,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.24" + "source": "https://github.com/symfony/twig-bridge/tree/v7.3.3" }, "funding": [ { @@ -13266,47 +14959,47 @@ "type": "tidelift" } ], - "time": "2025-07-26T12:47:35+00:00" + "time": "2025-08-18T13:10:53+00:00" }, { "name": "symfony/twig-bundle", - "version": "v6.4.24", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "3b48b6e8225495c6d2438828982b4d219ca565ba" + "reference": "5d85220df4d8d79e6a9ca57eea6f70004de39657" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/3b48b6e8225495c6d2438828982b4d219ca565ba", - "reference": "3b48b6e8225495c6d2438828982b4d219ca565ba", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/5d85220df4d8d79e6a9ca57eea6f70004de39657", + "reference": "5d85220df4d8d79e6a9ca57eea6f70004de39657", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", - "php": ">=8.1", - "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.1|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^6.2", - "symfony/twig-bridge": "^6.4", - "twig/twig": "^2.13|^3.0.4" + "php": ">=8.2", + "symfony/config": "^7.3", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/twig-bridge": "^7.3", + "twig/twig": "^3.12" }, "conflict": { - "symfony/framework-bundle": "<5.4", - "symfony/translation": "<5.4" + "symfony/framework-bundle": "<6.4", + "symfony/translation": "<6.4" }, "require-dev": { - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^5.4|^6.0|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/web-link": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/asset": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "type": "symfony-bundle", "autoload": { @@ -13334,7 +15027,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v6.4.24" + "source": "https://github.com/symfony/twig-bundle/tree/v7.3.2" }, "funding": [ { @@ -13354,28 +15047,111 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-07-10T08:47:49+00:00" }, { - "name": "symfony/uid", - "version": "v6.4.24", + "name": "symfony/type-info", + "version": "v7.3.3", "source": { "type": "git", - "url": "https://github.com/symfony/uid.git", - "reference": "17da16a750541a42cf2183935e0f6008316c23f7" + "url": "https://github.com/symfony/type-info.git", + "reference": "aa64b58ed04517d4d730202dd035895743c23273" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/17da16a750541a42cf2183935e0f6008316c23f7", - "reference": "17da16a750541a42cf2183935e0f6008316c23f7", + "url": "https://api.github.com/repos/symfony/type-info/zipball/aa64b58ed04517d4d730202dd035895743c23273", + "reference": "aa64b58ed04517d4d730202dd035895743c23273", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.30" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.30|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-28T09:38:04+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/a69f69f3159b852651a6bf45a9fdd149520525bb", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb", + "shasum": "" + }, + "require": { + "php": ">=8.2", "symfony/polyfill-uuid": "^1.15" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -13412,7 +15188,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.24" + "source": "https://github.com/symfony/uid/tree/v7.3.1" }, "funding": [ { @@ -13423,29 +15199,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/ux-translator", - "version": "v2.29.1", + "version": "v2.30.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-translator.git", - "reference": "36d90e2035df3e98a6d1b006b3d106a0f9400be5" + "reference": "9616091db206df4caa7d8dce2e48941512b1a94a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-translator/zipball/36d90e2035df3e98a6d1b006b3d106a0f9400be5", - "reference": "36d90e2035df3e98a6d1b006b3d106a0f9400be5", + "url": "https://api.github.com/repos/symfony/ux-translator/zipball/9616091db206df4caa7d8dce2e48941512b1a94a", + "reference": "9616091db206df4caa7d8dce2e48941512b1a94a", "shasum": "" }, "require": { @@ -13493,7 +15265,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-translator/tree/v2.29.1" + "source": "https://github.com/symfony/ux-translator/tree/v2.30.0" }, "funding": [ { @@ -13513,20 +15285,20 @@ "type": "tidelift" } ], - "time": "2025-08-08T11:38:41+00:00" + "time": "2025-08-27T15:25:48+00:00" }, { "name": "symfony/ux-turbo", - "version": "v2.29.1", + "version": "v2.30.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-turbo.git", - "reference": "b1a4aa38fbe08434944b8e4d7ea4eca52d5db361" + "reference": "c5e88c7e16713e84a2a35f36276ccdb05c2c78d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/b1a4aa38fbe08434944b8e4d7ea4eca52d5db361", - "reference": "b1a4aa38fbe08434944b8e4d7ea4eca52d5db361", + "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/c5e88c7e16713e84a2a35f36276ccdb05c2c78d8", + "reference": "c5e88c7e16713e84a2a35f36276ccdb05c2c78d8", "shasum": "" }, "require": { @@ -13596,7 +15368,7 @@ "turbo-stream" ], "support": { - "source": "https://github.com/symfony/ux-turbo/tree/v2.29.1" + "source": "https://github.com/symfony/ux-turbo/tree/v2.30.0" }, "funding": [ { @@ -13616,24 +15388,24 @@ "type": "tidelift" } ], - "time": "2025-08-08T11:38:41+00:00" + "time": "2025-08-27T15:25:48+00:00" }, { "name": "symfony/validator", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "297a24dccf13cc09f1d03207b20807f528f088cc" + "reference": "a2f26d7c122393db75a2d41435ad8251250f8bc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/297a24dccf13cc09f1d03207b20807f528f088cc", - "reference": "297a24dccf13cc09f1d03207b20807f528f088cc", + "url": "https://api.github.com/repos/symfony/validator/zipball/a2f26d7c122393db75a2d41435ad8251250f8bc6", + "reference": "a2f26d7c122393db75a2d41435ad8251250f8bc6", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", @@ -13641,34 +15413,35 @@ "symfony/translation-contracts": "^2.5|^3" }, "conflict": { - "doctrine/annotations": "<1.13", "doctrine/lexer": "<1.1", - "symfony/dependency-injection": "<5.4", - "symfony/expression-language": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/intl": "<5.4", - "symfony/property-info": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", - "symfony/yaml": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<7.0", + "symfony/expression-language": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/intl": "<6.4", + "symfony/property-info": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/yaml": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.13|^2", "egulias/email-validator": "^2.1.10|^3|^4", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", + "symfony/translation": "^6.4.3|^7.0.3", + "symfony/type-info": "^7.1.8", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -13697,7 +15470,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.24" + "source": "https://github.com/symfony/validator/tree/v7.3.3" }, "funding": [ { @@ -13717,37 +15490,36 @@ "type": "tidelift" } ], - "time": "2025-07-29T18:08:45+00:00" + "time": "2025-08-27T11:34:33+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "aa29484ce0544bd69fa9f0df902e5ed7b7fe5034" + "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/aa29484ce0544bd69fa9f0df902e5ed7b7fe5034", - "reference": "aa29484ce0544bd69fa9f0df902e5ed7b7fe5034", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", + "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -13785,7 +15557,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.24" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.3" }, "funding": [ { @@ -13805,30 +15577,30 @@ "type": "tidelift" } ], - "time": "2025-07-29T18:40:01+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "1e742d559fe5b19d0cdc281b1bf0b1fcc243bd35" + "reference": "d4dfcd2a822cbedd7612eb6fbd260e46f87b7137" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1e742d559fe5b19d0cdc281b1bf0b1fcc243bd35", - "reference": "1e742d559fe5b19d0cdc281b1bf0b1fcc243bd35", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/d4dfcd2a822cbedd7612eb6fbd260e46f87b7137", + "reference": "d4dfcd2a822cbedd7612eb6fbd260e46f87b7137", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { "symfony/property-access": "^6.4|^7.0", "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -13866,7 +15638,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.24" + "source": "https://github.com/symfony/var-exporter/tree/v7.3.3" }, "funding": [ { @@ -13886,34 +15658,34 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-18T13:10:53+00:00" }, { "name": "symfony/web-link", - "version": "v6.4.24", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/web-link.git", - "reference": "75ffbb304f26a716969863328c8c6a11eadcfa5a" + "reference": "7697f74fce67555665339423ce453cc8216a98ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-link/zipball/75ffbb304f26a716969863328c8c6a11eadcfa5a", - "reference": "75ffbb304f26a716969863328c8c6a11eadcfa5a", + "url": "https://api.github.com/repos/symfony/web-link/zipball/7697f74fce67555665339423ce453cc8216a98ff", + "reference": "7697f74fce67555665339423ce453cc8216a98ff", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/link": "^1.1|^2.0" }, "conflict": { - "symfony/http-kernel": "<5.4" + "symfony/http-kernel": "<6.4" }, "provide": { "psr/link-implementation": "1.0|2.0" }, "require-dev": { - "symfony/http-kernel": "^5.4|^6.0|^7.0" + "symfony/http-kernel": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -13953,7 +15725,7 @@ "push" ], "support": { - "source": "https://github.com/symfony/web-link/tree/v6.4.24" + "source": "https://github.com/symfony/web-link/tree/v7.3.0" }, "funding": [ { @@ -13964,16 +15736,12 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-05-19T13:28:18+00:00" }, { "name": "symfony/webpack-encore-bundle", @@ -14053,28 +15821,28 @@ }, { "name": "symfony/yaml", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "742a8efc94027624b36b10ba58e23d402f961f51" + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/742a8efc94027624b36b10ba58e23d402f961f51", - "reference": "742a8efc94027624b36b10ba58e23d402f961f51", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d", + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -14105,7 +15873,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.24" + "source": "https://github.com/symfony/yaml/tree/v7.3.3" }, "funding": [ { @@ -14125,7 +15893,68 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-27T11:34:33+00:00" + }, + { + "name": "symplify/easy-coding-standard", + "version": "12.5.24", + "source": { + "type": "git", + "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", + "reference": "4b90f2b6efed9508000968eac2397ac7aff34354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/4b90f2b6efed9508000968eac2397ac7aff34354", + "reference": "4b90f2b6efed9508000968eac2397ac7aff34354", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "conflict": { + "friendsofphp/php-cs-fixer": "<3.46", + "phpcsstandards/php_codesniffer": "<3.8", + "symplify/coding-standard": "<12.1" + }, + "suggest": { + "ext-dom": "Needed to support checkstyle output format in class CheckstyleOutputFormatter" + }, + "bin": [ + "bin/ecs" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Use Coding Standard with 0-knowledge of PHP-CS-Fixer and PHP_CodeSniffer", + "keywords": [ + "Code style", + "automation", + "fixer", + "static analysis" + ], + "support": { + "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.24" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2025-08-21T06:57:14+00:00" }, { "name": "tecnickcom/tc-lib-barcode", @@ -14979,16 +16808,16 @@ }, { "name": "web-auth/cose-lib", - "version": "4.4.1", + "version": "4.4.2", "source": { "type": "git", "url": "https://github.com/web-auth/cose-lib.git", - "reference": "b095f160a8c8fa7e53d0e36307093e34c26e7787" + "reference": "a93b61c48fb587855f64a9ec11ad7b60e867cb15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/web-auth/cose-lib/zipball/b095f160a8c8fa7e53d0e36307093e34c26e7787", - "reference": "b095f160a8c8fa7e53d0e36307093e34c26e7787", + "url": "https://api.github.com/repos/web-auth/cose-lib/zipball/a93b61c48fb587855f64a9ec11ad7b60e867cb15", + "reference": "a93b61c48fb587855f64a9ec11ad7b60e867cb15", "shasum": "" }, "require": { @@ -15045,7 +16874,7 @@ ], "support": { "issues": "https://github.com/web-auth/cose-lib/issues", - "source": "https://github.com/web-auth/cose-lib/tree/4.4.1" + "source": "https://github.com/web-auth/cose-lib/tree/4.4.2" }, "funding": [ { @@ -15057,48 +16886,44 @@ "type": "patreon" } ], - "time": "2025-06-13T11:35:45+00:00" + "time": "2025-08-14T20:33:29+00:00" }, { "name": "web-auth/webauthn-lib", - "version": "4.9.2", + "version": "5.2.2", "source": { "type": "git", "url": "https://github.com/web-auth/webauthn-lib.git", - "reference": "008b25171c27cf4813420d0de31cc059bcc71f1a" + "reference": "8937c397c8ae91b5af422ca8aa915c756062da74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/web-auth/webauthn-lib/zipball/008b25171c27cf4813420d0de31cc059bcc71f1a", - "reference": "008b25171c27cf4813420d0de31cc059bcc71f1a", + "url": "https://api.github.com/repos/web-auth/webauthn-lib/zipball/8937c397c8ae91b5af422ca8aa915c756062da74", + "reference": "8937c397c8ae91b5af422ca8aa915c756062da74", "shasum": "" }, "require": { "ext-json": "*", - "ext-mbstring": "*", "ext-openssl": "*", - "lcobucci/clock": "^2.2|^3.0", "paragonie/constant_time_encoding": "^2.6|^3.0", - "php": ">=8.1", + "php": ">=8.2", + "phpdocumentor/reflection-docblock": "^5.3", "psr/clock": "^1.0", "psr/event-dispatcher": "^1.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", "psr/log": "^1.0|^2.0|^3.0", "spomky-labs/cbor-php": "^3.0", "spomky-labs/pki-framework": "^1.0", + "symfony/clock": "^6.4|^7.0", "symfony/deprecation-contracts": "^3.2", - "symfony/uid": "^6.1|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", "web-auth/cose-lib": "^4.2.3" }, "suggest": { - "phpdocumentor/reflection-docblock": "As of 4.5.x, the phpdocumentor/reflection-docblock component will become mandatory for converting objects such as the Metadata Statement", - "psr/clock-implementation": "As of 4.5.x, the PSR Clock implementation will replace lcobucci/clock", "psr/log-implementation": "Recommended to receive logs from the library", "symfony/event-dispatcher": "Recommended to use dispatched events", - "symfony/property-access": "As of 4.5.x, the symfony/serializer component will become mandatory for converting objects such as the Metadata Statement", - "symfony/property-info": "As of 4.5.x, the symfony/serializer component will become mandatory for converting objects such as the Metadata Statement", - "symfony/serializer": "As of 4.5.x, the symfony/serializer component will become mandatory for converting objects such as the Metadata Statement", "web-token/jwt-library": "Mandatory for fetching Metadata Statement from distant sources" }, "type": "library", @@ -15135,7 +16960,7 @@ "webauthn" ], "support": { - "source": "https://github.com/web-auth/webauthn-lib/tree/4.9.2" + "source": "https://github.com/web-auth/webauthn-lib/tree/5.2.2" }, "funding": [ { @@ -15147,41 +16972,38 @@ "type": "patreon" } ], - "time": "2025-01-04T09:47:58+00:00" + "time": "2025-03-16T14:38:43+00:00" }, { "name": "web-auth/webauthn-symfony-bundle", - "version": "4.9.2", + "version": "5.2.2", "source": { "type": "git", "url": "https://github.com/web-auth/webauthn-symfony-bundle.git", - "reference": "80aa16fa6f16ab8f017a4108ffcd2ecc12264c07" + "reference": "aebb0315b43728a92973cc3d4d471cbe414baa54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/web-auth/webauthn-symfony-bundle/zipball/80aa16fa6f16ab8f017a4108ffcd2ecc12264c07", - "reference": "80aa16fa6f16ab8f017a4108ffcd2ecc12264c07", + "url": "https://api.github.com/repos/web-auth/webauthn-symfony-bundle/zipball/aebb0315b43728a92973cc3d4d471cbe414baa54", + "reference": "aebb0315b43728a92973cc3d4d471cbe414baa54", "shasum": "" }, "require": { - "nyholm/psr7": "^1.5", - "php": ">=8.1", - "phpdocumentor/reflection-docblock": "^5.3", + "php": ">=8.2", "psr/event-dispatcher": "^1.0", - "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.1|^7.0", - "symfony/framework-bundle": "^6.1|^7.0", - "symfony/http-client": "^6.1|^7.0", - "symfony/property-access": "^6.1|^7.0", - "symfony/property-info": "^6.1|^7.0", - "symfony/psr-http-message-bridge": "^2.1|^6.1|^7.0", - "symfony/security-bundle": "^6.1|^7.0", - "symfony/security-core": "^6.1|^7.0", - "symfony/security-http": "^6.1|^7.0", - "symfony/serializer": "^6.1|^7.0", - "symfony/validator": "^6.1|^7.0", - "web-auth/webauthn-lib": "self.version", - "web-token/jwt-library": "^3.3|^4.0" + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/security-bundle": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/security-http": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "web-auth/webauthn-lib": "self.version" + }, + "suggest": { + "symfony/security-bundle": "Symfony firewall using a JSON API (perfect for script applications)" }, "type": "symfony-bundle", "extra": { @@ -15220,7 +17042,7 @@ "webauthn" ], "support": { - "source": "https://github.com/web-auth/webauthn-symfony-bundle/tree/4.9.2" + "source": "https://github.com/web-auth/webauthn-symfony-bundle/tree/5.2.2" }, "funding": [ { @@ -15232,105 +17054,7 @@ "type": "patreon" } ], - "time": "2025-01-04T09:38:56+00:00" - }, - { - "name": "web-token/jwt-library", - "version": "3.4.8", - "source": { - "type": "git", - "url": "https://github.com/web-token/jwt-library.git", - "reference": "92445671cc788fa5f639898a67c06f9fd0bf491f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/web-token/jwt-library/zipball/92445671cc788fa5f639898a67c06f9fd0bf491f", - "reference": "92445671cc788fa5f639898a67c06f9fd0bf491f", - "shasum": "" - }, - "require": { - "brick/math": "^0.9|^0.10|^0.11|^0.12", - "ext-json": "*", - "ext-mbstring": "*", - "paragonie/constant_time_encoding": "^2.6|^3.0", - "paragonie/sodium_compat": "^1.20|^2.0", - "php": ">=8.1", - "psr/cache": "^2.0|^3.0", - "psr/clock": "^1.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "spomky-labs/pki-framework": "^1.2.1", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/polyfill-mbstring": "^1.12" - }, - "conflict": { - "spomky-labs/jose": "*" - }, - "suggest": { - "ext-bcmath": "GMP or BCMath is highly recommended to improve the library performance", - "ext-gmp": "GMP or BCMath is highly recommended to improve the library performance", - "ext-openssl": "For key management (creation, optimization, etc.) and some algorithms (AES, RSA, ECDSA, etc.)", - "ext-sodium": "Sodium is required for OKP key creation, EdDSA signature algorithm and ECDH-ES key encryption with OKP keys", - "paragonie/sodium_compat": "Sodium is required for OKP key creation, EdDSA signature algorithm and ECDH-ES key encryption with OKP keys", - "spomky-labs/aes-key-wrap": "For all Key Wrapping algorithms (A128KW, A192KW, A256KW, A128GCMKW, A192GCMKW, A256GCMKW, PBES2-HS256+A128KW, PBES2-HS384+A192KW, PBES2-HS512+A256KW...)", - "symfony/http-client": "To enable JKU/X5U support." - }, - "type": "library", - "autoload": { - "psr-4": { - "Jose\\Component\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Florent Morselli", - "homepage": "https://github.com/Spomky" - }, - { - "name": "All contributors", - "homepage": "https://github.com/web-token/jwt-framework/contributors" - } - ], - "description": "JWT library", - "homepage": "https://github.com/web-token", - "keywords": [ - "JOSE", - "JWE", - "JWK", - "JWKSet", - "JWS", - "Jot", - "RFC7515", - "RFC7516", - "RFC7517", - "RFC7518", - "RFC7519", - "RFC7520", - "bundle", - "jwa", - "jwt", - "symfony" - ], - "support": { - "issues": "https://github.com/web-token/jwt-library/issues", - "source": "https://github.com/web-token/jwt-library/tree/3.4.8" - }, - "funding": [ - { - "url": "https://github.com/Spomky", - "type": "github" - }, - { - "url": "https://www.patreon.com/FlorentMorselli", - "type": "patreon" - } - ], - "time": "2025-05-07T09:11:18+00:00" + "time": "2025-03-24T12:00:00+00:00" }, { "name": "webmozart/assert", @@ -15450,34 +17174,36 @@ "packages-dev": [ { "name": "dama/doctrine-test-bundle", - "version": "v8.2.2", + "version": "v8.3.1", "source": { "type": "git", "url": "https://github.com/dmaicher/doctrine-test-bundle.git", - "reference": "eefe54fdf00d910f808efea9cfce9cc261064a0a" + "reference": "9bc47e02a0d67cbfef6773837249f71e65c95bf6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/eefe54fdf00d910f808efea9cfce9cc261064a0a", - "reference": "eefe54fdf00d910f808efea9cfce9cc261064a0a", + "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/9bc47e02a0d67cbfef6773837249f71e65c95bf6", + "reference": "9bc47e02a0d67cbfef6773837249f71e65c95bf6", "shasum": "" }, "require": { "doctrine/dbal": "^3.3 || ^4.0", "doctrine/doctrine-bundle": "^2.11.0", - "php": "^7.4 || ^8.0", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^5.4 || ^6.3 || ^7.0", - "symfony/framework-bundle": "^5.4 || ^6.3 || ^7.0" + "php": ">= 8.1", + "psr/cache": "^2.0 || ^3.0", + "symfony/cache": "^6.4 || ^7.2 || ^8.0", + "symfony/framework-bundle": "^6.4 || ^7.2 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<10.0" }, "require-dev": { "behat/behat": "^3.0", "friendsofphp/php-cs-fixer": "^3.27", "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0 || ^11.0", - "symfony/phpunit-bridge": "^7.2", - "symfony/process": "^5.4 || ^6.3 || ^7.0", - "symfony/yaml": "^5.4 || ^6.3 || ^7.0" + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "symfony/process": "^6.4 || ^7.2 || ^8.0", + "symfony/yaml": "^6.4 || ^7.2 || ^8.0" }, "type": "symfony-bundle", "extra": { @@ -15487,7 +17213,7 @@ }, "autoload": { "psr-4": { - "DAMA\\DoctrineTestBundle\\": "src/DAMA/DoctrineTestBundle" + "DAMA\\DoctrineTestBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -15511,9 +17237,9 @@ ], "support": { "issues": "https://github.com/dmaicher/doctrine-test-bundle/issues", - "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v8.2.2" + "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v8.3.1" }, - "time": "2025-02-04T14:37:36+00:00" + "time": "2025-08-05T17:55:02+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -15799,16 +17525,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.6.0", + "version": "v5.6.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56" + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/221b0d0fdf1369c71047ad1d18bb5880017bbc56", - "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", "shasum": "" }, "require": { @@ -15827,7 +17553,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -15851,9 +17577,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" }, - "time": "2025-07-27T20:03:57+00:00" + "time": "2025-08-13T20:13:15+00:00" }, { "name": "phar-io/manifest", @@ -16272,35 +17998,35 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.32", + "version": "11.0.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", - "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.6", - "phpunit/php-text-template": "^2.0.4", - "sebastian/code-unit-reverse-lookup": "^2.0.3", - "sebastian/complexity": "^2.0.3", - "sebastian/environment": "^5.1.5", - "sebastian/lines-of-code": "^1.0.4", - "sebastian/version": "^3.0.2", + "nikic/php-parser": "^5.4.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.6" + "phpunit/phpunit": "^11.5.2" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -16309,7 +18035,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "9.2.x-dev" + "dev-main": "11.0.x-dev" } }, "autoload": { @@ -16338,40 +18064,52 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.11" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2024-08-22T04:23:01+00:00" + "time": "2025-08-27T14:37:49+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -16398,7 +18136,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" }, "funding": [ { @@ -16406,28 +18145,28 @@ "type": "github" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2024-08-27T05:02:59+00:00" }, { "name": "phpunit/php-invoker", - "version": "3.1.1", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-pcntl": "*" @@ -16435,7 +18174,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -16461,7 +18200,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" }, "funding": [ { @@ -16469,32 +18209,32 @@ "type": "github" } ], - "time": "2020-09-28T05:58:55+00:00" + "time": "2024-07-03T05:07:44+00:00" }, { "name": "phpunit/php-text-template", - "version": "2.0.4", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -16520,7 +18260,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" }, "funding": [ { @@ -16528,32 +18269,32 @@ "type": "github" } ], - "time": "2020-10-26T05:33:50+00:00" + "time": "2024-07-03T05:08:43+00:00" }, { "name": "phpunit/php-timer", - "version": "5.0.3", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -16579,7 +18320,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" }, "funding": [ { @@ -16587,24 +18329,23 @@ "type": "github" } ], - "time": "2020-10-26T13:16:10+00:00" + "time": "2024-07-03T05:09:35+00:00" }, { "name": "phpunit/phpunit", - "version": "9.6.24", + "version": "11.5.35", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "ea49afa29aeea25ea7bf9de9fdd7cab163cc0701" + "reference": "d341ee94ee5007b286fc7907b383aae6b5b3cc91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ea49afa29aeea25ea7bf9de9fdd7cab163cc0701", - "reference": "ea49afa29aeea25ea7bf9de9fdd7cab163cc0701", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d341ee94ee5007b286fc7907b383aae6b5b3cc91", + "reference": "d341ee94ee5007b286fc7907b383aae6b5b3cc91", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.5.0 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -16614,27 +18355,26 @@ "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.32", - "phpunit/php-file-iterator": "^3.0.6", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.4", - "phpunit/php-timer": "^5.0.3", - "sebastian/cli-parser": "^1.0.2", - "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.9", - "sebastian/diff": "^4.0.6", - "sebastian/environment": "^5.1.5", - "sebastian/exporter": "^4.0.6", - "sebastian/global-state": "^5.0.8", - "sebastian/object-enumerator": "^4.0.4", - "sebastian/resource-operations": "^3.0.4", - "sebastian/type": "^3.2.1", - "sebastian/version": "^3.0.2" + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.11", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.2", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.0", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.3", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" }, "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "ext-soap": "To be able to generate mocks based on WSDL files" }, "bin": [ "phpunit" @@ -16642,7 +18382,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.6-dev" + "dev-main": "11.5-dev" } }, "autoload": { @@ -16674,7 +18414,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.24" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.35" }, "funding": [ { @@ -16698,20 +18438,20 @@ "type": "tidelift" } ], - "time": "2025-08-10T08:32:42+00:00" + "time": "2025-08-28T05:13:54+00:00" }, { "name": "rector/rector", - "version": "2.1.2", + "version": "2.1.4", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "40a71441dd73fa150a66102f5ca1364c44fc8fff" + "reference": "fe613c528819222f8686a9a037a315ef9d4915b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/40a71441dd73fa150a66102f5ca1364c44fc8fff", - "reference": "40a71441dd73fa150a66102f5ca1364c44fc8fff", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/fe613c528819222f8686a9a037a315ef9d4915b3", + "reference": "fe613c528819222f8686a9a037a315ef9d4915b3", "shasum": "" }, "require": { @@ -16750,7 +18490,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.1.2" + "source": "https://github.com/rectorphp/rector/tree/2.1.4" }, "funding": [ { @@ -16758,7 +18498,7 @@ "type": "github" } ], - "time": "2025-07-17T19:30:06+00:00" + "time": "2025-08-15T14:41:36+00:00" }, { "name": "roave/security-advisories", @@ -16766,12 +18506,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "0479005335290f5c772337cf359599dad65bb63f" + "reference": "e7589e01dc8452bfecb4c8df977346cd3132650f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/0479005335290f5c772337cf359599dad65bb63f", - "reference": "0479005335290f5c772337cf359599dad65bb63f", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/e7589e01dc8452bfecb4c8df977346cd3132650f", + "reference": "e7589e01dc8452bfecb4c8df977346cd3132650f", "shasum": "" }, "conflict": { @@ -16789,7 +18529,7 @@ "airesvsg/acf-to-rest-api": "<=3.1", "akaunting/akaunting": "<2.1.13", "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", - "alextselegidis/easyappointments": "<=1.5.1", + "alextselegidis/easyappointments": "<1.5.2.0-beta1", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", "ameos/ameos_tarteaucitron": "<1.2.23", @@ -16802,8 +18542,8 @@ "aoe/restler": "<1.7.1", "apache-solr-for-typo3/solr": "<2.8.3", "apereo/phpcas": "<1.6", - "api-platform/core": "<3.4.17|>=4.0.0.0-alpha1,<4.0.22", - "api-platform/graphql": "<3.4.17|>=4.0.0.0-alpha1,<4.0.22", + "api-platform/core": "<3.4.17|>=4,<4.0.22|>=4.1,<4.1.5", + "api-platform/graphql": "<3.4.17|>=4,<4.0.22|>=4.1,<4.1.5", "appwrite/server-ce": "<=1.2.1", "arc/web": "<3", "area17/twill": "<1.2.5|>=2,<2.5.3", @@ -16827,7 +18567,7 @@ "backpack/crud": "<3.4.9", "backpack/filemanager": "<2.0.2|>=3,<3.0.9", "bacula-web/bacula-web": "<9.7.1", - "badaso/core": "<2.7", + "badaso/core": "<=2.9.11", "bagisto/bagisto": "<2.1", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", @@ -16892,15 +18632,15 @@ "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4", - "contao/contao": ">=3,<3.5.37|>=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", + "contao/contao": ">=3,<3.5.37|>=4,<4.4.56|>=4.5,<4.13.56|>=5,<5.3.38|>=5.4.0.0-RC1-dev,<5.6.1", "contao/core": "<3.5.39", - "contao/core-bundle": "<4.13.54|>=5,<5.3.30|>=5.4,<5.5.6", + "contao/core-bundle": "<4.13.56|>=5,<5.3.38|>=5.4,<5.6.1", "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", "contao/managed-edition": "<=1.5", "corveda/phpsandbox": "<1.3.5", "cosenary/instagram": "<=2.3", "couleurcitron/tarteaucitron-wp": "<0.3", - "craftcms/cms": "<4.16.3|>=5,<5.8.4", + "craftcms/cms": "<=4.16.5|>=5,<=5.8.6", "croogo/croogo": "<4", "cuyz/valinor": "<0.12", "czim/file-handling": "<1.5|>=2,<2.3", @@ -17056,7 +18796,7 @@ "globalpayments/php-sdk": "<2", "goalgorilla/open_social": "<12.3.11|>=12.4,<12.4.10|>=13.0.0.0-alpha1,<13.0.0.0-alpha11", "gogentooss/samlbase": "<1.2.7", - "google/protobuf": "<3.15", + "google/protobuf": "<3.4", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<2.2.1", "gregwar/rst": "<1.0.3", @@ -17115,7 +18855,7 @@ "jbartels/wec-map": "<3.0.3", "jcbrand/converse.js": "<3.3.3", "joelbutcher/socialstream": "<5.6|>=6,<6.2", - "johnbillion/wp-crontrol": "<1.16.2", + "johnbillion/wp-crontrol": "<1.16.2|>=1.17,<1.19.2", "joomla/application": "<1.0.13", "joomla/archive": "<1.1.12|>=2,<2.0.1", "joomla/database": ">=1,<2.2|>=3,<3.4", @@ -17180,7 +18920,7 @@ "luyadev/yii-helpers": "<1.2.1", "macropay-solutions/laravel-crud-wizard-free": "<3.4.17", "maestroerror/php-heic-to-jpg": "<1.0.5", - "magento/community-edition": "<2.4.5.0-patch13|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch11|>=2.4.7.0-beta1,<2.4.7.0-patch6|>=2.4.8.0-beta1,<2.4.8.0-patch1", + "magento/community-edition": "<2.4.5.0-patch14|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch12|>=2.4.7.0-beta1,<2.4.7.0-patch7|>=2.4.8.0-beta1,<2.4.8.0-patch1", "magento/core": "<=1.9.4.5", "magento/magento1ce": "<1.9.4.3-dev", "magento/magento1ee": ">=1,<1.14.4.3-dev", @@ -17224,6 +18964,7 @@ "mongodb/mongodb": ">=1,<1.9.2", "monolog/monolog": ">=1.8,<1.12", "moodle/moodle": "<4.3.12|>=4.4,<4.4.8|>=4.5.0.0-beta,<4.5.4", + "moonshine/moonshine": "<=3.12.5", "mos/cimage": "<0.7.19", "movim/moxl": ">=0.8,<=0.10", "movingbytes/social-network": "<=1.2.1", @@ -17319,7 +19060,7 @@ "phpoffice/common": "<0.2.9", "phpoffice/math": "<=0.2", "phpoffice/phpexcel": "<=1.8.2", - "phpoffice/phpspreadsheet": "<1.29.9|>=2,<2.1.8|>=2.2,<2.3.7|>=3,<3.9", + "phpoffice/phpspreadsheet": "<1.30|>=2,<2.1.12|>=2.2,<2.4|>=3,<3.10|>=4,<5", "phpseclib/phpseclib": "<2.0.47|>=3,<3.0.36", "phpservermon/phpservermon": "<3.6", "phpsysinfo/phpsysinfo": "<3.4.3", @@ -17446,6 +19187,8 @@ "snipe/snipe-it": "<8.1", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", + "solspace/craft-freeform": ">=5,<5.10.16", + "soosyze/soosyze": "<=2", "spatie/browsershot": "<5.0.5", "spatie/image-optimizer": "<1.7.3", "spencer14420/sp-php-email-handler": "<1", @@ -17578,7 +19321,7 @@ "uasoft-indonesia/badaso": "<=2.9.7", "unisharp/laravel-filemanager": "<2.9.1", "universal-omega/dynamic-page-list3": "<3.6.4", - "unopim/unopim": "<0.1.5", + "unopim/unopim": "<=0.3", "userfrosting/userfrosting": ">=0.3.1,<4.6.3", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "uvdesk/community-skeleton": "<=1.1.1", @@ -17592,7 +19335,7 @@ "vertexvaar/falsftp": "<0.2.6", "villagedefrance/opencart-overclocked": "<=1.11.1", "vova07/yii2-fileapi-widget": "<0.1.9", - "vrana/adminer": "<4.8.1", + "vrana/adminer": "<=4.8.1", "vufind/vufind": ">=2,<9.1.1", "waldhacker/hcaptcha": "<2.1.2", "wallabag/tcpdf": "<6.2.22", @@ -17720,32 +19463,32 @@ "type": "tidelift" } ], - "time": "2025-08-12T21:05:30+00:00" + "time": "2025-08-29T15:04:47+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.2", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -17768,7 +19511,8 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" }, "funding": [ { @@ -17776,32 +19520,32 @@ "type": "github" } ], - "time": "2024-03-02T06:27:43+00:00" + "time": "2024-07-03T04:41:36+00:00" }, { "name": "sebastian/code-unit", - "version": "1.0.8", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -17824,7 +19568,8 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" }, "funding": [ { @@ -17832,32 +19577,32 @@ "type": "github" } ], - "time": "2020-10-26T13:08:54+00:00" + "time": "2025-03-19T07:56:08+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -17879,7 +19624,8 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" }, "funding": [ { @@ -17887,34 +19633,39 @@ "type": "github" } ], - "time": "2020-09-28T05:30:19+00:00" + "time": "2024-07-03T04:45:54+00:00" }, { "name": "sebastian/comparator", - "version": "4.0.9", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5" + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5", - "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -17953,7 +19704,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.9" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2" }, "funding": [ { @@ -17973,33 +19725,33 @@ "type": "tidelift" } ], - "time": "2025-08-10T06:51:50+00:00" + "time": "2025-08-10T08:07:46+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.3", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -18022,7 +19774,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" }, "funding": [ { @@ -18030,33 +19783,33 @@ "type": "github" } ], - "time": "2023-12-22T06:19:30+00:00" + "time": "2024-07-03T04:49:50+00:00" }, { "name": "sebastian/diff", - "version": "4.0.6", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3", + "phpunit/phpunit": "^11.0", "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -18088,7 +19841,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" }, "funding": [ { @@ -18096,27 +19850,27 @@ "type": "github" } ], - "time": "2024-03-02T06:30:58+00:00" + "time": "2024-07-03T04:53:05+00:00" }, { "name": "sebastian/environment", - "version": "5.1.5", + "version": "7.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.3" }, "suggest": { "ext-posix": "*" @@ -18124,7 +19878,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-main": "7.2-dev" } }, "autoload": { @@ -18143,7 +19897,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -18151,42 +19905,55 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2023-02-03T06:03:51+00:00" + "time": "2025-05-21T11:55:47+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.6", + "version": "6.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -18228,7 +19995,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" }, "funding": [ { @@ -18236,38 +20004,35 @@ "type": "github" } ], - "time": "2024-03-02T06:33:00+00:00" + "time": "2024-12-05T09:17:50+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.8", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", - "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -18286,59 +20051,48 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8" + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", - "type": "tidelift" } ], - "time": "2025-08-10T07:10:35+00:00" + "time": "2024-07-03T04:57:36+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.4", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -18361,7 +20115,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" }, "funding": [ { @@ -18369,34 +20124,34 @@ "type": "github" } ], - "time": "2023-12-22T06:20:34+00:00" + "time": "2024-07-03T04:58:38+00:00" }, { "name": "sebastian/object-enumerator", - "version": "4.0.4", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -18418,7 +20173,8 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" }, "funding": [ { @@ -18426,32 +20182,32 @@ "type": "github" } ], - "time": "2020-10-26T13:12:34+00:00" + "time": "2024-07-03T05:00:13+00:00" }, { "name": "sebastian/object-reflector", - "version": "2.0.4", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -18473,7 +20229,8 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" }, "funding": [ { @@ -18481,32 +20238,32 @@ "type": "github" } ], - "time": "2020-10-26T13:14:26+00:00" + "time": "2024-07-03T05:01:32+00:00" }, { "name": "sebastian/recursion-context", - "version": "4.0.6", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", - "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -18536,7 +20293,8 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.6" + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" }, "funding": [ { @@ -18556,86 +20314,32 @@ "type": "tidelift" } ], - "time": "2025-08-10T06:57:39+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-14T16:00:52+00:00" + "time": "2025-08-13T04:42:22+00:00" }, { "name": "sebastian/type", - "version": "3.2.1", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -18658,37 +20362,50 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2023-02-03T06:13:03+00:00" + "time": "2025-08-09T06:55:48+00:00" }, { "name": "sebastian/version", - "version": "3.0.2", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -18711,7 +20428,8 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" }, "funding": [ { @@ -18719,31 +20437,83 @@ "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2024-10-09T05:16:32+00:00" }, { - "name": "symfony/browser-kit", - "version": "v6.4.24", + "name": "staabm/side-effects-detector", + "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "3537d17782f8c20795b194acb6859071b60c6fac" + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/3537d17782f8c20795b194acb6859071b60c6fac", - "reference": "3537d17782f8c20795b194acb6859071b60c6fac", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/dom-crawler": "^5.4|^6.0|^7.0" + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "f0b889b73a845cddef1d25fe207b37fd04cb5419" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/f0b889b73a845cddef1d25fe207b37fd04cb5419", + "reference": "f0b889b73a845cddef1d25fe207b37fd04cb5419", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/dom-crawler": "^6.4|^7.0" + }, + "require-dev": { + "symfony/css-selector": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -18771,7 +20541,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v6.4.24" + "source": "https://github.com/symfony/browser-kit/tree/v7.3.2" }, "funding": [ { @@ -18791,37 +20561,34 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-07-10T08:47:49+00:00" }, { "name": "symfony/debug-bundle", - "version": "v6.4.13", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "7bcfaff39e094cc09455201916d016d9b2ae08ff" + "reference": "781acc90f31f5fe18915f9276890864ebbbe3da8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/7bcfaff39e094cc09455201916d016d9b2ae08ff", - "reference": "7bcfaff39e094cc09455201916d016d9b2ae08ff", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/781acc90f31f5fe18915f9276890864ebbbe3da8", + "reference": "781acc90f31f5fe18915f9276890864ebbbe3da8", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.1", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/twig-bridge": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "conflict": { - "symfony/config": "<5.4", - "symfony/dependency-injection": "<5.4" + "php": ">=8.2", + "symfony/config": "^7.3", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "require-dev": { - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0" + "symfony/web-profiler-bundle": "^6.4|^7.0" }, "type": "symfony-bundle", "autoload": { @@ -18849,7 +20616,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v6.4.13" + "source": "https://github.com/symfony/debug-bundle/tree/v7.3.0" }, "funding": [ { @@ -18865,7 +20632,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2025-05-04T13:21:13+00:00" }, { "name": "symfony/maker-bundle", @@ -18962,27 +20729,27 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "c7bd97db095cb2f560b675e3fa0ae5ca6a2e5f59" + "reference": "7954e563ed14f924593169f6c4645d58d9d9ac77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/c7bd97db095cb2f560b675e3fa0ae5ca6a2e5f59", - "reference": "c7bd97db095cb2f560b675e3fa0ae5ca6a2e5f59", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/7954e563ed14f924593169f6c4645d58d9d9ac77", + "reference": "7954e563ed14f924593169f6c4645d58d9d9ac77", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": ">=7.2.5" }, "conflict": { "phpunit/phpunit": "<7.5|9.1.2" }, "require-dev": { "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.4|^7.0", "symfony/polyfill-php81": "^1.27" }, "bin": [ @@ -19027,7 +20794,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.24" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.3.3" }, "funding": [ { @@ -19047,42 +20814,45 @@ "type": "tidelift" } ], - "time": "2025-07-24T11:44:59+00:00" + "time": "2025-08-04T15:15:28+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v6.4.24", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "ae16f886ab3e3ed0a8db07d2a7c4d9d60b1eafcd" + "reference": "6ee224d6e9de787a47622b9ad4880e205ef16ad1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/ae16f886ab3e3ed0a8db07d2a7c4d9d60b1eafcd", - "reference": "ae16f886ab3e3ed0a8db07d2a7c4d9d60b1eafcd", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6ee224d6e9de787a47622b9ad4880e205ef16ad1", + "reference": "6ee224d6e9de787a47622b9ad4880e205ef16ad1", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/config": "^5.4|^6.0|^7.0", + "composer-runtime-api": ">=2.1", + "php": ">=8.2", + "symfony/config": "^7.3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/framework-bundle": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/twig-bundle": "^5.4|^6.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/routing": "^6.4|^7.0", + "symfony/twig-bundle": "^6.4|^7.0", + "twig/twig": "^3.12" }, "conflict": { - "symfony/form": "<5.4", - "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4", - "symfony/twig-bundle": ">=7.0" + "symfony/form": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/serializer": "<7.2", + "symfony/workflow": "<7.3" }, "require-dev": { - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/browser-kit": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" }, "type": "symfony-bundle", "autoload": { @@ -19113,7 +20883,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.24" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.3.3" }, "funding": [ { @@ -19133,68 +20903,7 @@ "type": "tidelift" } ], - "time": "2025-07-20T15:15:57+00:00" - }, - { - "name": "symplify/easy-coding-standard", - "version": "12.5.22", - "source": { - "type": "git", - "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "4581ec472a86ff11f2f3909a4dd14a9e6fa2110b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/4581ec472a86ff11f2f3909a4dd14a9e6fa2110b", - "reference": "4581ec472a86ff11f2f3909a4dd14a9e6fa2110b", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "conflict": { - "friendsofphp/php-cs-fixer": "<3.46", - "phpcsstandards/php_codesniffer": "<3.8", - "symplify/coding-standard": "<12.1" - }, - "suggest": { - "ext-dom": "Needed to support checkstyle output format in class CheckstyleOutputFormatter" - }, - "bin": [ - "bin/ecs" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Use Coding Standard with 0-knowledge of PHP-CS-Fixer and PHP_CodeSniffer", - "keywords": [ - "Code style", - "automation", - "fixer", - "static analysis" - ], - "support": { - "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.22" - }, - "funding": [ - { - "url": "https://www.paypal.me/rectorphp", - "type": "custom" - }, - { - "url": "https://github.com/tomasvotruba", - "type": "github" - } - ], - "time": "2025-07-31T06:08:02+00:00" + "time": "2025-08-19T13:44:55+00:00" }, { "name": "theseer/tokenizer", @@ -19247,14 +20956,7 @@ "time": "2024-03-03T12:36:25+00:00" } ], - "aliases": [ - { - "package": "brick/math", - "version": "0.12.1.0", - "alias": "0.11.0", - "alias_normalized": "0.11.0.0" - } - ], + "aliases": [], "minimum-stability": "stable", "stability-flags": { "florianv/swap-bundle": 20, @@ -19263,7 +20965,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.1", + "php": "^8.2", "ext-ctype": "*", "ext-dom": "*", "ext-gd": "*", @@ -19274,7 +20976,7 @@ }, "platform-dev": [], "platform-overrides": { - "php": "8.1.0" + "php": "8.2.0" }, "plugin-api-version": "2.3.0" } diff --git a/config/banner.md b/config/banner.md index 997ca15e..1d38a3f3 100644 --- a/config/banner.md +++ b/config/banner.md @@ -1,14 +1,4 @@ -Welcome to Part-DB. - -If you want to change this banner, edit `config/banner.md` file or set the `BANNER` environment variable. +**Attention**: +Since Version 2.0.0 this file is no longer used. -
-

-And God said
-$\nabla \cdot \vec{D} = \rho$, -$\nabla \cdot \vec{B} = 0$, -$\nabla \times \vec{E} = -\frac{\partial \vec{B}}{\partial t}$, -$\nabla \times \vec{H} = \vec{j} + \frac{\partial \vec{D}}{\partial t}$,
-and then there was light. -

-
\ No newline at end of file +You can now set the banner text directly in the admin interface, or by setting the `BANNER` environment variable. diff --git a/config/bundles.php b/config/bundles.php index 90350de5..ae7dc9cc 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -30,7 +30,7 @@ return [ Jbtronics\DompdfFontLoaderBundle\DompdfFontLoaderBundle::class => ['all' => true], KnpU\OAuth2ClientBundle\KnpUOAuth2ClientBundle::class => ['all' => true], Nelmio\CorsBundle\NelmioCorsBundle::class => ['all' => true], - ApiPlatform\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true], Jbtronics\SettingsBundle\JbtronicsSettingsBundle::class => ['all' => true], Jbtronics\TranslationEditorBundle\JbtronicsTranslationEditorBundle::class => ['dev' => true], + ApiPlatform\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true], ]; diff --git a/config/packages/api_platform.yaml b/config/packages/api_platform.yaml index d55f91ea..1b679cd1 100644 --- a/config/packages/api_platform.yaml +++ b/config/packages/api_platform.yaml @@ -32,10 +32,9 @@ api_platform: pagination_client_items_per_page: true # Allow clients to override the default items per page - keep_legacy_inflector: false # Need to be true, or some tests will fail use_symfony_listeners: true serializer: # Change this to false later, to remove the hydra prefix on the API - hydra_prefix: true \ No newline at end of file + hydra_prefix: true diff --git a/config/packages/csrf.yaml b/config/packages/csrf.yaml new file mode 100644 index 00000000..01db6267 --- /dev/null +++ b/config/packages/csrf.yaml @@ -0,0 +1,12 @@ +# Enable stateless CSRF protection for forms and logins/logouts +framework: + form: + csrf_protection: + token_id: submit + + csrf_protection: + check_header: true + stateless_token_ids: + - submit + - authenticate + - logout diff --git a/config/packages/datatables.yaml b/config/packages/datatables.yaml index 1297fc9d..f1ea4715 100644 --- a/config/packages/datatables.yaml +++ b/config/packages/datatables.yaml @@ -18,7 +18,7 @@ datatables: > <'row' <'col mt-2 input-group flex-nowrap' B l > <'col-auto mt-2' < p >>>" pagingType: 'simple_numbers' - searching: true + searching: false stateSave: true diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index 3211fbbe..5261c295 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -25,10 +25,6 @@ doctrine: tinyint: class: App\Doctrine\Types\TinyIntType - # This was removed in doctrine/orm 4.0 but we need it for the WebauthnKey entity - array: - class: App\Doctrine\Types\ArrayType - schema_filter: ~^(?!internal)~ # Only enable this when needed profiling_collect_backtrace: false @@ -39,6 +35,8 @@ doctrine: report_fields_where_declared: true validate_xml_mapping: true naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware + identity_generation_preferences: + Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity auto_mapping: true controller_resolver: auto_mapping: true diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index 279c51f5..6843a177 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -1,9 +1,6 @@ # see https://symfony.com/doc/current/reference/configuration/framework.html framework: secret: '%env(APP_SECRET)%' - csrf_protection: true - annotations: false - handle_all_throwables: true # We set this header by ourselves, so we can disable it here disallow_search_engine_index: false @@ -30,8 +27,11 @@ framework: #esi: true #fragments: true - php_errors: - log: true + + + form: { csrf_protection: { token_id: 'submit' } } + csrf_protection: + stateless_token_ids: ['submit', 'authenticate', 'logout'] when@test: framework: diff --git a/config/packages/knpu_oauth2_client.yaml b/config/packages/knpu_oauth2_client.yaml index 7d296a8b..5e56d5c5 100644 --- a/config/packages/knpu_oauth2_client.yaml +++ b/config/packages/knpu_oauth2_client.yaml @@ -6,8 +6,8 @@ knpu_oauth2_client: type: generic provider_class: '\League\OAuth2\Client\Provider\GenericProvider' - client_id: '%env(PROVIDER_DIGIKEY_CLIENT_ID)%' - client_secret: '%env(PROVIDER_DIGIKEY_SECRET)%' + client_id: '%env(settings:digikey:clientId)%' + client_secret: '%env(settings:digikey:secret)%' redirect_route: 'oauth_client_check' redirect_params: {name: 'ip_digikey_oauth'} @@ -26,8 +26,8 @@ knpu_oauth2_client: type: generic provider_class: '\League\OAuth2\Client\Provider\GenericProvider' - client_id: '%env(PROVIDER_OCTOPART_CLIENT_ID)%' - client_secret: '%env(PROVIDER_OCTOPART_SECRET)%' + client_id: '%env(settings:octopart:clientId)%' + client_secret: '%env(settings:octopart:secret)%' redirect_route: 'oauth_client_check' redirect_params: { name: 'ip_octopart_oauth' } diff --git a/config/packages/monolog.yaml b/config/packages/monolog.yaml index 44a078b8..725ebd7c 100644 --- a/config/packages/monolog.yaml +++ b/config/packages/monolog.yaml @@ -69,6 +69,7 @@ when@docker: excluded_http_codes: [404, 405] buffer_size: 50 # How many messages should be saved? Prevent memory leaks include_stacktraces: true + channels: ["!deprecation"] nested: type: stream path: "php://stderr" diff --git a/config/packages/property_info.yaml b/config/packages/property_info.yaml new file mode 100644 index 00000000..dd31b9da --- /dev/null +++ b/config/packages/property_info.yaml @@ -0,0 +1,3 @@ +framework: + property_info: + with_constructor_extractor: true diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml index df5d98d2..0f34f872 100644 --- a/config/packages/routing.yaml +++ b/config/packages/routing.yaml @@ -1,7 +1,5 @@ framework: router: - utf8: true - # Configure how to generate URLs in non-HTTP contexts, such as CLI commands. # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands default_uri: '%env(DEFAULT_URI)%' diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 95f5c6b1..e7a44e0c 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -13,7 +13,7 @@ security: firewalls: dev: - pattern: ^/(_(profiler|wdt)|css|images|js)/ + pattern: ^/(_(profiler|wdt)|css|images|js|\.well-known)/ security: false main: provider: app_user_provider diff --git a/config/packages/settings.yaml b/config/packages/settings.yaml index 6b47cba3..05e21636 100644 --- a/config/packages/settings.yaml +++ b/config/packages/settings.yaml @@ -1,2 +1,8 @@ jbtronics_settings: - default_storage_adapter: Jbtronics\SettingsBundle\Storage\PHPFileStorageAdapter \ No newline at end of file + default_storage_adapter: Jbtronics\SettingsBundle\Storage\ORMStorageAdapter + + cache: + default_cacheable: true + + orm_storage: + default_entity_class: App\Entity\SettingsEntry \ No newline at end of file diff --git a/config/packages/swap.yaml b/config/packages/swap.yaml index 2767f740..beb41d26 100644 --- a/config/packages/swap.yaml +++ b/config/packages/swap.yaml @@ -6,5 +6,5 @@ florianv_swap: providers: european_central_bank: ~ # European Central Bank (only works for EUR base currency) fixer: # Fixer.io (needs an API key) - access_key: "%env(FIXER_API_KEY)%" + access_key: "%env(string:default:settings:exchange_rate:fixerApiKey:INVALID)%" #exchange_rates_api: ~ \ No newline at end of file diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml index f113c254..674aa317 100644 --- a/config/packages/twig.yaml +++ b/config/packages/twig.yaml @@ -17,7 +17,6 @@ twig: available_themes: '%partdb.available_themes%' saml_enabled: '%partdb.saml.enabled%' part_preview_generator: '@App\Services\Attachments\PartPreviewGenerator' - img_overlay: '%partdb.show_part_image_overlay%' when@test: twig: diff --git a/config/packages/uid.yaml b/config/packages/uid.yaml deleted file mode 100644 index 01520944..00000000 --- a/config/packages/uid.yaml +++ /dev/null @@ -1,4 +0,0 @@ -framework: - uid: - default_uuid_version: 7 - time_based_uuid_version: 7 diff --git a/config/packages/ux_turbo.yaml b/config/packages/ux_turbo.yaml new file mode 100644 index 00000000..c2a6a44e --- /dev/null +++ b/config/packages/ux_turbo.yaml @@ -0,0 +1,4 @@ +# Enable stateless CSRF protection for forms and logins/logouts +framework: + csrf_protection: + check_header: true diff --git a/config/packages/validator.yaml b/config/packages/validator.yaml index 0201281d..dd47a6ad 100644 --- a/config/packages/validator.yaml +++ b/config/packages/validator.yaml @@ -1,7 +1,5 @@ framework: validation: - email_validation_mode: html5 - # Enables validator auto-mapping support. # For instance, basic validation constraints will be inferred from Doctrine's metadata. #auto_mapping: diff --git a/config/packages/web_profiler.yaml b/config/packages/web_profiler.yaml index b9461110..15112444 100644 --- a/config/packages/web_profiler.yaml +++ b/config/packages/web_profiler.yaml @@ -1,17 +1,14 @@ when@dev: web_profiler: - toolbar: true - intercept_redirects: false + toolbar: + ajax_replace: true framework: profiler: - only_exceptions: false collect_serializer_data: true when@test: - web_profiler: - toolbar: false - intercept_redirects: false - framework: - profiler: { collect: false } + profiler: + collect: false + collect_serializer_data: true diff --git a/config/parameters.yaml b/config/parameters.yaml index 8a798913..154fbd8a 100644 --- a/config/parameters.yaml +++ b/config/parameters.yaml @@ -48,7 +48,6 @@ parameters: # Miscellaneous ###################################################################################################################### partdb.demo_mode: '%env(bool:DEMO_MODE)%' # If set to true, all potentially dangerous things are disabled (like changing passwords of the own user) - partdb.show_part_image_overlay: '%env(bool:SHOW_PART_IMAGE_OVERLAY)%' # If set to false, the filename overlay of the part image will be disabled # Set the themes from which the user can choose from in the settings. # Themes commented here by default, are not really usable, because of display problems. Enable them at your own risk! @@ -91,7 +90,6 @@ parameters: env(ERROR_PAGE_SHOW_HELP): 1 env(DEMO_MODE): 0 - env(BANNER): '' env(EMAIL_SENDER_EMAIL): 'noreply@partdb.changeme' diff --git a/config/permissions.yaml b/config/permissions.yaml index b8970556..e5a1d65b 100644 --- a/config/permissions.yaml +++ b/config/permissions.yaml @@ -265,17 +265,13 @@ perms: # Here comes a list with all Permission names (they have a perm_[name] co # label: "perm.database.write_db_settings" # alsoSet: ['read_db_settings', 'see_status'] - #config: - # label: "perm.config" - # group: "system" - # operations: - # read_config: - # label: "perm.config.read_config" - # edit_config: - # label: "perm.config.edit_config" - # alsoSet: 'read_config' - # server_info: - # label: "perm.config.server_info" + config: + label: "perm.config" + group: "system" + operations: + change_system_settings: + label: "perm.config.change_system_settings" + apiTokenRole: ROLE_API_ADMIN system: label: "perm.system" diff --git a/config/routes/framework.yaml b/config/routes/framework.yaml index 0fc74bba..bc1feace 100644 --- a/config/routes/framework.yaml +++ b/config/routes/framework.yaml @@ -1,4 +1,4 @@ when@dev: _errors: - resource: '@FrameworkBundle/Resources/config/routing/errors.xml' + resource: '@FrameworkBundle/Resources/config/routing/errors.php' prefix: /_error diff --git a/config/routes/web_profiler.yaml b/config/routes/web_profiler.yaml index 8d85319f..b3b7b4b0 100644 --- a/config/routes/web_profiler.yaml +++ b/config/routes/web_profiler.yaml @@ -1,8 +1,8 @@ when@dev: web_profiler_wdt: - resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + resource: '@WebProfilerBundle/Resources/config/routing/wdt.php' prefix: /_wdt web_profiler_profiler: - resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + resource: '@WebProfilerBundle/Resources/config/routing/profiler.php' prefix: /_profiler diff --git a/config/services.yaml b/config/services.yaml index dfc9a7c7..17611cea 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -29,10 +29,6 @@ services: # this creates a service per class whose id is the fully-qualified class name App\: resource: '../src/' - exclude: - - '../src/DependencyInjection/' - - '../src/Entity/' - - '../src/Kernel.php' # controllers are imported separately to make sure services can be injected # as action arguments even if you don't extend any base controller class @@ -199,23 +195,6 @@ services: arguments: $providers: !tagged_iterator 'app.info_provider' - App\Services\InfoProviderSystem\Providers\DigikeyProvider: - arguments: - $clientId: '%env(string:PROVIDER_DIGIKEY_CLIENT_ID)%' - $currency: '%env(string:PROVIDER_DIGIKEY_CURRENCY)%' - $language: '%env(string:PROVIDER_DIGIKEY_LANGUAGE)%' - $country: '%env(string:PROVIDER_DIGIKEY_COUNTRY)%' - - App\Services\InfoProviderSystem\Providers\OctopartProvider: - arguments: - $clientId: '&env(string:PROVIDER_OCTOPART_CLIENT_ID)%' - $secret: '%env(string:PROVIDER_OCTOPART_SECRET)%' - $country: '%env(string:PROVIDER_OCTOPART_COUNTRY)%' - $currency: '%env(string:PROVIDER_OCTOPART_CURRENCY)%' - $search_limit: '%env(int:PROVIDER_OCTOPART_SEARCH_LIMIT)%' - $onlyAuthorizedSellers: '%env(bool:PROVIDER_OCTOPART_ONLY_AUTHORIZED_SELLERS)%' - - #################################################################################################################### # API system #################################################################################################################### diff --git a/docs/assets/getting_started/system_settings.png b/docs/assets/getting_started/system_settings.png new file mode 100644 index 00000000..5a7d7380 Binary files /dev/null and b/docs/assets/getting_started/system_settings.png differ diff --git a/docs/configuration.md b/docs/configuration.md index b4e5efc4..d4b21781 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -10,7 +10,7 @@ Part-DBs behavior can be configured to your needs. There are different kinds of user-changeable (changeable dynamically via frontend), options that can be configured by environment variables, and options that are only configurable via Symfony config files. -## User changeable +## User configruation The following things can be changed for every user and a user can change it for himself (if he has the correct permission for it). Configuration is either possible via the user's own settings page (where you can also change the password) or via @@ -24,15 +24,34 @@ the user admin page: * **Preferred currency**: One of the defined currencies, in which all prices should be shown, if possible. Prices with other currencies will be converted to the price selected here +## System configuration (via web interface) + +Many common configuration options can be changed via the web interface. You can find the settings page in the sidebar under +"System" -> "Settings". You need to have the "Change system settings" permission to access this page. + +If a setting is greyed out and cannot be changed, it means that this setting is currently overwritten by an environment +variable. You can either change the environment variable to change the setting, or you can migrate the setting to the +database, so that it can be changed via the web interface. To do this, you can use the `php bin/console settings:migrate-env-to-settings` command +and remove the environment variable afterward. + ## Environment variables (.env.local) The following configuration options can only be changed by the server administrator, by either changing the server variables, changing the `.env.local` file or setting env for your docker container. Here are just the most important options listed, see `.env` file for the full list of possible env variables. +Environment variables allow to overwrite settings in the web interface. This is useful, if you want to enforce certain +settings to be unchangable by users, or if you want to configure settings in a central place in a deployed environment. +On the settings page, you can hover over a setting to see, which environment variable can be used to overwrite it, it +is shown as tooltip. API keys or similar sensitve data which is overwritten by env variables, are redacted on the web +interface, so that even administrators cannot see them (only the last 2 characters and the length). + +For technical and security reasons some settings can only be configured via environment variables and not via the web +interface. These settings are marked with "(env only)" in the description below. + ### General options -* `DATABASE_URL`: Configures the database which Part-DB uses: +* `DATABASE_URL` (env only): Configures the database which Part-DB uses: * For MySQL (or MariaDB) use a string in the form of `mysql://:@:/` here (e.g. `DATABASE_URL=mysql://user:password@127.0.0.1:3306/part-db`). * For SQLite use the following format to specify the @@ -42,10 +61,10 @@ options listed, see `.env` file for the full list of possible env variables. Please note that **`serverVersion=x.y`** variable is required due to dependency of Symfony framework. -* `DATABASE_MYSQL_USE_SSL_CA`: If this value is set to `1` or `true` and a MySQL connection is used, then the connection +* `DATABASE_MYSQL_USE_SSL_CA` (env only): If this value is set to `1` or `true` and a MySQL connection is used, then the connection is encrypted by SSL/TLS and the server certificate is verified against the system CA certificates or the CA certificate bundled with Part-DB. Set `DATABASE_MYSQL_SSL_VERIFY_CERT` if you want to accept all certificates. -* `DATABASE_EMULATE_NATURAL_SORT` (default 0): If set to 1, Part-DB will emulate natural sorting, even if the database +* `DATABASE_EMULATE_NATURAL_SORT` (default 0) (env only): If set to 1, Part-DB will emulate natural sorting, even if the database does not support it natively. However this is much slower than the native sorting, and contain bugs or quirks, so use it only, if you have to. * `DEFAULT_LANG`: The default language to use server-wide (when no language is explicitly specified by a user or via @@ -74,7 +93,7 @@ bundled with Part-DB. Set `DATABASE_MYSQL_SSL_VERIFY_CERT` if you want to accept to specify the size in kilobytes, megabytes or gigabytes. By default `100M` (100 megabytes). Please note that this is only the limit of Part-DB. You still need to configure the php.ini `upload_max_filesize` and `post_max_size` to allow bigger files to be uploaded. -* `DEFAULT_URI`: The default URI base to use for the Part-DB, when no URL can be determined from the browser request. +* `DEFAULT_URI` (env only): The default URI base to use for the Part-DB, when no URL can be determined from the browser request. This should be the primary URL/Domain, which is used to access Part-DB. This value is used to create correct links in emails and other places, where the URL is needed. It is also used, when SAML is enabled.s If you are using a reverse proxy, you should set this to the URL of the reverse proxy (e.g. `https://part-db.example.com`). **This value must end @@ -91,14 +110,14 @@ bundled with Part-DB. Set `DATABASE_MYSQL_SSL_VERIFY_CERT` if you want to accept * `datastructure_create`: Creation of a new datastructure (e.g. category, manufacturer, ...) * `CHECK_FOR_UPDATES` (default `1`): Set this to 0, if you do not want Part-DB to connect to GitHub to check for new versions, or if your server can not connect to the internet. -* `APP_SECRET`: This variable is a configuration parameter used for various security-related purposes, +* `APP_SECRET` (env only): This variable is a configuration parameter used for various security-related purposes, particularly for securing and protecting various aspects of your application. It's a secret key that is used for cryptographic operations and security measures (session management, CSRF protection, etc..). Therefore this value should be handled as confidential data and not shared publicly. * `SHOW_PART_IMAGE_OVERLAY`: Set to 0 to disable the part image overlay, which appears if you hover over an image in the part image gallery -### E-Mail settings +### E-Mail settings (all env only) * `MAILER_DSN`: You can configure the mail provider which should be used for email delivery ( see https://symfony.com/doc/current/components/mailer.html for full documentation). If you just want to use an SMTP @@ -138,7 +157,7 @@ The following options are used to configure, which (and how much) data is writte If you want to use want to revert changes or view older revisions of entities, then `HISTORY_SAVE_CHANGED_FIELDS`, `HISTORY_SAVE_CHANGED_DATA` and `HISTORY_SAVE_REMOVED_DATA` all have to be true. -### Error pages settings +### Error pages settings (all env only) * `ERROR_PAGE_ADMIN_EMAIL`: You can set an email address here, which is shown on the error page, who should be contacted about the issue (e.g. an IT support email of your company) @@ -153,7 +172,7 @@ then `HISTORY_SAVE_CHANGED_FIELDS`, `HISTORY_SAVE_CHANGED_DATA` and `HISTORY_SAV All parts in the selected category and all subcategories are shown in KiCad. Set this to a higher value, if you want to show more categories in KiCad. When you set this value to -1, all parts are shown inside a single category in KiCad. -### SAML SSO settings +### SAML SSO settings (all env only) The following settings can be used to enable and configure Single-Sign on via SAML. This allows users to log in to Part-DB without entering a username and password, but instead they are redirected to a SAML Identity Provider (IdP) and @@ -201,26 +220,26 @@ See the [information providers]({% link usage/information_provider_system.md %}) ### Other / less-used options -* `TRUSTED_PROXIES`: Set the IP addresses (or IP blocks) of trusted reverse proxies here. This is needed to get correct +* `TRUSTED_PROXIES` (env only): Set the IP addresses (or IP blocks) of trusted reverse proxies here. This is needed to get correct IP information (see [here](https://symfony.com/doc/current/deployment/proxies.html) for more info). -* `TRUSTED_HOSTS`: To prevent `HTTP Host header attacks` you can set a regex containing all host names via which Part-DB +* `TRUSTED_HOSTS` (env only): To prevent `HTTP Host header attacks` you can set a regex containing all host names via which Part-DB should be accessible. If accessed via the wrong hostname, an error will be shown. -* `DEMO_MODE`: Set Part-DB into demo mode, which forbids users to change their passwords and settings. Used for the demo +* `DEMO_MODE` (env only): Set Part-DB into demo mode, which forbids users to change their passwords and settings. Used for the demo instance. This should not be needed for normal installations. -* `NO_URL_REWRITE_AVAILABLE` (allowed values `true` or `false`): Set this value to true, if your webserver does not +* `NO_URL_REWRITE_AVAILABLE` (allowed values `true` or `false`) (env only): Set this value to true, if your webserver does not support rewrite. In this case, all URL paths will contain index.php/, which is needed then. Normally this setting does not need to be changed. -* `REDIRECT_TO_HTTPS`: If this is set to true, all requests to http will be redirected to https. This is useful if your +* `REDIRECT_TO_HTTPS` (env only): If this is set to true, all requests to http will be redirected to https. This is useful if your web server does not already do this (like the one used in the demo instance). If your web server already redirects to https, you don't need to set this. Ensure that Part-DB is accessible via HTTPS before you enable this setting. * `FIXER_API_KEY`: If you want to automatically retrieve exchange rates for base currencies other than euros, you have to configure an exchange rate provider API. [Fixer.io](https://fixer.io/) is preconfigured, and you just have to register there and set the retrieved API key in this environment variable. -* `APP_ENV`: This value should always be set to `prod` in normal use. Set it to `dev` to enable debug/development +* `APP_ENV` (env only): This value should always be set to `prod` in normal use. Set it to `dev` to enable debug/development mode. (**You should not do this on a publicly accessible server, as it will leak sensitive information!**) * `BANNER`: You can configure the text that should be shown as the banner on the homepage. Useful especially for docker containers. In all other applications you can just change the `config/banner.md` file. -* `DISABLE_YEAR2038_BUG_CHECK`: If set to `1`, the year 2038 bug check is disabled on 32-bit systems, and dates after +* `DISABLE_YEAR2038_BUG_CHECK` (env only): If set to `1`, the year 2038 bug check is disabled on 32-bit systems, and dates after 2038 are no longer forbidden. However this will lead to 500 error messages when rendering dates after 2038 as all current 32-bit PHP versions can not format these dates correctly. This setting is for the case that future PHP versions will handle this correctly on 32-bit systems. 64-bit systems are not affected by this bug, and the check is always disabled. @@ -228,7 +247,7 @@ handle this correctly on 32-bit systems. 64-bit systems are not affected by this ## Banner To change the banner you can find on the homepage, you can either set the `BANNER` environment variable to the text you -want to show, or you can edit the `config/banner.md` file. The banner is written in markdown, so you can use all +want to show, or change it in the system settings webinterface. The banner is written in markdown, so you can use all markdown (and even some subset of HTML) syntax to format the text. ## parameters.yaml @@ -243,8 +262,6 @@ command `bin/console cache:clear`. The following options are available: -* `partdb.global_theme`: The default theme to use, when no user specific theme is set. Should be one of the themes from - the `partdb.available_themes` config option. * `partdb.locale_menu`: The codes of the languages, which should be shown in the language chooser menu (the one with the user icon in the navbar). The first language in the list will be the default language. * `partdb.gdpr_compliance`: When set to true (default value), IP addresses which are saved in the database will be diff --git a/docs/installation/installation_docker.md b/docs/installation/installation_docker.md index c9b46fdb..232633ab 100644 --- a/docs/installation/installation_docker.md +++ b/docs/installation/installation_docker.md @@ -142,28 +142,12 @@ services: # This feature is currently experimental, so use it at your own risk! # - DB_AUTOMIGRATE=true - # You can configure Part-DB using environment variables - # Below you can find the most essential ones predefined + # You can configure Part-DB using the webUI or environment variables # However you can add add any other environment configuration you want here # See .env file for all available options or https://docs.part-db.de/configuration.html - # The language to use serverwide as default (en, de, ru, etc.) - - DEFAULT_LANG=en - # The default timezone to use serverwide (e.g. Europe/Berlin) - - DEFAULT_TIMEZONE=Europe/Berlin - # The currency that is used inside the DB (and is assumed when no currency is set). This can not be changed later, so be sure to set it the currency used in your country - - BASE_CURRENCY=EUR - # The name of this installation. This will be shown as title in the browser and in the header of the website - - INSTANCE_NAME=Part-DB - - # Allow users to download attachments to the server by providing an URL - # This could be a potential security issue, as the user can retrieve any file the server has access to (via internet) - - ALLOW_ATTACHMENT_DOWNLOADS=0 - # Use gravatars for user avatars, when user has no own avatar defined - - USE_GRAVATAR=0 - # Override value if you want to show to show a given text on homepage. - # When this is empty the content of config/banner.md is used as banner + # When this is outcommented the webUI can be used to configure the banner #- BANNER=This is a test banner
with a line break database: diff --git a/docs/installation/installation_guide-debian.md b/docs/installation/installation_guide-debian.md index 885eea90..312fe21e 100644 --- a/docs/installation/installation_guide-debian.md +++ b/docs/installation/installation_guide-debian.md @@ -1,13 +1,13 @@ --- -title: Direct Installation on Debian 11 +title: Direct Installation on Debian 12 layout: default parent: Installation nav_order: 4 --- -# Part-DB installation guide for Debian 11 (Bullseye) +# Part-DB installation guide for Debian 12 (Bookworm) -This guide shows you how to install Part-DB directly on Debian 11 using apache2 and SQLite. This guide should work with +This guide shows you how to install Part-DB directly on Debian 12 using apache2 and SQLite. This guide should work with recent Ubuntu and other Debian-based distributions with little to no changes. Depending on what you want to do, using the prebuilt docker images may be a better choice, as you don't need to install this many dependencies. See [here]({% link installation/installation_docker.md %}) for more information on the docker @@ -33,35 +33,22 @@ sudo apt install git curl zip ca-certificates software-properties-common apt-tra ### Install PHP and apache2 -Part-DB is written in [PHP](https://php.net) and therefore needs a PHP interpreter to run. Part-DB needs PHP 8.1 or +Part-DB is written in [PHP](https://php.net) and therefore needs a PHP interpreter to run. Part-DB needs PHP 8.2 or higher. However, it is recommended to use the most recent version of PHP for performance reasons and future compatibility. -As Debian 11 does not ship PHP 8.1 in its default repositories, we have to add a repository for it. You can skip this -step if your distribution is shipping a recent version of PHP or you want to use the built-in PHP version. If you are -using Debian 12, you can skip this step, as PHP 8.1 is already included in the default repositories. +Install PHP with required extensions and apache2: ```bash -# Add sury repository for PHP 8.1 -sudo curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x - -# Update package list -sudo apt update && sudo apt upgrade +sudo apt install apache2 php8.2 libapache2-mod-php8.2 \ + php8.2-opcache php8.2-curl php8.2-gd php8.2-mbstring \ + php8.2-xml php8.2-bcmath php8.2-intl php8.2-zip php8.2-xsl \ + php8.2-sqlite3 php8.2-mysql ``` -Now you can install PHP 8.1 and the required packages (change the 8.1 in the package version according to the version you -want to use): - -```bash -sudo apt install php8.1 libapache2-mod-php8.1 php8.1-opcache php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-bcmath php8.1-intl php8.1-zip php8.1-xsl php8.1-sqlite3 php8.1-mysql -``` - -The apache2 webserver should be already installed with this command and configured basically. - ### Install composer -Part-DB uses [composer](https://getcomposer.org/) to install required PHP libraries. As the version shipped in the -repositories is pretty old, we will install it manually: +Part-DB uses [composer](https://getcomposer.org/) to install required PHP libraries. Install the latest version manually: ```bash # Download composer installer script @@ -78,10 +65,9 @@ To build the front end (the user interface) Part-DB uses [yarn](https://yarnpkg. shipped versions are pretty old, we install new versions from the official Node.js repository: ```bash -# Add recent node repository (nodejs 18 is supported until 2025) -curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash - -# Install nodejs -sudo apt install nodejs +curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - +sudo apt install -y nodejs + ``` We can install yarn with the following commands: @@ -117,8 +103,8 @@ Alternatively, you can check out a specific version by running ( see [GitHub Releases page](https://github.com/Part-DB/Part-DB-server/releases) for a list of available versions): ```bash -# This checks out the version 1.5.2 -git checkout v1.5.2 +# This checks out the version 2.0.0 +git checkout v2.0.0 ``` Change ownership of the files to the apache user: @@ -142,11 +128,10 @@ configuration: cp .env .env.local ``` -In your `.env.local` you can configure Part-DB according to your wishes. A full list of configuration options can be -found [here](../configuration.md). -Other configuration options like the default language or default currency can be found in `config/parameters.yaml`. +In your `.env.local` you can configure Part-DB according to your wishes and overwrite web interface settings. +A full list of configuration options can be found [here](../configuration.md). -Please check that the `partdb.default_currency` value in `config/parameters.yaml` matches your mainly used currency, as +Please check that the configured base currency matches your mainly used currency, as this can not be changed after creating price information. ### Install dependencies for Part-DB and build frontend @@ -256,6 +241,7 @@ network to point to the server). Navigate to the Part-DB web interface and login via the user icon in the top right corner. You can log in using the username `admin` and the password you have written down earlier. +As first steps, you should check out the system settings and check if everything is correct. ## Update Part-DB @@ -291,7 +277,7 @@ sudo -u www-data php bin/console cache:clear ## MySQL/MariaDB database To use a MySQL database, follow the steps from above (except the creation of the database, we will do this later). -Debian 11 does not ship MySQL in its repositories anymore, so we use the compatible MariaDB instead: +Debian 12 does not ship MySQL in its repositories anymore, so we use the compatible MariaDB instead: 1. Install maria-db with: diff --git a/docs/upgrade/1_to_2.md b/docs/upgrade/1_to_2.md new file mode 100644 index 00000000..f5b3b085 --- /dev/null +++ b/docs/upgrade/1_to_2.md @@ -0,0 +1,89 @@ +--- +layout: default +title: Upgrade from Part-DB 1.x to 2.x +nav_order: 1 +has_children: false +parent: Upgrade +--- + +# Upgrade from Part-DB 1.x to 2.x + +Part-DB 2.0 is a major release that changes a lot of things internally, but it is still compatible with Part-DB 1.x. +Depending on your preferences, you will have to do some changes to your Part-DB installation, this document will guide +you through the upgrade process. + +## New requirements +*If you are running Part-DB inside a docker container, you can skip this section, as the new requirements are already +fulfilled by the official Part-DB docker image.* + +Part-DB 2.0 requires at least PHP 8.2 (newer versions are recommended). So if your existing Part-DB installation is still +running PHP 8.1, you will have to upgrade your PHP version first. +The minimum required version of node.js is now 20.0 or newer, so if you are using 18.0, you will have to upgrade it too. + +Most distributions should have the possibility to get backports for PHP 8.4 and modern nodejs, so you should be able to +easily upgrade your system to the new requirements. Otherwise, you can use the official Part-DB docker image, which +ships all required dependencies and is always up to date with the latest requirements, so that you do not have to worry +about the requirements at all. + +## Changes +* Configuration is now preferably done via a web settings interface. You can still use environment variables, these overwrite +the settings in the web interface. Existing configuration will still work, but you should consider migriting them to the +web interface as described below. +* The `config/banner.md` file that could been used to customize the banner text, was removed. You can now set the banner text + directly in the admin interface, or by setting the `BANNER` environment variable. If you want to keep your existing + banner text, you will have to copy it from the `config/banner.md` file to the admin interface or set the `BANNER` + environment variable. +* The parameters `partdb.sidebar.items`, `partdb.sidebar.root_node_enable` and `partdb.sidebar.root_expanded` in `config/parameters.yaml`, +were removed. You can configure them now directly in the admin interface. +* Updated icon set. As fontawesome 7 is now used, some icons have changed slightly. + +## Upgrade installation + +The upgrade process works very similar to a normal (minor release) upgrade. + +### Direct installation + +**Be sure to execute the following steps as the user that owns the Part-DB files (e.g. `www-data`, or your webserver user). So prepend a `sudo -u wwww-data` where necessary.** + +1. Make a backup of your existing Part-DB installation, including the database, data directories and the configuration files and `.env.local` file. +The `php bin/console partdb:backup` command can help you with this. +2. Pull the v2 version. For git installation you can do this with `git checkout v2.0.0` (or newer version) +3. Run `composer install --no-dev -o` to update the dependencies. +4. Run `yarn install` and `yarn build` to update the frontend assets. +5. Rund `php bin/console doctrine:migrations:migrate` to update the database schema. +6. Clear the cache with `php bin/console cache:clear`. +7. Open your Part-DB instance in the browser and log in as an admin user. +8. Go to the user or group permissions page, and give yourself (and other administrators) the right to change system settings (under "System" and "Configuration"). +9. You can now go to the settings page (under "System" and "Settings") and check if all settings are correct. +10. Parameters which were previously set via environment variables are greyed out and cannot be changed in the web interface. +If you want to change them, you must migrate them to the settings interface as described below. + +### Docker installation +1. Make a backup of your existing Part-DB installation, including the database, data directories and the configuration files and the file where you configure the docker environment variables. +2. Stop the existing Part-DB container with `docker compose down` +3. Ensure that your docker compose file uses the new latest images (either `latest` or `2` tag). +4. Pull the new images with `docker compose pull` and start the container with `docker compose up -d` +5. If you have database automigration disabled, run `docker exec --user=www-data partdb php bin/console doctrine:migrations:migrate` to update the database schema. +6. Open your Part-DB instance in the browser and log in as an admin user. +7. Go to the user or group permissions page, and give yourself (and other administrators) +the right to change system settings (under "System" and "Configuration"). +8. You can now go to the settings page (under "System" and "Settings") +9. Parameters which were previously set via environment variables are greyed out and cannot be changed in the web interface. +If you want to change them, you must migrate them to the settings interface as described below. + +## Migrate environment variable configuration to settings interface +As described above, configuration can now be done via the web interface, and can be overwritten by environment variables, so +that existing configuration should still work. However, if a parameter is set via an environment variable, it cannot be changed in the web interface. +To change it, you must migrate your environment variable configuration to the new system. + +For this there is the new console command `settings:migrate-env-to-settings`, which reads in all environment variables used to overwrite +settings and write them to the database, so that you can safely delete them from your environment variable configuration afterwards, without +loosing your configuration. + +To run the command, execute `php bin/console settings:migrate-env-to-settings --all` as webserver user (or run `docker exec --user=www-data -it partdb php bin/console settings:migrate-env-to-settings --all` for docker containers). +It will list you all environment variables, it found and ask you for confirmation to migrate them. Answer with `yes` to migrate them and hit enter. + +After the migration run successfully, the contents of your environment variables are now stored in the database and you can safely remove them from your environment variable configuration. +Go through the environment variables listed by the command and remove them from your environment variable configuration (e.g. `.env.local` file or docker compose file), or just comment them out for now. + +If you want to keep some environment variables, just leave them as they are, they will still work as before, the migration command only affects the settings stored in the database. diff --git a/docs/upgrade/index.md b/docs/upgrade/index.md new file mode 100644 index 00000000..95a9cc33 --- /dev/null +++ b/docs/upgrade/index.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Upgrade +nav_order: 7 +has_children: true +--- + +This section provides information on how to upgrade Part-DB to the latest version. +This is intended for major release upgrades, where requirements or things changes significantly. diff --git a/docs/upgrade_legacy.md b/docs/upgrade/upgrade_legacy.md similarity index 97% rename from docs/upgrade_legacy.md rename to docs/upgrade/upgrade_legacy.md index e1e43831..4dd29e4d 100644 --- a/docs/upgrade_legacy.md +++ b/docs/upgrade/upgrade_legacy.md @@ -2,6 +2,8 @@ layout: default title: Upgrade from legacy Part-DB version (<1.0) nav_order: 100 +redirect_from: /upgrade_legacy +parent: Upgrade --- # Upgrade from legacy Part-DB version @@ -16,8 +18,8 @@ sections carefully before proceeding to upgrade. ## Changes -* PHP 8.1 or higher is required now (Part-DB 0.5 required PHP 5.4+, Part-DB 0.6 PHP 7.0). - Releases are available for Windows too, so almost everybody should be able to use PHP 8.1 +* PHP 8.2 or higher is required now (Part-DB 0.5 required PHP 5.4+, Part-DB 0.6 PHP 7.0). + Releases are available for Windows too, so almost everybody should be able to use PHP 8.2 * **Console access is highly recommended.** The installation of composer and frontend dependencies require console access, also more sensitive stuff like database migration works via CLI now, so you should have console access on your server. * Markdown/HTML is now used instead of BBCode for rich text in description and command fields. diff --git a/docs/usage/console_commands.md b/docs/usage/console_commands.md index e5197251..173f7b78 100644 --- a/docs/usage/console_commands.md +++ b/docs/usage/console_commands.md @@ -66,6 +66,8 @@ docker exec --user=www-data partdb php bin/console cache:clear * `partdb:migrations:import-partkeepr`: Imports a mysqldump XML dump of a PartKeepr database into Part-DB. This is only needed for users, which want to migrate from PartKeepr to Part-DB. *All existing data in the Part-DB database is deleted!* +* `settings:migrate-env-to-settings`: Migrate configuration from environment variables to the settings interface. +The value of the environment variable is copied to the settings database, so the environment variable can be removed afterwards without losing the configuration. ## Database commands @@ -76,4 +78,4 @@ docker exec --user=www-data partdb php bin/console cache:clear * `php bin/console partdb:attachments:download`: Download all attachments, which are not already downloaded, to the local filesystem. This is useful to create local backups of the attachments, no matter what happens on the remote and - also makes pictures thumbnails available for the frontend for them \ No newline at end of file + also makes pictures thumbnails available for the frontend for them diff --git a/docs/usage/getting_started.md b/docs/usage/getting_started.md index 4bb8afb9..4b9a809a 100644 --- a/docs/usage/getting_started.md +++ b/docs/usage/getting_started.md @@ -12,11 +12,19 @@ Before starting, it's useful to read a bit about the [concepts of Part-DB]({% li 1. TOC {:toc} -## Customize config files +## Customize system settings -Before you start creating data structures, you should configure Part-DB to your needs by changing possible configuration -options. -This is done either via changing the `.env.local` file in a direct installation or by changing the env variables in +Before starting creating datastructures, you should check the system settings to ensure that they fit your needs. +After login as an administrator, you can find the settings in the sidebar under `Tools -> System -> Settings`. +![image]({% link assets/getting_started/system_settings.png %}) + +Here you can change various settings, like the name of your Part-DB instance (which is shown in the title bar of the +browser), the default language (which is used if no user preference is set), the default timezone (which is used to +display times correctly), the default currency (which is used to display prices correctly), and many more. + +Some more fundamental settings like database connection, mail server settings, SSO, etc. are configured via environment variables. +Environment variables also allow to overwrite various settings from the web interface. +Environment variables can be changed by editing the `.env.local` file in a direct installation or by changing the env variables in your `docker-compose.yaml` file. A list of possible configuration options can be found [here]({% link configuration.md %}). @@ -44,8 +52,8 @@ used. ## (Optional) Customize homepage banner -The banner which is shown on the homepage, can be customized/changed by changing the `config/banner.md` file with a text -editor. You can use markdown and (safe) HTML here, to style and customize the banner. +The banner which is shown on the homepage, can be customized/changed via the homepage banner setting in system settings. +You can use markdown and (safe) HTML here, to style and customize the banner. You can even use LaTeX-style equations by wrapping the expressions into `$` (like `$E=mc^2$`, which is rendered inline: $E=mc^2$) or `$$` (like `$$E=mc^2$$`) which will be rendered as a block, like so: $$E=mc^2$$ @@ -202,4 +210,4 @@ later. You can choose from your created datastructures to add manufacturer information, supplier information, etc. to the part. You can also create new datastructures on the fly, if you want to add additional information to the part, by typing the name of the new datastructure in the field and select the "New ..." option in the dropdown menu. See [tips]({% link -usage/tips_tricks.md %}) for more information. \ No newline at end of file +usage/tips_tricks.md %}) for more information. diff --git a/docs/usage/import_export.md b/docs/usage/import_export.md index e43936cc..0534221f 100644 --- a/docs/usage/import_export.md +++ b/docs/usage/import_export.md @@ -20,7 +20,7 @@ Part-DB. Data can also be exported from Part-DB into various formats. > individually in the permissions settings. If you want to import data from PartKeepr you might want to look into the [PartKeepr migration guide]({% link -upgrade_legacy.md %}). +upgrade/upgrade_legacy.md %}). ### Import parts @@ -158,4 +158,4 @@ information, this can lead to very large export files. You can export parts in all part tables. Select the parts you want via the checkbox in the table line and select the export format and level in the appearing menu. -See the section about exporting data structures for more information about the export formats and levels. \ No newline at end of file +See the section about exporting data structures for more information about the export formats and levels. diff --git a/docs/usage/information_provider_system.md b/docs/usage/information_provider_system.md index 8de83a8e..953db409 100644 --- a/docs/usage/information_provider_system.md +++ b/docs/usage/information_provider_system.md @@ -80,6 +80,11 @@ Normally the providers utilize an API of a service, and you need to create an ac Also, there are limits on how many requests you can do per day or month, depending on the provider and your contract with them. +Data providers can be either configured in the system settings (in the info provider tab) or on the settings page which is +reachable via the cogwheel symbol next to the provider in the provider list. It is also possible to configure them via +environment variables. See below for the available configuration options. API keys configured via environment variables +are redacted in the settings interface. + The following providers are currently available and shipped with Part-DB: (All trademarks are property of their respective owners. Part-DB is not affiliated with any of the companies.) diff --git a/docs/usage/tips_tricks.md b/docs/usage/tips_tricks.md index d033cbe8..6eda718d 100644 --- a/docs/usage/tips_tricks.md +++ b/docs/usage/tips_tricks.md @@ -95,4 +95,9 @@ It is only be shown to users which has the `Show available Part-DB updates` perm For the notification to work, Part-DB queries the GitHub API every 2 days to check for new releases. No data is sent to GitHub besides the metadata required for the connection (so the public IP address of your computer running Part-DB). If you don't want Part-DB to query the GitHub API, or if your server can not reach the internet, you can disable the -update notifications by setting the `CHECK_FOR_UPDATES` option to `false`. \ No newline at end of file +update notifications by setting the `CHECK_FOR_UPDATES` option to `false`. + +## Internet access via proxy +If you server running Part-DB does not have direct access to the internet, but has to use a proxy server, you can configure +the proxy settings in the `.env.local` file (or docker env config). You can set the `HTTP_PROXY` and `HTTPS_PROXY` environment +variables to the URL of your proxy server. If your proxy server requires authentication, you can include the username and password in the URL. diff --git a/migrations/Version20221114193325.php b/migrations/Version20221114193325.php index 9766ccf3..bc2a97fa 100644 --- a/migrations/Version20221114193325.php +++ b/migrations/Version20221114193325.php @@ -4,18 +4,15 @@ declare(strict_types=1); namespace DoctrineMigrations; +use App\Doctrine\Migration\ContainerAwareMigrationInterface; use App\Migration\AbstractMultiPlatformMigration; use App\Migration\WithPermPresetsTrait; use App\Services\UserSystem\PermissionPresetsHelper; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Schema\Schema; use Psr\Log\LoggerInterface; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; -/** - * Auto-generated Migration: Please modify to your needs! - */ -final class Version20221114193325 extends AbstractMultiPlatformMigration implements ContainerAwareInterface +final class Version20221114193325 extends AbstractMultiPlatformMigration implements ContainerAwareMigrationInterface { use WithPermPresetsTrait; diff --git a/migrations/Version20240606203053.php b/migrations/Version20240606203053.php index 83370ad6..1c7d2bf9 100644 --- a/migrations/Version20240606203053.php +++ b/migrations/Version20240606203053.php @@ -4,16 +4,16 @@ declare(strict_types=1); namespace DoctrineMigrations; +use App\Doctrine\Migration\ContainerAwareMigrationInterface; use App\Migration\AbstractMultiPlatformMigration; use App\Migration\WithPermPresetsTrait; use App\Services\UserSystem\PermissionPresetsHelper; use Doctrine\DBAL\Schema\Schema; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20240606203053 extends AbstractMultiPlatformMigration implements ContainerAwareInterface +final class Version20240606203053 extends AbstractMultiPlatformMigration implements ContainerAwareMigrationInterface { use WithPermPresetsTrait; diff --git a/migrations/Version20250706201121.php b/migrations/Version20250706201121.php new file mode 100644 index 00000000..b7563978 --- /dev/null +++ b/migrations/Version20250706201121.php @@ -0,0 +1,49 @@ +addSql('CREATE TABLE settings_entry (`key` VARCHAR(255) NOT NULL, `data` JSON DEFAULT NULL, id INT AUTO_INCREMENT NOT NULL, UNIQUE INDEX UNIQ_93F8DB394E645A7E (`key`), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`'); + + } + + public function mySQLDown(Schema $schema): void + { + $this->addSql('DROP TABLE settings_entry'); + } + + public function sqLiteUp(Schema $schema): void + { + $this->addSql('CREATE TABLE settings_entry ("key" VARCHAR(255) NOT NULL, "data" CLOB DEFAULT NULL, id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_93F8DB39F48571EB ON settings_entry ("key")'); + } + + public function sqLiteDown(Schema $schema): void + { + $this->addSql('DROP TABLE settings_entry'); + } + + public function postgreSQLUp(Schema $schema): void + { + $this->addSql('CREATE TABLE settings_entry ("key" VARCHAR(255) NOT NULL, "data" JSON DEFAULT NULL, id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_93F8DB39F48571EB ON settings_entry ("key")'); + } + + public function postgreSQLDown(Schema $schema): void + { + $this->addSql('DROP TABLE settings_entry'); + } +} diff --git a/migrations/Version20250813214628.php b/migrations/Version20250813214628.php new file mode 100644 index 00000000..5b9350b2 --- /dev/null +++ b/migrations/Version20250813214628.php @@ -0,0 +1,75 @@ +connection; + $rows = $connection->fetchAllAssociative('SELECT id, transports, other_ui FROM webauthn_keys'); + + foreach ($rows as $row) { + $id = $row['id']; + $new_transports = json_encode(unserialize($row['transports'], ['allowed_classes' => false]), + JSON_THROW_ON_ERROR); + $new_other_ui = json_encode(unserialize($row['other_ui'], ['allowed_classes' => false]), + JSON_THROW_ON_ERROR); + + $connection->executeStatement( + 'UPDATE webauthn_keys SET transports = :transports, other_ui = :other_ui WHERE id = :id', + [ + 'transports' => $new_transports, + 'other_ui' => $new_other_ui, + 'id' => $id, + ] + ); + } + } + + public function mySQLUp(Schema $schema): void + { + $this->convertArrayToJson(); + $this->addSql('ALTER TABLE webauthn_keys CHANGE transports transports JSON NOT NULL, CHANGE other_ui other_ui JSON DEFAULT NULL'); + } + + public function mySQLDown(Schema $schema): void + { + $this->addSql('ALTER TABLE webauthn_keys CHANGE transports transports LONGTEXT NOT NULL, CHANGE other_ui other_ui LONGTEXT DEFAULT NULL'); + } + + public function sqLiteUp(Schema $schema): void + { + //As there is no JSON type in SQLite, we only need to convert the data. + $this->convertArrayToJson(); + } + + public function sqLiteDown(Schema $schema): void + { + //Nothing to do here, as SQLite does not support JSON type and we are not changing the column type. + } + + public function postgreSQLUp(Schema $schema): void + { + $this->convertArrayToJson(); + $this->addSql('ALTER TABLE webauthn_keys ALTER transports TYPE JSON USING transports::JSON'); + $this->addSql('ALTER TABLE webauthn_keys ALTER other_ui TYPE JSON USING other_ui::JSON'); + } + + public function postgreSQLDown(Schema $schema): void + { + $this->addSql('ALTER TABLE webauthn_keys ALTER transports TYPE TEXT'); + $this->addSql('ALTER TABLE webauthn_keys ALTER other_ui TYPE TEXT'); + } +} diff --git a/package.json b/package.json index 1b00611a..7a3efaa4 100644 --- a/package.json +++ b/package.json @@ -2,11 +2,11 @@ "devDependencies": { "@babel/core": "^7.19.6", "@babel/preset-env": "^7.19.4", - "@fortawesome/fontawesome-free": "^6.1.1", + "@fortawesome/fontawesome-free": "^7.0.0", "@hotwired/stimulus": "^3.0.0", "@hotwired/turbo": "^8.0.1", "@popperjs/core": "^2.10.2", - "@symfony/stimulus-bridge": "^3.2.0", + "@symfony/stimulus-bridge": "^4.0.0", "@symfony/ux-translator": "file:vendor/symfony/ux-translator/assets", "@symfony/ux-turbo": "file:vendor/symfony/ux-turbo/assets", "@symfony/webpack-encore": "^5.0.0", @@ -29,54 +29,28 @@ "watch": "encore dev --watch", "build": "encore production --progress" }, + "engines": { + "node": ">=20.0.0" + }, "dependencies": { "@algolia/autocomplete-js": "^1.17.0", "@algolia/autocomplete-plugin-recent-searches": "^1.17.0", "@algolia/autocomplete-theme-classic": "^1.17.0", - "@ckeditor/ckeditor5-alignment": "^44.0.0", - "@ckeditor/ckeditor5-autoformat": "^44.0.0", - "@ckeditor/ckeditor5-basic-styles": "^44.0.0", - "@ckeditor/ckeditor5-block-quote": "^44.0.0", - "@ckeditor/ckeditor5-code-block": "^44.0.0", "@ckeditor/ckeditor5-dev-translations": "^43.0.1", - "@ckeditor/ckeditor5-dev-utils": "43.0.*", - "@ckeditor/ckeditor5-editor-classic": "^44.0.0", - "@ckeditor/ckeditor5-essentials": "^44.0.0", - "@ckeditor/ckeditor5-find-and-replace": "^44.0.0", - "@ckeditor/ckeditor5-font": "^44.0.0", - "@ckeditor/ckeditor5-heading": "^44.0.0", - "@ckeditor/ckeditor5-highlight": "^44.0.0", - "@ckeditor/ckeditor5-horizontal-line": "^44.0.0", - "@ckeditor/ckeditor5-html-embed": "^44.0.0", - "@ckeditor/ckeditor5-html-support": "^44.0.0", - "@ckeditor/ckeditor5-image": "^44.0.0", - "@ckeditor/ckeditor5-indent": "^44.0.0", - "@ckeditor/ckeditor5-link": "^44.0.0", - "@ckeditor/ckeditor5-list": "^44.0.0", - "@ckeditor/ckeditor5-markdown-gfm": "^44.0.0", - "@ckeditor/ckeditor5-media-embed": "^44.0.0", - "@ckeditor/ckeditor5-paragraph": "^44.0.0", - "@ckeditor/ckeditor5-paste-from-office": "^44.0.0", - "@ckeditor/ckeditor5-remove-format": "^44.0.0", - "@ckeditor/ckeditor5-source-editing": "^44.0.0", - "@ckeditor/ckeditor5-special-characters": "^44.0.0", - "@ckeditor/ckeditor5-table": "^44.0.0", - "@ckeditor/ckeditor5-theme-lark": "^44.0.0", - "@ckeditor/ckeditor5-upload": "^44.0.0", - "@ckeditor/ckeditor5-watchdog": "^44.0.0", - "@ckeditor/ckeditor5-word-count": "^44.0.0", + "@ckeditor/ckeditor5-dev-utils": "^43.0.1", "@jbtronics/bs-treeview": "^1.0.1", - "@part-db/html5-qrcode": "^3.1.0", + "@part-db/html5-qrcode": "^4.0.0", "@zxcvbn-ts/core": "^3.0.2", "@zxcvbn-ts/language-common": "^3.0.3", "@zxcvbn-ts/language-de": "^3.0.1", "@zxcvbn-ts/language-en": "^3.0.1", "@zxcvbn-ts/language-fr": "^3.0.1", "@zxcvbn-ts/language-ja": "^3.0.1", - "barcode-detector": "^2.3.1", + "barcode-detector": "^3.0.5", "bootbox": "^6.0.0", "bootswatch": "^5.1.3", "bs-custom-file-input": "^1.3.4", + "ckeditor5": "^46.0.0", "clipboard": "^2.0.4", "compression-webpack-plugin": "^11.1.0", "datatables.net": "^2.0.0", @@ -85,14 +59,13 @@ "datatables.net-colreorder-bs5": "^2.0.0", "datatables.net-fixedheader-bs5": "^4.0.0", "datatables.net-responsive-bs5": "^3.0.0", - "datatables.net-select-bs5": "^2.0.0", + "datatables.net-select-bs5": "^3.0.1", "dompurify": "^3.0.3", - "emoji.json": "^15.0.0", "exports-loader": "^5.0.0", "json-formatter-js": "^2.3.4", "jszip": "^3.2.0", "katex": "^0.16.0", - "marked": "^15.0.4", + "marked": "^16.1.1", "marked-gfm-heading-id": "^4.1.1", "marked-mangle": "^1.0.1", "pdfmake": "^0.2.2", diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 7ee7596f..4a37b420 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,36 +1,42 @@ - - - - - - - - - - - - src - - - - - tests - - - - - - - - + xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" + colors="true" + failOnDeprecation="true" + failOnNotice="true" + failOnWarning="true" + bootstrap="tests/bootstrap.php" + cacheDirectory=".phpunit.cache" + backupGlobals="false" +> + + + + + + + + + + + + + src + + + + + + tests + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess index bfaab5de..a13baeee 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -86,7 +86,7 @@ DirectoryIndex index.php # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the # following RewriteCond (best solution) RewriteCond %{ENV:REDIRECT_STATUS} ="" - RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] + RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=308,L] # If the requested filename exists, simply serve it. # We only want to let Apache serve files and not directories. diff --git a/rector.php b/rector.php index 40eee9f7..936b447e 100644 --- a/rector.php +++ b/rector.php @@ -7,6 +7,7 @@ use Rector\CodingStyle\Rector\FuncCall\CountArrayToEmptyArrayComparisonRector; use Rector\Config\RectorConfig; use Rector\Doctrine\Set\DoctrineSetList; use Rector\PHPUnit\CodeQuality\Rector\Class_\PreferPHPUnitThisCallRector; +use Rector\PHPUnit\CodeQuality\Rector\MethodCall\AssertEmptyNullableObjectToAssertInstanceofRector; use Rector\PHPUnit\Set\PHPUnitSetList; use Rector\Set\ValueObject\LevelSetList; use Rector\Set\ValueObject\SetList; @@ -16,6 +17,61 @@ use Rector\Symfony\CodeQuality\Rector\MethodCall\LiteralGetToRequestClassConstan use Rector\Symfony\Set\SymfonySetList; use Rector\TypeDeclaration\Rector\StmtsAwareInterface\DeclareStrictTypesRector; +return RectorConfig::configure() + ->withComposerBased(phpunit: true) + + ->withSymfonyContainerPhp(__DIR__ . '/tests/symfony-container.php') + ->withSymfonyContainerXml(__DIR__ . '/var/cache/dev/App_KernelDevDebugContainer.xml') + + ->withImportNames(importShortClasses: false) + ->withPaths([ + __DIR__ . '/config', + __DIR__ . '/public', + __DIR__ . '/src', + __DIR__ . '/tests', + ]) + + ->withSets([ + PHPUnitSetList::ANNOTATIONS_TO_ATTRIBUTES, + PHPUnitSetList::PHPUNIT_90, + PHPUnitSetList::PHPUNIT_110, + PHPUnitSetList::PHPUNIT_CODE_QUALITY, + + + ]) + + ->withRules([ + DeclareStrictTypesRector::class + ]) + + ->withSkip([ + //Leave our AssertNull tests alone + AssertEmptyNullableObjectToAssertInstanceofRector::class, + + + CountArrayToEmptyArrayComparisonRector::class, + //Leave our !== null checks alone + FlipTypeControlToUseExclusiveTypeRector::class, + //Leave our PartList TableAction alone + ActionSuffixRemoverRector::class, + //We declare event listeners via attributes, therefore no need to migrate them to subscribers + EventListenerToEventSubscriberRector::class, + PreferPHPUnitThisCallRector::class, + //Do not replace 'GET' with class constant, + LiteralGetToRequestClassConstantRector::class, + ]) + + //Do not apply rules to Symfony own files + ->withSkip([ + __DIR__ . '/public/index.php', + __DIR__ . '/src/Kernel.php', + __DIR__ . '/config/preload.php', + __DIR__ . '/config/bundles.php', + ]) + + ; + +/* return static function (RectorConfig $rectorConfig): void { $rectorConfig->symfonyContainerXml(__DIR__ . '/var/cache/dev/App_KernelDevDebugContainer.xml'); $rectorConfig->symfonyContainerPhp(__DIR__ . '/tests/symfony-container.php'); @@ -79,3 +135,4 @@ return static function (RectorConfig $rectorConfig): void { __DIR__ . '/config/bundles.php', ]); }; +*/ diff --git a/src/ApiPlatform/DocumentedAPIProperties/PropertyMetadataFactory.php b/src/ApiPlatform/DocumentedAPIProperties/PropertyMetadataFactory.php index 49e9a031..2ffb9179 100644 --- a/src/ApiPlatform/DocumentedAPIProperties/PropertyMetadataFactory.php +++ b/src/ApiPlatform/DocumentedAPIProperties/PropertyMetadataFactory.php @@ -70,4 +70,4 @@ class PropertyMetadataFactory implements PropertyMetadataFactoryInterface return $metadata; } -} \ No newline at end of file +} diff --git a/src/Command/CheckRequirementsCommand.php b/src/Command/CheckRequirementsCommand.php index 5e15e8e2..f9080c42 100644 --- a/src/Command/CheckRequirementsCommand.php +++ b/src/Command/CheckRequirementsCommand.php @@ -69,8 +69,8 @@ class CheckRequirementsCommand extends Command if ($io->isVerbose()) { $io->comment('Checking PHP version...'); } - //We recommend PHP 8.2, but 8.1 is the minimum - if (PHP_VERSION_ID < 80200) { + //We recommend PHP 8.2, but 8.2 is the minimum + if (PHP_VERSION_ID < 80400) { $io->warning('You are using PHP '. PHP_VERSION .'. This will work, but a newer version is recommended.'); } elseif (!$only_issues) { $io->success('PHP version is sufficient.'); @@ -84,7 +84,7 @@ class CheckRequirementsCommand extends Command $io->success('You are using a 64-bit system.'); } } else { - $io->warning('You are using a system with an unknown bit size. That is interesting xD'); + $io->warning(' areYou using a system with an unknown bit size. That is interesting xD'); } //Check if opcache is enabled diff --git a/src/Command/Migrations/ImportPartKeeprCommand.php b/src/Command/Migrations/ImportPartKeeprCommand.php index 98272440..aee71afe 100644 --- a/src/Command/Migrations/ImportPartKeeprCommand.php +++ b/src/Command/Migrations/ImportPartKeeprCommand.php @@ -44,7 +44,7 @@ class ImportPartKeeprCommand extends Command protected PKDatastructureImporter $datastructureImporter, protected PKPartImporter $partImporter, protected PKImportHelper $importHelper, protected PKOptionalImporter $optionalImporter) { - parent::__construct(self::$defaultName); + parent::__construct(); } protected function configure(): void diff --git a/src/Command/User/UpgradePermissionsSchemaCommand.php b/src/Command/User/UpgradePermissionsSchemaCommand.php index 4947fd5c..a53e21a0 100644 --- a/src/Command/User/UpgradePermissionsSchemaCommand.php +++ b/src/Command/User/UpgradePermissionsSchemaCommand.php @@ -39,14 +39,7 @@ final class UpgradePermissionsSchemaCommand extends Command { public function __construct(private readonly PermissionSchemaUpdater $permissionSchemaUpdater, private readonly EntityManagerInterface $em, private readonly EventCommentHelper $eventCommentHelper) { - parent::__construct(self::$defaultName); - } - - protected function configure(): void - { - $this - ->setDescription(self::$defaultDescription) - ; + parent::__construct(); } protected function execute(InputInterface $input, OutputInterface $output): int diff --git a/src/Command/User/UsersPermissionsCommand.php b/src/Command/User/UsersPermissionsCommand.php index 6408e9c9..27382371 100644 --- a/src/Command/User/UsersPermissionsCommand.php +++ b/src/Command/User/UsersPermissionsCommand.php @@ -46,7 +46,7 @@ class UsersPermissionsCommand extends Command { $this->userRepository = $entityManager->getRepository(User::class); - parent::__construct(self::$defaultName); + parent::__construct(); } protected function configure(): void diff --git a/src/Controller/InfoProviderController.php b/src/Controller/InfoProviderController.php index a6ce3f1b..a6e886e6 100644 --- a/src/Controller/InfoProviderController.php +++ b/src/Controller/InfoProviderController.php @@ -29,10 +29,14 @@ use App\Form\InfoProviderSystem\PartSearchType; use App\Services\InfoProviderSystem\ExistingPartFinder; use App\Services\InfoProviderSystem\PartInfoRetriever; use App\Services\InfoProviderSystem\ProviderRegistry; +use App\Settings\AppSettings; use Doctrine\ORM\EntityManagerInterface; +use Jbtronics\SettingsBundle\Form\SettingsFormFactoryInterface; +use Jbtronics\SettingsBundle\Manager\SettingsManagerInterface; use Psr\Log\LoggerInterface; use Symfony\Bridge\Doctrine\Attribute\MapEntity; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\HttpClient\Exception\ClientException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -46,7 +50,9 @@ class InfoProviderController extends AbstractController public function __construct(private readonly ProviderRegistry $providerRegistry, private readonly PartInfoRetriever $infoRetriever, - private readonly ExistingPartFinder $existingPartFinder + private readonly ExistingPartFinder $existingPartFinder, + private readonly SettingsManagerInterface $settingsManager, + private readonly SettingsFormFactoryInterface $settingsFormFactory ) { @@ -63,6 +69,48 @@ class InfoProviderController extends AbstractController ]); } + #[Route('/provider/{provider}/settings', name: 'info_providers_provider_settings')] + public function providerSettings(string $provider, Request $request): Response + { + $this->denyAccessUnlessGranted('@config.change_system_settings'); + $this->denyAccessUnlessGranted('@info_providers.create_parts'); + + $providerInstance = $this->providerRegistry->getProviderByKey($provider); + $settingsClass = $providerInstance->getProviderInfo()['settings_class'] ?? throw new \LogicException('Provider ' . $provider . ' does not have a settings class defined'); + + //Create a clone of the settings object + $settings = $this->settingsManager->createTemporaryCopy($settingsClass); + + //Create a form builder for the settings object + $builder = $this->settingsFormFactory->createSettingsFormBuilder($settings); + + //Add a submit button to the form + $builder->add('submit', SubmitType::class, ['label' => 'save']); + + //Create the form + $form = $builder->getForm(); + $form->handleRequest($request); + + //If the form was submitted and is valid, save the settings + if ($form->isSubmitted() && $form->isValid()) { + $this->settingsManager->mergeTemporaryCopy($settings); + $this->settingsManager->save($settings); + + $this->addFlash('success', t('settings.flash.saved')); + } + + if ($form->isSubmitted() && !$form->isValid()) { + $this->addFlash('error', t('settings.flash.invalid')); + } + + //Render the form + return $this->render('info_providers/settings/provider_settings.html.twig', [ + 'form' => $form, + 'info_provider_key' => $provider, + 'info_provider_info' => $providerInstance->getProviderInfo(), + ]); + } + #[Route('/search', name: 'info_providers_search')] #[Route('/update/{target}', name: 'info_providers_update_part_search')] public function search(Request $request, #[MapEntity(id: 'target')] ?Part $update_target, LoggerInterface $exceptionLogger): Response @@ -128,4 +176,4 @@ class InfoProviderController extends AbstractController 'update_target' => $update_target ]); } -} \ No newline at end of file +} diff --git a/src/Controller/SettingsController.php b/src/Controller/SettingsController.php index 3b0eb15c..3479cf84 100644 --- a/src/Controller/SettingsController.php +++ b/src/Controller/SettingsController.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace App\Controller; +use Symfony\Component\Form\Extension\Core\Type\SubmitType; use App\Settings\AppSettings; use Jbtronics\SettingsBundle\Form\SettingsFormFactoryInterface; use Jbtronics\SettingsBundle\Manager\SettingsManagerInterface; @@ -32,6 +33,8 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; use Symfony\Contracts\Cache\TagAwareCacheInterface; +use function Symfony\Component\Translation\t; + class SettingsController extends AbstractController { public function __construct(private readonly SettingsManagerInterface $settingsManager, private readonly SettingsFormFactoryInterface $settingsFormFactory) @@ -40,6 +43,8 @@ class SettingsController extends AbstractController #[Route("/settings", name: "system_settings")] public function systemSettings(Request $request, TagAwareCacheInterface $cache): Response { + $this->denyAccessUnlessGranted('@config.change_system_settings'); + //Create a clone of the settings object $settings = $this->settingsManager->createTemporaryCopy(AppSettings::class); @@ -47,7 +52,7 @@ class SettingsController extends AbstractController $builder = $this->settingsFormFactory->createSettingsFormBuilder($settings); //Add a submit button to the form - $builder->add('submit', \Symfony\Component\Form\Extension\Core\Type\SubmitType::class, ['label' => 'save']); + $builder->add('submit', SubmitType::class, ['label' => 'save']); //Create the form $form = $builder->getForm(); @@ -60,14 +65,17 @@ class SettingsController extends AbstractController //It might be possible, that the tree settings have changed, so clear the cache $cache->invalidateTags(['tree_treeview', 'sidebar_tree_update']); + + $this->addFlash('success', t('settings.flash.saved')); } - - + if ($form->isSubmitted() && !$form->isValid()) { + $this->addFlash('error', t('settings.flash.invalid')); + } //Render the form return $this->render('settings/settings.html.twig', [ 'form' => $form ]); } -} \ No newline at end of file +} diff --git a/src/Doctrine/Migration/ContainerAwareMigrationFactory.php b/src/Doctrine/Migration/ContainerAwareMigrationFactory.php new file mode 100644 index 00000000..81565c0e --- /dev/null +++ b/src/Doctrine/Migration/ContainerAwareMigrationFactory.php @@ -0,0 +1,55 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Doctrine\Migration; + +use App\Services\UserSystem\PermissionPresetsHelper; +use Doctrine\Migrations\AbstractMigration; +use Doctrine\Migrations\Version\MigrationFactory; +use Symfony\Component\DependencyInjection\Attribute\AsDecorator; +use Symfony\Component\DependencyInjection\Attribute\AutowireLocator; +use Psr\Container\ContainerInterface; + +#[AsDecorator("doctrine.migrations.migrations_factory")] +class ContainerAwareMigrationFactory implements MigrationFactory +{ + public function __construct(private readonly MigrationFactory $decorated, + //List all services that should be available in migrations here + #[AutowireLocator([ + PermissionPresetsHelper::class + ])] + private readonly ContainerInterface $container) + { + } + + public function createVersion(string $migrationClassName): AbstractMigration + { + $migration = $this->decorated->createVersion($migrationClassName); + + if ($migration instanceof ContainerAwareMigrationInterface) { + $migration->setContainer($this->container); + } + + return $migration; + } +} \ No newline at end of file diff --git a/src/Doctrine/Migration/ContainerAwareMigrationInterface.php b/src/Doctrine/Migration/ContainerAwareMigrationInterface.php new file mode 100644 index 00000000..bd92116a --- /dev/null +++ b/src/Doctrine/Migration/ContainerAwareMigrationInterface.php @@ -0,0 +1,31 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Doctrine\Migration; + +use Psr\Container\ContainerInterface; + +interface ContainerAwareMigrationInterface +{ + public function setContainer(?ContainerInterface $container = null): void; +} \ No newline at end of file diff --git a/src/Doctrine/Types/ArrayType.php b/src/Doctrine/Types/ArrayType.php deleted file mode 100644 index daab9b75..00000000 --- a/src/Doctrine/Types/ArrayType.php +++ /dev/null @@ -1,116 +0,0 @@ -. - */ - -declare(strict_types=1); - -namespace App\Doctrine\Types; - -use Doctrine\DBAL\Platforms\AbstractPlatform; -use Doctrine\DBAL\Types\Exception\SerializationFailed; -use Doctrine\DBAL\Types\Type; -use Doctrine\Deprecations\Deprecation; - -use function is_resource; -use function restore_error_handler; -use function serialize; -use function set_error_handler; -use function stream_get_contents; -use function unserialize; - -use const E_DEPRECATED; -use const E_USER_DEPRECATED; - -/** - * This class is taken from doctrine ORM 3.8. https://github.com/doctrine/dbal/blob/3.8.x/src/Types/ArrayType.php - * - * It was removed in doctrine ORM 4.0. However, we require it for backward compatibility with WebauthnKey. - * Therefore, we manually added it here as a custom type as a forward compatibility layer. - */ -class ArrayType extends Type -{ - /** - * {@inheritDoc} - */ - public function getSQLDeclaration(array $column, AbstractPlatform $platform): string - { - return $platform->getClobTypeDeclarationSQL($column); - } - - /** - * {@inheritDoc} - */ - public function convertToDatabaseValue(mixed $value, AbstractPlatform $platform): string - { - return serialize($value); - } - - /** - * {@inheritDoc} - */ - public function convertToPHPValue(mixed $value, AbstractPlatform $platform): mixed - { - if ($value === null) { - return null; - } - - $value = is_resource($value) ? stream_get_contents($value) : $value; - - set_error_handler(function (int $code, string $message): bool { - if ($code === E_DEPRECATED || $code === E_USER_DEPRECATED) { - return false; - } - - //Change to original code. Use SerializationFailed instead of ConversionException. - throw new SerializationFailed("Serialization failed (Code $code): " . $message); - }); - - try { - //Change to original code. Use false for allowed_classes, to avoid unsafe unserialization of objects. - return unserialize($value, ['allowed_classes' => false]); - } finally { - restore_error_handler(); - } - } - - /** - * {@inheritDoc} - */ - public function getName(): string - { - return "array"; - } - - /** - * {@inheritDoc} - * - * @deprecated - */ - public function requiresSQLCommentHint(AbstractPlatform $platform): bool - { - Deprecation::triggerIfCalledFromOutside( - 'doctrine/dbal', - 'https://github.com/doctrine/dbal/pull/5509', - '%s is deprecated.', - __METHOD__, - ); - - return true; - } -} \ No newline at end of file diff --git a/src/Entity/Base/AbstractDBElement.php b/src/Entity/Base/AbstractDBElement.php index 871a22d0..9fb5d648 100644 --- a/src/Entity/Base/AbstractDBElement.php +++ b/src/Entity/Base/AbstractDBElement.php @@ -39,6 +39,7 @@ use App\Entity\Attachments\SupplierAttachment; use App\Entity\Attachments\UserAttachment; use App\Entity\Parameters\AbstractParameter; use App\Entity\Parts\Category; +use App\Entity\PriceInformations\Pricedetail; use App\Entity\ProjectSystem\Project; use App\Entity\ProjectSystem\ProjectBOMEntry; use App\Entity\Parts\Footprint; @@ -67,7 +68,7 @@ use Symfony\Component\Serializer\Annotation\Groups; * Every database table which are managed with this class (or a subclass of it) * must have the table row "id"!! The ID is the unique key to identify the elements. */ -#[DiscriminatorMap(typeProperty: 'type', mapping: ['attachment_type' => AttachmentType::class, 'attachment' => Attachment::class, 'attachment_type_attachment' => AttachmentTypeAttachment::class, 'category_attachment' => CategoryAttachment::class, 'currency_attachment' => CurrencyAttachment::class, 'footprint_attachment' => FootprintAttachment::class, 'group_attachment' => GroupAttachment::class, 'label_attachment' => LabelAttachment::class, 'manufacturer_attachment' => ManufacturerAttachment::class, 'measurement_unit_attachment' => MeasurementUnitAttachment::class, 'part_attachment' => PartAttachment::class, 'project_attachment' => ProjectAttachment::class, 'storelocation_attachment' => StorageLocationAttachment::class, 'supplier_attachment' => SupplierAttachment::class, 'user_attachment' => UserAttachment::class, 'category' => Category::class, 'project' => Project::class, 'project_bom_entry' => ProjectBOMEntry::class, 'footprint' => Footprint::class, 'group' => Group::class, 'manufacturer' => Manufacturer::class, 'orderdetail' => Orderdetail::class, 'part' => Part::class, 'pricedetail' => 'App\Entity\PriceInformation\Pricedetail', 'storelocation' => StorageLocation::class, 'part_lot' => PartLot::class, 'currency' => Currency::class, 'measurement_unit' => MeasurementUnit::class, 'parameter' => AbstractParameter::class, 'supplier' => Supplier::class, 'user' => User::class])] +#[DiscriminatorMap(typeProperty: 'type', mapping: ['attachment_type' => AttachmentType::class, 'attachment' => Attachment::class, 'attachment_type_attachment' => AttachmentTypeAttachment::class, 'category_attachment' => CategoryAttachment::class, 'currency_attachment' => CurrencyAttachment::class, 'footprint_attachment' => FootprintAttachment::class, 'group_attachment' => GroupAttachment::class, 'label_attachment' => LabelAttachment::class, 'manufacturer_attachment' => ManufacturerAttachment::class, 'measurement_unit_attachment' => MeasurementUnitAttachment::class, 'part_attachment' => PartAttachment::class, 'project_attachment' => ProjectAttachment::class, 'storelocation_attachment' => StorageLocationAttachment::class, 'supplier_attachment' => SupplierAttachment::class, 'user_attachment' => UserAttachment::class, 'category' => Category::class, 'project' => Project::class, 'project_bom_entry' => ProjectBOMEntry::class, 'footprint' => Footprint::class, 'group' => Group::class, 'manufacturer' => Manufacturer::class, 'orderdetail' => Orderdetail::class, 'part' => Part::class, 'pricedetail' => Pricedetail::class, 'storelocation' => StorageLocation::class, 'part_lot' => PartLot::class, 'currency' => Currency::class, 'measurement_unit' => MeasurementUnit::class, 'parameter' => AbstractParameter::class, 'supplier' => Supplier::class, 'user' => User::class])] #[ORM\MappedSuperclass(repositoryClass: DBElementRepository::class)] abstract class AbstractDBElement implements JsonSerializable { diff --git a/src/Entity/SettingsEntry.php b/src/Entity/SettingsEntry.php new file mode 100644 index 00000000..488de1d1 --- /dev/null +++ b/src/Entity/SettingsEntry.php @@ -0,0 +1,35 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Entity; + +use Doctrine\DBAL\Types\Types; +use Jbtronics\SettingsBundle\Entity\AbstractSettingsORMEntry; +use Doctrine\ORM\Mapping as ORM; + +#[ORM\Entity] +class SettingsEntry extends AbstractSettingsORMEntry +{ + #[ORM\Id, ORM\GeneratedValue, ORM\Column(type: Types::INTEGER)] + protected int $id; +} \ No newline at end of file diff --git a/src/Entity/UserSystem/WebauthnKey.php b/src/Entity/UserSystem/WebauthnKey.php index b2716e07..7d3cb7b3 100644 --- a/src/Entity/UserSystem/WebauthnKey.php +++ b/src/Entity/UserSystem/WebauthnKey.php @@ -100,16 +100,19 @@ class WebauthnKey extends BasePublicKeyCredentialSource implements TimeStampable public static function fromRegistration(BasePublicKeyCredentialSource $registration): self { return new self( - $registration->getPublicKeyCredentialId(), - $registration->getType(), - $registration->getTransports(), - $registration->getAttestationType(), - $registration->getTrustPath(), - $registration->getAaguid(), - $registration->getCredentialPublicKey(), - $registration->getUserHandle(), - $registration->getCounter(), - $registration->getOtherUI() + publicKeyCredentialId: $registration->publicKeyCredentialId, + type: $registration->type, + transports: $registration->transports, + attestationType: $registration->attestationType, + trustPath: $registration->trustPath, + aaguid: $registration->aaguid, + credentialPublicKey: $registration->credentialPublicKey, + userHandle: $registration->userHandle, + counter: $registration->counter, + otherUI: $registration->otherUI, + backupEligible: $registration->backupEligible, + backupStatus: $registration->backupStatus, + uvInitialized: $registration->uvInitialized, ); } } diff --git a/src/EventSubscriber/SymfonyDebugToolbarSubscriber.php b/src/EventSubscriber/SymfonyDebugToolbarSubscriber.php deleted file mode 100644 index 6f17e399..00000000 --- a/src/EventSubscriber/SymfonyDebugToolbarSubscriber.php +++ /dev/null @@ -1,69 +0,0 @@ -. - */ - -declare(strict_types=1); - -namespace App\EventSubscriber; - -use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Component\HttpKernel\Event\ResponseEvent; - -/** - * This subscriber sets a Header in Debug mode that signals the Symfony Profiler to also update on Ajax requests. - */ -final class SymfonyDebugToolbarSubscriber implements EventSubscriberInterface -{ - public function __construct(private readonly bool $kernel_debug_enabled) - { - } - - /** - * Returns an array of event names this subscriber wants to listen to. - * - * The array keys are event names and the value can be: - * - * * The method name to call (priority defaults to 0) - * * An array composed of the method name to call and the priority - * * An array of arrays composed of the method names to call and respective - * priorities, or 0 if unset - * - * For instance: - * - * * ['eventName' => 'methodName'] - * * ['eventName' => ['methodName', $priority]] - * * ['eventName' => [['methodName1', $priority], ['methodName2']]] - * - * @return array The event names to listen to - */ - public static function getSubscribedEvents(): array - { - return ['kernel.response' => 'onKernelResponse']; - } - - public function onKernelResponse(ResponseEvent $event): void - { - if (!$this->kernel_debug_enabled) { - return; - } - - $response = $event->getResponse(); - $response->headers->set('Symfony-Debug-Toolbar-Replace', '1'); - } -} diff --git a/src/Form/CollectionTypeExtension.php b/src/Form/Extension/CollectionTypeExtension.php similarity index 99% rename from src/Form/CollectionTypeExtension.php rename to src/Form/Extension/CollectionTypeExtension.php index 4fa93852..52cd4186 100644 --- a/src/Form/CollectionTypeExtension.php +++ b/src/Form/Extension/CollectionTypeExtension.php @@ -39,7 +39,7 @@ declare(strict_types=1); * along with this program. If not, see . */ -namespace App\Form; +namespace App\Form\Extension; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; diff --git a/src/Form/PasswordTypeExtension.php b/src/Form/Extension/PasswordTypeExtension.php similarity index 67% rename from src/Form/PasswordTypeExtension.php rename to src/Form/Extension/PasswordTypeExtension.php index 64711c53..cc0486b0 100644 --- a/src/Form/PasswordTypeExtension.php +++ b/src/Form/Extension/PasswordTypeExtension.php @@ -1,4 +1,22 @@ . + */ declare(strict_types=1); @@ -20,7 +38,7 @@ declare(strict_types=1); * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -namespace App\Form; +namespace App\Form\Extension; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\Extension\Core\Type\PasswordType; diff --git a/src/Form/SelectTypeOrderExtension.php b/src/Form/Extension/SelectTypeOrderExtension.php similarity index 94% rename from src/Form/SelectTypeOrderExtension.php rename to src/Form/Extension/SelectTypeOrderExtension.php index bc7ca82f..e8e9a93f 100644 --- a/src/Form/SelectTypeOrderExtension.php +++ b/src/Form/Extension/SelectTypeOrderExtension.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace App\Form; +namespace App\Form\Extension; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; @@ -41,7 +41,7 @@ class SelectTypeOrderExtension extends AbstractTypeExtension ]; } - public function configureOptions(OptionsResolver $resolver) + public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefault('ordered', false); $resolver->setDefault('by_reference', function (Options $options) { @@ -50,11 +50,11 @@ class SelectTypeOrderExtension extends AbstractTypeExtension }); } - public function buildView(FormView $view, FormInterface $form, array $options) + public function buildView(FormView $view, FormInterface $form, array $options): void { //Pass the data in ordered form to the frontend controller, so it can make the items appear in the correct order. if ($options['ordered']) { $view->vars['attr']['data-ordered-value'] = json_encode($form->getViewData(), JSON_THROW_ON_ERROR); } } -} \ No newline at end of file +} diff --git a/src/Form/Extension/TogglePasswordTypeExtension.php b/src/Form/Extension/TogglePasswordTypeExtension.php new file mode 100644 index 00000000..8f7320df --- /dev/null +++ b/src/Form/Extension/TogglePasswordTypeExtension.php @@ -0,0 +1,122 @@ +. + */ + +declare(strict_types=1); + +namespace App\Form\Extension; + +use Symfony\Component\Form\AbstractTypeExtension; +use Symfony\Component\Form\Extension\Core\Type\PasswordType; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Form\FormView; +use Symfony\Component\OptionsResolver\Options; +use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\Translation\TranslatableMessage; +use Symfony\Contracts\Translation\TranslatorInterface; + +final class TogglePasswordTypeExtension extends AbstractTypeExtension +{ + public function __construct(private readonly ?TranslatorInterface $translator) + { + } + + public static function getExtendedTypes(): iterable + { + return [PasswordType::class]; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'toggle' => false, + 'hidden_label' => 'Hide', + 'visible_label' => 'Show', + 'hidden_icon' => 'Default', + 'visible_icon' => 'Default', + 'button_classes' => ['toggle-password-button'], + 'toggle_container_classes' => ['toggle-password-container'], + 'toggle_translation_domain' => null, + 'use_toggle_form_theme' => true, + ]); + + $resolver->setNormalizer( + 'toggle_translation_domain', + static fn (Options $options, $labelTranslationDomain) => $labelTranslationDomain ?? $options['translation_domain'], + ); + + $resolver->setAllowedTypes('toggle', ['bool']); + $resolver->setAllowedTypes('hidden_label', ['string', TranslatableMessage::class, 'null']); + $resolver->setAllowedTypes('visible_label', ['string', TranslatableMessage::class, 'null']); + $resolver->setAllowedTypes('hidden_icon', ['string', 'null']); + $resolver->setAllowedTypes('visible_icon', ['string', 'null']); + $resolver->setAllowedTypes('button_classes', ['string[]']); + $resolver->setAllowedTypes('toggle_container_classes', ['string[]']); + $resolver->setAllowedTypes('toggle_translation_domain', ['string', 'bool', 'null']); + $resolver->setAllowedTypes('use_toggle_form_theme', ['bool']); + } + + public function buildView(FormView $view, FormInterface $form, array $options): void + { + $view->vars['toggle'] = $options['toggle']; + + if (!$options['toggle']) { + return; + } + + if ($options['use_toggle_form_theme']) { + array_splice($view->vars['block_prefixes'], -1, 0, 'toggle_password'); + } + + $controllerName = 'toggle-password'; + $controllerValues = []; + $view->vars['attr']['data-controller'] = trim(\sprintf('%s %s', $view->vars['attr']['data-controller'] ?? '', $controllerName)); + + if (false !== $options['toggle_translation_domain']) { + $controllerValues['hidden-label'] = $this->translateLabel($options['hidden_label'], $options['toggle_translation_domain']); + $controllerValues['visible-label'] = $this->translateLabel($options['visible_label'], $options['toggle_translation_domain']); + } else { + $controllerValues['hidden-label'] = $options['hidden_label']; + $controllerValues['visible-label'] = $options['visible_label']; + } + + $controllerValues['hidden-icon'] = $options['hidden_icon']; + $controllerValues['visible-icon'] = $options['visible_icon']; + $controllerValues['button-classes'] = json_encode($options['button_classes'], \JSON_THROW_ON_ERROR); + + foreach ($controllerValues as $name => $value) { + $view->vars['attr'][\sprintf('data-%s-%s-value', $controllerName, $name)] = $value; + } + + $view->vars['toggle_container_classes'] = $options['toggle_container_classes']; + } + + private function translateLabel(string|TranslatableMessage|null $label, ?string $translationDomain): ?string + { + if (null === $this->translator || null === $label) { + return $label; + } + + if ($label instanceof TranslatableMessage) { + return $label->trans($this->translator); + } + + return $this->translator->trans($label, domain: $translationDomain); + } +} diff --git a/src/Form/Type/APIKeyType.php b/src/Form/Type/APIKeyType.php new file mode 100644 index 00000000..57eaea96 --- /dev/null +++ b/src/Form/Type/APIKeyType.php @@ -0,0 +1,81 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Form\Type; + +use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\PasswordType; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Form\FormView; +use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Contracts\Translation\TranslatorInterface; + +class APIKeyType extends AbstractType +{ + public function __construct(private readonly TranslatorInterface $translator) + { + } + + public function getParent(): string + { + return PasswordType::class; + } + + public function buildView(FormView $view, FormInterface $form, array $options): void + { + $viewData = $form->getViewData(); + + //If the field is disabled, show the redacted API key + if ($options['disabled'] ?? false) { + if ($viewData === null || $viewData === '') { + $view->vars['value'] = $viewData; + } else { + + $view->vars['value'] = self::redact((string)$viewData) . ' (' . $this ->translator->trans("form.apikey.redacted") . ')'; + } + } else { //Otherwise, show the actual value + $view->vars['value'] = $viewData; + } + } + + public static function redact(string $apiKey): string + { + //Show only the last 2 characters of the API key if it is long enough (more than 16 characters) + //Replace all other characters with dots + if (strlen($apiKey) > 16) { + return str_repeat('*', strlen($apiKey) - 2) . substr($apiKey, -2); + } + + return str_repeat('*', strlen($apiKey)); + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'always_empty' => false, + 'toggle' => true, + 'empty_data' => null, + 'attr' => ['autocomplete' => 'off'], + ]); + } +} diff --git a/src/Form/Type/TriStateCheckboxType.php b/src/Form/Type/TriStateCheckboxType.php index 4523a839..b2a85ad3 100644 --- a/src/Form/Type/TriStateCheckboxType.php +++ b/src/Form/Type/TriStateCheckboxType.php @@ -100,7 +100,7 @@ final class TriStateCheckboxType extends AbstractType implements DataTransformer * @return mixed The value in the transformed representation * */ - public function transform(mixed $value) + public function transform(mixed $value): mixed { if (true === $value) { return 'true'; @@ -142,7 +142,7 @@ final class TriStateCheckboxType extends AbstractType implements DataTransformer * * @return mixed The value in the original representation */ - public function reverseTransform(mixed $value) + public function reverseTransform(mixed $value): mixed { return match ($value) { 'true' => true, diff --git a/src/Migration/WithPermPresetsTrait.php b/src/Migration/WithPermPresetsTrait.php index 44bc4510..203ef68a 100644 --- a/src/Migration/WithPermPresetsTrait.php +++ b/src/Migration/WithPermPresetsTrait.php @@ -26,7 +26,7 @@ namespace App\Migration; use App\Entity\UserSystem\PermissionData; use App\Security\Interfaces\HasPermissionsInterface; use App\Services\UserSystem\PermissionPresetsHelper; -use Symfony\Component\DependencyInjection\ContainerInterface; +use Psr\Container\ContainerInterface; trait WithPermPresetsTrait { diff --git a/src/Security/TwoFactor/WebauthnKeyLastUseTwoFactorProvider.php b/src/Security/TwoFactor/WebauthnKeyLastUseTwoFactorProvider.php index 9bfa691d..4d1269d6 100644 --- a/src/Security/TwoFactor/WebauthnKeyLastUseTwoFactorProvider.php +++ b/src/Security/TwoFactor/WebauthnKeyLastUseTwoFactorProvider.php @@ -33,6 +33,7 @@ use Scheb\TwoFactorBundle\Security\TwoFactor\Provider\TwoFactorProviderInterface use Symfony\Component\DependencyInjection\Attribute\AsDecorator; use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\DependencyInjection\Attribute\AutowireDecorated; +use Webauthn\PublicKeyCredential; /** * This class decorates the Webauthn TwoFactorProvider and adds additional logic which allows us to set a last used date @@ -88,10 +89,12 @@ class WebauthnKeyLastUseTwoFactorProvider implements TwoFactorProviderInterface private function getWebauthnKeyFromCode(string $authenticationCode): ?WebauthnKey { - $publicKeyCredentialLoader = $this->webauthnProvider->getPublicKeyCredentialLoader(); + $serializer = $this->webauthnProvider->getWebauthnSerializer(); //Try to load the public key credential from the code - $publicKeyCredential = $publicKeyCredentialLoader->load($authenticationCode); + $publicKeyCredential = $serializer->deserialize($authenticationCode, PublicKeyCredential::class, 'json', [ + 'json_decode_options' => JSON_THROW_ON_ERROR + ]); //Find the credential source for the given credential id $publicKeyCredentialSource = $this->publicKeyCredentialSourceRepository->findOneByCredentialId($publicKeyCredential->rawId); @@ -103,4 +106,4 @@ class WebauthnKeyLastUseTwoFactorProvider implements TwoFactorProviderInterface return $publicKeyCredentialSource; } -} \ No newline at end of file +} diff --git a/src/Serializer/APIPlatform/DetermineTypeFromElementIRIDenormalizer.php b/src/Serializer/APIPlatform/DetermineTypeFromElementIRIDenormalizer.php index 8283dbbe..78679214 100644 --- a/src/Serializer/APIPlatform/DetermineTypeFromElementIRIDenormalizer.php +++ b/src/Serializer/APIPlatform/DetermineTypeFromElementIRIDenormalizer.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace App\Serializer\APIPlatform; use ApiPlatform\Metadata\Exception\ResourceClassNotFoundException; -use ApiPlatform\Api\IriConverterInterface; +use ApiPlatform\Metadata\IriConverterInterface; use ApiPlatform\Metadata\Operation; use ApiPlatform\Metadata\Post; use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface; @@ -121,4 +121,4 @@ class DetermineTypeFromElementIRIDenormalizer implements DenormalizerInterface, return $tmp; } -} \ No newline at end of file +} diff --git a/src/Serializer/PartNormalizer.php b/src/Serializer/PartNormalizer.php index 9050abfc..775df77f 100644 --- a/src/Serializer/PartNormalizer.php +++ b/src/Serializer/PartNormalizer.php @@ -92,7 +92,7 @@ class PartNormalizer implements NormalizerInterface, DenormalizerInterface, Norm return $data; } - public function supportsDenormalization($data, string $type, string $format = null, array $context = []): bool + public function supportsDenormalization($data, string $type, ?string $format = null, array $context = []): bool { //Only denormalize if we are doing a file import operation if (!($context['partdb_import'] ?? false)) { diff --git a/src/Serializer/StructuralElementDenormalizer.php b/src/Serializer/StructuralElementDenormalizer.php index d9b03ae7..9f4256f9 100644 --- a/src/Serializer/StructuralElementDenormalizer.php +++ b/src/Serializer/StructuralElementDenormalizer.php @@ -122,7 +122,7 @@ class StructuralElementDenormalizer implements DenormalizerInterface, Denormaliz return $deserialized_entity; } - public function getSupportedTypes(): array + public function getSupportedTypes(?string $format): array { //Must be false, because we use in_array in supportsDenormalization return [ diff --git a/src/Serializer/StructuralElementNormalizer.php b/src/Serializer/StructuralElementNormalizer.php index e73f69be..bf3e1097 100644 --- a/src/Serializer/StructuralElementNormalizer.php +++ b/src/Serializer/StructuralElementNormalizer.php @@ -23,20 +23,21 @@ declare(strict_types=1); namespace App\Serializer; use App\Entity\Base\AbstractStructuralDBElement; +use App\Serializer\APIPlatform\SkippableItemNormalizer; use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; /** * @see \App\Tests\Serializer\StructuralElementNormalizerTest */ -class StructuralElementNormalizer implements NormalizerInterface +class StructuralElementNormalizer implements NormalizerInterface, NormalizerAwareInterface { - public function __construct( - #[Autowire(service: ObjectNormalizer::class)]private readonly NormalizerInterface $normalizer - ) - { - } + use NormalizerAwareTrait; + + public const ALREADY_CALLED = 'STRUCTURAL_ELEMENT_NORMALIZER_ALREADY_CALLED'; public function supportsNormalization($data, ?string $format = null, array $context = []): bool { @@ -45,15 +46,25 @@ class StructuralElementNormalizer implements NormalizerInterface return false; } + if (isset($context[self::ALREADY_CALLED]) && in_array($data, $context[self::ALREADY_CALLED], true)) { + //If we already handled this object, skip it + return false; + } + return $data instanceof AbstractStructuralDBElement; } - public function normalize($object, ?string $format = null, array $context = []): mixed + public function normalize($object, ?string $format = null, array $context = []): \ArrayObject|bool|float|int|string|array { if (!$object instanceof AbstractStructuralDBElement) { throw new \InvalidArgumentException('This normalizer only supports AbstractStructural objects!'); } + //Avoid infinite recursion by checking if we already handled this object + $context[self::ALREADY_CALLED] = $context[self::ALREADY_CALLED] ?? []; + $context[SkippableItemNormalizer::DISABLE_ITEM_NORMALIZER] = true; + $context[self::ALREADY_CALLED][] = $object; + $data = $this->normalizer->normalize($object, $format, $context); //If the data is not an array, we can't do anything with it @@ -77,7 +88,8 @@ class StructuralElementNormalizer implements NormalizerInterface public function getSupportedTypes(?string $format): array { return [ - AbstractStructuralDBElement::class => true, + //We cannot cache the result, as it depends on the context + AbstractStructuralDBElement::class => false, ]; } } diff --git a/src/Services/ImportExportSystem/EntityExporter.php b/src/Services/ImportExportSystem/EntityExporter.php index c37db50c..271642da 100644 --- a/src/Services/ImportExportSystem/EntityExporter.php +++ b/src/Services/ImportExportSystem/EntityExporter.php @@ -137,7 +137,7 @@ class EntityExporter $options = [ 'format' => $request->get('format') ?? 'json', 'level' => $request->get('level') ?? 'extended', - 'include_children' => $request->request->getBoolean('include_children') ?? false, + 'include_children' => $request->request->getBoolean('include_children'), ]; if (!is_array($entities)) { diff --git a/src/Services/InfoProviderSystem/ExistingPartFinder.php b/src/Services/InfoProviderSystem/ExistingPartFinder.php index 762c1517..614ca105 100644 --- a/src/Services/InfoProviderSystem/ExistingPartFinder.php +++ b/src/Services/InfoProviderSystem/ExistingPartFinder.php @@ -1,5 +1,7 @@ getQuery()->getResult(); } -} \ No newline at end of file +} diff --git a/src/Services/InfoProviderSystem/Providers/DigikeyProvider.php b/src/Services/InfoProviderSystem/Providers/DigikeyProvider.php index b20368ce..51f460e4 100644 --- a/src/Services/InfoProviderSystem/Providers/DigikeyProvider.php +++ b/src/Services/InfoProviderSystem/Providers/DigikeyProvider.php @@ -31,6 +31,7 @@ use App\Services\InfoProviderSystem\DTOs\PriceDTO; use App\Services\InfoProviderSystem\DTOs\PurchaseInfoDTO; use App\Services\InfoProviderSystem\DTOs\SearchResultDTO; use App\Services\OAuth\OAuthTokenManager; +use App\Settings\InfoProviderSystem\DigikeySettings; use Symfony\Contracts\HttpClient\HttpClientInterface; class DigikeyProvider implements InfoProviderInterface @@ -55,17 +56,16 @@ class DigikeyProvider implements InfoProviderInterface ]; public function __construct(HttpClientInterface $httpClient, private readonly OAuthTokenManager $authTokenManager, - private readonly string $currency, private readonly string $clientId, - private readonly string $language, private readonly string $country) + private readonly DigikeySettings $settings,) { //Create the HTTP client with some default options $this->digikeyClient = $httpClient->withOptions([ "base_uri" => self::BASE_URI, "headers" => [ - "X-DIGIKEY-Client-Id" => $clientId, - "X-DIGIKEY-Locale-Site" => $this->country, - "X-DIGIKEY-Locale-Language" => $this->language, - "X-DIGIKEY-Locale-Currency" => $this->currency, + "X-DIGIKEY-Client-Id" => $this->settings->clientId, + "X-DIGIKEY-Locale-Site" => $this->settings->country, + "X-DIGIKEY-Locale-Language" => $this->settings->language, + "X-DIGIKEY-Locale-Currency" => $this->settings->currency, "X-DIGIKEY-Customer-Id" => 0, ] ]); @@ -78,7 +78,8 @@ class DigikeyProvider implements InfoProviderInterface 'description' => 'This provider uses the DigiKey API to search for parts.', 'url' => 'https://www.digikey.com/', 'oauth_app_name' => self::OAUTH_APP_NAME, - 'disabled_help' => 'Set the PROVIDER_DIGIKEY_CLIENT_ID and PROVIDER_DIGIKEY_SECRET env option and connect OAuth to enable.' + 'disabled_help' => 'Set the Client ID and Secret in provider settings and connect OAuth to enable.', + 'settings_class' => DigikeySettings::class, ]; } @@ -101,7 +102,7 @@ class DigikeyProvider implements InfoProviderInterface public function isActive(): bool { //The client ID has to be set and a token has to be available (user clicked connect) - return $this->clientId !== '' && $this->authTokenManager->hasToken(self::OAUTH_APP_NAME); + return $this->settings->clientId !== null && $this->settings->clientId !== '' && $this->authTokenManager->hasToken(self::OAUTH_APP_NAME); } public function searchByKeyword(string $keyword): array @@ -268,7 +269,7 @@ class DigikeyProvider implements InfoProviderInterface $prices = []; foreach ($price_breaks as $price_break) { - $prices[] = new PriceDTO(minimum_discount_amount: $price_break['BreakQuantity'], price: (string) $price_break['UnitPrice'], currency_iso_code: $this->currency); + $prices[] = new PriceDTO(minimum_discount_amount: $price_break['BreakQuantity'], price: (string) $price_break['UnitPrice'], currency_iso_code: $this->settings->currency); } return [ diff --git a/src/Services/InfoProviderSystem/Providers/Element14Provider.php b/src/Services/InfoProviderSystem/Providers/Element14Provider.php index de51de46..27dfb908 100644 --- a/src/Services/InfoProviderSystem/Providers/Element14Provider.php +++ b/src/Services/InfoProviderSystem/Providers/Element14Provider.php @@ -46,7 +46,7 @@ class Element14Provider implements InfoProviderInterface 'rohsPhthalatesCompliant', 'SVHC', 'tariffCode', 'usEccn', 'hazardCode']; private readonly HttpClientInterface $element14Client; - + public function __construct(HttpClientInterface $element14Client, private readonly Element14Settings $settings) { /* We use the mozilla CA from the composer ca bundle directly, as some debian systems seems to have problems @@ -66,7 +66,8 @@ class Element14Provider implements InfoProviderInterface 'name' => 'Farnell element14', 'description' => 'This provider uses the Farnell element14 API to search for parts.', 'url' => 'https://www.element14.com/', - 'disabled_help' => 'Configure the API key in the PROVIDER_ELEMENT14_KEY environment variable to enable.' + 'disabled_help' => 'Configure the API key in the provider settings to enable.', + 'settings_class' => Element14Settings::class, ]; } @@ -77,7 +78,7 @@ class Element14Provider implements InfoProviderInterface public function isActive(): bool { - return trim($this->settings->apiKey) !== ''; + return $this->settings->apiKey !== null && trim($this->settings->apiKey) !== ''; } /** @@ -308,4 +309,4 @@ class Element14Provider implements InfoProviderInterface ProviderCapabilities::DATASHEET, ]; } -} \ No newline at end of file +} diff --git a/src/Services/InfoProviderSystem/Providers/InfoProviderInterface.php b/src/Services/InfoProviderSystem/Providers/InfoProviderInterface.php index 30821bad..1f787559 100644 --- a/src/Services/InfoProviderSystem/Providers/InfoProviderInterface.php +++ b/src/Services/InfoProviderSystem/Providers/InfoProviderInterface.php @@ -39,8 +39,9 @@ interface InfoProviderInterface * - url?: The url of the provider (e.g. "https://www.digikey.com") * - disabled_help?: A help text which is shown when the provider is disabled, explaining how to enable it * - oauth_app_name?: The name of the OAuth app which is used for authentication (e.g. "ip_digikey_oauth"). If this is set a connect button will be shown + * - settings_class?: The class name of the settings class which contains the settings for this provider (e.g. "App\Settings\InfoProviderSettings\DigikeySettings"). If this is set a link to the settings will be shown * - * @phpstan-return array{ name: string, description?: string, logo?: string, url?: string, disabled_help?: string, oauth_app_name?: string } + * @phpstan-return array{ name: string, description?: string, logo?: string, url?: string, disabled_help?: string, oauth_app_name?: string, settings_class?: class-string } */ public function getProviderInfo(): array; @@ -78,4 +79,4 @@ interface InfoProviderInterface * @return ProviderCapabilities[] */ public function getCapabilities(): array; -} \ No newline at end of file +} diff --git a/src/Services/InfoProviderSystem/Providers/LCSCProvider.php b/src/Services/InfoProviderSystem/Providers/LCSCProvider.php index 193ca366..58df3b82 100755 --- a/src/Services/InfoProviderSystem/Providers/LCSCProvider.php +++ b/src/Services/InfoProviderSystem/Providers/LCSCProvider.php @@ -51,7 +51,8 @@ class LCSCProvider implements InfoProviderInterface 'name' => 'LCSC', 'description' => 'This provider uses the (unofficial) LCSC API to search for parts.', 'url' => 'https://www.lcsc.com/', - 'disabled_help' => 'Set PROVIDER_LCSC_ENABLED to 1 (or true) in your environment variable config.' + 'disabled_help' => 'Enable this provider in the provider settings.', + 'settings_class' => LCSCSettings::class, ]; } diff --git a/src/Services/InfoProviderSystem/Providers/MouserProvider.php b/src/Services/InfoProviderSystem/Providers/MouserProvider.php index 0348ec74..6639e5c1 100644 --- a/src/Services/InfoProviderSystem/Providers/MouserProvider.php +++ b/src/Services/InfoProviderSystem/Providers/MouserProvider.php @@ -61,7 +61,8 @@ class MouserProvider implements InfoProviderInterface 'name' => 'Mouser', 'description' => 'This provider uses the Mouser API to search for parts.', 'url' => 'https://www.mouser.com/', - 'disabled_help' => 'Configure the API key in the PROVIDER_MOUSER_KEY environment variable to enable.' + 'disabled_help' => 'Configure the API key in the provider settings to enable.', + 'settings_class' => MouserSettings::class ]; } @@ -345,4 +346,4 @@ class MouserProvider implements InfoProviderInterface return $tmp; } -} \ No newline at end of file +} diff --git a/src/Services/InfoProviderSystem/Providers/OEMSecretsProvider.php b/src/Services/InfoProviderSystem/Providers/OEMSecretsProvider.php index bf97635f..b705e04a 100644 --- a/src/Services/InfoProviderSystem/Providers/OEMSecretsProvider.php +++ b/src/Services/InfoProviderSystem/Providers/OEMSecretsProvider.php @@ -246,7 +246,8 @@ class OEMSecretsProvider implements InfoProviderInterface 'name' => 'OEMSecrets', 'description' => 'This provider uses the OEMSecrets API to search for parts.', 'url' => 'https://www.oemsecrets.com/', - 'disabled_help' => 'Configure the API key in the PROVIDER_OEMSECRETS_KEY environment variable to enable.' + 'disabled_help' => 'Configure the API key in the provider settings to enable.', + 'settings_class' => OEMSecretsSettings::class ]; } /** @@ -265,7 +266,7 @@ class OEMSecretsProvider implements InfoProviderInterface */ public function isActive(): bool { - return $this->settings->apiKey !== ''; + return $this->settings->apiKey !== null && $this->settings->apiKey !== ''; } @@ -285,18 +286,18 @@ class OEMSecretsProvider implements InfoProviderInterface public function searchByKeyword(string $keyword): array { /* - oemsecrets Part Search API 3.0.1 + oemsecrets Part Search API 3.0.1 "https://oemsecretsapi.com/partsearch? searchTerm=BC547 &apiKey=icawpb0bspoo2c6s64uv4vpdfp2vgr7e27bxw0yct2bzh87mpl027x353uelpq2x ¤cy=EUR - &countryCode=IT" - + &countryCode=IT" + partsearch description: - Use the Part Search API to find distributor data for a full or partial manufacturer + Use the Part Search API to find distributor data for a full or partial manufacturer part number including part details, pricing, compliance and inventory. - + Required Parameter Format Description searchTerm string Part number you are searching for apiKey string Your unique API key provided to you by OEMsecrets @@ -304,14 +305,14 @@ class OEMSecretsProvider implements InfoProviderInterface Additional Parameter Format Description countryCode string The country you want to output for currency string / array The currency you want the prices to be displayed as - + To display the output for GB and to view prices in USD, add [ countryCode=GB ] and [ currency=USD ] as seen below: oemsecretsapi.com/partsearch?apiKey=abcexampleapikey123&searchTerm=bd04&countryCode=GB¤cy=USD - + To view prices in both USD and GBP add [ currency[]=USD¤cy[]=GBP ] oemsecretsapi.com/partsearch?searchTerm=bd04&apiKey=abcexampleapikey123¤cy[]=USD¤cy[]=GBP - + */ @@ -1465,4 +1466,4 @@ class OEMSecretsProvider implements InfoProviderInterface return $url; } -} \ No newline at end of file +} diff --git a/src/Services/InfoProviderSystem/Providers/OctopartProvider.php b/src/Services/InfoProviderSystem/Providers/OctopartProvider.php index e28162ba..1142f4ef 100644 --- a/src/Services/InfoProviderSystem/Providers/OctopartProvider.php +++ b/src/Services/InfoProviderSystem/Providers/OctopartProvider.php @@ -30,6 +30,7 @@ use App\Services\InfoProviderSystem\DTOs\PartDetailDTO; use App\Services\InfoProviderSystem\DTOs\PriceDTO; use App\Services\InfoProviderSystem\DTOs\PurchaseInfoDTO; use App\Services\OAuth\OAuthTokenManager; +use App\Settings\InfoProviderSystem\OctopartSettings; use Psr\Cache\CacheItemPoolInterface; use Symfony\Component\HttpClient\HttpOptions; use Symfony\Contracts\HttpClient\HttpClientInterface; @@ -114,9 +115,8 @@ class OctopartProvider implements InfoProviderInterface public function __construct(private readonly HttpClientInterface $httpClient, private readonly OAuthTokenManager $authTokenManager, private readonly CacheItemPoolInterface $partInfoCache, - private readonly string $clientId, private readonly string $secret, - private readonly string $currency, private readonly string $country, - private readonly int $search_limit, private readonly bool $onlyAuthorizedSellers) + private readonly OctopartSettings $settings, + ) { } @@ -170,7 +170,8 @@ class OctopartProvider implements InfoProviderInterface 'name' => 'Octopart', 'description' => 'This provider uses the Nexar/Octopart API to search for parts on Octopart.', 'url' => 'https://www.octopart.com/', - 'disabled_help' => 'Set the PROVIDER_OCTOPART_CLIENT_ID and PROVIDER_OCTOPART_SECRET env option.' + 'disabled_help' => 'Set the Client ID and Secret in provider settings.', + 'settings_class' => OctopartSettings::class ]; } @@ -183,7 +184,8 @@ class OctopartProvider implements InfoProviderInterface { //The client ID has to be set and a token has to be available (user clicked connect) //return /*!empty($this->clientId) && */ $this->authTokenManager->hasToken(self::OAUTH_APP_NAME); - return $this->clientId !== '' && $this->secret !== ''; + return $this->settings->clientId !== null && $this->settings->clientId !== '' + && $this->settings->secret !== null && $this->settings->secret !== ''; } private function mapLifeCycleStatus(?string $value): ?ManufacturingStatus @@ -337,7 +339,7 @@ class OctopartProvider implements InfoProviderInterface ) { hits results { - part + part %s } } @@ -347,10 +349,10 @@ class OctopartProvider implements InfoProviderInterface $result = $this->makeGraphQLCall($graphQL, [ 'keyword' => $keyword, - 'limit' => $this->search_limit, - 'currency' => $this->currency, - 'country' => $this->country, - 'authorizedOnly' => $this->onlyAuthorizedSellers, + 'limit' => $this->settings->searchLimit, + 'currency' => $this->settings->currency, + 'country' => $this->settings->country, + 'authorizedOnly' => $this->settings->onlyAuthorizedSellers, ]); $tmp = []; @@ -383,9 +385,9 @@ class OctopartProvider implements InfoProviderInterface $result = $this->makeGraphQLCall($graphql, [ 'ids' => [$id], - 'currency' => $this->currency, - 'country' => $this->country, - 'authorizedOnly' => $this->onlyAuthorizedSellers, + 'currency' => $this->settings->currency, + 'country' => $this->settings->country, + 'authorizedOnly' => $this->settings->onlyAuthorizedSellers, ]); $tmp = $this->partResultToDTO($result['data']['supParts'][0]); @@ -403,4 +405,4 @@ class OctopartProvider implements InfoProviderInterface ProviderCapabilities::PRICE, ]; } -} \ No newline at end of file +} diff --git a/src/Services/InfoProviderSystem/Providers/PollinProvider.php b/src/Services/InfoProviderSystem/Providers/PollinProvider.php index 864effd9..55fa335a 100644 --- a/src/Services/InfoProviderSystem/Providers/PollinProvider.php +++ b/src/Services/InfoProviderSystem/Providers/PollinProvider.php @@ -51,7 +51,8 @@ class PollinProvider implements InfoProviderInterface 'name' => 'Pollin', 'description' => 'Webscraping from pollin.de to get part information', 'url' => 'https://www.pollin.de/', - 'disabled_help' => 'Set PROVIDER_POLLIN_ENABLED env to 1' + 'disabled_help' => 'Enable the provider in provider settings', + 'settings_class' => PollinSettings::class, ]; } @@ -246,4 +247,4 @@ class PollinProvider implements InfoProviderInterface ProviderCapabilities::DATASHEET ]; } -} \ No newline at end of file +} diff --git a/src/Services/InfoProviderSystem/Providers/ReicheltProvider.php b/src/Services/InfoProviderSystem/Providers/ReicheltProvider.php index ebc62dd5..5c8efbf1 100644 --- a/src/Services/InfoProviderSystem/Providers/ReicheltProvider.php +++ b/src/Services/InfoProviderSystem/Providers/ReicheltProvider.php @@ -51,7 +51,8 @@ class ReicheltProvider implements InfoProviderInterface 'name' => 'Reichelt', 'description' => 'Webscraping from reichelt.com to get part information', 'url' => 'https://www.reichelt.com/', - 'disabled_help' => 'Set PROVIDER_REICHELT_ENABLED env to 1' + 'disabled_help' => 'Enable provider in provider settings.', + 'settings_class' => ReicheltSettings::class, ]; } @@ -274,4 +275,4 @@ class ReicheltProvider implements InfoProviderInterface ProviderCapabilities::PRICE, ]; } -} \ No newline at end of file +} diff --git a/src/Services/InfoProviderSystem/Providers/TMEClient.php b/src/Services/InfoProviderSystem/Providers/TMEClient.php index df198717..ae2ab0d1 100644 --- a/src/Services/InfoProviderSystem/Providers/TMEClient.php +++ b/src/Services/InfoProviderSystem/Providers/TMEClient.php @@ -48,7 +48,7 @@ class TMEClient public function isUsable(): bool { - return !($this->settings->apiToken === '' || $this->settings->apiSecret === ''); + return !($this->settings->apiToken === null || $this->settings->apiSecret === null); } /** @@ -59,7 +59,7 @@ class TMEClient public function isUsingPrivateToken(): bool { //Private tokens are longer than anonymous ones (50 instead of 45 characters) - return strlen($this->settings->apiToken) > 45; + return strlen($this->settings->apiToken ?? '') > 45; } /** @@ -94,4 +94,4 @@ class TMEClient return $params; } -} \ No newline at end of file +} diff --git a/src/Services/InfoProviderSystem/Providers/TMEProvider.php b/src/Services/InfoProviderSystem/Providers/TMEProvider.php index 81939a78..9bc73f09 100644 --- a/src/Services/InfoProviderSystem/Providers/TMEProvider.php +++ b/src/Services/InfoProviderSystem/Providers/TMEProvider.php @@ -54,7 +54,8 @@ class TMEProvider implements InfoProviderInterface 'name' => 'TME', 'description' => 'This provider uses the API of TME (Transfer Multipart).', 'url' => 'https://tme.eu/', - 'disabled_help' => 'Configure the PROVIDER_TME_KEY and PROVIDER_TME_SECRET environment variables to use this provider.' + 'disabled_help' => 'Configure the API Token and secret in provider settings to use this provider.', + 'settings_class' => TMESettings::class ]; } @@ -295,4 +296,4 @@ class TMEProvider implements InfoProviderInterface ProviderCapabilities::PRICE, ]; } -} \ No newline at end of file +} diff --git a/src/Services/LabelSystem/PlaceholderProviders/PartProvider.php b/src/Services/LabelSystem/PlaceholderProviders/PartProvider.php index 0df4d3d7..7d9e4db5 100644 --- a/src/Services/LabelSystem/PlaceholderProviders/PartProvider.php +++ b/src/Services/LabelSystem/PlaceholderProviders/PartProvider.php @@ -46,7 +46,9 @@ use App\Entity\Parts\Manufacturer; use App\Entity\Parts\Footprint; use App\Entity\Parts\Part; use App\Services\Formatters\SIFormatter; -use Parsedown; +use League\CommonMark\Environment\Environment; +use League\CommonMark\Extension\InlinesOnly\InlinesOnlyExtension; +use League\CommonMark\MarkdownConverter; use Symfony\Contracts\Translation\TranslatorInterface; /** @@ -54,8 +56,13 @@ use Symfony\Contracts\Translation\TranslatorInterface; */ final class PartProvider implements PlaceholderProviderInterface { + private readonly MarkdownConverter $inlineConverter; + public function __construct(private readonly SIFormatter $siFormatter, private readonly TranslatorInterface $translator) { + $environment = new Environment(); + $environment->addExtension(new InlinesOnlyExtension()); + $this->inlineConverter = new MarkdownConverter($environment); } public function replace(string $placeholder, object $part, array $options = []): ?string @@ -112,22 +119,20 @@ final class PartProvider implements PlaceholderProviderInterface return $this->translator->trans($part->getManufacturingStatus()->toTranslationKey()); } - $parsedown = new Parsedown(); - if ('[[DESCRIPTION]]' === $placeholder) { - return $parsedown->line($part->getDescription()); + return trim($this->inlineConverter->convert($part->getDescription())->getContent()); } if ('[[DESCRIPTION_T]]' === $placeholder) { - return strip_tags((string) $parsedown->line($part->getDescription())); + return trim(strip_tags($this->inlineConverter->convert($part->getDescription())->getContent())); } if ('[[COMMENT]]' === $placeholder) { - return $parsedown->line($part->getComment()); + return trim($this->inlineConverter->convert($part->getComment())->getContent()); } if ('[[COMMENT_T]]' === $placeholder) { - return strip_tags((string) $parsedown->line($part->getComment())); + return trim(strip_tags($this->inlineConverter->convert($part->getComment())->getContent())); } return null; diff --git a/src/Services/System/BannerHelper.php b/src/Services/System/BannerHelper.php index 81925f2c..bb27158f 100644 --- a/src/Services/System/BannerHelper.php +++ b/src/Services/System/BannerHelper.php @@ -30,7 +30,7 @@ use App\Settings\SystemSettings\CustomizationSettings; */ class BannerHelper { - public function __construct(private CustomizationSettings $customizationSettings) + public function __construct(private readonly CustomizationSettings $customizationSettings) { } @@ -43,4 +43,4 @@ class BannerHelper { return $this->customizationSettings->banner ?? ""; } -} \ No newline at end of file +} diff --git a/src/Services/Trees/ToolsTreeBuilder.php b/src/Services/Trees/ToolsTreeBuilder.php index 18571306..f7a9d1c4 100644 --- a/src/Services/Trees/ToolsTreeBuilder.php +++ b/src/Services/Trees/ToolsTreeBuilder.php @@ -289,6 +289,13 @@ class ToolsTreeBuilder ))->setIcon('fa-fw fa-treeview fa-solid fa-database'); } + if ($this->security->isGranted('@config.change_system_settings')) { + $nodes[] = (new TreeViewNode( + $this->translator->trans('tree.tools.system.settings'), + $this->urlGenerator->generate('system_settings') + ))->setIcon('fa fa-fw fa-gears fa-solid'); + } + return $nodes; } } diff --git a/src/Services/Trees/TreeViewGenerator.php b/src/Services/Trees/TreeViewGenerator.php index c66f2ee2..73ffa5ba 100644 --- a/src/Services/Trees/TreeViewGenerator.php +++ b/src/Services/Trees/TreeViewGenerator.php @@ -38,6 +38,7 @@ use App\Repository\StructuralDBElementRepository; use App\Services\Cache\ElementCacheTagGenerator; use App\Services\Cache\UserCacheKeyGenerator; use App\Services\EntityURLGenerator; +use App\Settings\BehaviorSettings\SidebarSettings; use Doctrine\ORM\EntityManagerInterface; use InvalidArgumentException; use RecursiveIteratorIterator; @@ -53,6 +54,10 @@ use function count; */ class TreeViewGenerator { + + private readonly bool $rootNodeExpandedByDefault; + private readonly bool $rootNodeEnabled; + public function __construct( protected EntityURLGenerator $urlGenerator, protected EntityManagerInterface $em, @@ -61,11 +66,10 @@ class TreeViewGenerator protected UserCacheKeyGenerator $keyGenerator, protected TranslatorInterface $translator, private readonly UrlGeneratorInterface $router, - protected bool $rootNodeExpandedByDefault, - protected bool $rootNodeEnabled, - //TODO: Make this configurable in the future - protected bool $rootNodeRedirectsToNewEntity = false, + private readonly SidebarSettings $sidebarSettings, ) { + $this->rootNodeEnabled = $this->sidebarSettings->rootNodeEnabled; + $this->rootNodeExpandedByDefault = $this->sidebarSettings->rootNodeExpanded; } /** @@ -188,7 +192,7 @@ class TreeViewGenerator protected function entityClassToRootNodeHref(string $class): ?string { //If the root node should redirect to the new entity page, we return the URL for the new entity. - if ($this->rootNodeRedirectsToNewEntity) { + if ($this->sidebarSettings->rootNodeRedirectsToNewEntity) { return match ($class) { Category::class => $this->router->generate('category_new'), StorageLocation::class => $this->router->generate('store_location_new'), diff --git a/src/Services/UserSystem/PermissionPresetsHelper.php b/src/Services/UserSystem/PermissionPresetsHelper.php index eeb80f61..554da8b3 100644 --- a/src/Services/UserSystem/PermissionPresetsHelper.php +++ b/src/Services/UserSystem/PermissionPresetsHelper.php @@ -105,6 +105,9 @@ class PermissionPresetsHelper $this->permissionResolver->setAllOperationsOfPermission($perm_holder, 'suppliers', PermissionData::ALLOW); $this->permissionResolver->setAllOperationsOfPermission($perm_holder, 'projects', PermissionData::ALLOW); + //Allow to change system settings + $this->permissionResolver->setPermission($perm_holder, 'config', 'change_system_settings', PermissionData::ALLOW); + //Allow to manage Oauth tokens $this->permissionResolver->setPermission($perm_holder, 'system', 'manage_oauth_tokens', PermissionData::ALLOW); //Allow to show updates diff --git a/src/Settings/BehaviorSettings/BehaviorSettings.php b/src/Settings/BehaviorSettings/BehaviorSettings.php index 97a1759e..1251a097 100644 --- a/src/Settings/BehaviorSettings/BehaviorSettings.php +++ b/src/Settings/BehaviorSettings/BehaviorSettings.php @@ -37,4 +37,7 @@ class BehaviorSettings #[EmbeddedSettings] public ?TableSettings $table = null; + + #[EmbeddedSettings] + public ?PartInfoSettings $partInfo = null; } \ No newline at end of file diff --git a/src/Settings/BehaviorSettings/PartInfoSettings.php b/src/Settings/BehaviorSettings/PartInfoSettings.php new file mode 100644 index 00000000..4c44b9bb --- /dev/null +++ b/src/Settings/BehaviorSettings/PartInfoSettings.php @@ -0,0 +1,43 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\BehaviorSettings; + +use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; +use Jbtronics\SettingsBundle\Settings\Settings; +use Jbtronics\SettingsBundle\Settings\SettingsParameter; +use Symfony\Component\Translation\TranslatableMessage as TM; + +#[Settings(name: "part_info", label: new TM("settings.behavior.part_info"))] +#[SettingsIcon('fa-circle-info')] +class PartInfoSettings +{ + /** + * Whether to show the part image overlays in the part info view + * @var bool + */ + #[SettingsParameter(label: new TM("settings.behavior.part_info.show_part_image_overlay"), description: new TM("settings.behavior.part_info.show_part_image_overlay.help"), + envVar: "bool:SHOW_PART_IMAGE_OVERLAY", envVarMode: EnvVarMode::OVERWRITE)] + public bool $showPartImageOverlay = true; +} \ No newline at end of file diff --git a/src/Settings/BehaviorSettings/SidebarSettings.php b/src/Settings/BehaviorSettings/SidebarSettings.php index 3e93d634..1266fa47 100644 --- a/src/Settings/BehaviorSettings/SidebarSettings.php +++ b/src/Settings/BehaviorSettings/SidebarSettings.php @@ -67,4 +67,10 @@ class SidebarSettings */ #[SettingsParameter(label: new TM("settings.behavior.sidebar.rootNodeExpanded"))] public bool $rootNodeExpanded = true; + + /** + * @var bool Whether the root node should redirect to a new entity creation page when clicked. + */ + #[SettingsParameter(label: new TM("settings.behavior.sidebar.rootNodeRedirectsToNewEntity"))] + public bool $rootNodeRedirectsToNewEntity = false; } \ No newline at end of file diff --git a/src/Settings/InfoProviderSystem/DigikeySettings.php b/src/Settings/InfoProviderSystem/DigikeySettings.php new file mode 100644 index 00000000..f42c1c1c --- /dev/null +++ b/src/Settings/InfoProviderSystem/DigikeySettings.php @@ -0,0 +1,73 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\InfoProviderSystem; + +use App\Form\Type\APIKeyType; +use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; +use Jbtronics\SettingsBundle\Settings\Settings; +use Jbtronics\SettingsBundle\Settings\SettingsTrait; +use Symfony\Component\Form\Extension\Core\Type\CountryType; +use Symfony\Component\Form\Extension\Core\Type\CurrencyType; +use Symfony\Component\Form\Extension\Core\Type\LanguageType; +use Symfony\Component\Translation\TranslatableMessage as TM; +use Jbtronics\SettingsBundle\Settings\SettingsParameter; +use Symfony\Component\Validator\Constraints as Assert; + +#[Settings(label: new TM("settings.ips.digikey"))] +#[SettingsIcon("fa-plug")] +class DigikeySettings +{ + use SettingsTrait; + + #[SettingsParameter( + label: new TM("settings.ips.digikey.client_id"), + formType: APIKeyType::class, + envVar: "PROVIDER_DIGIKEY_CLIENT_ID", envVarMode: EnvVarMode::OVERWRITE + )] + public ?string $clientId = null; + + #[SettingsParameter( + label: new TM("settings.ips.digikey.secret"), + formType: APIKeyType::class, + envVar: "PROVIDER_DIGIKEY_SECRET", envVarMode: EnvVarMode::OVERWRITE + )] + public ?string $secret = null; + + #[SettingsParameter(label: new TM("settings.ips.tme.currency"), formType: CurrencyType::class, + formOptions: ["preferred_choices" => ["EUR", "USD", "CHF", "GBP"]], + envVar: "PROVIDER_DIGIKEY_CURRENCY", envVarMode: EnvVarMode::OVERWRITE)] + #[Assert\Currency()] + public string $currency = "EUR"; + + #[SettingsParameter(label: new TM("settings.ips.tme.country"), formType: CountryType::class, + envVar: "PROVIDER_DIGIKEY_COUNTRY", envVarMode: EnvVarMode::OVERWRITE)] + #[Assert\Country] + public string $country = "DE"; + + #[SettingsParameter(label: new TM("settings.ips.tme.language"), formType: LanguageType::class, + envVar: "PROVIDER_DIGIKEY_LANGUAGE", envVarMode: EnvVarMode::OVERWRITE)] + #[Assert\Language] + public string $language = "en"; +} diff --git a/src/Settings/InfoProviderSystem/Element14Settings.php b/src/Settings/InfoProviderSystem/Element14Settings.php index 8ca38425..a4cdbf0d 100644 --- a/src/Settings/InfoProviderSystem/Element14Settings.php +++ b/src/Settings/InfoProviderSystem/Element14Settings.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace App\Settings\InfoProviderSystem; +use App\Form\Type\APIKeyType; use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\Settings\Settings; use Jbtronics\SettingsBundle\Settings\SettingsParameter; use Jbtronics\SettingsBundle\Settings\SettingsTrait; @@ -35,9 +37,12 @@ class Element14Settings { use SettingsTrait; - #[SettingsParameter(label: new TM("settings.ips.element14.apiKey"), description: new TM("settings.ips.element14.apiKey.help"), formOptions: ["help_html" => true], envVar: "PROVIDER_ELEMENT14_KEY")] + #[SettingsParameter(label: new TM("settings.ips.element14.apiKey"), description: new TM("settings.ips.element14.apiKey.help"),# + formType: APIKeyType::class, + formOptions: ["help_html" => true], envVar: "PROVIDER_ELEMENT14_KEY", envVarMode: EnvVarMode::OVERWRITE)] public ?string $apiKey = null; - #[SettingsParameter(label: new TM("settings.ips.element14.storeId"), description: new TM("settings.ips.element14.storeId.help"), formOptions: ["help_html" => true], envVar: "PROVIDER_ELEMENT14_STORE_ID")] + #[SettingsParameter(label: new TM("settings.ips.element14.storeId"), description: new TM("settings.ips.element14.storeId.help"), + formOptions: ["help_html" => true], envVar: "PROVIDER_ELEMENT14_STORE_ID", envVarMode: EnvVarMode::OVERWRITE)] public string $storeId = "de.farnell.com"; -} \ No newline at end of file +} diff --git a/src/Settings/InfoProviderSystem/InfoProviderSettings.php b/src/Settings/InfoProviderSystem/InfoProviderSettings.php index 109fbc02..3c7159cb 100644 --- a/src/Settings/InfoProviderSystem/InfoProviderSettings.php +++ b/src/Settings/InfoProviderSystem/InfoProviderSettings.php @@ -32,6 +32,9 @@ class InfoProviderSettings { use SettingsTrait; + #[EmbeddedSettings] + public ?DigikeySettings $digikey = null; + #[EmbeddedSettings] public ?MouserSettings $mouser = null; @@ -41,6 +44,9 @@ class InfoProviderSettings #[EmbeddedSettings] public ?Element14Settings $element14 = null; + #[EmbeddedSettings] + public ?OctopartSettings $octopartSettings = null; + #[EmbeddedSettings] public ?LCSCSettings $lcsc = null; diff --git a/src/Settings/InfoProviderSystem/LCSCSettings.php b/src/Settings/InfoProviderSystem/LCSCSettings.php index ac4a47f4..906838e2 100644 --- a/src/Settings/InfoProviderSystem/LCSCSettings.php +++ b/src/Settings/InfoProviderSystem/LCSCSettings.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace App\Settings\InfoProviderSystem; use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\Settings\Settings; use Jbtronics\SettingsBundle\Settings\SettingsParameter; use Jbtronics\SettingsBundle\Settings\SettingsTrait; @@ -37,10 +38,12 @@ class LCSCSettings { use SettingsTrait; - #[SettingsParameter(label: new TM("settings.ips.lcsc.enabled"), envVar: "bool:PROVIDER_LCSC_ENABLED")] + #[SettingsParameter(label: new TM("settings.ips.lcsc.enabled"), + envVar: "bool:PROVIDER_LCSC_ENABLED", envVarMode: EnvVarMode::OVERWRITE)] public bool $enabled = false; - #[SettingsParameter(label: new TM("settings.ips.lcsc.currency"), formType: CurrencyType::class, envVar: "string:PROVIDER_LCSC_CURRENCY")] + #[SettingsParameter(label: new TM("settings.ips.lcsc.currency"), formType: CurrencyType::class, + envVar: "string:PROVIDER_LCSC_CURRENCY", envVarMode: EnvVarMode::OVERWRITE)] #[Assert\Currency()] public string $currency = 'EUR'; } \ No newline at end of file diff --git a/src/Settings/InfoProviderSystem/MouserSettings.php b/src/Settings/InfoProviderSystem/MouserSettings.php index 5407620d..0abaa7f2 100644 --- a/src/Settings/InfoProviderSystem/MouserSettings.php +++ b/src/Settings/InfoProviderSystem/MouserSettings.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace App\Settings\InfoProviderSystem; +use App\Form\Type\APIKeyType; use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\Settings\Settings; use Jbtronics\SettingsBundle\Settings\SettingsParameter; use Symfony\Component\Validator\Constraints as Assert; @@ -33,22 +35,26 @@ use Symfony\Component\Translation\TranslatableMessage as TM; #[SettingsIcon("fa-plug")] class MouserSettings { - #[SettingsParameter(label: new TM("settings.ips.mouser.apiKey"), description: new TM("settings.ips.mouser.apiKey.help"), formOptions: ["help_html" => true], envVar: "PROVIDER_MOUSER_KEY")] + #[SettingsParameter(label: new TM("settings.ips.mouser.apiKey"), description: new TM("settings.ips.mouser.apiKey.help"), + formType: APIKeyType::class, + formOptions: ["help_html" => true], envVar: "PROVIDER_MOUSER_KEY", envVarMode: EnvVarMode::OVERWRITE)] public ?string $apiKey = null; /** @var int The number of results to get from Mouser while searching (please note that this value is max 50) */ - #[SettingsParameter(label: new TM("settings.ips.mouser.searchLimit"), description: new TM("settings.ips.mouser.searchLimit.help"), envVar: "int:PROVIDER_MOUSER_SEARCH_LIMIT")] + #[SettingsParameter(label: new TM("settings.ips.mouser.searchLimit"), description: new TM("settings.ips.mouser.searchLimit.help"), + envVar: "int:PROVIDER_MOUSER_SEARCH_LIMIT", envVarMode: EnvVarMode::OVERWRITE)] #[Assert\Range(min: 1, max: 50)] public int $searchLimit = 50; /** @var MouserSearchOptions Filter search results by RoHS compliance and stock availability */ - #[SettingsParameter(label: new TM("settings.ips.mouser.searchOptions"), description: new TM("settings.ips.mouser.searchOptions.help"), envVar: "PROVIDER_MOUSER_SEARCH_OPTION", envVarMapper: [self::class, "mapSearchOptionEnvVar"])] + #[SettingsParameter(label: new TM("settings.ips.mouser.searchOptions"), description: new TM("settings.ips.mouser.searchOptions.help"), + envVar: "PROVIDER_MOUSER_SEARCH_OPTION", envVarMode: EnvVarMode::OVERWRITE, envVarMapper: [self::class, "mapSearchOptionEnvVar"])] public MouserSearchOptions $searchOption = MouserSearchOptions::NONE; /** @var bool It is recommended to leave this set to 'true'. The option is not really documented by Mouser: * Used when searching for keywords in the language specified when you signed up for Search API. */ //TODO: Put this into some expert mode only - #[SettingsParameter(envVar: "bool:PROVIDER_MOUSER_SEARCH_WITH_SIGNUP_LANGUAGE")] + //#[SettingsParameter(envVar: "bool:PROVIDER_MOUSER_SEARCH_WITH_SIGNUP_LANGUAGE")] public bool $searchWithSignUpLanguage = true; public static function mapSearchOptionEnvVar(?string $value): MouserSearchOptions @@ -60,4 +66,4 @@ class MouserSettings return MouserSearchOptions::tryFrom($value) ?? MouserSearchOptions::NONE; } -} \ No newline at end of file +} diff --git a/src/Settings/InfoProviderSystem/OEMSecretsSettings.php b/src/Settings/InfoProviderSystem/OEMSecretsSettings.php index dfb2d689..77cf9080 100644 --- a/src/Settings/InfoProviderSystem/OEMSecretsSettings.php +++ b/src/Settings/InfoProviderSystem/OEMSecretsSettings.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace App\Settings\InfoProviderSystem; +use App\Form\Type\APIKeyType; use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\Settings\Settings; use Jbtronics\SettingsBundle\Settings\SettingsParameter; use Jbtronics\SettingsBundle\Settings\SettingsTrait; @@ -41,14 +43,18 @@ class OEMSecretsSettings public const SUPPORTED_CURRENCIES = ["AUD", "CAD", "CHF", "CNY", "DKK", "EUR", "GBP", "HKD", "ILS", "INR", "JPY", "KRW", "NOK", "NZD", "RUB", "SEK", "SGD", "TWD", "USD"]; - #[SettingsParameter(label: new TM("settings.ips.element14.apiKey"), envVar: "PROVIDER_OEMSECRETS_KEY")] + #[SettingsParameter(label: new TM("settings.ips.element14.apiKey"), + formType: APIKeyType::class, + envVar: "PROVIDER_OEMSECRETS_KEY", envVarMode: EnvVarMode::OVERWRITE)] public ?string $apiKey = null; #[Assert\Country] - #[SettingsParameter(label: new TM("settings.ips.tme.country"), formType: CountryType::class, formOptions: ["preferred_choices" => ["DE", "PL", "GB", "FR", "US"]], envVar: "PROVIDER_OEMSECRETS_COUNTRY_CODE")] + #[SettingsParameter(label: new TM("settings.ips.tme.country"), formType: CountryType::class, formOptions: ["preferred_choices" => ["DE", "PL", "GB", "FR", "US"]], + envVar: "PROVIDER_OEMSECRETS_COUNTRY_CODE", envVarMode: EnvVarMode::OVERWRITE)] public ?string $country = "DE"; - #[SettingsParameter(label: new TM("settings.ips.tme.currency"), formType: CurrencyType::class, formOptions: ["preferred_choices" => self::SUPPORTED_CURRENCIES], envVar: "PROVIDER_OEMSECRETS_CURRENCY")] + #[SettingsParameter(label: new TM("settings.ips.tme.currency"), formType: CurrencyType::class, formOptions: ["preferred_choices" => self::SUPPORTED_CURRENCIES], + envVar: "PROVIDER_OEMSECRETS_CURRENCY", envVarMode: EnvVarMode::OVERWRITE)] #[Assert\Choice(choices: self::SUPPORTED_CURRENCIES)] public string $currency = "EUR"; @@ -56,7 +62,8 @@ class OEMSecretsSettings * @var bool If this is enabled, distributors with zero prices * will be discarded from the creation of a new part */ - #[SettingsParameter(label: new TM("settings.ips.oemsecrets.keepZeroPrices"), description: new TM("settings.ips.oemsecrets.keepZeroPrices.help"), envVar: "bool:PROVIDER_OEMSECRETS_ZERO_PRICE")] + #[SettingsParameter(label: new TM("settings.ips.oemsecrets.keepZeroPrices"), description: new TM("settings.ips.oemsecrets.keepZeroPrices.help"), + envVar: "bool:PROVIDER_OEMSECRETS_ZERO_PRICE", envVarMode: EnvVarMode::OVERWRITE)] public bool $keepZeroPrices = false; /** @@ -64,7 +71,8 @@ class OEMSecretsSettings * # from the description transforming unstructured descriptions into structured parameters; * # each parameter in description should have the form: "...;name1:value1;name2:value2" */ - #[SettingsParameter(label: new TM("settings.ips.oemsecrets.parseParams"), description: new TM("settings.ips.oemsecrets.parseParams.help"), envVar: "bool:PROVIDER_OEMSECRETS_SET_PARAM")] + #[SettingsParameter(label: new TM("settings.ips.oemsecrets.parseParams"), description: new TM("settings.ips.oemsecrets.parseParams.help"), + envVar: "bool:PROVIDER_OEMSECRETS_SET_PARAM", envVarMode: EnvVarMode::OVERWRITE)] public bool $parseParams = true; #[SettingsParameter(label: new TM("settings.ips.oemsecrets.sortMode"), envVar: "PROVIDER_OEMSECRETS_SORT_CRITERIA", envVarMapper: [self::class, "mapSortModeEnvVar"])] @@ -79,4 +87,4 @@ class OEMSecretsSettings return OEMSecretsSortMode::tryFrom($value) ?? OEMSecretsSortMode::NONE; } -} \ No newline at end of file +} diff --git a/src/Settings/InfoProviderSystem/OctopartSettings.php b/src/Settings/InfoProviderSystem/OctopartSettings.php new file mode 100644 index 00000000..c28da459 --- /dev/null +++ b/src/Settings/InfoProviderSystem/OctopartSettings.php @@ -0,0 +1,81 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\InfoProviderSystem; + +use App\Form\Type\APIKeyType; +use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; +use Jbtronics\SettingsBundle\Settings\Settings; +use Jbtronics\SettingsBundle\Settings\SettingsParameter; +use Jbtronics\SettingsBundle\Settings\SettingsTrait; +use Symfony\Component\Form\Extension\Core\Type\CountryType; +use Symfony\Component\Form\Extension\Core\Type\CurrencyType; +use Symfony\Component\Form\Extension\Core\Type\NumberType; +use Symfony\Component\Translation\TranslatableMessage as TM; +use Symfony\Component\Validator\Constraints as Assert; + +#[Settings(label: new TM("settings.ips.octopart"))] +#[SettingsIcon("fa-plug")] +class OctopartSettings +{ + use SettingsTrait; + + #[SettingsParameter( + label: new TM("settings.ips.digikey.client_id"), + formType: APIKeyType::class, + envVar: "PROVIDER_OCTOPART_CLIENT_ID", envVarMode: EnvVarMode::OVERWRITE, + )] + public ?string $clientId = null; + + #[SettingsParameter( + label: new TM("settings.ips.digikey.secret"), + formType: APIKeyType::class, + envVar: "PROVIDER_OCTOPART_SECRET", envVarMode: EnvVarMode::OVERWRITE + )] + public ?string $secret = null; + + #[SettingsParameter(label: new TM("settings.ips.tme.currency"), formType: CurrencyType::class, + formOptions: ["preferred_choices" => ["EUR", "USD", "CHF", "GBP"]], + envVar: "PROVIDER_OCTOPART_CURRENCY", envVarMode: EnvVarMode::OVERWRITE)] + #[Assert\Currency()] + public string $currency = "EUR"; + + #[SettingsParameter(label: new TM("settings.ips.tme.country"), formType: CountryType::class, + envVar: "PROVIDER_OCTOPART_COUNTRY", envVarMode: EnvVarMode::OVERWRITE)] + #[Assert\Country] + public string $country = "DE"; + + #[SettingsParameter(label: new TM("settings.ips.octopart.searchLimit"), description: new TM("settings.ips.octopart.searchLimit.help"), + formType: NumberType::class, formOptions: ["attr" => ["min" => 1, "max" => 100]], + envVar: "int:PROVIDER_OCTOPART_SEARCH_LIMIT", envVarMode: EnvVarMode::OVERWRITE)] + #[Assert\Range(min: 1, max: 100)] + public int $searchLimit = 10; + + #[SettingsParameter(label: new TM("settings.ips.octopart.onlyAuthorizedSellers"), + description: new TM("settings.ips.octopart.onlyAuthorizedSellers.help"), + envVar: "bool:PROVIDER_OCTOPART_ONLY_AUTHORIZED_SELLERS", envVarMode: EnvVarMode::OVERWRITE + )] + public bool $onlyAuthorizedSellers = true; + +} diff --git a/src/Settings/InfoProviderSystem/PollinSettings.php b/src/Settings/InfoProviderSystem/PollinSettings.php index 8a7713c6..033d8b7e 100644 --- a/src/Settings/InfoProviderSystem/PollinSettings.php +++ b/src/Settings/InfoProviderSystem/PollinSettings.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace App\Settings\InfoProviderSystem; use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\Settings\Settings; use Jbtronics\SettingsBundle\Settings\SettingsParameter; use Symfony\Component\Translation\TranslatableMessage as TM; @@ -32,6 +33,7 @@ use Symfony\Component\Translation\TranslatableMessage as TM; #[SettingsIcon("fa-plug")] class PollinSettings { - #[SettingsParameter(label: new TM("settings.ips.lcsc.enabled"), envVar: "bool:PROVIDER_POLLIN_ENABLED")] + #[SettingsParameter(label: new TM("settings.ips.lcsc.enabled"), + envVar: "bool:PROVIDER_POLLIN_ENABLED", envVarMode: EnvVarMode::OVERWRITE)] public bool $enabled = false; } \ No newline at end of file diff --git a/src/Settings/InfoProviderSystem/ReicheltSettings.php b/src/Settings/InfoProviderSystem/ReicheltSettings.php index 8672ae69..588447de 100644 --- a/src/Settings/InfoProviderSystem/ReicheltSettings.php +++ b/src/Settings/InfoProviderSystem/ReicheltSettings.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace App\Settings\InfoProviderSystem; use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\Settings\Settings; use Jbtronics\SettingsBundle\Settings\SettingsParameter; use Jbtronics\SettingsBundle\Settings\SettingsTrait; @@ -41,22 +42,27 @@ class ReicheltSettings public const SUPPORTED_LANGUAGE = ["en", "de", "fr", "nl", "pl", "it", "es"]; - #[SettingsParameter(label: new TM("settings.ips.lcsc.enabled"), envVar: "bool:PROVIDER_REICHELT_ENABLED")] + #[SettingsParameter(label: new TM("settings.ips.lcsc.enabled"), + envVar: "bool:PROVIDER_REICHELT_ENABLED", envVarMode: EnvVarMode::OVERWRITE)] public bool $enabled = false; - #[SettingsParameter(label: new TM("settings.ips.tme.currency"), formType: CurrencyType::class, formOptions: ["preferred_choices" => ["EUR"]], envVar: "PROVIDER_REICHELT_CURRENCY")] + #[SettingsParameter(label: new TM("settings.ips.tme.currency"), formType: CurrencyType::class, formOptions: ["preferred_choices" => ["EUR"]], + envVar: "PROVIDER_REICHELT_CURRENCY", envVarMode: EnvVarMode::OVERWRITE)] public string $currency = "EUR"; - #[SettingsParameter(label: new TM("settings.ips.tme.language"), formType: LanguageType::class, formOptions: ["preferred_choices" => self::SUPPORTED_LANGUAGE], envVar: "PROVIDER_REICHELT_LANGUAGE")] + #[SettingsParameter(label: new TM("settings.ips.tme.language"), formType: LanguageType::class, formOptions: ["preferred_choices" => self::SUPPORTED_LANGUAGE], + envVar: "PROVIDER_REICHELT_LANGUAGE", envVarMode: EnvVarMode::OVERWRITE)] #[Assert\Language()] #[Assert\Choice(choices: self::SUPPORTED_LANGUAGE)] public string $language = "en"; - #[SettingsParameter(label: new TM("settings.ips.tme.country"), envVar: "PROVIDER_REICHELT_COUNTRY", formType: CountryType::class, formOptions: ["preferred_choices" => ["DE", "PL", "GB", "FR"]])] + #[SettingsParameter(label: new TM("settings.ips.tme.country"), formType: CountryType::class, formOptions: ["preferred_choices" => ["DE", "PL", "GB", "FR"]], + envVar: "PROVIDER_REICHELT_COUNTRY", envVarMode: EnvVarMode::OVERWRITE)] #[Assert\Country] public string $country = "DE"; - #[SettingsParameter(label: new TM("settings.ips.reichelt.include_vat"), envVar: "bool:PROVIDER_REICHELT_INCLUDE_VAT")] + #[SettingsParameter(label: new TM("settings.ips.reichelt.include_vat"), + envVar: "bool:PROVIDER_REICHELT_INCLUDE_VAT", envVarMode: EnvVarMode::OVERWRITE)] public bool $includeVAT = true; } \ No newline at end of file diff --git a/src/Settings/InfoProviderSystem/TMESettings.php b/src/Settings/InfoProviderSystem/TMESettings.php index f414e984..d6f03d34 100644 --- a/src/Settings/InfoProviderSystem/TMESettings.php +++ b/src/Settings/InfoProviderSystem/TMESettings.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace App\Settings\InfoProviderSystem; +use App\Form\Type\APIKeyType; use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\Settings\Settings; use Jbtronics\SettingsBundle\Settings\SettingsParameter; use Jbtronics\SettingsBundle\Settings\SettingsTrait; @@ -42,24 +44,32 @@ class TMESettings private const SUPPORTED_CURRENCIES = ["EUR", "USD", "PLN", "GBP"]; #[SettingsParameter(label: new TM("settings.ips.tme.token"), - description: new TM("settings.ips.tme.token.help"), formOptions: ["help_html" => true], envVar: "PROVIDER_TME_KEY")] + description: new TM("settings.ips.tme.token.help"), + formType: APIKeyType::class, formOptions: ["help_html" => true], + envVar: "PROVIDER_TME_KEY", envVarMode: EnvVarMode::OVERWRITE)] public ?string $apiToken = null; - #[SettingsParameter(label: new TM("settings.ips.tme.secret"), envVar: "PROVIDER_TME_SECRET")] + #[SettingsParameter(label: new TM("settings.ips.tme.secret"), + formType: APIKeyType::class, + envVar: "PROVIDER_TME_SECRET", envVarMode: EnvVarMode::OVERWRITE)] public ?string $apiSecret = null; - #[SettingsParameter(label: new TM("settings.ips.tme.currency"), formType: CurrencyType::class, formOptions: ["preferred_choices" => self::SUPPORTED_CURRENCIES], envVar: "PROVIDER_TME_CURRENCY")] + #[SettingsParameter(label: new TM("settings.ips.tme.currency"), formType: CurrencyType::class, formOptions: ["preferred_choices" => self::SUPPORTED_CURRENCIES], + envVar: "PROVIDER_TME_CURRENCY", envVarMode: EnvVarMode::OVERWRITE)] #[Assert\Choice(choices: self::SUPPORTED_CURRENCIES)] public string $currency = "EUR"; - #[SettingsParameter(label: new TM("settings.ips.tme.language"), formType: LanguageType::class, formOptions: ["preferred_choices" => ["en", "de", "fr", "pl"]], envVar: "PROVIDER_TME_LANGUAGE")] + #[SettingsParameter(label: new TM("settings.ips.tme.language"), formType: LanguageType::class, formOptions: ["preferred_choices" => ["en", "de", "fr", "pl"]], + envVar: "PROVIDER_TME_LANGUAGE", envVarMode: EnvVarMode::OVERWRITE)] #[Assert\Language] public string $language = "en"; - #[SettingsParameter(label: new TM("settings.ips.tme.country"), formType: CountryType::class, formOptions: ["preferred_choices" => ["DE", "PL", "GB", "FR"]], envVar: "PROVIDER_TME_COUNTRY")] + #[SettingsParameter(label: new TM("settings.ips.tme.country"), formType: CountryType::class, formOptions: ["preferred_choices" => ["DE", "PL", "GB", "FR"]], + envVar: "PROVIDER_TME_COUNTRY", envVarMode: EnvVarMode::OVERWRITE)] #[Assert\Country] public string $country = "DE"; - #[SettingsParameter(label: new TM("settings.ips.tme.grossPrices"), envVar: "bool:PROVIDER_TME_GET_GROSS_PRICES")] + #[SettingsParameter(label: new TM("settings.ips.tme.grossPrices"), + envVar: "bool:PROVIDER_TME_GET_GROSS_PRICES", envVarMode: EnvVarMode::OVERWRITE)] public bool $grossPrices = true; -} \ No newline at end of file +} diff --git a/src/Settings/MiscSettings/ExchangeRateSettings.php b/src/Settings/MiscSettings/ExchangeRateSettings.php new file mode 100644 index 00000000..744523c6 --- /dev/null +++ b/src/Settings/MiscSettings/ExchangeRateSettings.php @@ -0,0 +1,43 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\MiscSettings; + +use App\Form\Type\APIKeyType; +use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; +use Jbtronics\SettingsBundle\Settings\Settings; +use Jbtronics\SettingsBundle\Settings\SettingsParameter; +use Symfony\Component\Translation\TranslatableMessage as TM; + +#[Settings(name: "exchange_rate", label: new TM("settings.misc.exchange_rate"))] +#[SettingsIcon("fa-money-bill-transfer")] +class ExchangeRateSettings +{ + #[SettingsParameter(label: new TM("settings.misc.exchange_rate.fixer_api_key"), + description: new TM("settings.misc.exchange_rate.fixer_api_key.help"), + formType: APIKeyType::class, + envVar: "FIXER_API_KEY", envVarMode: EnvVarMode::OVERWRITE, + )] + public ?string $fixerApiKey = null; +} diff --git a/src/Settings/MiscSettings/MiscSettings.php b/src/Settings/MiscSettings/MiscSettings.php index a2ad0fd4..b8a3a73f 100644 --- a/src/Settings/MiscSettings/MiscSettings.php +++ b/src/Settings/MiscSettings/MiscSettings.php @@ -31,4 +31,7 @@ class MiscSettings { #[EmbeddedSettings] public ?KiCadEDASettings $kicadEDA = null; + + #[EmbeddedSettings] + public ?ExchangeRateSettings $exchangeRate = null; } \ No newline at end of file diff --git a/src/Settings/SystemSettings/CustomizationSettings.php b/src/Settings/SystemSettings/CustomizationSettings.php index abfeb880..d7e92a51 100644 --- a/src/Settings/SystemSettings/CustomizationSettings.php +++ b/src/Settings/SystemSettings/CustomizationSettings.php @@ -49,6 +49,7 @@ class CustomizationSettings #[SettingsParameter( label: new TM("settings.system.customization.banner"), formType: RichTextEditorType::class, formOptions: ['mode' => 'markdown-full'], + envVar: "BANNER", envVarMode: EnvVarMode::OVERWRITE, )] public ?string $banner = null; @@ -58,4 +59,4 @@ class CustomizationSettings )] #[ValidTheme] public string $theme = 'bootstrap'; -} \ No newline at end of file +} diff --git a/src/Settings/SystemSettings/HistorySettings.php b/src/Settings/SystemSettings/HistorySettings.php index 3602a398..46003c6d 100644 --- a/src/Settings/SystemSettings/HistorySettings.php +++ b/src/Settings/SystemSettings/HistorySettings.php @@ -70,6 +70,7 @@ class HistorySettings description: new TM("settings.system.history.enforceComments.description"), options: ['type' => EnumType::class, 'nullable' => false, 'options' => ['class' => EventCommentType::class]], formType: EnforceEventCommentTypesType::class, + formOptions: ['required' => false, "empty_data" => []], envVar: "ENFORCE_CHANGE_COMMENTS_FOR", envVarMode: EnvVarMode::OVERWRITE, envVarMapper: [self::class, 'mapEnforceComments'] )] public array $enforceComments = []; diff --git a/src/Twig/MiscExtension.php b/src/Twig/MiscExtension.php index 3f78a857..8b6ebc68 100644 --- a/src/Twig/MiscExtension.php +++ b/src/Twig/MiscExtension.php @@ -22,6 +22,7 @@ declare(strict_types=1); */ namespace App\Twig; +use App\Settings\SettingsIcon; use Symfony\Component\HttpFoundation\Request; use App\Services\LogSystem\EventCommentType; use Jbtronics\SettingsBundle\Proxy\SettingsProxyInterface; @@ -71,7 +72,7 @@ final class MiscExtension extends AbstractExtension $reflection = new ReflectionClass($objectOrClass); - $attribute = $reflection->getAttributes(\App\Settings\SettingsIcon::class)[0] ?? null; + $attribute = $reflection->getAttributes(SettingsIcon::class)[0] ?? null; return $attribute?->newInstance()->icon; } diff --git a/src/Twig/TwigCoreExtension.php b/src/Twig/TwigCoreExtension.php index 352e09d3..7b2b58f8 100644 --- a/src/Twig/TwigCoreExtension.php +++ b/src/Twig/TwigCoreExtension.php @@ -34,8 +34,11 @@ use Twig\TwigTest; */ final class TwigCoreExtension extends AbstractExtension { - public function __construct(protected ObjectNormalizer $objectNormalizer) + private readonly ObjectNormalizer $objectNormalizer; + + public function __construct() { + $this->objectNormalizer = new ObjectNormalizer(); } public function getFunctions(): array diff --git a/symfony.lock b/symfony.lock index 18bfcad2..d301c269 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,16 +1,16 @@ { - "api-platform/core": { - "version": "3.2", + "api-platform/symfony": { + "version": "4.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "3.2", - "ref": "696d44adc3c0d4f5d25a2f1c4f3700dd8a5c6db9" + "version": "4.0", + "ref": "e9952e9f393c2d048f10a78f272cd35e807d972b" }, "files": [ - "config/packages/api_platform.yaml", - "config/routes/api_platform.yaml", - "src/ApiResource/.gitignore" + "./config/packages/api_platform.yaml", + "./config/routes/api_platform.yaml", + "./src/ApiResource/.gitignore" ] }, "beberlei/assert": { @@ -29,15 +29,15 @@ "version": "1.11.99.4" }, "dama/doctrine-test-bundle": { - "version": "8.0", + "version": "8.3", "recipe": { "repo": "github.com/symfony/recipes-contrib", "branch": "main", - "version": "7.2", - "ref": "896306d79d4ee143af9eadf9b09fd34a8c391b70" + "version": "8.3", + "ref": "dfc51177476fb39d014ed89944cde53dc3326d23" }, "files": [ - "./config/packages/dama_doctrine_test_bundle.yaml" + "config/packages/dama_doctrine_test_bundle.yaml" ] }, "doctrine/cache": { @@ -53,20 +53,26 @@ "version": "v2.9.2" }, "doctrine/deprecations": { - "version": "v0.5.3" - }, - "doctrine/doctrine-bundle": { - "version": "2.11", + "version": "1.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "2.10", - "ref": "c170ded8fc587d6bd670550c43dafcf093762245" + "version": "1.0", + "ref": "87424683adc81d7dc305eefec1fced883084aab9" + } + }, + "doctrine/doctrine-bundle": { + "version": "2.15", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "2.13", + "ref": "620b57f496f2e599a6015a9fa222c2ee0a32adcb" }, "files": [ - "./config/packages/doctrine.yaml", - "./src/Entity/.gitignore", - "./src/Repository/.gitignore" + "config/packages/doctrine.yaml", + "src/Entity/.gitignore", + "src/Repository/.gitignore" ] }, "doctrine/doctrine-fixtures-bundle": { @@ -127,9 +133,6 @@ "ekino/phpstan-banned-code": { "version": "v0.3.1" }, - "erusev/parsedown": { - "version": "1.7.4" - }, "florianv/exchanger": { "version": "1.4.1" }, @@ -210,15 +213,15 @@ ] }, "nelmio/security-bundle": { - "version": "2.4", + "version": "3.5", "recipe": { "repo": "github.com/symfony/recipes", - "branch": "master", + "branch": "main", "version": "2.4", - "ref": "65726efb67ff51d89de38195bc0d230fa811f64d" + "ref": "71045833e4f882ad9de8c95fe47efb99a1eec2f7" }, "files": [ - "./config/packages/nelmio_security.yaml" + "config/packages/nelmio_security.yaml" ] }, "nikic/php-parser": { @@ -303,17 +306,18 @@ "version": "0.12.4" }, "phpunit/phpunit": { - "version": "9.6", + "version": "11.5", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "9.6", - "ref": "7364a21d87e658eb363c5020c072ecfdc12e2326" + "version": "11.1", + "ref": "c6658a60fc9d594805370eacdf542c3d6b5c0869" }, "files": [ - "./.env.test", - "./phpunit.xml.dist", - "./tests/bootstrap.php" + ".env.test", + "bin/phpunit", + "phpunit.xml.dist", + "tests/bootstrap.php" ] }, "psr/cache": { @@ -383,10 +387,10 @@ "repo": "github.com/symfony/recipes-contrib", "branch": "main", "version": "1.0", - "ref": "0f18b4decdf5695d692c1d0dfd65516a07a6adf1" + "ref": "5d454ec6cc4c700ed3d963f3803e1d427d9669fb" }, "files": [ - "./public/.htaccess" + "public/.htaccess" ] }, "symfony/asset": { @@ -478,17 +482,27 @@ ] }, "symfony/form": { - "version": "v4.2.3" - }, - "symfony/framework-bundle": { - "version": "6.4", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "6.4", - "ref": "a91c965766ad3ff2ae15981801643330eb42b6a5" + "version": "7.2", + "ref": "7d86a6723f4a623f59e2bf966b6aad2fc461d36b" }, "files": [ + "./config/packages/csrf.yaml" + ] + }, + "symfony/framework-bundle": { + "version": "7.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.3", + "ref": "5a1497d539f691b96afd45ae397ce5fe30beb4b9" + }, + "files": [ + ".editorconfig", "config/packages/cache.yaml", "config/packages/framework.yaml", "config/preload.php", @@ -515,15 +529,15 @@ "version": "v4.2.3" }, "symfony/mailer": { - "version": "6.4", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "4.3", - "ref": "df66ee1f226c46f01e85c29c2f7acce0596ba35a" + "ref": "09051cfde49476e3c12cd3a0e44289ace1c75a4f" }, "files": [ - "./config/packages/mailer.yaml" + "config/packages/mailer.yaml" ] }, "symfony/maker-bundle": { @@ -560,19 +574,14 @@ "version": "v5.3.8" }, "symfony/phpunit-bridge": { - "version": "6.4", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "6.3", - "ref": "a411a0480041243d97382cac7984f7dce7813c08" + "version": "7.3", + "ref": "dc13fec96bd527bd399c3c01f0aab915c67fd544" }, - "files": [ - "./.env.test", - "./bin/phpunit", - "./phpunit.xml.dist", - "./tests/bootstrap.php" - ] + "files": [] }, "symfony/polyfill-ctype": { "version": "v1.14.0" @@ -602,15 +611,24 @@ "version": "v4.2.3" }, "symfony/property-info": { - "version": "v4.2.3" - }, - "symfony/routing": { - "version": "6.2", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "6.2", - "ref": "e0a11b4ccb8c9e70b574ff5ad3dfdcd41dec5aa6" + "version": "7.3", + "ref": "dae70df71978ae9226ae915ffd5fad817f5ca1f7" + }, + "files": [ + "./config/packages/property_info.yaml" + ] + }, + "symfony/routing": { + "version": "7.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.0", + "ref": "21b72649d5622d8f7da329ffb5afb232a023619d" }, "files": [ "config/packages/routing.yaml", @@ -649,17 +667,18 @@ "version": "v1.1.5" }, "symfony/stimulus-bundle": { - "version": "2.16", + "version": "2.27", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "2.13", - "ref": "6acd9ff4f7fd5626d2962109bd4ebab351d43c43" + "version": "2.20", + "ref": "e058471c5502e549c1404ebdd510099107bb5549" }, "files": [ - "./assets/bootstrap.js", - "./assets/controllers.json", - "./assets/controllers/hello_controller.js" + "assets/bootstrap.js", + "assets/controllers.json", + "assets/controllers/csrf_protection_controller.js", + "assets/controllers/hello_controller.js" ] }, "symfony/stopwatch": { @@ -669,16 +688,16 @@ "version": "v5.1.0" }, "symfony/translation": { - "version": "6.4", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "6.3", - "ref": "e28e27f53663cc34f0be2837aba18e3a1bef8e7b" + "ref": "620a1b84865ceb2ba304c8f8bf2a185fbf32a843" }, "files": [ - "./config/packages/translation.yaml", - "./translations/.gitignore" + "config/packages/translation.yaml", + "translations/.gitignore" ] }, "symfony/translation-contracts": { @@ -701,16 +720,14 @@ ] }, "symfony/uid": { - "version": "6.2", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "6.2", - "ref": "d294ad4add3e15d7eb1bae0221588ca89b38e558" + "version": "7.0", + "ref": "0df5844274d871b37fc3816c57a768ffc60a43a5" }, - "files": [ - "./config/packages/uid.yaml" - ] + "files": [] }, "symfony/ux-translator": { "version": "2.9", @@ -728,15 +745,24 @@ ] }, "symfony/ux-turbo": { - "version": "v2.16.0" - }, - "symfony/validator": { - "version": "5.4", + "version": "2.28", "recipe": { "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "5.3", - "ref": "c32cfd98f714894c4f128bb99aa2530c1227603c" + "branch": "main", + "version": "2.20", + "ref": "287f7c6eb6e9b65e422d34c00795b360a787380b" + }, + "files": [ + "config/packages/ux_turbo.yaml" + ] + }, + "symfony/validator": { + "version": "7.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.0", + "ref": "8c1c4e28d26a124b0bb273f537ca8ce443472bfd" }, "files": [ "config/packages/validator.yaml" @@ -752,12 +778,12 @@ "version": "v4.2.3" }, "symfony/web-profiler-bundle": { - "version": "6.3", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "6.1", - "ref": "e42b3f0177df239add25373083a564e5ead4e13a" + "version": "7.3", + "ref": "a363460c1b0b4a4d0242f2ce1a843ca0f6ac9026" }, "files": [ "config/packages/web_profiler.yaml", @@ -765,12 +791,12 @@ ] }, "symfony/webpack-encore-bundle": { - "version": "2.1", + "version": "2.2", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "2.0", - "ref": "082d754b3bd54b3fc669f278f1eea955cfd23cf5" + "ref": "9ef5412a4a2a8415aca3a3f2b4edd3866aab9a19" }, "files": [ "assets/app.js", @@ -783,9 +809,6 @@ "symfony/yaml": { "version": "v4.2.3" }, - "symplify/easy-coding-standard": { - "version": "v7.1.3" - }, "tecnickcom/tc-lib-barcode": { "version": "1.15.20" }, diff --git a/templates/form/extended_bootstrap_layout.html.twig b/templates/form/extended_bootstrap_layout.html.twig index 811f57ac..75e44a15 100644 --- a/templates/form/extended_bootstrap_layout.html.twig +++ b/templates/form/extended_bootstrap_layout.html.twig @@ -1,5 +1,9 @@ {% extends 'bootstrap_5_horizontal_layout.html.twig' %} +{%- block toggle_password_widget -%} +
{{ block('password_widget') }}
+{%- endblock toggle_password_widget -%} + {# Make form rows smaller #} {% block form_row -%} {%- set row_attr = row_attr|merge({"class": "mb-2"}) -%} @@ -139,4 +143,4 @@ {% else %} {{- parent() -}} {% endif %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/form/settings_form.html.twig b/templates/form/settings_form.html.twig new file mode 100644 index 00000000..9e1a8c4f --- /dev/null +++ b/templates/form/settings_form.html.twig @@ -0,0 +1,25 @@ +{% extends "form/extended_bootstrap_layout.html.twig" %} + +{% block form_label %} + {# If parameter_envvar exists on form then show it as tooltip #} + {% if parameter_envvar is defined and parameter_envvar is not null %} + {%- set label_attr = label_attr|merge({title: 'settings.tooltip.overrideable_by_env'|trans(arguments = {'%env%': (parameter_envvar)|trim})}) -%} + {% endif %} + {{- parent() -}} +{% endblock %} + +{% block checkbox_radio_label %} + {# If parameter_envvar exists on form then show it as tooltip #} + {% if parameter_envvar is defined and parameter_envvar is not null %} + {%- set label_attr = label_attr|merge({title: 'settings.tooltip.overrideable_by_env'|trans(arguments = {'%env%': (parameter_envvar)|trim})}) -%} + {% endif %} + {{- parent() -}} +{% endblock %} + +{% block tristate_label %} + {# If parameter_envvar exists on form then show it as tooltip #} + {% if parameter_envvar is defined and parameter_envvar is not null %} + {%- set label_attr = label_attr|merge({title: 'settings.tooltip.overrideable_by_env'|trans(arguments = {'%env%': (parameter_envvar)|trim})}) -%} + {% endif %} + {{- parent() -}} +{% endblock %} diff --git a/templates/info_providers/providers.macro.html.twig b/templates/info_providers/providers.macro.html.twig index 7304806a..827a95fd 100644 --- a/templates/info_providers/providers.macro.html.twig +++ b/templates/info_providers/providers.macro.html.twig @@ -13,7 +13,6 @@ {% else %} {{ provider.providerInfo.name | trans }} {% endif %} -
{% if provider.providerInfo.description is defined and provider.providerInfo.description is not null %} @@ -23,6 +22,11 @@
+ {% if provider.providerInfo.settings_class is defined %} + + {% endif %} {% for capability in provider.capabilities %} {# @var capability \App\Services\InfoProviderSystem\Providers\ProviderCapabilities #} @@ -52,4 +56,4 @@ {% endfor %} -{% endmacro %} \ No newline at end of file +{% endmacro %} diff --git a/templates/info_providers/settings/provider_settings.html.twig b/templates/info_providers/settings/provider_settings.html.twig new file mode 100644 index 00000000..1876c2eb --- /dev/null +++ b/templates/info_providers/settings/provider_settings.html.twig @@ -0,0 +1,31 @@ +{% extends "main_card.html.twig" %} +{% macro genId(widget) %}{{ widget.vars.full_name }}{% endmacro %} + +{% form_theme form "form/settings_form.html.twig" %} + +{% block title %}{% trans %}info_providers.settings.title{% endtrans %}: {{ info_provider_info.name }}{% endblock %} + +{% block card_title %} {% trans %}info_providers.settings.title{% endtrans %}: {{ info_provider_info.name }}{% endblock %} + +{% block card_content %} +
+

+ {% if info_provider_info.url %} + {{ info_provider_info.name }} + {% else %} + {{ info_provider_info.name }} + {% endif %} +

+ {% if info_provider_info.description %} +

{{ info_provider_info.description }}

+ {% endif %} +
+ + {{ form_start(form) }} +
+
+ {{ form_help(form) }} +
+
+ {{ form_end(form) }} +{% endblock %} diff --git a/templates/parts/info/_picture.html.twig b/templates/parts/info/_picture.html.twig index 6bfb2472..e6aa74b3 100644 --- a/templates/parts/info/_picture.html.twig +++ b/templates/parts/info/_picture.html.twig @@ -13,7 +13,7 @@