Showing
35 changed files
with
2052 additions
and
0 deletions
Too many changes to show.
To preserve performance only 35 of 148 files are displayed.
.blackfire.yml
0 → 100644
| 1 | +tests: | |
| 2 | + 'The homepage should be fast': | |
| 3 | + path: | |
| 4 | + - '/' | |
| 5 | + assertions: | |
| 6 | + - 'main.wall_time <= 250ms' | |
| 7 | + 'Some Composer dependencies have known security issues and should be upgraded': | |
| 8 | + path: | |
| 9 | + - '/.*' | |
| 10 | + assertions: | |
| 11 | + - { expression: 'not has_vulnerable_dependencies()' } | |
| 12 | + '"assert.active" is a dev_only feature and should be disabled in production': | |
| 13 | + path: | |
| 14 | + - '/.*' | |
| 15 | + assertions: | |
| 16 | + - { expression: 'runtime.configuration.assert_active === false' } | |
| 17 | + '"display_errors" should be disabled': | |
| 18 | + path: | |
| 19 | + - '/.*' | |
| 20 | + assertions: | |
| 21 | + - { expression: 'not is_configuration_enabled("display_errors")' } | |
| 22 | + '"display_startup_errors" should not be enabled': | |
| 23 | + path: | |
| 24 | + - '/.*' | |
| 25 | + assertions: | |
| 26 | + - { expression: 'not is_configuration_enabled("display_startup_errors")' } | |
| 27 | + '"max_execution_time" should be less than 30 seconds for Web requests': | |
| 28 | + path: | |
| 29 | + - '/.*' | |
| 30 | + assertions: | |
| 31 | + - { expression: 'runtime.configuration.max_execution_time <= 30' } | |
| 32 | + '"session.use_strict_mode" should be enabled': | |
| 33 | + path: | |
| 34 | + - '/.*' | |
| 35 | + assertions: | |
| 36 | + - { expression: 'runtime.configuration.session_use_strict_mode === true' } | |
| 37 | + '"zend.detect_unicode" should be disabled as BOMs are not portable': | |
| 38 | + path: | |
| 39 | + - '/.*' | |
| 40 | + assertions: | |
| 41 | + - { expression: 'runtime.configuration.zend_detect_unicode === false' } | |
| 42 | + 'The realpath cache ttl should be more than one hour in production': | |
| 43 | + path: | |
| 44 | + - '/.*' | |
| 45 | + assertions: | |
| 46 | + - { expression: 'runtime.configuration.realpath_cache_ttl >= 3600' } | |
| 47 | + 'The session garbage collector should be disabled in production': | |
| 48 | + path: | |
| 49 | + - '/.*' | |
| 50 | + assertions: | |
| 51 | + - { expression: 'runtime.configuration.session_gc_probability === 0' } | |
| 52 | + | |
| 53 | +scenarios: | | |
| 54 | + #!blackfire-player | |
| 55 | + | |
| 56 | + name "Drupal Scenarios" | |
| 57 | + | |
| 58 | + group homepages | |
| 59 | + visit url("/") | |
| 60 | + name "Homepage (English)" | |
| 61 | + expect status_code() == 200 | |
| 62 | + visit url("/es") | |
| 63 | + name "Homepage (Español)" | |
| 64 | + expect status_code() == 200 | |
| 65 | + | |
| 66 | + group articles | |
| 67 | + visit url("/en/articles") | |
| 68 | + name "Articles" | |
| 69 | + expect status_code() == 200 | |
| 70 | + | |
| 71 | + group admin_anonymous | |
| 72 | + visit url("/en/admin/content") | |
| 73 | + expect status_code() == 403 | |
| 74 | + visit url("/en/admin/structure") | |
| 75 | + expect status_code() == 403 | |
| 76 | + | |
| 77 | + scenario | |
| 78 | + name "Anonymous Visit" | |
| 79 | + include homepages | |
| 80 | + include articles | |
| 81 | + include admin_anonymous | ... | ... |
.ddev/.gitignore
0 → 100644
| 1 | +# You can remove the above line if you want to edit and maintain this file yourself. | |
| 2 | + | |
| 3 | +/**/*.example | |
| 4 | +/.dbimageBuild | |
| 5 | +/.dbimageExtra | |
| 6 | +/.ddev-docker-*.yaml | |
| 7 | +/.*downloads | |
| 8 | +/.global_commands | |
| 9 | +/.homeadditions | |
| 10 | +/.importdb* | |
| 11 | +/.sshimageBuild | |
| 12 | +/.venv | |
| 13 | +/.webimageBuild | |
| 14 | +/.webimageExtra | |
| 15 | +/apache/apache-site.conf | |
| 16 | +/commands/.gitattributes | |
| 17 | +/commands/db/mysql | |
| 18 | +/commands/host/launch | |
| 19 | +/commands/web/xdebug | |
| 20 | +/commands/web/live | |
| 21 | +/config.local.y*ml | |
| 22 | +/db_dumps/* | |
| 23 | +/db_snapshots | |
| 24 | +/file_dumps/* | |
| 25 | +/import-db | |
| 26 | +/import.yaml | |
| 27 | +/mutagen/mutagen.yml | |
| 28 | +/mutagen/.start-synced | |
| 29 | +/nginx_full/nginx-site.conf | |
| 30 | +/postgres/postgresql.conf | |
| 31 | +/providers/platform.yaml | |
| 32 | +/sequelpro.spf | |
| 33 | +/settings/settings.ddev.py | |
| 34 | +/traefik/config/*.yaml | |
| 35 | +/traefik/certs/*.crt | |
| 36 | +/traefik/certs/*.key | |
| 37 | +/xhprof/xhprof_prepend.php | |
| 38 | +/**/README.* | ... | ... |
.ddev/commands/host/auto-update
0 → 100755
| 1 | +#!/usr/bin/env bash | |
| 2 | + | |
| 3 | +# Disable commands dynamic path. | |
| 4 | +# shellcheck disable=SC2154 | |
| 5 | + | |
| 6 | +# Prepare some colors. | |
| 7 | +red=$(tput -T xterm-256color setaf 1) | |
| 8 | +aqua=$(tput -T xterm-256color setaf 14) | |
| 9 | +lime=$(tput -T xterm-256color setaf 10) | |
| 10 | +yellow=$(tput -T xterm-256color setaf 11) | |
| 11 | +no_color=$(tput -T xterm-256color sgr0) | |
| 12 | + | |
| 13 | +# Declare composer update function. | |
| 14 | +composer_update() { | |
| 15 | + # Print debug command | |
| 16 | + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev composer update $1${no_color}" | |
| 17 | + | |
| 18 | + # Run ddev composer update on all available updates. | |
| 19 | + (ddev composer update $1 | tee composer_update_result.txt) > /dev/null 2>&1 | |
| 20 | + | |
| 21 | + # Get update result. | |
| 22 | + composer_update_result=$(cat composer_update_result.txt) && rm composer_update_result.txt | |
| 23 | + | |
| 24 | + # Check if we see problem string inside our logs. | |
| 25 | + if [[ ${composer_update_result} == *"Problem"* ]]; then | |
| 26 | + # Print message about errors. | |
| 27 | + echo "${aqua}[Auto update] ${red}Composer update failed due to dependencies problems. Fix all listed problems and try again.${no_color}" | |
| 28 | + exit | |
| 29 | + fi | |
| 30 | + | |
| 31 | + # Check if we see permission denied string inside our logs. | |
| 32 | + if [[ ${composer_update_result} == *"Permission denied (publickey)"* ]]; then | |
| 33 | + # Print message about errors. | |
| 34 | + echo "${aqua}[Auto update] ${red}Composer update failed due to permission denied. Fix all listed problems and try again.${no_color}" | |
| 35 | + exit | |
| 36 | + fi | |
| 37 | +} | |
| 38 | + | |
| 39 | +# Declare auto update function. | |
| 40 | +auto_update() { | |
| 41 | + # Prepare declaration. | |
| 42 | + declare -A packages_to_update=() | |
| 43 | + | |
| 44 | + # Prepare some variables. | |
| 45 | + app_path="web" | |
| 46 | + updates_check_script_path=".ddev/commands/host/auto_update/updates_check.php" | |
| 47 | + | |
| 48 | + # Check if target script does actually exists. | |
| 49 | + if [[ ! -f ${updates_check_script_path} ]]; then | |
| 50 | + # If not print proper message. | |
| 51 | + echo "${aqua}[Auto update] ${red}Updates check failed. File 'updates_check.php' not found.${no_color}" | |
| 52 | + exit 1; | |
| 53 | + fi | |
| 54 | + | |
| 55 | + # Loop through each given site. | |
| 56 | + for site in "$@"; do | |
| 57 | + # Print what we are doing on which site. | |
| 58 | + echo "${aqua}[Auto update] ${no_color}Running auto-update on site \"${yellow}${site}${no_color}\"." | |
| 59 | + echo "${aqua}[Auto update] ${no_color}Enabling update module on target site..." | |
| 60 | + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev drush en update -y -l \"${site}\"${no_color}" | |
| 61 | + | |
| 62 | + # Enable update module. | |
| 63 | + ddev drush en update -y -l "${site}" > /dev/null 2>&1 | |
| 64 | + | |
| 65 | + # Print what we gonna do. | |
| 66 | + echo "${aqua}[Auto update] ${no_color}Clearing cache after enabling module..." | |
| 67 | + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev drush cr -y -l \"${site}\"${no_color}" | |
| 68 | + | |
| 69 | + # Clear cache after those actions | |
| 70 | + ddev drush cr -y -l "${site}" > /dev/null 2>&1 | |
| 71 | + | |
| 72 | + # Print what we gonna do. | |
| 73 | + echo "${aqua}[Auto update] ${no_color}Gather info about packages that need to be updated..." | |
| 74 | + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev php \"${updates_check_script_path}\" \"${site}\" \"${app_path}\"${no_color}" | |
| 75 | + | |
| 76 | + # Run update test on given site. | |
| 77 | + updates_check_result=$(ddev php "${updates_check_script_path}" "${site}" "${app_path}" | tail -n1) | |
| 78 | + | |
| 79 | + # Check if results does actually contain anything. | |
| 80 | + if [[ ${updates_check_result} =~ (<<)(.*)(>>) ]]; then | |
| 81 | + # Get our packages which need to be updates. | |
| 82 | + if [[ -n ${BASH_REMATCH[2]} ]]; then | |
| 83 | + # Loop through each package to update. | |
| 84 | + for package in ${BASH_REMATCH[2]}; do | |
| 85 | + # Save that package to array. | |
| 86 | + packages_to_update[${package}]=${package} | |
| 87 | + done | |
| 88 | + fi | |
| 89 | + else | |
| 90 | + # In case of any other case, print error. | |
| 91 | + echo "${aqua}[Auto update] ${red}Updates check failed. Reason: ${no_color}${updates_check_result}" | |
| 92 | + exit 1; | |
| 93 | + fi | |
| 94 | + done | |
| 95 | + | |
| 96 | + # Check if we successfully get some requirements. | |
| 97 | + if [[ -n "${packages_to_update[*]}" ]]; then | |
| 98 | + # Print them. | |
| 99 | + echo "${aqua}[Auto update] ${no_color}Required update for following packages: ${lime}${packages_to_update[*]}${no_color}" | |
| 100 | + | |
| 101 | + # If drupal/core needs to be updated, we need to check if drupal/core-recommended is used. | |
| 102 | + if [[ "${packages_to_update[*]}" == *"drupal/core"* ]]; then | |
| 103 | + # Print debug command. | |
| 104 | + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev composer show drupal/core-recommended${no_color}" | |
| 105 | + | |
| 106 | + # Show all core-recommended packages. | |
| 107 | + ddev composer show drupal/core-recommended | tee drupal_core_recommended.txt > /dev/null 2>&1 | |
| 108 | + | |
| 109 | + # Save them to variable. | |
| 110 | + drupal_core_recommended=$(cat drupal_core_recommended.txt) && rm drupal_core_recommended.txt | |
| 111 | + | |
| 112 | + # Check if core-recommend was found. | |
| 113 | + if [[ ${drupal_core_recommended} != *"Package drupal/core-recommended not found"* ]]; then | |
| 114 | + # If so then run all core-* updates. | |
| 115 | + composer_update "drupal/core-* --with-all-dependencies --no-interaction --no-dev" | |
| 116 | + | |
| 117 | + # Remove drupal/core from the list, since the update for it was already executed. | |
| 118 | + unset packages_to_update["drupal/core"] | |
| 119 | + fi | |
| 120 | + fi | |
| 121 | + | |
| 122 | + # Update all other packages for which update is needed. | |
| 123 | + if [[ -n "${packages_to_update[*]}" ]]; then | |
| 124 | + # Run the same command as for drupal/core. | |
| 125 | + composer_update "${packages_to_update[*]} --with-dependencies --no-interaction" | |
| 126 | + fi | |
| 127 | + | |
| 128 | + # Print debug command. | |
| 129 | + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}git status${no_color}" | |
| 130 | + | |
| 131 | + # Check if composer.lock was changed and grab full path to it from git status output. | |
| 132 | + git status | tee git_status_result.txt > /dev/null 2>&1 | |
| 133 | + git_status_result=$(cat git_status_result.txt) && rm git_status_result.txt | |
| 134 | + | |
| 135 | + # Check if we have changes inside composer.lock | |
| 136 | + if [[ ${git_status_result} =~ ([ ]+)(([a-zA-Z0-9_ \/\.\-]+\/)*composer\.lock) ]]; then | |
| 137 | + # Get lock file changes for variables. | |
| 138 | + composer_lock_file=${BASH_REMATCH[2]} | |
| 139 | + date=$(date '+%Y-%m-%d_%H-%M-%S') | |
| 140 | + update_branch_name="update/${date}" | |
| 141 | + | |
| 142 | + # Try to run extra commands after update. | |
| 143 | + for site in ${1//,/ }; do | |
| 144 | + # Print debug command. | |
| 145 | + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev drush updb -y -l \"${site}\"${no_color}" | |
| 146 | + | |
| 147 | + # Run database update on current site. | |
| 148 | + (ddev drush updb -y -l "${site}" 2>&1 | tee drush_update_db_result.txt) > /dev/null 2>&1 | |
| 149 | + drush_update_db_result=$(cat drush_update_db_result.txt) | |
| 150 | + | |
| 151 | + # Check if we have success. | |
| 152 | + if | |
| 153 | + [[ ${drush_update_db_result} != *"[success] No pending updates."* ]] && | |
| 154 | + [[ ${drush_update_db_result} != *"[success] Finished performing updates."* ]] && | |
| 155 | + [ "${#drush_update_db_result}" -gt 0 ] | |
| 156 | + then | |
| 157 | + # If not print that and quit. | |
| 158 | + echo "${aqua}[Auto update] ${red}Database updates failed.${no_color}" | |
| 159 | + exit 1; | |
| 160 | + fi | |
| 161 | + | |
| 162 | + # Remove logs from drush update db. | |
| 163 | + rm drush_update_db_result.txt | |
| 164 | + | |
| 165 | + # Print debug command. | |
| 166 | + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev drush cr -y -l \"${site}\"${no_color}" | |
| 167 | + | |
| 168 | + # Final step, clear cache. | |
| 169 | + ddev drush cr -y -l "${site}" > /dev/null 2>&1 | |
| 170 | + | |
| 171 | + # Print debug command. | |
| 172 | + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev drush cex -y -l \"${site}\"${no_color}" | |
| 173 | + | |
| 174 | + # Final step, clear cache. | |
| 175 | + ddev drush cex -y -l "${site}" > /dev/null 2>&1 | |
| 176 | + done | |
| 177 | + | |
| 178 | + # Print debug command. | |
| 179 | + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}git checkout && git add && git commit${no_color}" | |
| 180 | + | |
| 181 | + # Create new branch, add updates files and commit them. | |
| 182 | + git checkout -B "${update_branch_name}" > /dev/null 2>&1 | |
| 183 | + git add "*.yml" > /dev/null 2>&1 | |
| 184 | + git add "composer.json" > /dev/null 2>&1 | |
| 185 | + git add "${composer_lock_file}" > /dev/null 2>&1 | |
| 186 | + git commit -m "${DDEV_SITENAME^}: Update ${date}" > /dev/null 2>&1 | |
| 187 | + git push --set-upstream origin "${update_branch_name}" | |
| 188 | + | |
| 189 | + # Print success message. | |
| 190 | + echo "${aqua}[Auto update] ${lime}Auto update finished successfully.${no_color}" | |
| 191 | + else | |
| 192 | + # If we do not have any changes inside composer.lock print message. | |
| 193 | + echo "${aqua}[Auto update] ${red}Branch not created, because composer.lock file was not modified.${no_color}" | |
| 194 | + fi | |
| 195 | + else | |
| 196 | + # Print proper message if we do not have security updates. | |
| 197 | + echo "${aqua}[Auto update] ${lime}No security updates available.${no_color}" | |
| 198 | + fi | |
| 199 | +} | |
| 200 | + | |
| 201 | +# Get all sites that user requested. | |
| 202 | +sites_to_update=${@:1} | |
| 203 | + | |
| 204 | +# Check if we actually have any site. | |
| 205 | +if [[ -z ${sites_to_update+x} || -z ${sites_to_update} ]]; then | |
| 206 | + # If not make default one as required. | |
| 207 | + sites_to_update="default" | |
| 208 | +fi | |
| 209 | + | |
| 210 | +# Print proper message if we do not have security updates. | |
| 211 | +echo "${aqua}[Auto update] ${lime}Running auto-update${no_color} script on those sites: ${yellow}${sites_to_update}${no_color}." | |
| 212 | + | |
| 213 | +# Run auto_update function with all given sites. | |
| 214 | +auto_update ${sites_to_update} | ... | ... |
.ddev/commands/host/build
0 → 100755
.ddev/commands/host/build-profile
0 → 100755
| 1 | +#!/usr/bin/env bash | |
| 2 | + | |
| 3 | +# Composer install with styles. | |
| 4 | +ddev composer install | |
| 5 | +ddev drush sql-drop -y | |
| 6 | +ddev drush site-install droopler install_configure_form.enable_update_status_module=TRUE install_configure_form.enable_update_status_emails=NULL --db-url='{{ DDEV_DATABASE_FAMILY }}://db:db@db/db' --account-name=admin --account-pass=123 --site-name=droopler -y --locale=en droopler_additional_modules_form.module_d_blog=1 droopler_additional_modules_form.module_d_product=1 droopler_additional_modules_form.init_content=1 droopler_additional_modules_form.documentation=1 | |
| 7 | +ddev theme | |
| 8 | +ddev drush cr | |
| 9 | +ddev drush uli | ... | ... |
.ddev/commands/host/compatibility
0 → 100755
| 1 | +#!/usr/bin/env bash | |
| 2 | + | |
| 3 | +# Disable commands dynamic path. | |
| 4 | +# shellcheck disable=SC2154 | |
| 5 | + | |
| 6 | +helpFunction() | |
| 7 | +{ | |
| 8 | + echo "" | |
| 9 | + echo "Usage: ddev compatibility <php version> <directories>" | |
| 10 | + echo -e "\tExample: ddev compatibility 8.2 web/modules/custom web/themes/custom" | |
| 11 | + exit 1 | |
| 12 | +} | |
| 13 | + | |
| 14 | +if [ "$#" -lt 2 ]; then | |
| 15 | + echo "Illegal number of parameters" | |
| 16 | + helpFunction | |
| 17 | +fi | |
| 18 | + | |
| 19 | +PHPVER="$1" | |
| 20 | +shift | |
| 21 | +DIRECTORY="$@" | |
| 22 | + | |
| 23 | +# Begin script in case all parameters are correct | |
| 24 | +FIND="find $DIRECTORY -name '*.php' -or -name '*.module' -or -name '*.install' -or -name '*.theme' -or -name '*.inc' -or -name '*.profile'" | |
| 25 | +docker run --rm -ti -w "/opt/project" -v `pwd`:/opt/project php:$PHPVER bash -c "$FIND | xargs -n1 /usr/local/bin/php --syntax-check" || true | |
| 26 | +docker run --rm -ti -w "/opt/project" -v `pwd`:/opt/project droptica/compatibility:latest phpcs --ignore=*.js,*.css -p $DIRECTORY --standard=PHPCompatibility --runtime-set testVersion $PHPVER --report=code || true | ... | ... |
.ddev/commands/host/db-restore
0 → 100755
| 1 | +#!/usr/bin/env bash | |
| 2 | + | |
| 3 | +# Check if database snpashot exists. | |
| 4 | +if [ -f ".ddev/db_dumps/db.sql.gz" ]; then | |
| 5 | + # Add info about page restoring. | |
| 6 | + printf "[%s] Restoring the database...\n" "${DDEV_SITENAME}" | |
| 7 | + | |
| 8 | + # Restore db from local dump. | |
| 9 | + ddev import-db --target-db=db --src=.ddev/db_dumps/db.sql.gz | |
| 10 | +fi | ... | ... |
.ddev/commands/host/files-import
0 → 100755
| 1 | +#!/usr/bin/env bash | |
| 2 | + | |
| 3 | + | |
| 4 | +# Check if files dir exists. | |
| 5 | +if [ -f "${DDEV_APPROOT}/.ddev/file_dumps/files.tar.gz" ]; then | |
| 6 | + # Add info about page restoring. | |
| 7 | + printf "[%s] Importing the files...\n" "${DDEV_SITENAME}" | |
| 8 | + | |
| 9 | + # Remove all current files. | |
| 10 | + rm -rf ${DDEV_APPROOT}/app/web/sites/default/files/* | |
| 11 | + | |
| 12 | + # Extra new ones. | |
| 13 | + tar -xf ${DDEV_APPROOT}/.ddev/file_dumps/files.tar.gz -C ${DDEV_APPROOT}/app/web/sites/default | |
| 14 | + | |
| 15 | + # Check if drush is successfully installed (if not this should be first build). | |
| 16 | + if [ -f " ${DDEV_APPROOT}/app/vendor/bin/drush" ]; then | |
| 17 | + # Clear drupal cache after our little modification. | |
| 18 | + ddev drush cr | |
| 19 | + fi | |
| 20 | +fi | ... | ... |
.ddev/commands/host/phpcbf
0 → 100755
| 1 | +#!/usr/bin/env bash | |
| 2 | + | |
| 3 | +PHPCS_CONFIG_PATH="./phpcs.xml" | |
| 4 | + | |
| 5 | +if [[ "$#" -gt 0 && "$1" == "--droopler" ]]; then | |
| 6 | + PHPCS_DIRECTORIES="/app/web/profiles/contrib/droopler/modules/custom /app/web/profiles/contrib/droopler/themes/custom" | |
| 7 | + docker run --rm -t -v `pwd`:/app droptica/phpcs:latest phpcbf --standard=${PHPCS_CONFIG_PATH} ${PHPCS_DIRECTORIES} | |
| 8 | +else | |
| 9 | + docker run --rm -t -v `pwd`:/app droptica/phpcs:latest phpcbf --standard=${PHPCS_CONFIG_PATH} | |
| 10 | +fi | ... | ... |
.ddev/commands/host/phpcs
0 → 100755
| 1 | +#!/usr/bin/env bash | |
| 2 | + | |
| 3 | +PHPCS_CONFIG_PATH="./phpcs.xml" | |
| 4 | + | |
| 5 | +if [[ "$#" -gt 0 && "$1" == "--droopler" ]]; then | |
| 6 | + PHPCS_DIRECTORIES="/app/web/profiles/contrib/droopler" | |
| 7 | + docker run --rm -t -v `pwd`:/app droptica/phpcs:latest phpcs --standard=${PHPCS_CONFIG_PATH} ${PHPCS_DIRECTORIES} | |
| 8 | +else | |
| 9 | + docker run --rm -t -v `pwd`:/app droptica/phpcs:latest phpcs --standard=${PHPCS_CONFIG_PATH} | |
| 10 | +fi | ... | ... |
.ddev/commands/host/phpstan
0 → 100755
| 1 | +#!/usr/bin/env bash | |
| 2 | + | |
| 3 | +PHPSTAN_CONFIG_PATH="/opt/project/phpstan.neon" | |
| 4 | + | |
| 5 | +if [[ "$#" -gt 0 && "$1" == "--droopler" ]]; then | |
| 6 | + PHPSTAN_DIRECTORIES="/opt/project/web/profiles/contrib/droopler" | |
| 7 | + docker run --rm -t -v `pwd`:/opt/project droptica/phpstan:latest analyse -c ${PHPSTAN_CONFIG_PATH} ${PHPSTAN_DIRECTORIES} | |
| 8 | +else | |
| 9 | + docker run --rm -t -v `pwd`:/opt/project droptica/phpstan:latest analyse -c ${PHPSTAN_CONFIG_PATH} | |
| 10 | +fi | ... | ... |
.ddev/commands/web/theme
0 → 100755
| 1 | +#!/usr/bin/env bash | |
| 2 | + | |
| 3 | +THEME_DIR="/var/www/html/web/profiles/contrib/droopler/themes/custom/droopler_theme" | |
| 4 | +SUBTHEME_DIR="/var/www/html/web/themes/custom/droopler_subtheme" | |
| 5 | + | |
| 6 | +# Install droopler_theme npm packages. | |
| 7 | +cd ${THEME_DIR} | |
| 8 | +npm install | |
| 9 | + | |
| 10 | +# Install droopler_subtheme npm packages. | |
| 11 | +cd ${SUBTHEME_DIR} | |
| 12 | +npm install | |
| 13 | + | |
| 14 | +# Check if user wants instant-update. | |
| 15 | +if [ "$1" == "watch" ]; then | |
| 16 | + npm run watch | |
| 17 | +elif [ "$1" == "dev" ]; then | |
| 18 | + echo "Compiling DEV version." | |
| 19 | + npm run dev | |
| 20 | +else | |
| 21 | + echo "Compiling PRODUCTION, minified version." | |
| 22 | + npm run production | |
| 23 | +fi | ... | ... |
.ddev/commands/web/theme-profile
0 → 100755
| 1 | +#!/usr/bin/env bash | |
| 2 | + | |
| 3 | +THEME_DIR="/var/www/html/web/profiles/contrib/droopler/themes/custom/droopler_theme" | |
| 4 | + | |
| 5 | +# Install droopler_theme npm packages. | |
| 6 | +cd ${THEME_DIR} | |
| 7 | +npm install | |
| 8 | + | |
| 9 | +# Check if user wants instant-update. | |
| 10 | +if [ "$1" == "watch" ]; then | |
| 11 | + npm run watch | |
| 12 | +elif [ "$1" == "dev" ]; then | |
| 13 | + echo "Compiling DEV version." | |
| 14 | + npm run dev | |
| 15 | +else | |
| 16 | + echo "Compiling PRODUCTION, minified version." | |
| 17 | + npm run production | |
| 18 | +fi | ... | ... |
.ddev/config.yaml
0 → 100644
| 1 | +name: DDEVAppName | |
| 2 | +type: drupal10 | |
| 3 | +docroot: web | |
| 4 | +php_version: "8.1" | |
| 5 | +webserver_type: nginx-fpm | |
| 6 | +router_http_port: "80" | |
| 7 | +router_https_port: "443" | |
| 8 | +xdebug_enabled: false | |
| 9 | +additional_hostnames: [] | |
| 10 | +additional_fqdns: [] | |
| 11 | +database: | |
| 12 | + type: mariadb | |
| 13 | + version: "10.11" | |
| 14 | +use_dns_when_possible: true | |
| 15 | +composer_version: "2.6" | |
| 16 | +web_environment: [] | |
| 17 | +nodejs_version: "20" | |
| 18 | + | |
| 19 | +# Key features of DDEV's config.yaml: | |
| 20 | + | |
| 21 | +# name: <projectname> # Name of the project, automatically provides | |
| 22 | +# http://projectname.ddev.site and https://projectname.ddev.site | |
| 23 | + | |
| 24 | +# type: <projecttype> # drupal6/7/8/9/10, backdrop, typo3, wordpress, php | |
| 25 | + | |
| 26 | +# docroot: <relative_path> # Relative path to the directory containing index.php. | |
| 27 | + | |
| 28 | +# php_version: "8.1" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3" | |
| 29 | + | |
| 30 | +# You can explicitly specify the webimage but this | |
| 31 | +# is not recommended, as the images are often closely tied to DDEV's' behavior, | |
| 32 | +# so this can break upgrades. | |
| 33 | + | |
| 34 | +# webimage: <docker_image> # nginx/php docker image. | |
| 35 | + | |
| 36 | +# database: | |
| 37 | +# type: <dbtype> # mysql, mariadb, postgres | |
| 38 | +# version: <version> # database version, like "10.4" or "8.0" | |
| 39 | +# MariaDB versions can be 5.5-10.8 and 10.11, MySQL versions can be 5.5-8.0 | |
| 40 | +# PostgreSQL versions can be 9-16. | |
| 41 | + | |
| 42 | +# router_http_port: <port> # Port to be used for http (defaults to global configuration, usually 80) | |
| 43 | +# router_https_port: <port> # Port for https (defaults to global configuration, usually 443) | |
| 44 | + | |
| 45 | +# xdebug_enabled: false # Set to true to enable Xdebug and "ddev start" or "ddev restart" | |
| 46 | +# Note that for most people the commands | |
| 47 | +# "ddev xdebug" to enable Xdebug and "ddev xdebug off" to disable it work better, | |
| 48 | +# as leaving Xdebug enabled all the time is a big performance hit. | |
| 49 | + | |
| 50 | +# xhprof_enabled: false # Set to true to enable Xhprof and "ddev start" or "ddev restart" | |
| 51 | +# Note that for most people the commands | |
| 52 | +# "ddev xhprof" to enable Xhprof and "ddev xhprof off" to disable it work better, | |
| 53 | +# as leaving Xhprof enabled all the time is a big performance hit. | |
| 54 | + | |
| 55 | +# webserver_type: nginx-fpm, apache-fpm, or nginx-gunicorn | |
| 56 | + | |
| 57 | +# timezone: Europe/Berlin | |
| 58 | +# This is the timezone used in the containers and by PHP; | |
| 59 | +# it can be set to any valid timezone, | |
| 60 | +# see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones | |
| 61 | +# For example Europe/Dublin or MST7MDT | |
| 62 | + | |
| 63 | +# composer_root: <relative_path> | |
| 64 | +# Relative path to the Composer root directory from the project root. This is | |
| 65 | +# the directory which contains the composer.json and where all Composer related | |
| 66 | +# commands are executed. | |
| 67 | + | |
| 68 | +# composer_version: "2" | |
| 69 | +# You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1 | |
| 70 | +# to use the latest major version available at the time your container is built. | |
| 71 | +# It is also possible to use each other Composer version channel. This includes: | |
| 72 | +# - 2.2 (latest Composer LTS version) | |
| 73 | +# - stable | |
| 74 | +# - preview | |
| 75 | +# - snapshot | |
| 76 | +# Alternatively, an explicit Composer version may be specified, for example "2.2.18". | |
| 77 | +# To reinstall Composer after the image was built, run "ddev debug refresh". | |
| 78 | + | |
| 79 | +# nodejs_version: "18" | |
| 80 | +# change from the default system Node.js version to another supported version, like 16, 18, 20. | |
| 81 | +# Note that you can use 'ddev nvm' or nvm inside the web container to provide nearly any | |
| 82 | +# Node.js version, including v6, etc. | |
| 83 | +# You only need to configure this if you are not using nvm and you want to use a major | |
| 84 | +# version that is not the default. | |
| 85 | + | |
| 86 | +# additional_hostnames: | |
| 87 | +# - somename | |
| 88 | +# - someothername | |
| 89 | +# would provide http and https URLs for "somename.ddev.site" | |
| 90 | +# and "someothername.ddev.site". | |
| 91 | + | |
| 92 | +# additional_fqdns: | |
| 93 | +# - example.com | |
| 94 | +# - sub1.example.com | |
| 95 | +# would provide http and https URLs for "example.com" and "sub1.example.com" | |
| 96 | +# Please take care with this because it can cause great confusion. | |
| 97 | + | |
| 98 | +# upload_dirs: "custom/upload/dir" | |
| 99 | +# | |
| 100 | +# upload_dirs: | |
| 101 | +# - custom/upload/dir | |
| 102 | +# - ../private | |
| 103 | +# | |
| 104 | +# would set the destination paths for ddev import-files to <docroot>/custom/upload/dir | |
| 105 | +# When Mutagen is enabled this path is bind-mounted so that all the files | |
| 106 | +# in the upload_dirs don't have to be synced into Mutagen. | |
| 107 | + | |
| 108 | +# disable_upload_dirs_warning: false | |
| 109 | +# If true, turns off the normal warning that says | |
| 110 | +# "You have Mutagen enabled and your 'php' project type doesn't have upload_dirs set" | |
| 111 | + | |
| 112 | +# ddev_version_constraint: "" | |
| 113 | +# Example: | |
| 114 | +# ddev_version_constraint: ">= 1.22.4" | |
| 115 | +# This will enforce that the running ddev version is within this constraint. | |
| 116 | +# See https://github.com/Masterminds/semver#checking-version-constraints for | |
| 117 | +# supported constraint formats | |
| 118 | + | |
| 119 | +# working_dir: | |
| 120 | +# web: /var/www/html | |
| 121 | +# db: /home | |
| 122 | +# would set the default working directory for the web and db services. | |
| 123 | +# These values specify the destination directory for ddev ssh and the | |
| 124 | +# directory in which commands passed into ddev exec are run. | |
| 125 | + | |
| 126 | +# omit_containers: [db, ddev-ssh-agent] | |
| 127 | +# Currently only these containers are supported. Some containers can also be | |
| 128 | +# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit | |
| 129 | +# the "db" container, several standard features of DDEV that access the | |
| 130 | +# database container will be unusable. In the global configuration it is also | |
| 131 | +# possible to omit ddev-router, but not here. | |
| 132 | + | |
| 133 | +# performance_mode: "global" | |
| 134 | +# DDEV offers performance optimization strategies to improve the filesystem | |
| 135 | +# performance depending on your host system. Should be configured globally. | |
| 136 | +# | |
| 137 | +# If set, will override the global config. Possible values are: | |
| 138 | +# - "global": uses the value from the global config. | |
| 139 | +# - "none": disables performance optimization for this project. | |
| 140 | +# - "mutagen": enables Mutagen for this project. | |
| 141 | +# - "nfs": enables NFS for this project. | |
| 142 | +# | |
| 143 | +# See https://ddev.readthedocs.io/en/latest/users/install/performance/#nfs | |
| 144 | +# See https://ddev.readthedocs.io/en/latest/users/install/performance/#mutagen | |
| 145 | + | |
| 146 | +# fail_on_hook_fail: False | |
| 147 | +# Decide whether 'ddev start' should be interrupted by a failing hook | |
| 148 | + | |
| 149 | +# host_https_port: "59002" | |
| 150 | +# The host port binding for https can be explicitly specified. It is | |
| 151 | +# dynamic unless otherwise specified. | |
| 152 | +# This is not used by most people, most people use the *router* instead | |
| 153 | +# of the localhost port. | |
| 154 | + | |
| 155 | +# host_webserver_port: "59001" | |
| 156 | +# The host port binding for the ddev-webserver can be explicitly specified. It is | |
| 157 | +# dynamic unless otherwise specified. | |
| 158 | +# This is not used by most people, most people use the *router* instead | |
| 159 | +# of the localhost port. | |
| 160 | + | |
| 161 | +# host_db_port: "59002" | |
| 162 | +# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic | |
| 163 | +# unless explicitly specified. | |
| 164 | + | |
| 165 | +# mailpit_http_port: "8025" | |
| 166 | +# mailpit_https_port: "8026" | |
| 167 | +# The Mailpit ports can be changed from the default 8025 and 8026 | |
| 168 | + | |
| 169 | +# host_mailpit_port: "8025" | |
| 170 | +# The mailpit port is not normally bound on the host at all, instead being routed | |
| 171 | +# through ddev-router, but it can be bound directly to localhost if specified here. | |
| 172 | + | |
| 173 | +# webimage_extra_packages: [php7.4-tidy, php-bcmath] | |
| 174 | +# Extra Debian packages that are needed in the webimage can be added here | |
| 175 | + | |
| 176 | +# dbimage_extra_packages: [telnet,netcat] | |
| 177 | +# Extra Debian packages that are needed in the dbimage can be added here | |
| 178 | + | |
| 179 | +# use_dns_when_possible: true | |
| 180 | +# If the host has internet access and the domain configured can | |
| 181 | +# successfully be looked up, DNS will be used for hostname resolution | |
| 182 | +# instead of editing /etc/hosts | |
| 183 | +# Defaults to true | |
| 184 | + | |
| 185 | +# project_tld: ddev.site | |
| 186 | +# The top-level domain used for project URLs | |
| 187 | +# The default "ddev.site" allows DNS lookup via a wildcard | |
| 188 | +# If you prefer you can change this to "ddev.local" to preserve | |
| 189 | +# pre-v1.9 behavior. | |
| 190 | + | |
| 191 | +# ngrok_args: --basic-auth username:pass1234 | |
| 192 | +# Provide extra flags to the "ngrok http" command, see | |
| 193 | +# https://ngrok.com/docs/ngrok-agent/config or run "ngrok http -h" | |
| 194 | + | |
| 195 | +# disable_settings_management: false | |
| 196 | +# If true, DDEV will not create CMS-specific settings files like | |
| 197 | +# Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalConfiguration.php | |
| 198 | +# In this case the user must provide all such settings. | |
| 199 | + | |
| 200 | +# You can inject environment variables into the web container with: | |
| 201 | +# web_environment: | |
| 202 | +# - SOMEENV=somevalue | |
| 203 | +# - SOMEOTHERENV=someothervalue | |
| 204 | + | |
| 205 | +# no_project_mount: false | |
| 206 | +# (Experimental) If true, DDEV will not mount the project into the web container; | |
| 207 | +# the user is responsible for mounting it manually or via a script. | |
| 208 | +# This is to enable experimentation with alternate file mounting strategies. | |
| 209 | +# For advanced users only! | |
| 210 | + | |
| 211 | +# bind_all_interfaces: false | |
| 212 | +# If true, host ports will be bound on all network interfaces, | |
| 213 | +# not the localhost interface only. This means that ports | |
| 214 | +# will be available on the local network if the host firewall | |
| 215 | +# allows it. | |
| 216 | + | |
| 217 | +# default_container_timeout: 120 | |
| 218 | +# The default time that DDEV waits for all containers to become ready can be increased from | |
| 219 | +# the default 120. This helps in importing huge databases, for example. | |
| 220 | + | |
| 221 | +#web_extra_exposed_ports: | |
| 222 | +#- name: nodejs | |
| 223 | +# container_port: 3000 | |
| 224 | +# http_port: 2999 | |
| 225 | +# https_port: 3000 | |
| 226 | +#- name: something | |
| 227 | +# container_port: 4000 | |
| 228 | +# https_port: 4000 | |
| 229 | +# http_port: 3999 | |
| 230 | +# Allows a set of extra ports to be exposed via ddev-router | |
| 231 | +# Fill in all three fields even if you don’t intend to use the https_port! | |
| 232 | +# If you don’t add https_port, then it defaults to 0 and ddev-router will fail to start. | |
| 233 | +# | |
| 234 | +# The port behavior on the ddev-webserver must be arranged separately, for example | |
| 235 | +# using web_extra_daemons. | |
| 236 | +# For example, with a web app on port 3000 inside the container, this config would | |
| 237 | +# expose that web app on https://<project>.ddev.site:9999 and http://<project>.ddev.site:9998 | |
| 238 | +# web_extra_exposed_ports: | |
| 239 | +# - name: myapp | |
| 240 | +# container_port: 3000 | |
| 241 | +# http_port: 9998 | |
| 242 | +# https_port: 9999 | |
| 243 | + | |
| 244 | +#web_extra_daemons: | |
| 245 | +#- name: "http-1" | |
| 246 | +# command: "/var/www/html/node_modules/.bin/http-server -p 3000" | |
| 247 | +# directory: /var/www/html | |
| 248 | +#- name: "http-2" | |
| 249 | +# command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000" | |
| 250 | +# directory: /var/www/html | |
| 251 | + | |
| 252 | +# override_config: false | |
| 253 | +# By default, config.*.yaml files are *merged* into the configuration | |
| 254 | +# But this means that some things can't be overridden | |
| 255 | +# For example, if you have 'use_dns_when_possible: true'' you can't override it with a merge | |
| 256 | +# and you can't erase existing hooks or all environment variables. | |
| 257 | +# However, with "override_config: true" in a particular config.*.yaml file, | |
| 258 | +# 'use_dns_when_possible: false' can override the existing values, and | |
| 259 | +# hooks: | |
| 260 | +# post-start: [] | |
| 261 | +# or | |
| 262 | +# web_environment: [] | |
| 263 | +# or | |
| 264 | +# additional_hostnames: [] | |
| 265 | +# can have their intended affect. 'override_config' affects only behavior of the | |
| 266 | +# config.*.yaml file it exists in. | |
| 267 | + | |
| 268 | +# Many DDEV commands can be extended to run tasks before or after the | |
| 269 | +# DDEV command is executed, for example "post-start", "post-import-db", | |
| 270 | +# "pre-composer", "post-composer" | |
| 271 | +# See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more | |
| 272 | +# information on the commands that can be extended and the tasks you can define | |
| 273 | +# for them. Example: | |
| 274 | +#hooks: | |
| 275 | +# post-import-db: | |
| 276 | +# - exec: drush cr | |
| 277 | +# - exec: drush updb | ... | ... |
.ddev/providers/acquia.yaml
0 → 100755
| 1 | +#ddev-generated | |
| 2 | +# Acquia provider configuration. | |
| 3 | + | |
| 4 | +# To use this configuration, | |
| 5 | + | |
| 6 | +# 1. Get your Acquia API token from your Account Settings->API Tokens. | |
| 7 | +# 2. Make sure your ssh key is authorized on your Acquia account at Account Settings->SSH Keys | |
| 8 | +# 3. `ddev auth ssh` (this typically needs only be done once per ddev session, not every pull). | |
| 9 | +# 4. Add / update the web_environment section in ~/.ddev/global_config.yaml | |
| 10 | +# or your project config.yamlwith the API keys: | |
| 11 | +# ```yaml | |
| 12 | +# web_environment: | |
| 13 | +# - ACQUIA_API_KEY=xxxxxxxx | |
| 14 | +# - ACQUIA_API_SECRET=xxxxx | |
| 15 | +# ``` | |
| 16 | +# 5. Add the ACQUIA_ENVIRONMENT_ID environment variable to your project config.yaml, for example: | |
| 17 | +# ```yaml | |
| 18 | +# web_environment: | |
| 19 | +# - ACQUIA_ENVIRONMENT_ID=project1.dev | |
| 20 | +# - On the Acquia Cloud Platform you can find this out by navigating to the environments page, | |
| 21 | +# clicking on the header and look for the "SSH URL" line. | |
| 22 | +# Eg. `project1.dev@cool-projects.acquia-sites.com` would have a project ID of `project1.dev` | |
| 23 | +# 6. `ddev restart` | |
| 24 | +# 7. Use `ddev pull acquia` to pull the project database and files. | |
| 25 | +# 8. Optionally use `ddev push acquia` to push local files and database to Acquia. Note that `ddev push` is a command that can potentially damage your production site, so this is not recommended. | |
| 26 | + | |
| 27 | +# Debugging: Use `ddev exec acli command` and `ddev exec acli auth:login` | |
| 28 | + | |
| 29 | +# Instead of setting the environment variables in configuration files, you can use | |
| 30 | +# `ddev pull acquia --environment=ACQUIA_ENVIRONMENT_ID=yourproject.dev` for example | |
| 31 | + | |
| 32 | +auth_command: | |
| 33 | + command: | | |
| 34 | + set -eu -o pipefail | |
| 35 | + if [ -z "${ACQUIA_API_KEY:-}" ] || [ -z "${ACQUIA_API_SECRET:-}" ]; then echo "Please make sure you have set ACQUIA_API_KEY and ACQUIA_API_SECRET in ~/.ddev/global_config.yaml" && exit 1; fi | |
| 36 | + if [ -z "${ACQUIA_ENVIRONMENT_ID:-}" ] ; then echo "Please set ACQUIA_ENVIRONMENT_ID via config.yaml or with '--environment=ACQUIA_ENVIRONMENT_ID=xxx'" && exit 1; fi | |
| 37 | + ssh-add -l >/dev/null || ( echo "Please 'ddev auth ssh' before running this command." && exit 1 ) | |
| 38 | + acli -n auth:login -n --key="${ACQUIA_API_KEY}" --secret="${ACQUIA_API_SECRET}" | |
| 39 | + | |
| 40 | +db_pull_command: | |
| 41 | + command: | | |
| 42 | + set -eu -o pipefail | |
| 43 | + # xargs here just trims whitespace | |
| 44 | + # We could use an easier technique when https://github.com/acquia/cli/issues/1629 is resolved | |
| 45 | + # just using `acli pull:db ${ACQUIA_ENVIRONMENT_ID}` | |
| 46 | + echo "Using ACQUIA_ENVIRONMENT_ID=${ACQUIA_ENVIRONMENT_ID}" | |
| 47 | + set -x # You can enable bash debugging output by uncommenting | |
| 48 | + db_dump=$(acli pull:db ${ACQUIA_ENVIRONMENT_ID} --no-interaction --no-import | tail -2l | xargs | sed 's/^.* //') | |
| 49 | + ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible | |
| 50 | + cp ${db_dump} /var/www/html/.ddev/.downloads/db.sql.gz | |
| 51 | + | |
| 52 | +files_import_command: | |
| 53 | + command: | | |
| 54 | + # set -x # You can enable bash debugging output by uncommenting | |
| 55 | + set -eu -o pipefail | |
| 56 | + acli -n pull:files ${ACQUIA_ENVIRONMENT_ID} | |
| 57 | + | |
| 58 | +# push is a dangerous command. If not absolutely needed it's better to delete these lines. | |
| 59 | +db_push_command: | |
| 60 | + command: | | |
| 61 | + set -eu -o pipefail | |
| 62 | + export ACLI_DB_HOST=db ACLI_DB_NAME=db ACLI_DB_USER=db ACLI_DB_PASSWORD=db | |
| 63 | + set -x # You can enable bash debugging output by uncommenting | |
| 64 | + acli push:db ${ACQUIA_ENVIRONMENT_ID} --no-interaction | |
| 65 | + | |
| 66 | +# push is a dangerous command. If not absolutely needed it's better to delete these lines. | |
| 67 | +files_push_command: | |
| 68 | + command: | | |
| 69 | + # set -x # You can enable bash debugging output by uncommenting | |
| 70 | + set -eu -o pipefail | |
| 71 | + acli push:files ${ACQUIA_ENVIRONMENT_ID} --no-interaction | ... | ... |
.ddev/providers/lagoon.yaml
0 → 100755
| 1 | +#ddev-generated | |
| 2 | +# Lagoon provider configuration. | |
| 3 | + | |
| 4 | +# To use this configuration, | |
| 5 | + | |
| 6 | +# 1. Check out the project and then configure it with 'ddev config'. You'll want to use 'ddev start' and make sure the basic functionality is working. Your project must have a .lagoon.yml properly configured. | |
| 7 | +# 2. Configure an SSH key for your Lagoon user https://docs.lagoon.sh/using-lagoon-advanced/ssh/ | |
| 8 | +# 3. `ddev auth ssh`. | |
| 9 | +# 4. Add LAGOON_PROJECT and LAGOON_ENVIRONMENT variables to your project in 'web_environment' or a '.ddev/.env' | |
| 10 | +# 5. `ddev restart` | |
| 11 | +# | |
| 12 | +# 'ddev pull lagoon' | |
| 13 | + | |
| 14 | +auth_command: | |
| 15 | + command: | | |
| 16 | + set -eu -o pipefail | |
| 17 | + ssh-add -l >/dev/null || ( echo "Please 'ddev auth ssh' before running this command." && exit 1 ) | |
| 18 | + if [ -z "${LAGOON_PROJECT:-}" ]; then echo "Please make sure you have set the LAGOON_PROJECT environment variable in your 'web_environment' or .ddev/.env." && exit 1; fi | |
| 19 | + if [ -z "${LAGOON_ENVIRONMENT}" ]; then echo "Please make sure you have set the LAGOON_ENVIRONMENT environment variable in your 'web_environment' or .ddev/.env." && exit 1; fi | |
| 20 | + | |
| 21 | + | |
| 22 | +db_import_command: | |
| 23 | + command: | | |
| 24 | + # set -x # You can enable bash debugging output by uncommenting | |
| 25 | + set -eu -o pipefail | |
| 26 | + export MARIADB_HOST=db MARIADB_USERNAME=db MARIADB_PASSWORD=db MARIADB_DATABASE=db | |
| 27 | + lagoon-sync sync mariadb -p ${LAGOON_PROJECT} -e ${LAGOON_ENVIRONMENT} --no-interaction | |
| 28 | + | |
| 29 | +files_import_command: | |
| 30 | + command: | | |
| 31 | + #set -x # You can enable bash debugging output by uncommenting | |
| 32 | + set -eu -o pipefail | |
| 33 | + lagoon-sync sync files -p ${LAGOON_PROJECT} -e ${LAGOON_ENVIRONMENT} --no-interaction | |
| 34 | + | |
| 35 | +# push is a dangerous command. If not absolutely needed it's better to delete these lines. | |
| 36 | +db_push_command: | |
| 37 | + command: | | |
| 38 | + set -eu -o pipefail | |
| 39 | + #set -x # You can enable bash debugging output by uncommenting | |
| 40 | + export MARIADB_HOST=db MARIADB_USERNAME=db MARIADB_PASSWORD=db MARIADB_DATABASE=db | |
| 41 | + lagoon-sync sync mariadb -p ${LAGOON_PROJECT} -t ${LAGOON_ENVIRONMENT} -e local --no-interaction | |
| 42 | + | |
| 43 | +# push is a dangerous command. If not absolutely needed it's better to delete these lines. | |
| 44 | +files_push_command: | |
| 45 | + command: | | |
| 46 | + set -eu -o pipefail | |
| 47 | + #set -x # You can enable bash debugging output by uncommenting | |
| 48 | + lagoon-sync sync files -p ${LAGOON_PROJECT} -e local -t ${LAGOON_ENVIRONMENT} --no-interaction | |
| 49 | + | ... | ... |
.ddev/providers/upsun.yaml
0 → 100755
| 1 | +#ddev-generated | |
| 2 | +# Upsun provider configuration. This works out of the box, but can be edited to add | |
| 3 | +# your own preferences. If you edit it, remove the `ddev-generated` line from the top so | |
| 4 | +# that it won't be overwritten. | |
| 5 | + | |
| 6 | +# To use this configuration, | |
| 7 | + | |
| 8 | +# 1. Check out the site from Upsun and then configure it with `ddev config`. You'll want to use `ddev start` and make sure the basic functionality is working. | |
| 9 | +# 2. Obtain and configure an API token. | |
| 10 | +# a. Login to the Upsun Dashboard and go to My Profile->API Tokens to create an API token for DDEV to use. | |
| 11 | +# b. Add the API token to the `web_environment` section in your global ddev configuration at ~/.ddev/global_config.yaml: | |
| 12 | +# ```yaml | |
| 13 | +# web_environment: | |
| 14 | +# - UPSUN_CLI_TOKEN=abcdeyourtoken | |
| 15 | +# ``` | |
| 16 | +# 3. Add UPSUN_PROJECT and UPSUN_ENVIRONMENT variables to your project `.ddev/config.yaml` or a `.ddev/config.upsun.yaml` | |
| 17 | +# ```yaml | |
| 18 | +# web_environment: | |
| 19 | +# - UPSUN_PROJECT=nf4amudfn23biyourproject | |
| 20 | +# - UPSUN_ENVIRONMENT=main | |
| 21 | +# 4. `ddev restart` | |
| 22 | +# 5. Run `ddev pull upsun`. After you agree to the prompt, the current upstream database and files will be downloaded. | |
| 23 | +# 6. Optionally use `ddev push upsun` to push local files and database to Upsun. Note that `ddev push` is a command that can potentially damage your production site, so this is not recommended. | |
| 24 | + | |
| 25 | +# Debugging: Use `ddev exec upsun` to see what Upsun knows about | |
| 26 | +# your configuration and whether it's working correctly. | |
| 27 | + | |
| 28 | +auth_command: | |
| 29 | + command: | | |
| 30 | + set -eu -o pipefail | |
| 31 | + if [ -z "${UPSUN_CLI_TOKEN:-}" ]; then echo "Please make sure you have set UPSUN_CLI_TOKEN." && exit 1; fi | |
| 32 | + if [ -z "${UPSUN_PROJECT:-}" ]; then echo "Please make sure you have set UPSUN_PROJECT." && exit 1; fi | |
| 33 | + if [ -z "${UPSUN_ENVIRONMENT:-}" ]; then echo "Please make sure you have set UPSUN_ENVIRONMENT." && exit 1; fi | |
| 34 | + | |
| 35 | +db_pull_command: | |
| 36 | + command: | | |
| 37 | + # set -x # You can enable bash debugging output by uncommenting | |
| 38 | + set -eu -o pipefail | |
| 39 | + export UPSUN_CLI_NO_INTERACTION=1 | |
| 40 | + ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible | |
| 41 | + upsun db:dump --yes --gzip --file=/var/www/html/.ddev/.downloads/db.sql.gz --project="${UPSUN_PROJECT}" --environment="${UPSUN_ENVIRONMENT}" | |
| 42 | + | |
| 43 | +files_import_command: | |
| 44 | + command: | | |
| 45 | + # set -x # You can enable bash debugging output by uncommenting | |
| 46 | + set -eu -o pipefail | |
| 47 | + export UPSUN_CLI_NO_INTERACTION=1 | |
| 48 | + # Use $UPSUN_MOUNTS if it exists to get list of mounts to download, otherwise just web/sites/default/files (drupal) | |
| 49 | + declare -a mounts=(${UPSUN_MOUNTS:-/web/sites/default/files}) | |
| 50 | + upsun mount:download --all --yes --quiet --project="${UPSUN_PROJECT}" --environment="${UPSUN_ENVIRONMENT}" --target=/var/www/html | |
| 51 | + | |
| 52 | + | |
| 53 | +# push is a dangerous command. If not absolutely needed it's better to delete these lines. | |
| 54 | +db_push_command: | |
| 55 | + command: | | |
| 56 | + # set -x # You can enable bash debugging output by uncommenting | |
| 57 | + set -eu -o pipefail | |
| 58 | + export UPSUN_CLI_NO_INTERACTION=1 | |
| 59 | + ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible | |
| 60 | + pushd /var/www/html/.ddev/.downloads >/dev/null | |
| 61 | + gzip -dc db.sql.gz | upsun db:sql --project="${UPSUN_PROJECT}" --environment="${UPSUN_ENVIRONMENT}" | |
| 62 | + | |
| 63 | +# push is a dangerous command. If not absolutely needed it's better to delete these lines. | |
| 64 | +# TODO: This is a naive, Drupal-centric push, which needs adjustment for the mount to be pushed. | |
| 65 | +files_push_command: | |
| 66 | + command: | | |
| 67 | + # set -x # You can enable bash debugging output by uncommenting | |
| 68 | + set -eu -o pipefail | |
| 69 | + export UPSUN_CLI_NO_INTERACTION=1 | |
| 70 | + ls "${DDEV_FILES_DIR}" >/dev/null # This just refreshes stale NFS if possible | |
| 71 | + upsun mount:upload --yes --quiet --project="${UPSUN_PROJECT}" --environment="${UPSUN_ENVIRONMENT}" --source="${DDEV_FILES_DIR}" --mount=web/sites/default/files | ... | ... |
.environment
0 → 100644
| 1 | +# Statements in this file will be executed (sourced) by the shell in SSH | |
| 2 | +# sessions, in deploy hooks, in cron jobs, and in the application's runtime | |
| 3 | +# environment. This file must be placed in the root of the application, not | |
| 4 | +# necessarily the git repository's root. In case of multiple applications, | |
| 5 | +# each application can have its own .environment file. | |
| 6 | + | |
| 7 | +# Allow executable app dependencies from Composer to be run from the path. | |
| 8 | +if [ -n "$PLATFORM_APP_DIR" -a -f "$PLATFORM_APP_DIR"/composer.json ] ; then | |
| 9 | + bin=$(composer config bin-dir --working-dir="$PLATFORM_APP_DIR" --no-interaction 2>/dev/null) | |
| 10 | + export PATH="${PLATFORM_APP_DIR}/${bin:-vendor/bin}:${PATH}" | |
| 11 | +fi | ... | ... |
.githooks/pre-commit
0 → 100755
.githooks/precommit/build-css.sh
0 → 100755
| 1 | +#!/bin/bash | |
| 2 | + | |
| 3 | +dist_folder="web/themes/custom/droopler_subtheme/build" | |
| 4 | +rebuild_command="ddev theme" | |
| 5 | + | |
| 6 | +# Colors | |
| 7 | +default=$(tput sgr0) | |
| 8 | +yellow=$(tput setaf 3) | |
| 9 | +green=$(tput setaf 2) | |
| 10 | + | |
| 11 | +changed_files=$(git diff --cached --name-only | grep "^$dist_folder") | |
| 12 | + | |
| 13 | +if [ -n "$changed_files" ]; then | |
| 14 | + echo | |
| 15 | + echo "${yellow}dist css files changed. Building for production${default}" | |
| 16 | + echo | |
| 17 | + $rebuild_command | |
| 18 | + git add $dist_folder | |
| 19 | +else | |
| 20 | + echo | |
| 21 | + echo "${green}No dist css files changed. Skipping build.${default}" | |
| 22 | + echo | |
| 23 | +fi | ... | ... |
.githooks/precommit/phpcs.sh
0 → 100755
| 1 | +#!/bin/bash | |
| 2 | + | |
| 3 | +# Run PHP CodeSniffer | |
| 4 | +ddev phpcs | |
| 5 | + | |
| 6 | +# Capture the exit code of the last command | |
| 7 | +exit_code=$? | |
| 8 | + | |
| 9 | +# Check if PHP CodeSniffer had errors | |
| 10 | +if [ $exit_code -ne 0 ]; then | |
| 11 | + echo "PHP CodeSniffer check failed. Please fix the issues before committing." | |
| 12 | + exit 1 # Prevent the commit | |
| 13 | +fi | |
| 14 | + | |
| 15 | +exit 0 # Allow the commit | ... | ... |
.githooks/precommit/phpstan.sh
0 → 100755
| 1 | +#!/bin/bash | |
| 2 | + | |
| 3 | +# Run PHP Static analysis | |
| 4 | +ddev phpstan | |
| 5 | + | |
| 6 | +# Capture the exit code of the last command | |
| 7 | +exit_code=$? | |
| 8 | + | |
| 9 | +# Check if PHP Static analysis had errors | |
| 10 | +if [ $exit_code -ne 0 ]; then | |
| 11 | + echo "PHP Static analysis check failed. Please fix the issues before committing." | |
| 12 | + exit 1 # Prevent the commit | |
| 13 | +fi | |
| 14 | + | |
| 15 | +exit 0 # Allow the commit | ... | ... |
.gitignore
0 → 100644
| 1 | +# Ignore directories generated by Composer | |
| 2 | +/drush/contrib/ | |
| 3 | +/vendor/ | |
| 4 | +/web/core/ | |
| 5 | +/web/modules/* | |
| 6 | +!/web/modules/custom | |
| 7 | +/web/themes/* | |
| 8 | +!/web/themes/custom | |
| 9 | +/web/profiles/* | |
| 10 | +!/web/profiles/custom | |
| 11 | +/web/libraries/ | |
| 12 | +console/ | |
| 13 | + | |
| 14 | +# Ignore sensitive information | |
| 15 | +/web/sites/*/settings.local.php | |
| 16 | + | |
| 17 | +# Ignore Drupal's file directory | |
| 18 | +/web/sites/files | |
| 19 | + | |
| 20 | +# Ignore SimpleTest multi-site environment. | |
| 21 | +/web/sites/simpletest | |
| 22 | + | |
| 23 | +# Ignore files generated by PhpStorm | |
| 24 | +/.idea/ | |
| 25 | +/.vscode/ | |
| 26 | + | |
| 27 | +# Ignore .env files as they are personal | |
| 28 | +/.env | |
| 29 | + | |
| 30 | +# Ignore mounts | |
| 31 | +web/sites/default/files | |
| 32 | +tmp | |
| 33 | +private | |
| 34 | +.drush | |
| 35 | +drush-backups | |
| 36 | +.console | |
| 37 | +/.editorconfig | |
| 38 | +/.gitattributes | |
| 39 | + | |
| 40 | +# Comment these lines if you don't use Composer. | |
| 41 | +/web/.* | |
| 42 | +/web/*.php | |
| 43 | +/web/web.config | |
| 44 | +/web/robots.txt | ... | ... |
.lando.yml
0 → 100644
| 1 | +name: droopler | |
| 2 | +recipe: drupal10 | |
| 3 | +config: | |
| 4 | + # Droopler project webroot. | |
| 5 | + webroot: ./web | |
| 6 | + drush: 12 | |
| 7 | + | |
| 8 | +services: | |
| 9 | + node: | |
| 10 | + type: node:18 | |
| 11 | + | |
| 12 | +tooling: | |
| 13 | + # Theme. | |
| 14 | + theme-production: | |
| 15 | + service: node | |
| 16 | + description: Compiles the theme in PROD mode. | |
| 17 | + cmd: | |
| 18 | + - npm install | |
| 19 | + - npm run production | |
| 20 | + dir: /app/web/profiles/contrib/droopler/themes/custom/droopler_theme | |
| 21 | + theme-dev: | |
| 22 | + service: node | |
| 23 | + description: Compiles the theme in DEV mode. | |
| 24 | + cmd: | |
| 25 | + - npm install | |
| 26 | + - npm run dev | |
| 27 | + dir: /app/web/profiles/contrib/droopler/themes/custom/droopler_theme | |
| 28 | + theme-watch: | |
| 29 | + service: node | |
| 30 | + description: Watches the theme for changes. | |
| 31 | + cmd: | |
| 32 | + - npm install | |
| 33 | + - npm run watch | |
| 34 | + dir: /app/web/profiles/contrib/droopler/themes/custom/droopler_theme | |
| 35 | + | |
| 36 | + # Subtheme. | |
| 37 | + subtheme-production: | |
| 38 | + service: node | |
| 39 | + description: Compiles the subtheme in PROD mode. | |
| 40 | + cmd: | |
| 41 | + - npm install | |
| 42 | + - npm run production | |
| 43 | + dir: /app/web/themes/custom/droopler_subtheme | |
| 44 | + subtheme-dev: | |
| 45 | + service: node | |
| 46 | + description: Compiles the subtheme in DEV mode. | |
| 47 | + cmd: | |
| 48 | + - npm install | |
| 49 | + - npm run dev | |
| 50 | + dir: /app/web/themes/custom/droopler_subtheme | |
| 51 | + subtheme-watch: | |
| 52 | + service: node | |
| 53 | + description: Watches the subtheme for changes. | |
| 54 | + cmd: | |
| 55 | + - npm install | |
| 56 | + - npm run watch | |
| 57 | + dir: /app/web/themes/custom/droopler_subtheme | |
| 58 | + | |
| 59 | + # Build profile. | |
| 60 | + build-full-profile: | |
| 61 | + description: Builds the full profile (all modules + demo content) from the scratch. | |
| 62 | + cmd: | |
| 63 | + - appserver: drush site-install droopler install_configure_form.enable_update_status_module=TRUE install_configure_form.enable_update_status_emails=NULL --db-url='mysql://drupal10:drupal10@database/drupal10' --account-name=admin --account-pass=123 --site-name=droopler -y --locale=en droopler_additional_modules_form.module_d_blog=1 droopler_additional_modules_form.module_d_product=1 droopler_additional_modules_form.init_content=1 droopler_additional_modules_form.documentation=1 | |
| 64 | + build-bare-profile: | |
| 65 | + description: Builds the bare profile (without demo content) from the scratch. | |
| 66 | + cmd: | |
| 67 | + - appserver: drush site-install droopler install_configure_form.enable_update_status_module=TRUE install_configure_form.enable_update_status_emails=NULL --db-url='mysql://drupal10:drupal10@database/drupal10' --account-name=admin --account-pass=123 --site-name=droopler -y --locale=en | |
| 68 | + prepare: | |
| 69 | + description: Prepares the codebase by downloading all vendors and compiling assets. | |
| 70 | + cmd: | |
| 71 | + - appserver: composer install | |
| 72 | + - node: cd /app/web/profiles/contrib/droopler/themes/custom/droopler_theme && npm install | |
| 73 | + - node: cd /app/web/themes/custom/droopler_subtheme && npm install | |
| 74 | + - node: cd /app/web/profiles/contrib/droopler/themes/custom/droopler_theme && npm run production | |
| 75 | + - node: cd /app/web/themes/custom/droopler_subtheme && npm run production | |
| 76 | + | ... | ... |
.platform.app.yaml
0 → 100644
| 1 | +# This file describes an application. You can have multiple applications | |
| 2 | +# in the same project. | |
| 3 | +# | |
| 4 | +# See https://docs.platform.sh/configuration/app.html | |
| 5 | + | |
| 6 | +# The name of this app. Must be unique within a project. | |
| 7 | +# Must be lowercase alphanumeric characters. Changing the name destroys data associated with the app. | |
| 8 | +name: 'platform-app-name' | |
| 9 | + | |
| 10 | +# The runtime the application uses. | |
| 11 | +type: 'php:8.1' | |
| 12 | + | |
| 13 | +dependencies: | |
| 14 | + php: | |
| 15 | + composer/composer: '^2.1' | |
| 16 | + drush/drush: '^12' | |
| 17 | + nodejs: | |
| 18 | + n: "*" | |
| 19 | + | |
| 20 | +runtime: | |
| 21 | + # Enable the redis extension so Drupal can communicate with the Redis cache. | |
| 22 | + extensions: | |
| 23 | + - redis | |
| 24 | + - sodium | |
| 25 | + - apcu | |
| 26 | + - blackfire | |
| 27 | + | |
| 28 | +# The relationships of the application with services or other applications. | |
| 29 | +# | |
| 30 | +# The left-hand side is the name of the relationship as it will be exposed | |
| 31 | +# to the application in the PLATFORM_RELATIONSHIPS variable. The right-hand | |
| 32 | +# side is in the form `<service name>:<endpoint name>`. | |
| 33 | +relationships: | |
| 34 | + database: 'db:mysql' | |
| 35 | + redis: 'cache:redis' | |
| 36 | + | |
| 37 | +# The size of the persistent disk of the application (in MB). | |
| 38 | +disk: 2048 | |
| 39 | + | |
| 40 | +# The 'mounts' describe writable, persistent filesystem mounts in the application. | |
| 41 | +mounts: | |
| 42 | + # The default Drupal files directory. | |
| 43 | + '/web/sites/default/files': | |
| 44 | + source: local | |
| 45 | + source_path: 'files' | |
| 46 | + # Drupal gets its own dedicated tmp directory. The settings.platformsh.php | |
| 47 | + # file will automatically configure Drupal to use this directory. | |
| 48 | + '/tmp': | |
| 49 | + source: local | |
| 50 | + source_path: 'tmp' | |
| 51 | + # Private file uploads are stored outside the web root. The settings.platformsh.php | |
| 52 | + # file will automatically configure Drupal to use this directory. | |
| 53 | + '/private': | |
| 54 | + source: local | |
| 55 | + source_path: 'private' | |
| 56 | + # Drush needs a scratch space for its own caches. | |
| 57 | + '/.drush': | |
| 58 | + source: local | |
| 59 | + source_path: 'drush' | |
| 60 | + # Drush will try to save backups to this directory, so it must be | |
| 61 | + # writeable even though you will almost never need to use it. | |
| 62 | + '/drush-backups': | |
| 63 | + source: local | |
| 64 | + source_path: 'drush-backups' | |
| 65 | + # Drupal Console will try to save backups to this directory, so it must be | |
| 66 | + # writeable even though you will almost never need to use it. | |
| 67 | + '/.console': | |
| 68 | + source: local | |
| 69 | + source_path: 'console' | |
| 70 | + | |
| 71 | +# Configuration of the build of this application. | |
| 72 | +build: | |
| 73 | + flavor: composer | |
| 74 | + | |
| 75 | +variables: | |
| 76 | + env: | |
| 77 | + N_PREFIX: /app/.global | |
| 78 | + | |
| 79 | +# The hooks executed at various points in the lifecycle of the application. | |
| 80 | +hooks: | |
| 81 | + # The build hook runs after Composer to finish preparing up your code. | |
| 82 | + # No services are available but the disk is writeable. | |
| 83 | + build: | | |
| 84 | + set -e | |
| 85 | + | |
| 86 | + if [ "$PLATFORM_ENVIRONMENT_TYPE" != production ]; then | |
| 87 | + curl -fsS https://platform.sh/cli/installer | php | |
| 88 | + | |
| 89 | + # Install the version specified in the .nvmrc file | |
| 90 | + n auto | |
| 91 | + | |
| 92 | + # Reset the location hash to recognize the newly installed version | |
| 93 | + hash -r | |
| 94 | + | |
| 95 | + # Install npm packages for droopler_theme, compile sass, and compile js | |
| 96 | + echo "Install npm packages for droopler_subtheme, compile sass, and compile js" | |
| 97 | + | |
| 98 | + cd web/profiles/contrib/droopler/themes/custom/droopler_theme/ | |
| 99 | + npm install | |
| 100 | + cd - | |
| 101 | + | |
| 102 | + # Install npm packages for droopler_subtheme, compile sass, and compile js | |
| 103 | + echo "Install npm packages for droopler_subtheme, compile sass, and compile js" | |
| 104 | + | |
| 105 | + cd web/themes/custom/droopler_subtheme/ | |
| 106 | + npm install | |
| 107 | + npm run production | |
| 108 | + fi | |
| 109 | + | |
| 110 | + # The deploy hook runs after your application has been deployed and started. | |
| 111 | + # Code cannot be modified at this point but the database is available. | |
| 112 | + # The site is not accepting requests while this script runs so keep it | |
| 113 | + # fast. | |
| 114 | + deploy: | | |
| 115 | + set -e | |
| 116 | + php ./drush/platformsh_generate_drush_yml.php | |
| 117 | + # if drupal is installed, will call the following drush commands: | |
| 118 | + # - `cache-rebuild` | |
| 119 | + # - `updatedb` | |
| 120 | + # - and if config files are present, `config-import` | |
| 121 | + cd web | |
| 122 | + bash $PLATFORM_APP_DIR/drush/platformsh_deploy_drupal.sh | |
| 123 | + | |
| 124 | +# The configuration of app when it is exposed to the web. | |
| 125 | +web: | |
| 126 | + locations: | |
| 127 | + # All requests not otherwise specified follow these rules. | |
| 128 | + '/': | |
| 129 | + # The folder from which to serve static assets, for this location. | |
| 130 | + # | |
| 131 | + # This is a filesystem path, relative to the application root. | |
| 132 | + root: 'web' | |
| 133 | + | |
| 134 | + # How long to allow static assets from this location to be cached. | |
| 135 | + # | |
| 136 | + # Can be a time in seconds, or -1 for no caching. Times can be | |
| 137 | + # suffixed with "s" (seconds), "m" (minutes), "h" (hours), "d" | |
| 138 | + # (days), "w" (weeks), "M" (months, as 30 days) or "y" (years, as | |
| 139 | + # 365 days). | |
| 140 | + expires: 5m | |
| 141 | + | |
| 142 | + # Redirect any incoming request to Drupal's front controller. | |
| 143 | + passthru: '/index.php' | |
| 144 | + | |
| 145 | + # Deny access to all static files, except those specifically allowed below. | |
| 146 | + allow: false | |
| 147 | + | |
| 148 | + # Rules for specific URI patterns. | |
| 149 | + rules: | |
| 150 | + # Allow access to common static files. | |
| 151 | + '\.(jpe?g|png|gif|svgz?|css|js|map|ico|bmp|eot|woff2?|otf|ttf)$': | |
| 152 | + allow: true | |
| 153 | + '^/robots\.txt$': | |
| 154 | + allow: true | |
| 155 | + '^/sitemap\.xml$': | |
| 156 | + allow: true | |
| 157 | + | |
| 158 | + # Deny direct access to configuration files. | |
| 159 | + '^/sites/sites\.php$': | |
| 160 | + scripts: false | |
| 161 | + '^/sites/[^/]+/settings.*?\.php$': | |
| 162 | + scripts: false | |
| 163 | + | |
| 164 | + # The files directory has its own special configuration rules. | |
| 165 | + '/sites/default/files': | |
| 166 | + # Allow access to all files in the public files directory. | |
| 167 | + allow: true | |
| 168 | + expires: 5m | |
| 169 | + passthru: '/index.php' | |
| 170 | + root: 'web/sites/default/files' | |
| 171 | + | |
| 172 | + # Do not execute PHP scripts from the writeable mount. | |
| 173 | + scripts: false | |
| 174 | + | |
| 175 | + rules: | |
| 176 | + # Provide a longer TTL (2 weeks) for aggregated CSS and JS files. | |
| 177 | + '^/sites/default/files/(css|js)': | |
| 178 | + expires: 2w | |
| 179 | + | |
| 180 | +crons: | |
| 181 | + # Run Drupal's cron tasks every 19 minutes. | |
| 182 | + drupal: | |
| 183 | + spec: '*/19 * * * *' | |
| 184 | + commands: | |
| 185 | + start: 'cd web ; drush core-cron' | |
| 186 | + | |
| 187 | +source: | |
| 188 | + operations: | |
| 189 | + auto-update: | |
| 190 | + command: | | |
| 191 | + curl -fsS https://raw.githubusercontent.com/platformsh/source-operations/main/setup.sh | { bash /dev/fd/3 sop-autoupdate; } 3<&0 | ... | ... |
.platform.template.yml
0 → 100644
| 1 | +version: 1 | |
| 2 | + | |
| 3 | +info: | |
| 4 | + id: platformsh/droopler | |
| 5 | + name: Droopler 4 (Drupal 10) | |
| 6 | + description: | | |
| 7 | + <p>This template builds Droopler 4, the Drupal 10 distribution using the "Drupal Recommended" composer project. It is pre-configured to use MariaDB and Redis for caching. The Drupal installer will skip asking for database credentials as they are already provided.</p> | |
| 8 | + <p>Droopler is a Drupal distribution to build beautiful corporate websites on Drupal fast. It is a pre-built complete website easy to customise and manage.</p> | |
| 9 | + tags: | |
| 10 | + - PHP | |
| 11 | + - Droopler | |
| 12 | + - Drupal | |
| 13 | + - CMS | |
| 14 | + - Symfony | |
| 15 | + image: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMwNCA3OC4xNzE2NzciIGhlaWdodD0iNzguMTcxNjc3IiB3aWR0aD0iMzA0IiB4bWw6c3BhY2U9InByZXNlcnZlIiBpZD0ic3ZnMiIgdmVyc2lvbj0iMS4xIj48bWV0YWRhdGEgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz48ZGM6dGl0bGUvPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcyBpZD0iZGVmczYiPjxjbGlwUGF0aCBpZD0iY2xpcFBhdGgxOCIgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGlkPSJwYXRoMTYiIGQ9Ik0gMCw1MS45IEggMTk3LjggViAwIEggMCBaIi8+PC9jbGlwUGF0aD48L2RlZnM+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLC0xLjA2NjQsNzguODAzODA3KSIgaWQ9ImcxMCI+PGcgaWQ9ImcxMiI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNjI2NjkyLDAsMCwxLjE2MjY2OTIsLTAuMTMwMTAyOCwtMC4wNzcxMjE0NSkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDE4KSIgaWQ9ImcxNCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjIuNzk5OCwzMy4xOTk4KSIgaWQ9ImcyMCI+PHBhdGggaWQ9InBhdGgyMiIgc3R5bGU9ImZpbGw6IzE5NmRiYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0iTSAwLDAgMy41LC02LjUgMy42LC02LjYgQyA0LC03LjMgNC4zLC04LjIgNC4zLC05IGMgMCwtMi4zOTkgLTIsLTQuMzk5IC00LjQsLTQuMzk5IC0yLjQsMCAtNC40LDIgLTQuNCw0LjM5OSAwLDAuOSAwLjIsMS43IDAuNywyLjQgeiBtIC02LjQsMTEuNyB2IDAgbCAzLjEsLTUuNiAtNS42LC05LjYgYyAtMSwtMS43IC0xLjYsLTMuNiAtMS42LC01LjUgMCwtNS43IDQuNywtMTAuMzk5IDEwLjQsLTEwLjM5OSA1LjcsMCAxMC40LDQuNjk5IDEwLjQsMTAuMzk5IDAsMiAtMC41LDMuOSAtMS42LDUuNSBMIC0yLjgsMTcuNyBIIC0yMiBaIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2Ljg5OTksNTAuNTAwMSkiIGlkPSJnMjQiPjxwYXRoIGlkPSJwYXRoMjYiIHN0eWxlPSJmaWxsOiMxNWE2ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGggLTAuNyBsIDMuOSwtNy4yIGMgNywtMi45IDExLjMsLTkuMyAxMS4zLC0xNy40IDAsLTExIC04LjQsLTE5IC0xOS45LC0xOSBoIC0xNC43IHYgMzggaCA5LjYgbCAtMTUuNiw2IHYgLTQ5LjkgaCAyMC44IGMgNi45LC0wLjEgMTMuNSwyLjQgMTguNSw3LjEgNC44LDQuNyA3LjUsMTEuMiA3LjQsMTcuOSBDIDIwLjgsLTEyLjMgMTIsLTEuOSAwLDAiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjUuMjIyMiw1LjkxMTcpIiBpZD0iZzI4Ij48cGF0aCBpZD0icGF0aDMwIiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJNIDAsMCBDIDAsMC40MDggLTAuMDU0LDAuNzczIC0wLjE2MiwxLjA5OCAtMC4yNywxLjQyMiAtMC40MjYsMS42OTUgLTAuNjMsMS45MiAtMC44MzMsMi4xNDUgLTEuMDgxLDIuMzE2IC0xLjM3LDIuNDM2IC0xLjY2LDIuNTU3IC0xLjk4NiwyLjYxNSAtMi4zNDksMi42MTUgaCAtMS40NDQgdiAtNS4yMzIgaCAxLjQ0NCBjIDAuMzYzLDAgMC42ODksMC4wNiAwLjk3OSwwLjE4MSAwLjI4OSwwLjEyIDAuNTM3LDAuMjkxIDAuNzQsMC41MTYgMC4yMDQsMC4yMjUgMC4zNiwwLjQ5OCAwLjQ2OCwwLjgyMiBDIC0wLjA1NCwtMC43NzMgMCwtMC40MDggMCwwIG0gMS40MTgsMCBjIDAsLTAuNTQ1IC0wLjA5LC0xLjA0NSAtMC4yNzIsLTEuNSBDIDAuOTY0LC0xLjk1NyAwLjcwOSwtMi4zNSAwLjM4LC0yLjY3OCAwLjA1MSwtMy4wMDggLTAuMzQ1LC0zLjI2MiAtMC44MDcsLTMuNDQzIC0xLjI3LC0zLjYyNSAtMS43ODQsLTMuNzE3IC0yLjM0OSwtMy43MTcgaCAtMi44MzIgdiA3LjQzNCBoIDIuODMyIGMgMC41NjUsMCAxLjA3OSwtMC4wOTIgMS41NDIsLTAuMjc2IEMgLTAuMzQ1LDMuMjU4IDAuMDUxLDMuMDAyIDAuMzgsMi42NzYgMC43MDksMi4zNDggMC45NjQsMS45NTcgMS4xNDYsMS41IDEuMzI4LDEuMDQ1IDEuNDE4LDAuNTQ1IDEuNDE4LDAiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjguNzU3OCw2LjU1NDMpIiBpZD0iZzMyIj48cGF0aCBpZD0icGF0aDM0IiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJtIDAsMCBjIDAuMTY1LDAuMzE0IDAuMzYsMC41NjIgMC41ODYsMC43NDIgMC4yMjYsMC4xOCAwLjQ5NCwwLjI3IDAuODAyLDAuMjcgMC4yNDMsMCAwLjQzOCwtMC4wNTMgMC41ODYsLTAuMTU4IEwgMS44OTIsLTAuMDk4IEMgMS44NzUsLTAuMTYgMS44NSwtMC4yMDMgMS44MTcsLTAuMjI5IDEuNzg0LC0wLjI1NCAxLjc0MSwtMC4yNjggMS42ODYsLTAuMjY4IGMgLTAuMDUyLDAgLTAuMTI4LDAuMDA4IC0wLjIyOSwwLjAyNiAtMC4xMDEsMC4wMTcgLTAuMiwwLjAyNSAtMC4yOTUsMC4wMjUgLTAuMTQxLDAgLTAuMjY2LC0wLjAxOSAtMC4zNzUsLTAuMDYgQyAwLjY3NywtMC4zMTggMC41NzgsLTAuMzc5IDAuNDkxLC0wLjQ1NSAwLjQwMywtMC41MzEgMC4zMjYsLTAuNjI1IDAuMjYsLTAuNzM0IDAuMTkzLC0wLjg0NiAwLjEzLC0wLjk3MSAwLjA3MiwtMS4xMTEgdiAtMy4yNDggaCAtMS4yNyB2IDUuMjczIGggMC43NDYgYyAwLjEzLDAgMC4yMjEsLTAuMDIxIDAuMjcyLC0wLjA2OCAwLjA1MiwtMC4wNDcgMC4wODYsLTAuMTI5IDAuMTAzLC0wLjI1IHoiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzUuOTM4NSw3LjQ2ODQpIiBpZD0iZzM2Ij48cGF0aCBpZD0icGF0aDM4IiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJtIDAsMCB2IC01LjI3MyBoIC0wLjc3NiBjIC0wLjE2OCwwIC0wLjI3NCwwLjA3OCAtMC4zMTksMC4yMzIgbCAtMC4wODcsMC40MiBjIC0wLjIxNiwtMC4yMTkgLTAuNDU0LC0wLjM5NyAtMC43MTQsLTAuNTMxIC0wLjI2MSwtMC4xMzUgLTAuNTY4LC0wLjIwMyAtMC45MjEsLTAuMjAzIC0wLjI4NywwIC0wLjU0MiwwLjA0OCAtMC43NjMsMC4xNDYgLTAuMjIxLDAuMDk4IC0wLjQwNywwLjIzNiAtMC41NTgsMC40MTQgLTAuMTUxLDAuMTc4IC0wLjI2NCwwLjM5MSAtMC4zNDEsMC42MzUgLTAuMDc4LDAuMjQ0IC0wLjExNiwwLjUxNSAtMC4xMTYsMC44MDggViAwIGggMS4yNjkgdiAtMy4zNTIgYyAwLC0wLjMyIDAuMDc1LC0wLjU3IDAuMjI0LC0wLjc0NiAwLjE0OSwtMC4xNzcgMC4zNzMsLTAuMjY1IDAuNjcxLC0wLjI2NSAwLjIxOSwwIDAuNDI1LDAuMDQ5IDAuNjE3LDAuMTQ2IDAuMTkxLDAuMDk4IDAuMzczLDAuMjMzIDAuNTQ0LDAuNDA0IFYgMCBaIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4LjQ2MTksMy41NjIxKSIgaWQ9Imc0MCI+PHBhdGggaWQ9InBhdGg0MiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAwLjE0NCwtMC4xNzQgMC4zMDEsLTAuMjk3IDAuNDcxLC0wLjM2OSAwLjE2OSwtMC4wNzIgMC4zNTMsLTAuMTA4IDAuNTUyLC0wLjEwOCAwLjE5MiwwIDAuMzY1LDAuMDM2IDAuNTE5LDAuMTA4IDAuMTU0LDAuMDcyIDAuMjg2LDAuMTgyIDAuMzk0LDAuMzI4IDAuMTA3LDAuMTQ4IDAuMTksMC4zMzQgMC4yNDksMC41NTkgMC4wNTgsMC4yMjQgMC4wODcsMC40ODggMC4wODcsMC43OTMgMCwwLjMwOCAtMC4wMjUsMC41NyAtMC4wNzQsMC43ODUgQyAyLjE0OCwyLjMwOSAyLjA3NywyLjQ4MiAxLjk4NCwyLjYxNyAxLjg5MiwyLjc1IDEuNzc5LDIuODQ4IDEuNjQ3LDIuOTEgMS41MTYsMi45NzEgMS4zNjYsMy4wMDIgMS4xOTgsMy4wMDIgMC45MzQsMy4wMDIgMC43MDksMi45NDcgMC41MjQsMi44MzYgMC4zMzksMi43MjUgMC4xNjUsMi41NjYgMCwyLjM2NSBaIE0gLTAuMDY2LDMuMTg4IEMgMC4xNDksMy40MyAwLjM5NCwzLjYyNyAwLjY2OCwzLjc3OSAwLjk0MiwzLjkzIDEuMjY1LDQuMDA0IDEuNjM1LDQuMDA0IDEuOTIyLDQuMDA0IDIuMTg2LDMuOTQ1IDIuNDI0LDMuODI0IDIuNjYyLDMuNzA1IDIuODY3LDMuNTMxIDMuMDQxLDMuMzAzIDMuMjEzLDMuMDc0IDMuMzQ3LDIuNzk1IDMuNDQxLDIuNDYxIDMuNTM2LDIuMTI1IDMuNTgzLDEuNzQyIDMuNTgzLDEuMzExIDMuNTgzLDAuOTE4IDMuNTMsMC41NTMgMy40MjMsMC4yMTcgMy4zMTcsLTAuMTE5IDMuMTY2LC0wLjQxIDIuOTY5LC0wLjY1OCAyLjc3MSwtMC45MDQgMi41MzMsLTEuMDk4IDIuMjU0LC0xLjIzNiAxLjk3NSwtMS4zNzUgMS42NjIsLTEuNDQzIDEuMzE2LC0xLjQ0MyAxLjAyMSwtMS40NDMgMC43NywtMS4zOTggMC41NjEsLTEuMzA3IDAuMzUyLC0xLjIxNyAwLjE2NSwtMS4wOTIgMCwtMC45MyB2IC0yLjE1OCBoIC0xLjI3IHYgNi45OTQgaCAwLjc3NyBjIDAuMTY0LDAgMC4yNzIsLTAuMDc2IDAuMzI0LC0wLjIzIHoiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODUuODE3NCw0LjQ0NjkpIiBpZD0iZzQ0Ij48cGF0aCBpZD0icGF0aDQ2IiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJtIDAsMCBjIC0wLjM2NywtMC4wMTggLTAuNjc1LC0wLjA0OSAtMC45MjUsLTAuMDk2IC0wLjI1LC0wLjA0NSAtMC40NTEsLTAuMTA1IC0wLjYwMiwtMC4xNzcgLTAuMTUxLC0wLjA3MSAtMC4yNTksLTAuMTU1IC0wLjMyNCwtMC4yNTIgLTAuMDY1LC0wLjA5NiAtMC4wOTcsLTAuMiAtMC4wOTcsLTAuMzEzIDAsLTAuMjIzIDAuMDY2LC0wLjM4MyAwLjE5OCwtMC40NzggMC4xMzEsLTAuMDk2IDAuMzA0LC0wLjE0MyAwLjUxNiwtMC4xNDMgMC4yNjEsMCAwLjQ4NiwwLjA0NyAwLjY3NiwwLjE0MSAwLjE5LDAuMDkzIDAuMzc2LDAuMjM2IDAuNTU4LDAuNDI5IHogbSAtMi45MDksMi4yODcgYyAwLjYwNiwwLjU1NSAxLjMzNiwwLjgzMiAyLjE4OSwwLjgzMiAwLjMwOSwwIDAuNTg0LC0wLjA1MSAwLjgyOCwtMC4xNSBDIDAuMzUxLDIuODY3IDAuNTU3LDIuNzI3IDAuNzI1LDIuNTQ3IDAuODkzLDIuMzY3IDEuMDIsMi4xNTIgMS4xMDcsMS45MDIgMS4xOTUsMS42NTIgMS4yMzksMS4zNzcgMS4yMzksMS4wOCBWIC0yLjI1MiBIIDAuNjYzIGMgLTAuMTIsMCAtMC4yMTMsMC4wMTggLTAuMjc4LDAuMDU1IC0wLjA2NSwwLjAzNSAtMC4xMTYsMC4xMDkgLTAuMTU0LDAuMjE4IEwgMC4xMTgsLTEuNiBjIC0wLjEzNCwtMC4xMTkgLTAuMjY0LC0wLjIyNCAtMC4zOSwtMC4zMTQgLTAuMTI3LC0wLjA5MiAtMC4yNTksLTAuMTY4IC0wLjM5NiwtMC4yMjkgLTAuMTM3LC0wLjA2MiAtMC4yODQsLTAuMTA5IC0wLjQ0LC0wLjE0MiAtMC4xNTYsLTAuMDMzIC0wLjMyOCwtMC4wNDkgLTAuNTE3LC0wLjA0OSAtMC4yMjIsMCAtMC40MjgsMC4wMzEgLTAuNjE2LDAuMDkgLTAuMTg5LDAuMDYgLTAuMzUxLDAuMTUgLTAuNDg4LDAuMjY5IC0wLjEzOCwwLjEyMSAtMC4yNDQsMC4yNyAtMC4zMTksMC40NDggLTAuMDc2LDAuMTc5IC0wLjExMywwLjM4NiAtMC4xMTMsMC42MjMgMCwwLjEzMyAwLjAyMiwwLjI2NSAwLjA2NywwLjM5OCAwLjA0NCwwLjEzMSAwLjExNywwLjI1OCAwLjIxOCwwLjM3NyAwLjEwMSwwLjEyMSAwLjIzMiwwLjIzMyAwLjM5MywwLjM0IDAuMTYxLDAuMTA1IDAuMzU5LDAuMTk5IDAuNTk0LDAuMjc3IDAuMjM1LDAuMDc4IDAuNTA4LDAuMTQzIDAuODIsMC4xOTQgQyAtMC43NTcsMC43MyAtMC40MDEsMC43NiAwLDAuNzcxIFYgMS4wOCBjIDAsMC4zNTIgLTAuMDc2LDAuNjEzIC0wLjIyNiwwLjc4MyAtMC4xNTEsMC4xNyAtMC4zNjksMC4yNTQgLTAuNjUzLDAuMjU0IC0wLjIwNSwwIC0wLjM3NiwtMC4wMjMgLTAuNTEyLC0wLjA3MiBDIC0xLjUyNiwxLjk5OCAtMS42NDUsMS45NDMgLTEuNzQ4LDEuODgzIC0xLjg1MSwxLjgyNCAtMS45NDQsMS43NyAtMi4wMjgsMS43MjMgLTIuMTEyLDEuNjc0IC0yLjIwNSwxLjY1IC0yLjMwOCwxLjY1IGMgLTAuMDg5LDAgLTAuMTY1LDAuMDI0IC0wLjIyNiwwLjA2OSAtMC4wNjIsMC4wNDcgLTAuMTEyLDAuMTAxIC0wLjE0OSwwLjE2MiB6Ii8+PC9nPjxwYXRoIGlkPSJwYXRoNDgiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gODkuNTMzLDIuMTk1IGggLTEuMjcgdiA3LjYzOSBoIDEuMjcgeiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkzLjY3MDQsMi4xOTQ5KSIgaWQ9Imc1MCI+PHBhdGggaWQ9InBhdGg1MiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgdiA0LjMxOCBsIC0wLjQ1OCwwLjA3MyBjIC0wLjA5OSwwLjAxOSAtMC4xNzgsMC4wNTQgLTAuMjM4LDAuMTA1IC0wLjA2LDAuMDQ5IC0wLjA5LDAuMTE5IC0wLjA5LDAuMjEzIHYgMC41MiBIIDAgdiAwLjM5IGMgMCwwLjMwMSAwLjA0NSwwLjU3MiAwLjEzNiwwLjgxMSAwLjA5MSwwLjI0IDAuMjIxLDAuNDQ1IDAuMzkxLDAuNjEzIDAuMTcsMC4xNjggMC4zNzYsMC4yOTUgMC42MTksMC4zODUgMC4yNDQsMC4wOSAwLjUxOCwwLjEzMyAwLjgyMywwLjEzMyAwLjI0MywwIDAuNDY5LC0wLjAzMiAwLjY3OCwtMC4wOTggTCAyLjYyMiw2LjgyNiBDIDIuNjE4LDYuNzc5IDIuNjA0LDYuNzQgMi41ODEsNi43MTEgMi41NTYsNi42ODIgMi41MjQsNi42NiAyLjQ4NSw2LjY0NSAyLjQ0Niw2LjYyOSAyLjQsNi42MTkgMi4zNDksNi42MTMgMi4yOTgsNi42MDcgMi4yNDMsNi42MDUgMi4xODUsNi42MDUgMi4wMzQsNi42MDUgMS44OTksNi41OSAxLjc4MSw2LjU1NyAxLjY2Myw2LjUyMyAxLjU2Miw2LjQ2NyAxLjQ4LDYuMzg3IDEuMzk4LDYuMzA3IDEuMzM1LDYuMTk5IDEuMjkzLDYuMDY4IDEuMjUsNS45MzYgMS4yMjksNS43NzMgMS4yMjksNS41NzggViA1LjIyOSBIIDIuNjAxIFYgNC4zMjIgSCAxLjI3IFYgMCBaIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDk5LjE4MzYsMy4wOTUzKSIgaWQ9Imc1NCI+PHBhdGggaWQ9InBhdGg1NiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0iTSAwLDAgQyAwLjQzOSwwIDAuNzY0LDAuMTQ2IDAuOTc1LDAuNDQxIDEuMTg2LDAuNzM2IDEuMjkxLDEuMTY4IDEuMjkxLDEuNzM2IDEuMjkxLDIuMzA3IDEuMTg2LDIuNzM4IDAuOTc1LDMuMDM3IDAuNzY0LDMuMzM2IDAuNDM5LDMuNDg0IDAsMy40ODQgLTAuNDQ1LDMuNDg0IC0wLjc3NSwzLjMzNCAtMC45ODksMy4wMzUgLTEuMjA0LDIuNzM0IC0xLjMxMSwyLjMwMyAtMS4zMTEsMS43MzYgLTEuMzExLDEuMTcyIC0xLjIwNCwwLjc0IC0wLjk4OSwwLjQ0MyAtMC43NzUsMC4xNDggLTAuNDQ1LDAgMCwwIE0gMCw0LjQ1NSBDIDAuMzkxLDQuNDU1IDAuNzQ2LDQuMzkzIDEuMDY3LDQuMjY2IDEuMzg4LDQuMTM5IDEuNjYxLDMuOTU5IDEuODksMy43MjcgMi4xMTcsMy40OTIgMi4yOTMsMy4yMDkgMi40MTYsMi44NzMgMi41NCwyLjUzNyAyLjYwMiwyLjE2MiAyLjYwMiwxLjc0OCAyLjYwMiwxLjMyOCAyLjU0LDAuOTUzIDIuNDE2LDAuNjE3IDIuMjkzLDAuMjgxIDIuMTE3LC0wLjAwNiAxLjg5LC0wLjI0MiAxLjY2MSwtMC40NzkgMS4zODgsLTAuNjYgMS4wNjcsLTAuNzg3IDAuNzQ2LC0wLjkxNCAwLjM5MSwtMC45NzcgMCwtMC45NzcgYyAtMC4zOTQsMCAtMC43NTIsMC4wNjMgLTEuMDc0LDAuMTkgLTAuMzIyLDAuMTI3IC0wLjU5NywwLjMwOCAtMC44MjUsMC41NDUgLTAuMjI4LDAuMjM2IC0wLjQwNCwwLjUyMyAtMC41MjksMC44NTkgLTAuMTI2LDAuMzM2IC0wLjE4OCwwLjcxMSAtMC4xODgsMS4xMzEgMCwwLjQxNCAwLjA2MiwwLjc4OSAwLjE4OCwxLjEyNSAwLjEyNSwwLjMzNiAwLjMwMSwwLjYxOSAwLjUyOSwwLjg1NCAwLjIyOCwwLjIzMiAwLjUwMywwLjQxMiAwLjgyNSwwLjUzOSAwLjMyMiwwLjEyNyAwLjY4LDAuMTg5IDEuMDc0LDAuMTg5Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwMy45NDgyLDYuNTU0MykiIGlkPSJnNTgiPjxwYXRoIGlkPSJwYXRoNjAiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgMC4xNjQsMC4zMTQgMC4zNTksMC41NjIgMC41ODYsMC43NDIgMC4yMjYsMC4xOCAwLjQ5MywwLjI3IDAuODAyLDAuMjcgMC4yNDMsMCAwLjQzOCwtMC4wNTMgMC41ODYsLTAuMTU4IEwgMS44OTIsLTAuMDk4IEMgMS44NzQsLTAuMTYgMS44NSwtMC4yMDMgMS44MTYsLTAuMjI5IDEuNzg0LC0wLjI1NCAxLjc0LC0wLjI2OCAxLjY4NiwtMC4yNjggYyAtMC4wNTIsMCAtMC4xMjgsMC4wMDggLTAuMjI5LDAuMDI2IC0wLjEwMiwwLjAxNyAtMC4yLDAuMDI1IC0wLjI5NiwwLjAyNSAtMC4xNCwwIC0wLjI2NSwtMC4wMTkgLTAuMzc1LC0wLjA2IEMgMC42NzcsLTAuMzE4IDAuNTc4LC0wLjM3OSAwLjQ5LC0wLjQ1NSAwLjQwMywtMC41MzEgMC4zMjYsLTAuNjI1IDAuMjYsLTAuNzM0IDAuMTkyLC0wLjg0NiAwLjEzLC0wLjk3MSAwLjA3MSwtMS4xMTEgdiAtMy4yNDggaCAtMS4yNjkgdiA1LjI3MyBoIDAuNzQ2IGMgMC4xMywwIDAuMjIxLC0wLjAyMSAwLjI3MiwtMC4wNjggMC4wNTEsLTAuMDQ3IDAuMDg1LC0wLjEyOSAwLjEwMywtMC4yNSB6Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDExMi42NDg0LDYuMzUzMSkiIGlkPSJnNjIiPjxwYXRoIGlkPSJwYXRoNjQiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgLTAuMDM4LC0wLjA0NyAtMC4wNzQsLTAuMDg2IC0wLjExLC0wLjExMyAtMC4wMzYsLTAuMDI4IC0wLjA4OSwtMC4wNDEgLTAuMTU4LC0wLjA0MSAtMC4wNjQsMCAtMC4xMjgsMC4wMTkgLTAuMTg5LDAuMDYgLTAuMDYzLDAuMDM5IC0wLjEzNiwwLjA4NCAtMC4yMjIsMC4xMzMgLTAuMDg2LDAuMDQ5IC0wLjE4NywwLjA5NCAtMC4zMDUsMC4xMzMgLTAuMTE5LDAuMDQxIC0wLjI2NSwwLjA2IC0wLjQ0LDAuMDYgLTAuMjIyLDAgLTAuNDE4LC0wLjA0MSAtMC41ODYsLTAuMTIxIEMgLTIuMTc4LDAuMDMxIC0yLjMxNywtMC4wODYgLTIuNDI5LC0wLjIzNiAtMi41NCwtMC4zODcgLTIuNjIzLC0wLjU2OCAtMi42NzgsLTAuNzgzIC0yLjczMiwtMC45OTggLTIuNzYsLTEuMjQgLTIuNzYsLTEuNTEgYyAwLC0wLjI4MSAwLjAzLC0wLjUzMSAwLjA5LC0wLjc1MiAwLjA2LC0wLjIxOCAwLjE0NywtMC40MDIgMC4yNTksLTAuNTUyIDAuMTEzLC0wLjE0OSAwLjI1MSwtMC4yNjIgMC40MTIsLTAuMzM4IDAuMTYsLTAuMDc4IDAuMzQyLC0wLjExNiAwLjU0NCwtMC4xMTYgMC4yMDIsMCAwLjM2NiwwLjAyNCAwLjQ5MSwwLjA3NSAwLjEyNSwwLjA0OCAwLjIzMSwwLjEwMyAwLjMxNywwLjE2NCAwLjA4NSwwLjA2IDAuMTYsMC4xMTUgMC4yMjMsMC4xNjQgMC4wNjQsMC4wNTEgMC4xMzQsMC4wNzQgMC4yMTMsMC4wNzQgMC4xMDMsMCAwLjE4LC0wLjAzOSAwLjIzMiwtMC4xMTcgbCAwLjM2NSwtMC40NjMgYyAtMC4xNDEsLTAuMTY0IC0wLjI5MywtMC4zMDMgLTAuNDU4LC0wLjQxNCAtMC4xNjQsLTAuMTExIC0wLjMzNSwtMC4yMDEgLTAuNTExLC0wLjI2OCAtMC4xNzcsLTAuMDY2IC0wLjM1OCwtMC4xMTMgLTAuNTQ1LC0wLjE0IC0wLjE4NywtMC4wMjggLTAuMzczLC0wLjA0MSAtMC41NTgsLTAuMDQxIC0wLjMyNiwwIC0wLjYzMiwwLjA2IC0wLjkyLDAuMTgxIC0wLjI4OCwwLjEyMSAtMC41NCwwLjI5OSAtMC43NTUsMC41MzMgLTAuMjE2LDAuMjMzIC0wLjM4NywwLjUxOCAtMC41MTIsMC44NTYgLTAuMTI1LDAuMzM4IC0wLjE4OCwwLjcyMyAtMC4xODgsMS4xNTQgMCwwLjM4NyAwLjA1NiwwLjc0NiAwLjE2NywxLjA3NiAwLjExMiwwLjMzIDAuMjc2LDAuNjE4IDAuNDkyLDAuODU4IDAuMjE1LDAuMjQyIDAuNDgyLDAuNDMxIDAuODAxLDAuNTY4IDAuMzE5LDAuMTM3IDAuNjg1LDAuMjA1IDEuMSwwLjIwNSAwLjM5NSwwIDAuNzM5LC0wLjA2MiAxLjAzNiwtMC4xODkgMC4yOTYsLTAuMTI3IDAuNTYzLC0wLjMwOSAwLjc5OSwtMC41NDUgeiIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMTYuMDYzNSwzLjA5NTMpIiBpZD0iZzY2Ij48cGF0aCBpZD0icGF0aDY4IiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJNIDAsMCBDIDAuNDM5LDAgMC43NjQsMC4xNDYgMC45NzUsMC40NDEgMS4xODYsMC43MzYgMS4yOTEsMS4xNjggMS4yOTEsMS43MzYgMS4yOTEsMi4zMDcgMS4xODYsMi43MzggMC45NzUsMy4wMzcgMC43NjQsMy4zMzYgMC40MzksMy40ODQgMCwzLjQ4NCAtMC40NDUsMy40ODQgLTAuNzc0LDMuMzM0IC0wLjk4OSwzLjAzNSAtMS4yMDMsMi43MzQgLTEuMzExLDIuMzAzIC0xLjMxMSwxLjczNiAtMS4zMTEsMS4xNzIgLTEuMjAzLDAuNzQgLTAuOTg5LDAuNDQzIC0wLjc3NCwwLjE0OCAtMC40NDUsMCAwLDAgTSAwLDQuNDU1IEMgMC4zOTEsNC40NTUgMC43NDYsNC4zOTMgMS4wNjcsNC4yNjYgMS4zODgsNC4xMzkgMS42NjEsMy45NTkgMS44OSwzLjcyNyAyLjExNywzLjQ5MiAyLjI5MywzLjIwOSAyLjQxNiwyLjg3MyAyLjU0LDIuNTM3IDIuNjAyLDIuMTYyIDIuNjAyLDEuNzQ4IDIuNjAyLDEuMzI4IDIuNTQsMC45NTMgMi40MTYsMC42MTcgMi4yOTMsMC4yODEgMi4xMTcsLTAuMDA2IDEuODksLTAuMjQyIDEuNjYxLC0wLjQ3OSAxLjM4OCwtMC42NiAxLjA2NywtMC43ODcgMC43NDYsLTAuOTE0IDAuMzkxLC0wLjk3NyAwLC0wLjk3NyBjIC0wLjM5NCwwIC0wLjc1MiwwLjA2MyAtMS4wNzQsMC4xOSAtMC4zMjIsMC4xMjcgLTAuNTk3LDAuMzA4IC0wLjgyNCwwLjU0NSAtMC4yMjksMC4yMzYgLTAuNDA1LDAuNTIzIC0wLjUzLDAuODU5IC0wLjEyNiwwLjMzNiAtMC4xODgsMC43MTEgLTAuMTg4LDEuMTMxIDAsMC40MTQgMC4wNjIsMC43ODkgMC4xODgsMS4xMjUgMC4xMjUsMC4zMzYgMC4zMDEsMC42MTkgMC41MywwLjg1NCAwLjIyNywwLjIzMiAwLjUwMiwwLjQxMiAwLjgyNCwwLjUzOSAwLjMyMiwwLjEyNyAwLjY4LDAuMTg5IDEuMDc0LDAuMTg5Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMC44MzQsNi41NTQzKSIgaWQ9Imc3MCI+PHBhdGggaWQ9InBhdGg3MiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAwLjE2NCwwLjMxNCAwLjM1OSwwLjU2MiAwLjU4NiwwLjc0MiAwLjIyNiwwLjE4IDAuNDkzLDAuMjcgMC44MDIsMC4yNyAwLjI0MywwIDAuNDM4LC0wLjA1MyAwLjU4NiwtMC4xNTggTCAxLjg5MiwtMC4wOTggQyAxLjg3NCwtMC4xNiAxLjg1LC0wLjIwMyAxLjgxNiwtMC4yMjkgMS43ODQsLTAuMjU0IDEuNzQsLTAuMjY4IDEuNjg2LC0wLjI2OCBjIC0wLjA1MiwwIC0wLjEyOCwwLjAwOCAtMC4yMjksMC4wMjYgLTAuMTAyLDAuMDE3IC0wLjIsMC4wMjUgLTAuMjk2LDAuMDI1IC0wLjE0LDAgLTAuMjY1LC0wLjAxOSAtMC4zNzUsLTAuMDYgQyAwLjY3NywtMC4zMTggMC41NzgsLTAuMzc5IDAuNDksLTAuNDU1IDAuNDAzLC0wLjUzMSAwLjMyNiwtMC42MjUgMC4yNiwtMC43MzQgMC4xOTIsLTAuODQ2IDAuMTMsLTAuOTcxIDAuMDcxLC0xLjExMSB2IC0zLjI0OCBoIC0xLjI2OSB2IDUuMjczIGggMC43NDYgYyAwLjEzLDAgMC4yMjEsLTAuMDIxIDAuMjcyLC0wLjA2OCAwLjA1MSwtMC4wNDcgMC4wODUsLTAuMTI5IDAuMTAzLC0wLjI1IHoiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTI0Ljc0MDIsMy41NjIxKSIgaWQ9Imc3NCI+PHBhdGggaWQ9InBhdGg3NiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAwLjE0NCwtMC4xNzQgMC4zMDEsLTAuMjk3IDAuNDcxLC0wLjM2OSAwLjE2OSwtMC4wNzIgMC4zNTMsLTAuMTA4IDAuNTUxLC0wLjEwOCAwLjE5MywwIDAuMzY2LDAuMDM2IDAuNTIsMC4xMDggMC4xNTQsMC4wNzIgMC4yODUsMC4xODIgMC4zOTQsMC4zMjggMC4xMDcsMC4xNDggMC4xOSwwLjMzNCAwLjI0OSwwLjU1OSAwLjA1NywwLjIyNCAwLjA4NiwwLjQ4OCAwLjA4NiwwLjc5MyAwLDAuMzA4IC0wLjAyNCwwLjU3IC0wLjA3NCwwLjc4NSBDIDIuMTQ3LDIuMzA5IDIuMDc2LDIuNDgyIDEuOTg0LDIuNjE3IDEuODkyLDIuNzUgMS43NzksMi44NDggMS42NDcsMi45MSAxLjUxNiwyLjk3MSAxLjM2NSwzLjAwMiAxLjE5NywzLjAwMiAwLjkzNCwzLjAwMiAwLjcwOSwyLjk0NyAwLjUyNCwyLjgzNiAwLjMzOSwyLjcyNSAwLjE2NCwyLjU2NiAwLDIuMzY1IFogTSAtMC4wNjYsMy4xODggQyAwLjE0OSwzLjQzIDAuMzk0LDMuNjI3IDAuNjY4LDMuNzc5IDAuOTQyLDMuOTMgMS4yNjUsNC4wMDQgMS42MzUsNC4wMDQgMS45MjIsNC4wMDQgMi4xODYsMy45NDUgMi40MjQsMy44MjQgMi42NjEsMy43MDUgMi44NjcsMy41MzEgMy4wNCwzLjMwMyAzLjIxMywzLjA3NCAzLjM0NywyLjc5NSAzLjQ0MSwyLjQ2MSAzLjUzNSwyLjEyNSAzLjU4MiwxLjc0MiAzLjU4MiwxLjMxMSAzLjU4MiwwLjkxOCAzLjUyOSwwLjU1MyAzLjQyMywwLjIxNyAzLjMxNywtMC4xMTkgMy4xNjUsLTAuNDEgMi45NjksLTAuNjU4IDIuNzcxLC0wLjkwNCAyLjUzMywtMS4wOTggMi4yNTQsLTEuMjM2IDEuOTc1LC0xLjM3NSAxLjY2MiwtMS40NDMgMS4zMTUsLTEuNDQzIDEuMDIxLC0xLjQ0MyAwLjc3LC0xLjM5OCAwLjU2MSwtMS4zMDcgMC4zNTIsLTEuMjE3IDAuMTY0LC0xLjA5MiAwLC0wLjkzIHYgLTIuMTU4IGggLTEuMjcgdiA2Ljk5NCBoIDAuNzc3IGMgMC4xNjQsMCAwLjI3MiwtMC4wNzYgMC4zMjMsLTAuMjMgeiIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMzEuNjQyNiwzLjA5NTMpIiBpZD0iZzc4Ij48cGF0aCBpZD0icGF0aDgwIiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJNIDAsMCBDIDAuNDM5LDAgMC43NjQsMC4xNDYgMC45NzUsMC40NDEgMS4xODYsMC43MzYgMS4yOTEsMS4xNjggMS4yOTEsMS43MzYgMS4yOTEsMi4zMDcgMS4xODYsMi43MzggMC45NzUsMy4wMzcgMC43NjQsMy4zMzYgMC40MzksMy40ODQgMCwzLjQ4NCAtMC40NDUsMy40ODQgLTAuNzc0LDMuMzM0IC0wLjk4OSwzLjAzNSAtMS4yMDMsMi43MzQgLTEuMzExLDIuMzAzIC0xLjMxMSwxLjczNiAtMS4zMTEsMS4xNzIgLTEuMjAzLDAuNzQgLTAuOTg5LDAuNDQzIC0wLjc3NCwwLjE0OCAtMC40NDUsMCAwLDAgTSAwLDQuNDU1IEMgMC4zOTEsNC40NTUgMC43NDYsNC4zOTMgMS4wNjcsNC4yNjYgMS4zODgsNC4xMzkgMS42NjEsMy45NTkgMS44OSwzLjcyNyAyLjExNywzLjQ5MiAyLjI5MywzLjIwOSAyLjQxNiwyLjg3MyAyLjU0LDIuNTM3IDIuNjAyLDIuMTYyIDIuNjAyLDEuNzQ4IDIuNjAyLDEuMzI4IDIuNTQsMC45NTMgMi40MTYsMC42MTcgMi4yOTMsMC4yODEgMi4xMTcsLTAuMDA2IDEuODksLTAuMjQyIDEuNjYxLC0wLjQ3OSAxLjM4OCwtMC42NiAxLjA2NywtMC43ODcgMC43NDYsLTAuOTE0IDAuMzkxLC0wLjk3NyAwLC0wLjk3NyBjIC0wLjM5NCwwIC0wLjc1MiwwLjA2MyAtMS4wNzQsMC4xOSAtMC4zMjIsMC4xMjcgLTAuNTk3LDAuMzA4IC0wLjgyNCwwLjU0NSAtMC4yMjksMC4yMzYgLTAuNDA1LDAuNTIzIC0wLjUzLDAuODU5IC0wLjEyNiwwLjMzNiAtMC4xODgsMC43MTEgLTAuMTg4LDEuMTMxIDAsMC40MTQgMC4wNjIsMC43ODkgMC4xODgsMS4xMjUgMC4xMjUsMC4zMzYgMC4zMDEsMC42MTkgMC41MywwLjg1NCAwLjIyNywwLjIzMiAwLjUwMiwwLjQxMiAwLjgyNCwwLjUzOSAwLjMyMiwwLjEyNyAwLjY4LDAuMTg5IDEuMDc0LDAuMTg5Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzNi40MDgyLDYuNTU0MykiIGlkPSJnODIiPjxwYXRoIGlkPSJwYXRoODQiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgMC4xNjQsMC4zMTQgMC4zNTksMC41NjIgMC41ODYsMC43NDIgMC4yMjYsMC4xOCAwLjQ5MywwLjI3IDAuODAyLDAuMjcgMC4yNDMsMCAwLjQzOCwtMC4wNTMgMC41ODYsLTAuMTU4IEwgMS44OTIsLTAuMDk4IEMgMS44NzQsLTAuMTYgMS44NSwtMC4yMDMgMS44MTYsLTAuMjI5IDEuNzg0LC0wLjI1NCAxLjc0LC0wLjI2OCAxLjY4NiwtMC4yNjggYyAtMC4wNTIsMCAtMC4xMjgsMC4wMDggLTAuMjI5LDAuMDI2IC0wLjEwMiwwLjAxNyAtMC4yLDAuMDI1IC0wLjI5NiwwLjAyNSAtMC4xNCwwIC0wLjI2NSwtMC4wMTkgLTAuMzc1LC0wLjA2IEMgMC42NzcsLTAuMzE4IDAuNTc4LC0wLjM3OSAwLjQ5LC0wLjQ1NSAwLjQwMywtMC41MzEgMC4zMjYsLTAuNjI1IDAuMjYsLTAuNzM0IDAuMTkyLC0wLjg0NiAwLjEzLC0wLjk3MSAwLjA3MSwtMS4xMTEgdiAtMy4yNDggaCAtMS4yNjkgdiA1LjI3MyBoIDAuNzQ2IGMgMC4xMywwIDAuMjIxLC0wLjAyMSAwLjI3MiwtMC4wNjggMC4wNTEsLTAuMDQ3IDAuMDg1LC0wLjEyOSAwLjEwMywtMC4yNSB6Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE0MS43NjM3LDQuNDQ2OSkiIGlkPSJnODYiPjxwYXRoIGlkPSJwYXRoODgiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgLTAuMzY2LC0wLjAxOCAtMC42NzUsLTAuMDQ5IC0wLjkyNSwtMC4wOTYgLTAuMjUsLTAuMDQ1IC0wLjQ1MSwtMC4xMDUgLTAuNjAxLC0wLjE3NyAtMC4xNTIsLTAuMDcxIC0wLjI1OSwtMC4xNTUgLTAuMzI1LC0wLjI1MiAtMC4wNjQsLTAuMDk2IC0wLjA5NywtMC4yIC0wLjA5NywtMC4zMTMgMCwtMC4yMjMgMC4wNjYsLTAuMzgzIDAuMTk4LC0wLjQ3OCAwLjEzMiwtMC4wOTYgMC4zMDQsLTAuMTQzIDAuNTE3LC0wLjE0MyAwLjI2LDAgMC40ODUsMC4wNDcgMC42NzUsMC4xNDEgMC4xOTEsMC4wOTMgMC4zNzYsMC4yMzYgMC41NTgsMC40MjkgeiBtIC0yLjkwOSwyLjI4NyBjIDAuNjA2LDAuNTU1IDEuMzM3LDAuODMyIDIuMTg5LDAuODMyIDAuMzA5LDAgMC41ODQsLTAuMDUxIDAuODI4LC0wLjE1IEMgMC4zNTIsMi44NjcgMC41NTcsMi43MjcgMC43MjUsMi41NDcgMC44OTMsMi4zNjcgMS4wMjEsMi4xNTIgMS4xMDcsMS45MDIgMS4xOTUsMS42NTIgMS4yMzksMS4zNzcgMS4yMzksMS4wOCBWIC0yLjI1MiBIIDAuNjYzIGMgLTAuMTIsMCAtMC4yMTMsMC4wMTggLTAuMjc3LDAuMDU1IEMgMC4zMiwtMi4xNjIgMC4yNywtMi4wODggMC4yMzEsLTEuOTc5IEwgMC4xMTgsLTEuNiBjIC0wLjEzNCwtMC4xMTkgLTAuMjY0LC0wLjIyNCAtMC4zOSwtMC4zMTQgLTAuMTI3LC0wLjA5MiAtMC4yNTksLTAuMTY4IC0wLjM5NiwtMC4yMjkgLTAuMTM3LC0wLjA2MiAtMC4yODQsLTAuMTA5IC0wLjQzOSwtMC4xNDIgLTAuMTU3LC0wLjAzMyAtMC4zMjksLTAuMDQ5IC0wLjUxNywtMC4wNDkgLTAuMjIzLDAgLTAuNDI5LDAuMDMxIC0wLjYxNywwLjA5IC0wLjE4OSwwLjA2IC0wLjM1MSwwLjE1IC0wLjQ4OCwwLjI2OSAtMC4xMzcsMC4xMjEgLTAuMjQ0LDAuMjcgLTAuMzE5LDAuNDQ4IC0wLjA3NSwwLjE3OSAtMC4xMTMsMC4zODYgLTAuMTEzLDAuNjIzIDAsMC4xMzMgMC4wMjIsMC4yNjUgMC4wNjcsMC4zOTggMC4wNDQsMC4xMzEgMC4xMTcsMC4yNTggMC4yMTgsMC4zNzcgMC4xMDIsMC4xMjEgMC4yMzIsMC4yMzMgMC4zOTQsMC4zNCAwLjE2MSwwLjEwNSAwLjM1OCwwLjE5OSAwLjU5MywwLjI3NyAwLjIzNSwwLjA3OCAwLjUwOCwwLjE0MyAwLjgyLDAuMTk0IEMgLTAuNzU3LDAuNzMgLTAuNCwwLjc2IDAsMC43NzEgViAxLjA4IGMgMCwwLjM1MiAtMC4wNzUsMC42MTMgLTAuMjI2LDAuNzgzIC0wLjE1MSwwLjE3IC0wLjM2OSwwLjI1NCAtMC42NTMsMC4yNTQgLTAuMjA1LDAgLTAuMzc2LC0wLjAyMyAtMC41MTIsLTAuMDcyIEMgLTEuNTI1LDEuOTk4IC0xLjY0NSwxLjk0MyAtMS43NDcsMS44ODMgLTEuODUxLDEuODI0IC0xLjk0MywxLjc3IC0yLjAyNywxLjcyMyAtMi4xMTEsMS42NzQgLTIuMjA1LDEuNjUgLTIuMzA4LDEuNjUgYyAtMC4wODgsMCAtMC4xNjUsMC4wMjQgLTAuMjI2LDAuMDY5IC0wLjA2MiwwLjA0NyAtMC4xMTIsMC4xMDEgLTAuMTQ5LDAuMTYyIHoiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQ1Ljg3NzksMi4xMTI5KSIgaWQ9Imc5MCI+PHBhdGggaWQ9InBhdGg5MiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAtMC40NTksMCAtMC44MTEsMC4xMjkgLTEuMDU2LDAuMzg5IC0wLjI0NSwwLjI1NyAtMC4zNjgsMC42MTUgLTAuMzY4LDEuMDcyIHYgMi45NDMgaCAtMC41MzkgYyAtMC4wNjgsMCAtMC4xMjcsMC4wMjQgLTAuMTc1LDAuMDY5IC0wLjA0OCwwLjA0MyAtMC4wNzIsMC4xMTEgLTAuMDcyLDAuMTk5IHYgMC41MDQgbCAwLjg0OSwwLjEzOCAwLjI2NiwxLjQ0IGMgMC4wMTgsMC4wNjggMC4wNSwwLjEyMSAwLjA5OCwwLjE2IDAuMDQ4LDAuMDM3IDAuMTEsMC4wNTcgMC4xODUsMC4wNTcgaCAwLjY1OSBWIDUuMzExIEggMS4yNTUgViA0LjQwNCBIIC0wLjE1MyBWIDEuNTQ3IGMgMCwtMC4xNjQgMC4wNCwtMC4yOTMgMC4xMiwtMC4zODUgMC4wODEsLTAuMDkyIDAuMTkxLC0wLjEzOSAwLjMzMiwtMC4xMzkgMC4wNzgsMCAwLjE0NCwwLjAxIDAuMTk3LDAuMDI4IEMgMC41NSwxLjA3IDAuNTk2LDEuMDkgMC42MzUsMS4xMTEgMC42NzUsMS4xMzEgMC43MSwxLjE1IDAuNzQsMS4xNyAwLjc3MSwxLjE4NyAwLjgwMywxLjE5NyAwLjgzMywxLjE5NyAwLjg3MSwxLjE5NyAwLjkwMSwxLjE4NyAwLjkyNiwxLjE3IDAuOTQ5LDEuMTUgMC45NzYsMS4xMjMgMS4wMDMsMS4wODQgTCAxLjM4MywwLjQ2OSBDIDEuMTk4LDAuMzE0IDAuOTg1LDAuMTk3IDAuNzQ2LDAuMTE5IDAuNTA2LDAuMDM5IDAuMjU4LDAgMCwwIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1MS4yOTc5LDUuNDM5MSkiIGlkPSJnOTQiPjxwYXRoIGlkPSJwYXRoOTYiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Ik0gMCwwIEMgMCwwLjE2NCAtMC4wMjMsMC4zMTggLTAuMDY5LDAuNDY1IC0wLjExNSwwLjYxMSAtMC4xODYsMC43MzggLTAuMjc3LDAuODQ4IC0wLjM3LDAuOTU3IC0wLjQ4NywxLjA0MyAtMC42MywxLjEwNyAtMC43NzEsMS4xNyAtMC45MzcsMS4yMDMgLTEuMTI2LDEuMjAzIC0xLjQ5MiwxLjIwMyAtMS43ODEsMS4wOTggLTEuOTkyLDAuODg5IC0yLjIwMiwwLjY4IC0yLjMzNywwLjM4MyAtMi4zOTYsMCBaIG0gLTIuNDIxLC0wLjc2NiBjIDAuMDIxLC0wLjI3MSAwLjA2OCwtMC41MDUgMC4xNDQsLTAuNzAzIDAuMDc1LC0wLjE5NSAwLjE3NCwtMC4zNTkgMC4yOTgsLTAuNDg4IDAuMTI0LC0wLjEyNyAwLjI3LC0wLjIyMyAwLjQ0LC0wLjI4NyAwLjE2OSwtMC4wNjMgMC4zNTYsLTAuMDk2IDAuNTYyLC0wLjA5NiAwLjIwNiwwIDAuMzgzLDAuMDI2IDAuNTMzLDAuMDcyIDAuMTQ4LDAuMDQ5IDAuMjc5LDAuMTAyIDAuMzksMC4xNjEgMC4xMTIsMC4wNTggMC4yMDksMC4xMTEgMC4yOTMsMC4xNTggMC4wODQsMC4wNDkgMC4xNjUsMC4wNzIgMC4yNDQsMC4wNzIgMC4xMDYsMCAwLjE4NSwtMC4wMzkgMC4yMzcsLTAuMTE3IEwgMS4wODUsLTIuNDU3IEMgMC45NDQsLTIuNjIxIDAuNzg2LC0yLjc2IDAuNjExLC0yLjg3MSAwLjQzNywtMi45ODIgMC4yNTQsLTMuMDcyIDAuMDY0LC0zLjEzOSAtMC4xMjYsLTMuMjA1IC0wLjMxOSwtMy4yNTIgLTAuNTE3LC0zLjI3OSAtMC43MTQsLTMuMzA3IC0wLjkwNCwtMy4zMiAtMS4wOSwtMy4zMiBjIC0wLjM2NiwwIC0wLjcwNywwLjA2IC0xLjAyMiwwLjE4MSAtMC4zMTYsMC4xMjEgLTAuNTksMC4zMDMgLTAuODIzLDAuNTQxIC0wLjIzMywwLjIzNyAtMC40MTcsMC41MzIgLTAuNTUsMC44ODMgLTAuMTMzLDAuMzUyIC0wLjIwMSwwLjc1OCAtMC4yMDEsMS4yMjEgMCwwLjM1OSAwLjA1OSwwLjY5OSAwLjE3NSwxLjAxNSAwLjExNiwwLjMxNyAwLjI4MywwLjU5MiAwLjUwMSwwLjgyOSAwLjIxOCwwLjIzNCAwLjQ4NCwwLjQyIDAuNzk3LDAuNTU2IDAuMzE0LDAuMTM3IDAuNjY3LDAuMjA1IDEuMDYyLDAuMjA1IDAuMzMyLDAgMC42MzgsLTAuMDUyIDAuOTIsLTAuMTU4IEMgMC4wNSwxLjg0NiAwLjI5MSwxLjY5MSAwLjQ5MywxLjQ4OCAwLjY5NSwxLjI4MyAwLjg1NCwxLjAzMyAwLjk2OSwwLjczNiAxLjA4NCwwLjQ0MSAxLjE0MSwwLjEwMiAxLjE0MSwtMC4yNzcgMS4xNDEsLTAuNDcxIDEuMTIsLTAuNiAxLjA3OSwtMC42NjYgYyAtMC4wNDEsLTAuMDY2IC0wLjEyLC0wLjEgLTAuMjM2LC0wLjEgeiIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjMuMjEwOSw3LjQ2ODQpIiBpZD0iZzk4Ij48cGF0aCBpZD0icGF0aDEwMCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgLTEuNjc2LC01LjI3MyBoIC0xLjAxNyBjIC0wLjExOCwwIC0wLjE5OCwwLjA3NiAtMC4yNDMsMC4yMjYgbCAtMC45NDUsMy4wNDkgYyAtMC4wMzEsMC4xMDIgLTAuMDU5LDAuMjAzIC0wLjA4NSwwLjMwNSAtMC4wMjUsMC4xMDEgLTAuMDQ3LDAuMjAzIC0wLjA2NCwwLjMwNiAtMC4wMjEsLTAuMTAzIC0wLjA0NCwtMC4yMDcgLTAuMDcsLTAuMzEgLTAuMDI1LC0wLjEwNiAtMC4wNTMsLTAuMjA5IC0wLjA4NSwtMC4zMTMgbCAtMC45NjEsLTMuMDM3IGMgLTAuMDQxLC0wLjE1IC0wLjEzMSwtMC4yMjYgLTAuMjcyLC0wLjIyNiBIIC02LjM5NSBMIC04LjA2NSwwIGggMS4wMTIgYyAwLjA5MywwIDAuMTcyLC0wLjAyMSAwLjIzNywtMC4wNjYgMC4wNjUsLTAuMDQ1IDAuMTA4LC0wLjEwMiAwLjEyOSwtMC4xNyBsIDAuNzU1LC0yLjgxNyBjIDAuMDM3LC0wLjE1NCAwLjA3MiwtMC4zMDQgMC4xLC0wLjQ1MSAwLjAyOSwtMC4xNDggMC4wNTUsLTAuMjk1IDAuMDc1LC0wLjQ0MyAwLjAzNywwLjE0OCAwLjA3OCwwLjI5NSAwLjEyLDAuNDQzIDAuMDQzLDAuMTQ3IDAuMDg5LDAuMjk3IDAuMTM3LDAuNDUxIGwgMC44NzQsMi44MjggYyAwLjAyMSwwLjA2OSAwLjA2MSwwLjEyNSAwLjEyLDAuMTY4IDAuMDYxLDAuMDQ1IDAuMTMzLDAuMDY5IDAuMjE5LDAuMDY5IGggMC41NiBjIDAuMDg5LDAgMC4xNjUsLTAuMDI0IDAuMjI5LC0wLjA2OSAwLjA2MywtMC4wNDMgMC4xMDUsLTAuMDk5IDAuMTI2LC0wLjE2OCBsIDAuODQ4LC0yLjgyOCBjIDAuMDQ1LC0wLjE1NCAwLjA4NiwtMC4zMDQgMC4xMjYsLTAuNDU1IDAuMDQsLTAuMTQ4IDAuMDc4LC0wLjI5NyAwLjExNiwtMC40NDMgMC4wNDQsMC4yOTEgMC4xMDcsMC41OSAwLjE5LDAuODk4IGwgMC43NzYsMi44MTcgYyAwLjAyNCwwLjA2OCAwLjA2NywwLjEyNSAwLjEyOSwwLjE3IEMgLTEuMTI2LC0wLjAyMSAtMS4wNTMsMCAtMC45NjcsMCBaIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2Ny4yMzczLDUuNDM5MSkiIGlkPSJnMTAyIj48cGF0aCBpZD0icGF0aDEwNCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0iTSAwLDAgQyAwLDAuMTY0IC0wLjAyMiwwLjMxOCAtMC4wNjksMC40NjUgLTAuMTE1LDAuNjExIC0wLjE4NSwwLjczOCAtMC4yNzcsMC44NDggLTAuMzcsMC45NTcgLTAuNDg3LDEuMDQzIC0wLjYyOSwxLjEwNyAtMC43NzEsMS4xNyAtMC45MzcsMS4yMDMgLTEuMTI1LDEuMjAzIC0xLjQ5MiwxLjIwMyAtMS43OCwxLjA5OCAtMS45OTEsMC44ODkgLTIuMjAyLDAuNjggLTIuMzM3LDAuMzgzIC0yLjM5NSwwIFogbSAtMi40MjEsLTAuNzY2IGMgMC4wMjEsLTAuMjcxIDAuMDY5LC0wLjUwNSAwLjE0NSwtMC43MDMgMC4wNzUsLTAuMTk1IDAuMTc0LC0wLjM1OSAwLjI5NywtMC40ODggMC4xMjQsLTAuMTI3IDAuMjcsLTAuMjIzIDAuNDQsLTAuMjg3IDAuMTcsLTAuMDYzIDAuMzU3LC0wLjA5NiAwLjU2MiwtMC4wOTYgMC4yMDYsMCAwLjM4NCwwLjAyNiAwLjUzMywwLjA3MiAwLjE0OSwwLjA0OSAwLjI3OSwwLjEwMiAwLjM5LDAuMTYxIDAuMTEyLDAuMDU4IDAuMjA5LDAuMTExIDAuMjkzLDAuMTU4IDAuMDg0LDAuMDQ5IDAuMTY1LDAuMDcyIDAuMjQ0LDAuMDcyIDAuMTA3LDAgMC4xODYsLTAuMDM5IDAuMjM3LC0wLjExNyBMIDEuMDg1LC0yLjQ1NyBDIDAuOTQ0LC0yLjYyMSAwLjc4NywtMi43NiAwLjYxMiwtMi44NzEgMC40MzcsLTIuOTgyIDAuMjU1LC0zLjA3MiAwLjA2NCwtMy4xMzkgLTAuMTI1LC0zLjIwNSAtMC4zMTksLTMuMjUyIC0wLjUxNywtMy4yNzkgLTAuNzEzLC0zLjMwNyAtMC45MDQsLTMuMzIgLTEuMDg5LC0zLjMyIGMgLTAuMzY3LDAgLTAuNzA4LDAuMDYgLTEuMDIzLDAuMTgxIC0wLjMxNiwwLjEyMSAtMC41ODksMC4zMDMgLTAuODIzLDAuNTQxIC0wLjIzMywwLjIzNyAtMC40MTYsMC41MzIgLTAuNTQ5LDAuODgzIC0wLjEzNCwwLjM1MiAtMC4yMDEsMC43NTggLTAuMjAxLDEuMjIxIDAsMC4zNTkgMC4wNTgsMC42OTkgMC4xNzUsMS4wMTUgMC4xMTYsMC4zMTcgMC4yODMsMC41OTIgMC41MDEsMC44MjkgMC4yMTgsMC4yMzQgMC40ODQsMC40MiAwLjc5NywwLjU1NiAwLjMxNCwwLjEzNyAwLjY2NywwLjIwNSAxLjA2MSwwLjIwNSAwLjMzMywwIDAuNjM5LC0wLjA1MiAwLjkyMSwtMC4xNTggQyAwLjA1LDEuODQ2IDAuMjkyLDEuNjkxIDAuNDk0LDEuNDg4IDAuNjk2LDEuMjgzIDAuODU0LDEuMDMzIDAuOTcsMC43MzYgMS4wODQsMC40NDEgMS4xNDIsMC4xMDIgMS4xNDIsLTAuMjc3IDEuMTQyLC0wLjQ3MSAxLjEyMSwtMC42IDEuMDgsLTAuNjY2IDEuMDM5LC0wLjczMiAwLjk2LC0wLjc2NiAwLjg0NCwtMC43NjYgWiIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNzAuNTk4NiwzLjU2MjEpIiBpZD0iZzEwNiI+PHBhdGggaWQ9InBhdGgxMDgiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgMC4xNDUsLTAuMTc0IDAuMzAxLC0wLjI5NyAwLjQ3MSwtMC4zNjkgMC4xNywtMC4wNzIgMC4zNDgsLTAuMTA4IDAuNTM3LC0wLjEwOCAwLjE5NSwwIDAuMzcxLDAuMDM2IDAuNTI3LDAuMTA0IDAuMTU1LDAuMDcgMC4yODgsMC4xODIgMC4zOTgsMC4zMyAwLjExLDAuMTQ4IDAuMTk0LDAuMzQgMC4yNTIsMC41NyAwLjA1OCwwLjIzMSAwLjA4NywwLjUwOCAwLjA4NywwLjgzIDAsMC41OCAtMC4wOTUsMC45OTggLTAuMjg4LDEuMjU2IEMgMS43OTMsMi44NzMgMS41MTcsMy4wMDIgMS4xNTcsMy4wMDIgMC45MTMsMy4wMDIgMC43MDEsMi45NDcgMC41MiwyLjgzNiAwLjMzOCwyLjcyNSAwLjE2NSwyLjU2NiAwLDIuMzY1IFogbSAwLDMuMjYgYyAwLjIxMywwLjIyMiAwLjQ0OCwwLjQgMC43MDcsMC41MzEgMC4yNTksMC4xMzMgMC41NTUsMC4xOTcgMC44ODcsMC4xOTcgMC4zMDQsMCAwLjU4LC0wLjA1OCAwLjgyNSwtMC4xNzkgQyAyLjY2NCwzLjY4OSAyLjg3MywzLjUxOCAzLjA0NiwzLjI5MyAzLjIxOSwzLjA2OCAzLjM1MiwyLjc5NyAzLjQ0NCwyLjQ3OSAzLjUzNywyLjE2IDMuNTgzLDEuODAxIDMuNTgzLDEuNDA0IDMuNTgzLDAuOTc1IDMuNTMsMC41ODYgMy40MjQsMC4yMzYgMy4zMTcsLTAuMTEzIDMuMTY2LC0wLjQxMiAyLjk2OSwtMC42NiAyLjc3MSwtMC45MDggMi41MzQsLTEuMTAyIDIuMjU3LC0xLjIzOCAxLjk3OSwtMS4zNzUgMS42NzEsLTEuNDQzIDEuMzMyLC0xLjQ0MyBjIC0wLjE2NSwwIC0wLjMxMywwLjAxNSAtMC40NDcsMC4wNDggLTAuMTM0LDAuMDMyIC0wLjI1NywwLjA3OSAtMC4zNywwLjEzNyAtMC4xMTQsMC4wNTcgLTAuMjE3LDAuMTI5IC0wLjMxMiwwLjIxMyAtMC4wOTQsMC4wODQgLTAuMTgzLDAuMTc4IC0wLjI2OSwwLjI3OSBsIC0wLjA1NywtMC4zNTMgYyAtMC4wMjEsLTAuMDkgLTAuMDU2LC0wLjE1NCAtMC4xMDYsLTAuMTkyIC0wLjA0OSwtMC4wMzcgLTAuMTE3LC0wLjA1NiAtMC4yMDMsLTAuMDU2IEggLTEuMjcgViA2LjI3MSBIIDAgWiIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNzguMzgwOSw2LjQ0MSkiIGlkPSJnMTEwIj48cGF0aCBpZD0icGF0aDExMiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAtMC4wMzQsLTAuMDU1IC0wLjA3LC0wLjA5NCAtMC4xMDcsLTAuMTE1IC0wLjAzOSwtMC4wMjQgLTAuMDg2LC0wLjAzMyAtMC4xNDUsLTAuMDMzIC0wLjA2MSwwIC0wLjEyNywwLjAxNSAtMC4xOTcsMC4wNSAtMC4wNzEsMC4wMzYgLTAuMTUzLDAuMDczIC0wLjI0NCwwLjExNiAtMC4wOTMsMC4wNDMgLTAuMTk5LDAuMDgyIC0wLjMxNywwLjExNSAtMC4xMTgsMC4wMzUgLTAuMjU4LDAuMDUzIC0wLjQxOSwwLjA1MyAtMC4yNSwwIC0wLjQ0NiwtMC4wNTMgLTAuNTg5LC0wLjE2MSAtMC4xNDEsLTAuMTA1IC0wLjIxMiwtMC4yNDQgLTAuMjEyLC0wLjQxNiAwLC0wLjExMyAwLjAzNywtMC4yMDkgMC4xMSwtMC4yODUgMC4wNzQsLTAuMDc4IDAuMTcyLC0wLjE0NCAwLjI5MywtMC4yMDMgMC4xMjIsLTAuMDU4IDAuMjYsLTAuMTExIDAuNDE0LC0wLjE1NiAwLjE1NCwtMC4wNDcgMC4zMSwtMC4wOTggMC40NywtMC4xNTIgMC4xNiwtMC4wNTUgMC4zMTYsLTAuMTE4IDAuNDcsLTAuMTg4IDAuMTU1LC0wLjA3IDAuMjkyLC0wLjE2IDAuNDE0LC0wLjI2OCAwLjEyMSwtMC4xMDcgMC4yMTksLTAuMjM2IDAuMjkzLC0wLjM4NiAwLjA3NCwtMC4xNTMgMC4xMTEsLTAuMzM0IDAuMTExLC0wLjU0NSAwLC0wLjI1NCAtMC4wNDYsLTAuNDg5IC0wLjEzNywtMC43MDMgLTAuMDkxLC0wLjIxMyAtMC4yMjUsLTAuMzk5IC0wLjQwMywtMC41NTUgLTAuMTc4LC0wLjE1NiAtMC4zOTksLTAuMjc3IC0wLjY2LC0wLjM2NSAtMC4yNjMsLTAuMDg2IC0wLjU2NSwtMC4xMzEgLTAuOTA4LC0wLjEzMSAtMC4xODEsMCAtMC4zNTksMC4wMTYgLTAuNTMyLDAuMDQ5IC0wLjE3MywwLjAzMyAtMC4zMzksMC4wNzggLTAuNDk4LDAuMTM2IC0wLjE2LDAuMDU5IC0wLjMwNywwLjEyNyAtMC40NDIsMC4yMDUgLTAuMTM2LDAuMDc5IC0wLjI1NSwwLjE2NSAtMC4zNTgsMC4yNTggbCAwLjI5MywwLjQ4MyBjIDAuMDM4LDAuMDU4IDAuMDgyLDAuMTAzIDAuMTM0LDAuMTM0IDAuMDUyLDAuMDMgMC4xMTYsMC4wNDUgMC4xOTUsMC4wNDUgMC4wNzksMCAwLjE1NCwtMC4wMjEgMC4yMjQsLTAuMDY2IDAuMDcsLTAuMDQ1IDAuMTUxLC0wLjA5MiAwLjI0NCwtMC4xNDUgMC4wOTMsLTAuMDUgMC4yMDEsLTAuMDk5IDAuMzI2LC0wLjE0MiAwLjEyNSwtMC4wNDUgMC4yODQsLTAuMDY4IDAuNDc2LC0wLjA2OCAwLjE1LDAgMC4yOCwwLjAxOSAwLjM4OCwwLjA1NCAwLjEwOCwwLjAzNSAwLjE5NywwLjA4NCAwLjI2NywwLjE0MSAwLjA3LDAuMDU4IDAuMTIyLDAuMTI3IDAuMTU0LDAuMjAzIDAuMDMzLDAuMDc4IDAuMDQ5LDAuMTU4IDAuMDQ5LDAuMjQgMCwwLjEyMyAtMC4wMzcsMC4yMjUgLTAuMTEsMC4zMDMgLTAuMDc0LDAuMDc4IC0wLjE3MiwwLjE0NiAtMC4yOTMsMC4yMDUgLTAuMTIyLDAuMDU5IC0wLjI2MSwwLjExMSAtMC40MTYsMC4xNTggLTAuMTU2LDAuMDQ1IC0wLjMxNiwwLjA5NiAtMC40NzksMC4xNTEgLTAuMTYzLDAuMDU0IC0wLjMyMiwwLjExOSAtMC40NzcsMC4xOTMgLTAuMTU2LDAuMDc0IC0wLjI5NSwwLjE2NiAtMC40MTcsMC4yNzkgLTAuMTIxLDAuMTE0IC0wLjIxOSwwLjI1MiAtMC4yOTMsMC40MTYgLTAuMDczLDAuMTY2IC0wLjExLDAuMzY0IC0wLjExLDAuNTk4IDAsMC4yMTUgMC4wNDIsMC40MjIgMC4xMjgsMC42MTcgMC4wODUsMC4xOTUgMC4yMTEsMC4zNjUgMC4zNzcsMC41MSAwLjE2NywwLjE0NiAwLjM3NCwwLjI2NCAwLjYyMiwwLjM1IDAuMjQ5LDAuMDg3IDAuNTM3LDAuMTMgMC44NjIsMC4xMyAwLjM2MywwIDAuNjk0LC0wLjA1OCAwLjk5MiwtMC4xNzkgMC4yOTgsLTAuMTE5IDAuNTQ2LC0wLjI3OCAwLjc0NSwtMC40NzMgeiIvPjwvZz48cGF0aCBpZD0icGF0aDExNCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAxODAuOTk3LDIuMTk1IGggLTEuMjc0IHYgNS4yNzMgaCAxLjI3NCB6IG0gMC4xNzUsNi44MSBjIDAsLTAuMTA5IC0wLjAyMywtMC4yMTIgLTAuMDY3LC0wLjMwOCAtMC4wNDQsLTAuMDk2IC0wLjEwMywtMC4xOCAtMC4xNzcsLTAuMjUyIC0wLjA3NCwtMC4wNyAtMC4xNiwtMC4xMjkgLTAuMjYsLTAuMTcyIC0wLjA5OSwtMC4wNDMgLTAuMjA1LC0wLjA2NCAtMC4zMTgsLTAuMDY0IC0wLjExLDAgLTAuMjEzLDAuMDIxIC0wLjMxMSwwLjA2NCAtMC4wOTgsMC4wNDMgLTAuMTgzLDAuMTAyIC0wLjI1NSwwLjE3MiAtMC4wNzIsMC4wNzIgLTAuMTI5LDAuMTU2IC0wLjE3MiwwLjI1MiAtMC4wNDMsMC4wOTYgLTAuMDY0LDAuMTk5IC0wLjA2NCwwLjMwOCAwLDAuMTE0IDAuMDIxLDAuMjE5IDAuMDY0LDAuMzE5IDAuMDQzLDAuMDk5IDAuMSwwLjE4NSAwLjE3MiwwLjI1OCAwLjA3MiwwLjA3MiAwLjE1NywwLjEyOSAwLjI1NSwwLjE3MiAwLjA5OCwwLjA0MiAwLjIwMSwwLjA2NCAwLjMxMSwwLjA2NCAwLjExMywwIDAuMjE5LC0wLjAyMiAwLjMxOCwtMC4wNjQgMC4xLC0wLjA0MyAwLjE4NiwtMC4xIDAuMjYsLTAuMTcyIDAuMDc0LC0wLjA3MyAwLjEzMywtMC4xNTkgMC4xNzcsLTAuMjU4IDAuMDQ0LC0wLjEgMC4wNjcsLTAuMjA1IDAuMDY3LC0wLjMxOSIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4NC4wNDc5LDIuMTEyOSkiIGlkPSJnMTE2Ij48cGF0aCBpZD0icGF0aDExOCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAtMC40NTksMCAtMC44MTEsMC4xMjkgLTEuMDU2LDAuMzg5IC0wLjI0NSwwLjI1NyAtMC4zNjgsMC42MTUgLTAuMzY4LDEuMDcyIHYgMi45NDMgaCAtMC41MzkgYyAtMC4wNjgsMCAtMC4xMjcsMC4wMjQgLTAuMTc1LDAuMDY5IC0wLjA0OCwwLjA0MyAtMC4wNzIsMC4xMTEgLTAuMDcyLDAuMTk5IHYgMC41MDQgbCAwLjg0OSwwLjEzOCAwLjI2NiwxLjQ0IGMgMC4wMTgsMC4wNjggMC4wNSwwLjEyMSAwLjA5OCwwLjE2IDAuMDQ4LDAuMDM3IDAuMTEsMC4wNTcgMC4xODUsMC4wNTcgaCAwLjY1OSBWIDUuMzExIEggMS4yNTUgViA0LjQwNCBIIC0wLjE1MyBWIDEuNTQ3IGMgMCwtMC4xNjQgMC4wNCwtMC4yOTMgMC4xMiwtMC4zODUgMC4wODEsLTAuMDkyIDAuMTkxLC0wLjEzOSAwLjMzMiwtMC4xMzkgMC4wNzgsMCAwLjE0NCwwLjAxIDAuMTk3LDAuMDI4IEMgMC41NSwxLjA3IDAuNTk2LDEuMDkgMC42MzUsMS4xMTEgMC42NzUsMS4xMzEgMC43MSwxLjE1IDAuNzQsMS4xNyAwLjc3MSwxLjE4NyAwLjgwMywxLjE5NyAwLjgzMywxLjE5NyAwLjg3MSwxLjE5NyAwLjkwMSwxLjE4NyAwLjkyNiwxLjE3IDAuOTQ5LDEuMTUgMC45NzYsMS4xMjMgMS4wMDMsMS4wODQgTCAxLjM4MywwLjQ2OSBDIDEuMTk4LDAuMzE0IDAuOTg1LDAuMTk3IDAuNzQ2LDAuMTE5IDAuNTA2LDAuMDM5IDAuMjU4LDAgMCwwIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4OS40Njc4LDUuNDM5MSkiIGlkPSJnMTIwIj48cGF0aCBpZD0icGF0aDEyMiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0iTSAwLDAgQyAwLDAuMTY0IC0wLjAyMywwLjMxOCAtMC4wNjksMC40NjUgLTAuMTE1LDAuNjExIC0wLjE4NiwwLjczOCAtMC4yNzcsMC44NDggLTAuMzcsMC45NTcgLTAuNDg3LDEuMDQzIC0wLjYzLDEuMTA3IC0wLjc3MSwxLjE3IC0wLjkzNywxLjIwMyAtMS4xMjYsMS4yMDMgLTEuNDkyLDEuMjAzIC0xLjc4MSwxLjA5OCAtMS45OTIsMC44ODkgLTIuMjAyLDAuNjggLTIuMzM3LDAuMzgzIC0yLjM5NiwwIFogbSAtMi40MjEsLTAuNzY2IGMgMC4wMjEsLTAuMjcxIDAuMDY4LC0wLjUwNSAwLjE0NCwtMC43MDMgMC4wNzUsLTAuMTk1IDAuMTc0LC0wLjM1OSAwLjI5OCwtMC40ODggMC4xMjQsLTAuMTI3IDAuMjcsLTAuMjIzIDAuNDQsLTAuMjg3IDAuMTY5LC0wLjA2MyAwLjM1NiwtMC4wOTYgMC41NjIsLTAuMDk2IDAuMjA2LDAgMC4zODMsMC4wMjYgMC41MzMsMC4wNzIgMC4xNDgsMC4wNDkgMC4yNzksMC4xMDIgMC4zOSwwLjE2MSAwLjExMiwwLjA1OCAwLjIwOSwwLjExMSAwLjI5MywwLjE1OCAwLjA4NCwwLjA0OSAwLjE2NSwwLjA3MiAwLjI0NCwwLjA3MiAwLjEwNiwwIDAuMTg1LC0wLjAzOSAwLjIzNywtMC4xMTcgTCAxLjA4NSwtMi40NTcgQyAwLjk0NCwtMi42MjEgMC43ODYsLTIuNzYgMC42MTEsLTIuODcxIDAuNDM3LC0yLjk4MiAwLjI1NCwtMy4wNzIgMC4wNjQsLTMuMTM5IC0wLjEyNiwtMy4yMDUgLTAuMzE5LC0zLjI1MiAtMC41MTcsLTMuMjc5IC0wLjcxNCwtMy4zMDcgLTAuOTA0LC0zLjMyIC0xLjA5LC0zLjMyIGMgLTAuMzY2LDAgLTAuNzA3LDAuMDYgLTEuMDIyLDAuMTgxIC0wLjMxNiwwLjEyMSAtMC41OSwwLjMwMyAtMC44MjMsMC41NDEgLTAuMjMzLDAuMjM3IC0wLjQxNywwLjUzMiAtMC41NSwwLjg4MyAtMC4xMzMsMC4zNTIgLTAuMjAxLDAuNzU4IC0wLjIwMSwxLjIyMSAwLDAuMzU5IDAuMDU5LDAuNjk5IDAuMTc1LDEuMDE1IDAuMTE2LDAuMzE3IDAuMjgzLDAuNTkyIDAuNTAxLDAuODI5IDAuMjE4LDAuMjM0IDAuNDg0LDAuNDIgMC43OTcsMC41NTYgMC4zMTQsMC4xMzcgMC42NjcsMC4yMDUgMS4wNjIsMC4yMDUgMC4zMzIsMCAwLjYzOCwtMC4wNTIgMC45MiwtMC4xNTggQyAwLjA1LDEuODQ2IDAuMjkxLDEuNjkxIDAuNDkzLDEuNDg4IDAuNjk1LDEuMjgzIDAuODU0LDEuMDMzIDAuOTY5LDAuNzM2IDEuMDg0LDAuNDQxIDEuMTQxLDAuMTAyIDEuMTQxLC0wLjI3NyAxLjE0MSwtMC40NzEgMS4xMiwtMC42IDEuMDc5LC0wLjY2NiBjIC0wLjA0MSwtMC4wNjYgLTAuMTIsLTAuMSAtMC4yMzYsLTAuMSB6Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5NC43NzczLDYuNDQxKSIgaWQ9ImcxMjQiPjxwYXRoIGlkPSJwYXRoMTI2IiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJtIDAsMCBjIC0wLjAzNCwtMC4wNTUgLTAuMDcsLTAuMDk0IC0wLjEwOCwtMC4xMTUgLTAuMDM4LC0wLjAyNCAtMC4wODYsLTAuMDMzIC0wLjE0NCwtMC4wMzMgLTAuMDYxLDAgLTAuMTI4LDAuMDE1IC0wLjE5OCwwLjA1IC0wLjA3MSwwLjAzNiAtMC4xNTIsMC4wNzMgLTAuMjQ0LDAuMTE2IC0wLjA5MywwLjA0MyAtMC4xOTgsMC4wODIgLTAuMzE3LDAuMTE1IC0wLjExOCwwLjAzNSAtMC4yNTgsMC4wNTMgLTAuNDE4LDAuMDUzIC0wLjI1MSwwIC0wLjQ0NywtMC4wNTMgLTAuNTg5LC0wLjE2MSAtMC4xNDIsLTAuMTA1IC0wLjIxMywtMC4yNDQgLTAuMjEzLC0wLjQxNiAwLC0wLjExMyAwLjAzNywtMC4yMDkgMC4xMTEsLTAuMjg1IDAuMDczLC0wLjA3OCAwLjE3MSwtMC4xNDQgMC4yOTMsLTAuMjAzIDAuMTIxLC0wLjA1OCAwLjI1OSwtMC4xMTEgMC40MTMsLTAuMTU2IDAuMTU0LC0wLjA0NyAwLjMxMSwtMC4wOTggMC40NzEsLTAuMTUyIDAuMTU5LC0wLjA1NSAwLjMxNiwtMC4xMTggMC40NywtMC4xODggMC4xNTQsLTAuMDcgMC4yOTIsLTAuMTYgMC40MTMsLTAuMjY4IDAuMTIyLC0wLjEwNyAwLjIyLC0wLjIzNiAwLjI5MywtMC4zODYgMC4wNzUsLTAuMTUzIDAuMTExLC0wLjMzNCAwLjExMSwtMC41NDUgMCwtMC4yNTQgLTAuMDQ1LC0wLjQ4OSAtMC4xMzYsLTAuNzAzIC0wLjA5MSwtMC4yMTMgLTAuMjI2LC0wLjM5OSAtMC40MDMsLTAuNTU1IC0wLjE3OSwtMC4xNTYgLTAuMzk5LC0wLjI3NyAtMC42NjEsLTAuMzY1IC0wLjI2MiwtMC4wODYgLTAuNTY1LC0wLjEzMSAtMC45MDgsLTAuMTMxIC0wLjE4MSwwIC0wLjM1OCwwLjAxNiAtMC41MzEsMC4wNDkgLTAuMTc0LDAuMDMzIC0wLjM0LDAuMDc4IC0wLjQ5OSwwLjEzNiAtMC4xNTksMC4wNTkgLTAuMzA3LDAuMTI3IC0wLjQ0MiwwLjIwNSAtMC4xMzUsMC4wNzkgLTAuMjU0LDAuMTY1IC0wLjM1NywwLjI1OCBsIDAuMjkzLDAuNDgzIGMgMC4wMzcsMC4wNTggMC4wODIsMC4xMDMgMC4xMzQsMC4xMzQgMC4wNTEsMC4wMyAwLjExNiwwLjA0NSAwLjE5NSwwLjA0NSAwLjA3OCwwIDAuMTU0LC0wLjAyMSAwLjIyMywtMC4wNjYgMC4wNywtMC4wNDUgMC4xNTIsLTAuMDkyIDAuMjQ0LC0wLjE0NSAwLjA5MywtMC4wNSAwLjIwMiwtMC4wOTkgMC4zMjcsLTAuMTQyIDAuMTI1LC0wLjA0NSAwLjI4MywtMC4wNjggMC40NzYsLTAuMDY4IDAuMTUsMCAwLjI3OSwwLjAxOSAwLjM4OCwwLjA1NCAwLjEwNywwLjAzNSAwLjE5NywwLjA4NCAwLjI2NywwLjE0MSAwLjA3LDAuMDU4IDAuMTIxLDAuMTI3IDAuMTU0LDAuMjAzIDAuMDMzLDAuMDc4IDAuMDQ5LDAuMTU4IDAuMDQ5LDAuMjQgMCwwLjEyMyAtMC4wMzcsMC4yMjUgLTAuMTExLDAuMzAzIC0wLjA3MywwLjA3OCAtMC4xNzEsMC4xNDYgLTAuMjkzLDAuMjA1IC0wLjEyMSwwLjA1OSAtMC4yNiwwLjExMSAtMC40MTYsMC4xNTggLTAuMTU2LDAuMDQ1IC0wLjMxNiwwLjA5NiAtMC40NzgsMC4xNTEgLTAuMTYzLDAuMDU0IC0wLjMyMiwwLjExOSAtMC40NzgsMC4xOTMgLTAuMTU2LDAuMDc0IC0wLjI5NSwwLjE2NiAtMC40MTYsMC4yNzkgLTAuMTIyLDAuMTE0IC0wLjIyLDAuMjUyIC0wLjI5MywwLjQxNiAtMC4wNzQsMC4xNjYgLTAuMTEsMC4zNjQgLTAuMTEsMC41OTggMCwwLjIxNSAwLjA0MiwwLjQyMiAwLjEyNywwLjYxNyAwLjA4NiwwLjE5NSAwLjIxMiwwLjM2NSAwLjM3OCwwLjUxIDAuMTY2LDAuMTQ2IDAuMzczLDAuMjY0IDAuNjIyLDAuMzUgMC4yNDgsMC4wODcgMC41MzYsMC4xMyAwLjg2MSwwLjEzIDAuMzYzLDAgMC42OTQsLTAuMDU4IDAuOTkyLC0wLjE3OSAwLjI5OSwtMC4xMTkgMC41NDcsLTAuMjc4IDAuNzQ1LC0wLjQ3MyB6Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc3LjYxMTgsMzAuMjkwMSkiIGlkPSJnMTI4Ij48cGF0aCBpZD0icGF0aDEzMCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAwLDEuMzk0IC0wLjE4NSwyLjY0NSAtMC41NTMsMy43NTEgLTAuMzcsMS4xMDcgLTAuOTAzLDIuMDQ0IC0xLjYsMi44MTEgLTAuNjk3LDAuNzY4IC0xLjU0LDEuMzU2IC0yLjUzLDEuNzY3IC0wLjk5LDAuNDEgLTIuMTA2LDAuNjE0IC0zLjM0NywwLjYxNCBoIC00LjkzOCBWIC04Ljk0NCBoIDQuOTM4IGMgMS4yNDEsMCAyLjM1NywwLjIwNSAzLjM0NywwLjYxNSAwLjk5LDAuNDExIDEuODMzLDAuOTk4IDIuNTMsMS43NjYgMC42OTcsMC43NjggMS4yMywxLjcwNCAxLjYsMi44MTIgQyAtMC4xODUsLTIuNjQ1IDAsLTEuMzk0IDAsMCBNIDQuODUsMCBDIDQuODUsLTEuODYzIDQuNTM5LC0zLjU3MyAzLjkxOCwtNS4xMzEgMy4yOTcsLTYuNjg5IDIuNDI1LC04LjAzIDEuMywtOS4xNTUgYyAtMS4xMjQsLTEuMTI0IC0yLjQ3OCwtMS45OTcgLTQuMDU5LC0yLjYxOCAtMS41ODEsLTAuNjIxIC0zLjMzOCwtMC45MzEgLTUuMjcxLC0wLjkzMSBoIC05LjY4MiB2IDI1LjQwOCBoIDkuNjgyIGMgMS45MzMsMCAzLjY5LC0wLjMxNCA1LjI3MSwtMC45NCBDIC0xLjE3OCwxMS4xMzcgMC4xNzYsMTAuMjY0IDEuMyw5LjE0NiAyLjQyNSw4LjAyNyAzLjI5Nyw2LjY4OCAzLjkxOCw1LjEzMSA0LjUzOSwzLjU3MyA0Ljg1LDEuODYyIDQuODUsMCIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4OS43MTgzLDMyLjQ4NjQpIiBpZD0iZzEzMiI+PHBhdGggaWQ9InBhdGgxMzQiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Ik0gMCwwIEMgMC41NjIsMS4wNzggMS4yMywxLjkyNCAyLjAwNCwyLjUzOSAyLjc3NywzLjE1NCAzLjY5LDMuNDYxIDQuNzQ1LDMuNDYxIDUuNTc2LDMuNDYxIDYuMjQ0LDMuMjggNi43NDgsMi45MTcgTCA2LjQ2NiwtMC4zMzQgQyA2LjQwOCwtMC41NDUgNi4zMjMsLTAuNjk0IDYuMjExLC0wLjc4MiA2LjEsLTAuODcgNS45NTEsLTAuOTE0IDUuNzY0LC0wLjkxNCBjIC0wLjE3NiwwIC0wLjQzNywwLjAzIC0wLjc4MiwwLjA4OCAtMC4zNDYsMC4wNTkgLTAuNjgyLDAuMDg4IC0xLjAxLDAuMDg4IC0wLjQ4MSwwIC0wLjkwOSwtMC4wNyAtMS4yODMsLTAuMjExIEMgMi4zMTQsLTEuMDg5IDEuOTc4LC0xLjI5MiAxLjY3OSwtMS41NTUgMS4zOCwtMS44MTkgMS4xMTYsLTIuMTM4IDAuODg4LC0yLjUxMyAwLjY2LC0yLjg4OCAwLjQ0NSwtMy4zMTUgMC4yNDcsLTMuNzk1IFYgLTE0LjkgSCAtNC4wOTQgViAzLjEyNyBoIDIuNTQ4IGMgMC40NDUsMCAwLjc1NiwtMC4wNzggMC45MzEsLTAuMjM3IDAuMTc3LC0wLjE1OCAwLjI5MywtMC40NDIgMC4zNTIsLTAuODUyIHoiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTA2LjIwMDIsMjAuNjYwOCkiIGlkPSJnMTM2Ij48cGF0aCBpZD0icGF0aDEzOCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0iTSAwLDAgQyAxLjQ5OSwwIDIuNjA4LDAuNTA0IDMuMzI5LDEuNTEyIDQuMDUsMi41MTkgNC40MSwzLjk5NSA0LjQxLDUuOTM5IDQuNDEsNy44ODQgNC4wNSw5LjM2NiAzLjMyOSwxMC4zODUgMi42MDgsMTEuNDA0IDEuNDk5LDExLjkxNCAwLDExLjkxNCBjIC0xLjUyMywwIC0yLjY1LC0wLjUxMyAtMy4zODMsLTEuNTM4IEMgLTQuMTE1LDkuMzUxIC00LjQ4LDcuODcyIC00LjQ4LDUuOTM5IC00LjQ4LDQuMDA3IC00LjExNSwyLjUzMyAtMy4zODMsMS41MjEgLTIuNjUsMC41MDcgLTEuNTIzLDAgMCwwIG0gMCwxNS4yMzQgYyAxLjMzNSwwIDIuNTUxLC0wLjIxNiAzLjY0NiwtMC42NSBDIDQuNzQxLDE0LjE1MSA1LjY3OCwxMy41MzYgNi40NTcsMTIuNzM5IDcuMjM2LDExLjk0MiA3LjgzNiwxMC45NyA4LjI1OCw5LjgyMyA4LjY4LDguNjc0IDguODkxLDcuMzkyIDguODkxLDUuOTc1IDguODkxLDQuNTQ1IDguNjgsMy4yNTcgOC4yNTgsMi4xMDggNy44MzYsMC45NjEgNy4yMzYsLTAuMDE4IDYuNDU3LC0wLjgyNSA1LjY3OCwtMS42MzQgNC43NDEsLTIuMjU1IDMuNjQ2LC0yLjY4OCAyLjU1MSwtMy4xMjEgMS4zMzUsLTMuMzM4IDAsLTMuMzM4IGMgLTEuMzQ4LDAgLTIuNTcxLDAuMjE3IC0zLjY3MywwLjY1IC0xLjEwMSwwLjQzMyAtMi4wNDEsMS4wNTQgLTIuODIsMS44NjMgLTAuNzc4LDAuODA3IC0xLjM4MiwxLjc4NiAtMS44MDksMi45MzMgLTAuNDI4LDEuMTQ5IC0wLjY0MiwyLjQzNyAtMC42NDIsMy44NjcgMCwxLjQxNyAwLjIxNCwyLjY5OSAwLjY0MiwzLjg0OCAwLjQyNywxLjE0NyAxLjAzMSwyLjExOSAxLjgwOSwyLjkxNiAwLjc3OSwwLjc5NyAxLjcxOSwxLjQxMiAyLjgyLDEuODQ1IDEuMTAyLDAuNDM0IDIuMzI1LDAuNjUgMy42NzMsMC42NSIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjYuMzg4NywyMC42NjA4KSIgaWQ9ImcxNDAiPjxwYXRoIGlkPSJwYXRoMTQyIiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJtIDAsMCBjIDEuNDk5LDAgMi42MDksMC41MDQgMy4zMywxLjUxMiAwLjcyMSwxLjAwNyAxLjA4LDIuNDgzIDEuMDgsNC40MjcgMCwxLjk0NSAtMC4zNTksMy40MjcgLTEuMDgsNC40NDYgLTAuNzIxLDEuMDE5IC0xLjgzMSwxLjUyOSAtMy4zMywxLjUyOSAtMS41MjIsMCAtMi42NSwtMC41MTMgLTMuMzgyLC0xLjUzOCBDIC00LjExNSw5LjM1MSAtNC40OCw3Ljg3MiAtNC40OCw1LjkzOSAtNC40OCw0LjAwNyAtNC4xMTUsMi41MzMgLTMuMzgyLDEuNTIxIC0yLjY1LDAuNTA3IC0xLjUyMiwwIDAsMCBtIDAsMTUuMjM0IGMgMS4zMzYsMCAyLjU1MSwtMC4yMTYgMy42NDYsLTAuNjUgQyA0Ljc0MSwxNC4xNTEgNS42NzgsMTMuNTM2IDYuNDU4LDEyLjczOSA3LjIzNiwxMS45NDIgNy44MzcsMTAuOTcgOC4yNTgsOS44MjMgOC42OCw4LjY3NCA4Ljg5MSw3LjM5MiA4Ljg5MSw1Ljk3NSA4Ljg5MSw0LjU0NSA4LjY4LDMuMjU3IDguMjU4LDIuMTA4IDcuODM3LDAuOTYxIDcuMjM2LC0wLjAxOCA2LjQ1OCwtMC44MjUgNS42NzgsLTEuNjM0IDQuNzQxLC0yLjI1NSAzLjY0NiwtMi42ODggMi41NTEsLTMuMTIxIDEuMzM2LC0zLjMzOCAwLC0zLjMzOCBjIC0xLjM0OCwwIC0yLjU3MSwwLjIxNyAtMy42NzMsMC42NSAtMS4xLDAuNDMzIC0yLjA0MSwxLjA1NCAtMi44MTksMS44NjMgLTAuNzc5LDAuODA3IC0xLjM4MywxLjc4NiAtMS44MSwyLjkzMyAtMC40MjgsMS4xNDkgLTAuNjQyLDIuNDM3IC0wLjY0MiwzLjg2NyAwLDEuNDE3IDAuMjE0LDIuNjk5IDAuNjQyLDMuODQ4IDAuNDI3LDEuMTQ3IDEuMDMxLDIuMTE5IDEuODEsMi45MTYgMC43NzgsMC43OTcgMS43MTksMS40MTIgMi44MTksMS44NDUgMS4xMDIsMC40MzQgMi4zMjUsMC42NSAzLjY3MywwLjY1Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE0Mi45NDA0LDIyLjI2MDQpIiBpZD0iZzE0NCI+PHBhdGggaWQ9InBhdGgxNDYiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgMC40OTIsLTAuNTk4IDEuMDI4LC0xLjAyIDEuNjA3LC0xLjI2NiAwLjU4MSwtMC4yNDYgMS4yMSwtMC4zNjkgMS44ODksLTAuMzY5IDAuNjU2LDAgMS4yNDgsMC4xMjMgMS43NzUsMC4zNjkgMC41MjcsMC4yNDYgMC45NzUsMC42MjEgMS4zNDQsMS4xMjUgMC4zNjksMC41MDMgMC42NTQsMS4xMzkgMC44NTMsMS45MDcgMC4xOTksMC43NjYgMC4yOTksMS42NzIgMC4yOTksMi43MTQgMCwxLjA1NSAtMC4wODYsMS45NDggLTAuMjU1LDIuNjggQyA3LjM0Miw3Ljg5MiA3LjA5OSw4LjQ4NiA2Ljc4Miw4Ljk0MyA2LjQ2Niw5LjQgNi4wODIsOS43MzQgNS42MzEsOS45NDUgNS4xODEsMTAuMTU2IDQuNjY4LDEwLjI2MSA0LjA5NSwxMC4yNjEgMy4xOTIsMTAuMjYxIDIuNDI1LDEwLjA3MSAxLjc5Miw5LjY5IDEuMTU5LDkuMzA5IDAuNTYyLDguNzczIDAsOC4wODMgWiBtIC0wLjIyOSwxMC44OTQgYyAwLjczOSwwLjgzMSAxLjU3NiwxLjUwNCAyLjUxMywyLjAyMSAwLjkzNywwLjUxNSAyLjAzOCwwLjc3MyAzLjMwMywwLjc3MyAwLjk4NCwwIDEuODgzLC0wLjIwNiAyLjY5NywtMC42MTYgMC44MTUsLTAuNDA5IDEuNTE4LC0xLjAwNCAyLjEwOSwtMS43ODMgQyAxMC45ODQsMTAuNTEgMTEuNDQxLDkuNTUgMTEuNzY0LDguNDA3IDEyLjA4NSw3LjI2NSAxMi4yNDcsNS45NTYgMTIuMjQ3LDQuNDggMTIuMjQ3LDMuMTMzIDEyLjA2NCwxLjg4NiAxMS43MDIsMC43MzcgMTEuMzM5LC0wLjQxIDEwLjgyLC0xLjQwNiAxMC4xNDcsLTIuMjQ5IDkuNDc0LC0zLjA5MyA4LjY1OSwtMy43NTIgNy43MDUsLTQuMjI3IDYuNzUsLTQuNyA1LjY4MSwtNC45MzcgNC40OTgsLTQuOTM3IDMuNDkxLC00LjkzNyAyLjYzLC00Ljc4MiAxLjkxNSwtNC40NzMgMS4yLC00LjE2MiAwLjU2MiwtMy43MzEgMCwtMy4xODEgdiAtNy4zOCBoIC00LjM0IHYgMjMuOTE1IGggMi42NTMgYyAwLjU2MiwwIDAuOTMxLC0wLjI2NCAxLjEwNywtMC43OTEgeiIvPjwvZz48cGF0aCBpZD0icGF0aDE0OCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAxNjIuOTU0LDE3LjU4NyBoIC00LjM0MSB2IDI2LjExIGggNC4zNDEgeiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE3OC45MDgyLDI4LjY3MzQpIiBpZD0iZzE1MCI+PHBhdGggaWQ9InBhdGgxNTIiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Ik0gMCwwIEMgMCwwLjU2MiAtMC4wOCwxLjA5MiAtMC4yMzcsMS41OSAtMC4zOTYsMi4wODggLTAuNjMzLDIuNTI0IC0wLjk0OSwyLjg5OSAtMS4yNjYsMy4yNzQgLTEuNjY3LDMuNTcgLTIuMTUzLDMuNzg3IC0yLjY0LDQuMDAzIC0zLjIwNCw0LjExMiAtMy44NDksNC4xMTIgLTUuMTAzLDQuMTEyIC02LjA4OSwzLjc1NCAtNi44MSwzLjA0IC03LjUyOSwyLjMyNSAtNy45ODksMS4zMTIgLTguMTg4LDAgWiBtIC04LjI3NiwtMi42MTggYyAwLjA3LC0wLjkyNiAwLjIzNCwtMS43MjUgMC40OTIsLTIuMzk5IDAuMjU3LC0wLjY3MyAwLjU5NywtMS4yMjkgMS4wMTgsLTEuNjY5IDAuNDIyLC0wLjQzOSAwLjkyMiwtMC43NjcgMS41MDIsLTAuOTg0IDAuNTgsLTAuMjE3IDEuMjIyLC0wLjMyNSAxLjkyNSwtMC4zMjUgMC43MDIsMCAxLjMwOSwwLjA4MiAxLjgxOCwwLjI0NiAwLjUxLDAuMTY0IDAuOTU2LDAuMzQ2IDEuMzM2LDAuNTQ1IDAuMzgsMC4xOTkgMC43MTQsMC4zODEgMS4wMDEsMC41NDUgMC4yODgsMC4xNjQgMC41NjUsMC4yNDYgMC44MzUsMC4yNDYgMC4zNjMsMCAwLjYzMiwtMC4xMzUgMC44MDksLTAuNDA0IGwgMS4yNDcsLTEuNTgyIGMgLTAuNDgsLTAuNTYyIC0xLjAxOSwtMS4wMzQgLTEuNjE2LC0xLjQxNCAtMC41OTksLTAuMzgxIC0xLjIyMiwtMC42ODYgLTEuODcyLC0wLjkxNCAtMC42NTEsLTAuMjI4IC0xLjMxMiwtMC4zODkgLTEuOTg2LC0wLjQ4MyAtMC42NzMsLTAuMDk0IC0xLjMyNiwtMC4xNDEgLTEuOTU5LC0wLjE0MSAtMS4yNTMsMCAtMi40MTksMC4yMDggLTMuNDk2LDAuNjI0IC0xLjA3OSwwLjQxNSAtMi4wMTUsMS4wMzEgLTIuODExLDEuODQ1IC0wLjc5OCwwLjgxNCAtMS40MjQsMS44MjEgLTEuODgxLDMuMDIyIC0wLjQ1NiwxLjIwMSAtMC42ODYsMi41OTIgLTAuNjg2LDQuMTczIDAsMS4yMyAwLjIwMSwyLjM4NyAwLjU5OSwzLjQ3IDAuMzk3LDEuMDg0IDAuOTY5LDIuMDI3IDEuNzEzLDIuODI5IDAuNzQzLDAuODAzIDEuNjUxLDEuNDM4IDIuNzI0LDEuOTA3IDEuMDcxLDAuNDY4IDIuMjgsMC43MDMgMy42MjcsMC43MDMgMS4xMzYsMCAyLjE4NSwtMC4xODIgMy4xNDYsLTAuNTQ1IEMgMC4xNjksNi4zMTQgMC45OTUsNS43ODQgMS42ODcsNS4wODcgMi4zNzcsNC4zOSAyLjkxOSwzLjUzNSAzLjMxMiwyLjUyMSAzLjcwNCwxLjUwOCAzLjksMC4zNTIgMy45LC0wLjk0OSAzLjksLTEuNjA1IDMuODMsLTIuMDQ3IDMuNjg5LC0yLjI3NSAzLjU0OSwtMi41MDQgMy4yNzksLTIuNjE4IDIuODgxLC0yLjYxOCBaIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5MC4xNTIzLDMyLjQ4NjQpIiBpZD0iZzE1NCI+PHBhdGggaWQ9InBhdGgxNTYiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Ik0gMCwwIEMgMC41NjIsMS4wNzggMS4yMywxLjkyNCAyLjAwNCwyLjUzOSAyLjc3NywzLjE1NCAzLjY5LDMuNDYxIDQuNzQ1LDMuNDYxIDUuNTc2LDMuNDYxIDYuMjQ0LDMuMjggNi43NDgsMi45MTcgTCA2LjQ2NywtMC4zMzQgQyA2LjQwOCwtMC41NDUgNi4zMjMsLTAuNjk0IDYuMjEyLC0wLjc4MiA2LjEwMSwtMC44NyA1Ljk1MSwtMC45MTQgNS43NjQsLTAuOTE0IGMgLTAuMTc2LDAgLTAuNDM3LDAuMDMgLTAuNzgyLDAuMDg4IC0wLjM0NSwwLjA1OSAtMC42ODIsMC4wODggLTEuMDEsMC4wODggLTAuNDgxLDAgLTAuOTA5LC0wLjA3IC0xLjI4NCwtMC4yMTEgQyAyLjMxNCwtMS4wODkgMS45NzgsLTEuMjkyIDEuNjc5LC0xLjU1NSAxLjM4LC0xLjgxOSAxLjExNiwtMi4xMzggMC44ODgsLTIuNTEzIDAuNjYsLTIuODg4IDAuNDQ1LC0zLjMxNSAwLjI0NywtMy43OTUgViAtMTQuOSBoIC00LjM0IFYgMy4xMjcgaCAyLjU0NyBjIDAuNDQ1LDAgMC43NTYsLTAuMDc4IDAuOTMyLC0wLjIzNyAwLjE3NiwtMC4xNTggMC4yOTIsLTAuNDQyIDAuMzUxLC0wLjg1MiB6Ii8+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPg==" | |
| 16 | + notes: | |
| 17 | + - heading: "Features" | |
| 18 | + content: | | |
| 19 | + PHP 8.1<br /> | |
| 20 | + MariaDB 10.6<br /> | |
| 21 | + Redis 7<br /> | |
| 22 | + Drush included<br /> | |
| 23 | + Automatic TLS certificates<br /> | |
| 24 | + Composer-based build<br /> | |
| 25 | + | |
| 26 | +initialize: | |
| 27 | + repository: https://github.com/droptica/droopler_project.git@4.0.0-alpha3 | |
| 28 | + config: null | |
| 29 | + files: [] | |
| 30 | + profile: Droopler | ... | ... |
.platform/local/.gitignore
0 → 100644
| 1 | +/ | ... | ... |
.platform/local/README.txt
0 → 100644
| 1 | +.platform/local | |
| 2 | +=============== | |
| 3 | + | |
| 4 | +This directory is where the Platform.sh CLI stores configuration files, builds, and | |
| 5 | +other data to help work with your project locally. | |
| 6 | + | |
| 7 | +It is not used on remote environments at all - the directory is excluded from | |
| 8 | +your Git repository (via .git/info/exclude). | ... | ... |
.platform/local/project.yaml
0 → 100644
.platform/routes.yaml
0 → 100644
| 1 | +# The routes of the project. | |
| 2 | +# | |
| 3 | +# Each route describes how an incoming URL is going | |
| 4 | +# to be processed by Platform.sh. | |
| 5 | + | |
| 6 | +"https://{default}/": | |
| 7 | + type: upstream | |
| 8 | + upstream: "platform-app-name:http" | |
| 9 | + cache: | |
| 10 | + enabled: true | |
| 11 | + | |
| 12 | + # Base the cache on the session cookie and custom Drupal cookies. Ignore all other cookies. | |
| 13 | + cookies: ['/^SS?ESS/', '/^Drupal.visitor/'] | |
| 14 | + | |
| 15 | +"https://www.{default}/": | |
| 16 | + type: redirect | |
| 17 | + to: "https://{default}/" | ... | ... |
.platform/services.yaml
0 → 100644
LICENSE
0 → 100644
| 1 | + GNU GENERAL PUBLIC LICENSE | |
| 2 | + Version 2, June 1991 | |
| 3 | + | |
| 4 | + Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/> | |
| 5 | + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| 6 | + Everyone is permitted to copy and distribute verbatim copies | |
| 7 | + of this license document, but changing it is not allowed. | |
| 8 | + | |
| 9 | + Preamble | |
| 10 | + | |
| 11 | + The licenses for most software are designed to take away your | |
| 12 | +freedom to share and change it. By contrast, the GNU General Public | |
| 13 | +License is intended to guarantee your freedom to share and change free | |
| 14 | +software--to make sure the software is free for all its users. This | |
| 15 | +General Public License applies to most of the Free Software | |
| 16 | +Foundation's software and to any other program whose authors commit to | |
| 17 | +using it. (Some other Free Software Foundation software is covered by | |
| 18 | +the GNU Lesser General Public License instead.) You can apply it to | |
| 19 | +your programs, too. | |
| 20 | + | |
| 21 | + When we speak of free software, we are referring to freedom, not | |
| 22 | +price. Our General Public Licenses are designed to make sure that you | |
| 23 | +have the freedom to distribute copies of free software (and charge for | |
| 24 | +this service if you wish), that you receive source code or can get it | |
| 25 | +if you want it, that you can change the software or use pieces of it | |
| 26 | +in new free programs; and that you know you can do these things. | |
| 27 | + | |
| 28 | + To protect your rights, we need to make restrictions that forbid | |
| 29 | +anyone to deny you these rights or to ask you to surrender the rights. | |
| 30 | +These restrictions translate to certain responsibilities for you if you | |
| 31 | +distribute copies of the software, or if you modify it. | |
| 32 | + | |
| 33 | + For example, if you distribute copies of such a program, whether | |
| 34 | +gratis or for a fee, you must give the recipients all the rights that | |
| 35 | +you have. You must make sure that they, too, receive or can get the | |
| 36 | +source code. And you must show them these terms so they know their | |
| 37 | +rights. | |
| 38 | + | |
| 39 | + We protect your rights with two steps: (1) copyright the software, and | |
| 40 | +(2) offer you this license which gives you legal permission to copy, | |
| 41 | +distribute and/or modify the software. | |
| 42 | + | |
| 43 | + Also, for each author's protection and ours, we want to make certain | |
| 44 | +that everyone understands that there is no warranty for this free | |
| 45 | +software. If the software is modified by someone else and passed on, we | |
| 46 | +want its recipients to know that what they have is not the original, so | |
| 47 | +that any problems introduced by others will not reflect on the original | |
| 48 | +authors' reputations. | |
| 49 | + | |
| 50 | + Finally, any free program is threatened constantly by software | |
| 51 | +patents. We wish to avoid the danger that redistributors of a free | |
| 52 | +program will individually obtain patent licenses, in effect making the | |
| 53 | +program proprietary. To prevent this, we have made it clear that any | |
| 54 | +patent must be licensed for everyone's free use or not licensed at all. | |
| 55 | + | |
| 56 | + The precise terms and conditions for copying, distribution and | |
| 57 | +modification follow. | |
| 58 | + | |
| 59 | + GNU GENERAL PUBLIC LICENSE | |
| 60 | + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
| 61 | + | |
| 62 | + 0. This License applies to any program or other work which contains | |
| 63 | +a notice placed by the copyright holder saying it may be distributed | |
| 64 | +under the terms of this General Public License. The "Program", below, | |
| 65 | +refers to any such program or work, and a "work based on the Program" | |
| 66 | +means either the Program or any derivative work under copyright law: | |
| 67 | +that is to say, a work containing the Program or a portion of it, | |
| 68 | +either verbatim or with modifications and/or translated into another | |
| 69 | +language. (Hereinafter, translation is included without limitation in | |
| 70 | +the term "modification".) Each licensee is addressed as "you". | |
| 71 | + | |
| 72 | +Activities other than copying, distribution and modification are not | |
| 73 | +covered by this License; they are outside its scope. The act of | |
| 74 | +running the Program is not restricted, and the output from the Program | |
| 75 | +is covered only if its contents constitute a work based on the | |
| 76 | +Program (independent of having been made by running the Program). | |
| 77 | +Whether that is true depends on what the Program does. | |
| 78 | + | |
| 79 | + 1. You may copy and distribute verbatim copies of the Program's | |
| 80 | +source code as you receive it, in any medium, provided that you | |
| 81 | +conspicuously and appropriately publish on each copy an appropriate | |
| 82 | +copyright notice and disclaimer of warranty; keep intact all the | |
| 83 | +notices that refer to this License and to the absence of any warranty; | |
| 84 | +and give any other recipients of the Program a copy of this License | |
| 85 | +along with the Program. | |
| 86 | + | |
| 87 | +You may charge a fee for the physical act of transferring a copy, and | |
| 88 | +you may at your option offer warranty protection in exchange for a fee. | |
| 89 | + | |
| 90 | + 2. You may modify your copy or copies of the Program or any portion | |
| 91 | +of it, thus forming a work based on the Program, and copy and | |
| 92 | +distribute such modifications or work under the terms of Section 1 | |
| 93 | +above, provided that you also meet all of these conditions: | |
| 94 | + | |
| 95 | + a) You must cause the modified files to carry prominent notices | |
| 96 | + stating that you changed the files and the date of any change. | |
| 97 | + | |
| 98 | + b) You must cause any work that you distribute or publish, that in | |
| 99 | + whole or in part contains or is derived from the Program or any | |
| 100 | + part thereof, to be licensed as a whole at no charge to all third | |
| 101 | + parties under the terms of this License. | |
| 102 | + | |
| 103 | + c) If the modified program normally reads commands interactively | |
| 104 | + when run, you must cause it, when started running for such | |
| 105 | + interactive use in the most ordinary way, to print or display an | |
| 106 | + announcement including an appropriate copyright notice and a | |
| 107 | + notice that there is no warranty (or else, saying that you provide | |
| 108 | + a warranty) and that users may redistribute the program under | |
| 109 | + these conditions, and telling the user how to view a copy of this | |
| 110 | + License. (Exception: if the Program itself is interactive but | |
| 111 | + does not normally print such an announcement, your work based on | |
| 112 | + the Program is not required to print an announcement.) | |
| 113 | + | |
| 114 | +These requirements apply to the modified work as a whole. If | |
| 115 | +identifiable sections of that work are not derived from the Program, | |
| 116 | +and can be reasonably considered independent and separate works in | |
| 117 | +themselves, then this License, and its terms, do not apply to those | |
| 118 | +sections when you distribute them as separate works. But when you | |
| 119 | +distribute the same sections as part of a whole which is a work based | |
| 120 | +on the Program, the distribution of the whole must be on the terms of | |
| 121 | +this License, whose permissions for other licensees extend to the | |
| 122 | +entire whole, and thus to each and every part regardless of who wrote it. | |
| 123 | + | |
| 124 | +Thus, it is not the intent of this section to claim rights or contest | |
| 125 | +your rights to work written entirely by you; rather, the intent is to | |
| 126 | +exercise the right to control the distribution of derivative or | |
| 127 | +collective works based on the Program. | |
| 128 | + | |
| 129 | +In addition, mere aggregation of another work not based on the Program | |
| 130 | +with the Program (or with a work based on the Program) on a volume of | |
| 131 | +a storage or distribution medium does not bring the other work under | |
| 132 | +the scope of this License. | |
| 133 | + | |
| 134 | + 3. You may copy and distribute the Program (or a work based on it, | |
| 135 | +under Section 2) in object code or executable form under the terms of | |
| 136 | +Sections 1 and 2 above provided that you also do one of the following: | |
| 137 | + | |
| 138 | + a) Accompany it with the complete corresponding machine-readable | |
| 139 | + source code, which must be distributed under the terms of Sections | |
| 140 | + 1 and 2 above on a medium customarily used for software interchange; or, | |
| 141 | + | |
| 142 | + b) Accompany it with a written offer, valid for at least three | |
| 143 | + years, to give any third party, for a charge no more than your | |
| 144 | + cost of physically performing source distribution, a complete | |
| 145 | + machine-readable copy of the corresponding source code, to be | |
| 146 | + distributed under the terms of Sections 1 and 2 above on a medium | |
| 147 | + customarily used for software interchange; or, | |
| 148 | + | |
| 149 | + c) Accompany it with the information you received as to the offer | |
| 150 | + to distribute corresponding source code. (This alternative is | |
| 151 | + allowed only for noncommercial distribution and only if you | |
| 152 | + received the program in object code or executable form with such | |
| 153 | + an offer, in accord with Subsection b above.) | |
| 154 | + | |
| 155 | +The source code for a work means the preferred form of the work for | |
| 156 | +making modifications to it. For an executable work, complete source | |
| 157 | +code means all the source code for all modules it contains, plus any | |
| 158 | +associated interface definition files, plus the scripts used to | |
| 159 | +control compilation and installation of the executable. However, as a | |
| 160 | +special exception, the source code distributed need not include | |
| 161 | +anything that is normally distributed (in either source or binary | |
| 162 | +form) with the major components (compiler, kernel, and so on) of the | |
| 163 | +operating system on which the executable runs, unless that component | |
| 164 | +itself accompanies the executable. | |
| 165 | + | |
| 166 | +If distribution of executable or object code is made by offering | |
| 167 | +access to copy from a designated place, then offering equivalent | |
| 168 | +access to copy the source code from the same place counts as | |
| 169 | +distribution of the source code, even though third parties are not | |
| 170 | +compelled to copy the source along with the object code. | |
| 171 | + | |
| 172 | + 4. You may not copy, modify, sublicense, or distribute the Program | |
| 173 | +except as expressly provided under this License. Any attempt | |
| 174 | +otherwise to copy, modify, sublicense or distribute the Program is | |
| 175 | +void, and will automatically terminate your rights under this License. | |
| 176 | +However, parties who have received copies, or rights, from you under | |
| 177 | +this License will not have their licenses terminated so long as such | |
| 178 | +parties remain in full compliance. | |
| 179 | + | |
| 180 | + 5. You are not required to accept this License, since you have not | |
| 181 | +signed it. However, nothing else grants you permission to modify or | |
| 182 | +distribute the Program or its derivative works. These actions are | |
| 183 | +prohibited by law if you do not accept this License. Therefore, by | |
| 184 | +modifying or distributing the Program (or any work based on the | |
| 185 | +Program), you indicate your acceptance of this License to do so, and | |
| 186 | +all its terms and conditions for copying, distributing or modifying | |
| 187 | +the Program or works based on it. | |
| 188 | + | |
| 189 | + 6. Each time you redistribute the Program (or any work based on the | |
| 190 | +Program), the recipient automatically receives a license from the | |
| 191 | +original licensor to copy, distribute or modify the Program subject to | |
| 192 | +these terms and conditions. You may not impose any further | |
| 193 | +restrictions on the recipients' exercise of the rights granted herein. | |
| 194 | +You are not responsible for enforcing compliance by third parties to | |
| 195 | +this License. | |
| 196 | + | |
| 197 | + 7. If, as a consequence of a court judgment or allegation of patent | |
| 198 | +infringement or for any other reason (not limited to patent issues), | |
| 199 | +conditions are imposed on you (whether by court order, agreement or | |
| 200 | +otherwise) that contradict the conditions of this License, they do not | |
| 201 | +excuse you from the conditions of this License. If you cannot | |
| 202 | +distribute so as to satisfy simultaneously your obligations under this | |
| 203 | +License and any other pertinent obligations, then as a consequence you | |
| 204 | +may not distribute the Program at all. For example, if a patent | |
| 205 | +license would not permit royalty-free redistribution of the Program by | |
| 206 | +all those who receive copies directly or indirectly through you, then | |
| 207 | +the only way you could satisfy both it and this License would be to | |
| 208 | +refrain entirely from distribution of the Program. | |
| 209 | + | |
| 210 | +If any portion of this section is held invalid or unenforceable under | |
| 211 | +any particular circumstance, the balance of the section is intended to | |
| 212 | +apply and the section as a whole is intended to apply in other | |
| 213 | +circumstances. | |
| 214 | + | |
| 215 | +It is not the purpose of this section to induce you to infringe any | |
| 216 | +patents or other property right claims or to contest validity of any | |
| 217 | +such claims; this section has the sole purpose of protecting the | |
| 218 | +integrity of the free software distribution system, which is | |
| 219 | +implemented by public license practices. Many people have made | |
| 220 | +generous contributions to the wide range of software distributed | |
| 221 | +through that system in reliance on consistent application of that | |
| 222 | +system; it is up to the author/donor to decide if he or she is willing | |
| 223 | +to distribute software through any other system and a licensee cannot | |
| 224 | +impose that choice. | |
| 225 | + | |
| 226 | +This section is intended to make thoroughly clear what is believed to | |
| 227 | +be a consequence of the rest of this License. | |
| 228 | + | |
| 229 | + 8. If the distribution and/or use of the Program is restricted in | |
| 230 | +certain countries either by patents or by copyrighted interfaces, the | |
| 231 | +original copyright holder who places the Program under this License | |
| 232 | +may add an explicit geographical distribution limitation excluding | |
| 233 | +those countries, so that distribution is permitted only in or among | |
| 234 | +countries not thus excluded. In such case, this License incorporates | |
| 235 | +the limitation as if written in the body of this License. | |
| 236 | + | |
| 237 | + 9. The Free Software Foundation may publish revised and/or new versions | |
| 238 | +of the General Public License from time to time. Such new versions will | |
| 239 | +be similar in spirit to the present version, but may differ in detail to | |
| 240 | +address new problems or concerns. | |
| 241 | + | |
| 242 | +Each version is given a distinguishing version number. If the Program | |
| 243 | +specifies a version number of this License which applies to it and "any | |
| 244 | +later version", you have the option of following the terms and conditions | |
| 245 | +either of that version or of any later version published by the Free | |
| 246 | +Software Foundation. If the Program does not specify a version number of | |
| 247 | +this License, you may choose any version ever published by the Free Software | |
| 248 | +Foundation. | |
| 249 | + | |
| 250 | + 10. If you wish to incorporate parts of the Program into other free | |
| 251 | +programs whose distribution conditions are different, write to the author | |
| 252 | +to ask for permission. For software which is copyrighted by the Free | |
| 253 | +Software Foundation, write to the Free Software Foundation; we sometimes | |
| 254 | +make exceptions for this. Our decision will be guided by the two goals | |
| 255 | +of preserving the free status of all derivatives of our free software and | |
| 256 | +of promoting the sharing and reuse of software generally. | |
| 257 | + | |
| 258 | + NO WARRANTY | |
| 259 | + | |
| 260 | + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | |
| 261 | +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | |
| 262 | +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | |
| 263 | +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | |
| 264 | +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
| 265 | +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | |
| 266 | +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | |
| 267 | +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | |
| 268 | +REPAIR OR CORRECTION. | |
| 269 | + | |
| 270 | + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |
| 271 | +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | |
| 272 | +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | |
| 273 | +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | |
| 274 | +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | |
| 275 | +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | |
| 276 | +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | |
| 277 | +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | |
| 278 | +POSSIBILITY OF SUCH DAMAGES. | |
| 279 | + | |
| 280 | + END OF TERMS AND CONDITIONS | |
| 281 | + | |
| 282 | + How to Apply These Terms to Your New Programs | |
| 283 | + | |
| 284 | + If you develop a new program, and you want it to be of the greatest | |
| 285 | +possible use to the public, the best way to achieve this is to make it | |
| 286 | +free software which everyone can redistribute and change under these terms. | |
| 287 | + | |
| 288 | + To do so, attach the following notices to the program. It is safest | |
| 289 | +to attach them to the start of each source file to most effectively | |
| 290 | +convey the exclusion of warranty; and each file should have at least | |
| 291 | +the "copyright" line and a pointer to where the full notice is found. | |
| 292 | + | |
| 293 | + {description} | |
| 294 | + Copyright (C) {year} {fullname} | |
| 295 | + | |
| 296 | + This program is free software; you can redistribute it and/or modify | |
| 297 | + it under the terms of the GNU General Public License as published by | |
| 298 | + the Free Software Foundation; either version 2 of the License, or | |
| 299 | + (at your option) any later version. | |
| 300 | + | |
| 301 | + This program is distributed in the hope that it will be useful, | |
| 302 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 303 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 304 | + GNU General Public License for more details. | |
| 305 | + | |
| 306 | + You should have received a copy of the GNU General Public License along | |
| 307 | + with this program; if not, write to the Free Software Foundation, Inc., | |
| 308 | + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 309 | + | |
| 310 | +Also add information on how to contact you by electronic and paper mail. | |
| 311 | + | |
| 312 | +If the program is interactive, make it output a short notice like this | |
| 313 | +when it starts in an interactive mode: | |
| 314 | + | |
| 315 | + Gnomovision version 69, Copyright (C) year name of author | |
| 316 | + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | |
| 317 | + This is free software, and you are welcome to redistribute it | |
| 318 | + under certain conditions; type `show c' for details. | |
| 319 | + | |
| 320 | +The hypothetical commands `show w' and `show c' should show the appropriate | |
| 321 | +parts of the General Public License. Of course, the commands you use may | |
| 322 | +be called something other than `show w' and `show c'; they could even be | |
| 323 | +mouse-clicks or menu items--whatever suits your program. | |
| 324 | + | |
| 325 | +You should also get your employer (if you work as a programmer) or your | |
| 326 | +school, if any, to sign a "copyright disclaimer" for the program, if | |
| 327 | +necessary. Here is a sample; alter the names: | |
| 328 | + | |
| 329 | + Yoyodyne, Inc., hereby disclaims all copyright interest in the program | |
| 330 | + `Gnomovision' (which makes passes at compilers) written by James Hacker. | |
| 331 | + | |
| 332 | + {signature of Ty Coon}, 1 April 1989 | |
| 333 | + Ty Coon, President of Vice | |
| 334 | + | |
| 335 | +This General Public License does not permit incorporating your program into | |
| 336 | +proprietary programs. If your program is a subroutine library, you may | |
| 337 | +consider it more useful to permit linking proprietary applications with the | |
| 338 | +library. If this is what you want to do, use the GNU Lesser General | |
| 339 | +Public License instead of this License. | ... | ... |
README.md
0 → 100644
| 1 | +[](https://droopler-demo.droptica.com) | |
| 2 | + | |
| 3 | +# Droopler template for new project | |
| 4 | + | |
| 5 | +--- | |
| 6 | + | |
| 7 | +## About | |
| 8 | + | |
| 9 | +Droopler is a Drupal 10 profile designed to kickstart a new webpage in a few minutes. It's based on the latest frontend technologies, including Bootstrap 5. The maintainer of Droopler is [Droptica](https://droptica.com). | |
| 10 | + | |
| 11 | +* **Official website**: [droptica.com/droopler](https://www.droptica.com/droopler) | |
| 12 | +* **Tutorials**: [droptica.com/droopler/tutorials](https://www.droptica.com/droopler/tutorials/) | |
| 13 | +* **Demo**: [droopler-demo.droptica.com](https://droopler-demo.droptica.com) | |
| 14 | +* **Profile repository**: [github.com/droptica/droopler](https://github.com/droptica/droopler) | |
| 15 | +* **Drupal.org project**: [drupal.org/project/droopler](https://www.drupal.org/project/droopler) | |
| 16 | +* **Issue queue**: [drupal.org/project/issues/droopler](https://www.drupal.org/project/issues/droopler) | |
| 17 | + | |
| 18 | +For the latest news, follow us on [Facebook](https://www.facebook.com/Droopler/) and [Twitter](https://twitter.com/DrooplerCMS). | |
| 19 | + | |
| 20 | +### What is this Droopler template? ## | |
| 21 | +It's a skeleton, a boilerplate for new projects based on Droopler. If you wish to use Droopler - fork (or download) this repository. It contains a minimal set of code to start your new site. Threat it the same way as [drupal/recommended-project](https://github.com/drupal/recommended-project) or [drupal-composer/drupal-project](https://github.com/drupal-composer/drupal-project). | |
| 22 | + | |
| 23 | +This repository includes: | |
| 24 | + | |
| 25 | +- **composer.json** with all dependencies required to run Droopler. | |
| 26 | +- **.gitignore** adjusted to use GIT with Drupal. | |
| 27 | +- Boilerplate subtheme with minimal required CSS/SCSS and Javascript. It contains gulpfile.js to speed up development of Drupal's frontend. | |
| 28 | + | |
| 29 | +## Deploy on Platform.sh | |
| 30 | + | |
| 31 | +You can deploy and host your Droopler installation on [Platform.sh](https://platform.sh/). | |
| 32 | + | |
| 33 | +<a href="https://console.platform.sh/projects/create-project?template=https://raw.githubusercontent.com/droptica/droopler_project/4.0.x/.platform.template.yml"> | |
| 34 | + <img src="https://platform.sh/images/deploy/lg-blue.svg" alt="Deploy Droopler on Platform.sh" width="180px" /> | |
| 35 | +</a> | |
| 36 | + | |
| 37 | +## Quick start | |
| 38 | + | |
| 39 | +Fork this repository and clone the newly created to your local machine. | |
| 40 | + | |
| 41 | +## Local development | |
| 42 | + | |
| 43 | +This section provides instructions for running the `Droopler` distribution locally. | |
| 44 | + | |
| 45 | +### Using custom development environment | |
| 46 | + | |
| 47 | +1. Run `composer create-project droptica/droopler-project <path> "^8.4"` to install the project and its dependencies. | |
| 48 | +2. Run npm to download the theme dependencies and compile assets.<br /><br /> | |
| 49 | +Droopler uses the npm stack to speed up the development of new sites. It compiles SCSS to CSS, allows Autoprefixer to handle browser compatibility, and minimizes all JavaScript files. [Install Node v18 and npm](https://nodejs.org/en/download/) on your computer and run the following commands in the root directory of your project: | |
| 50 | + | |
| 51 | +```sh | |
| 52 | +$ cd web/profiles/contrib/droopler/themes/custom/droopler_theme | |
| 53 | +$ npm install | |
| 54 | + | |
| 55 | +$ cd web/themes/custom/droopler_subtheme | |
| 56 | +$ npm install | |
| 57 | +$ npm run dev | |
| 58 | +``` | |
| 59 | +3. Run Drupal installation.<br /> | |
| 60 | +Go to http://yourserver.local/install.php and follow the steps of configuration. | |
| 61 | + | |
| 62 | +### Using DDEV | |
| 63 | + | |
| 64 | +1. [Install ddev](https://ddev.readthedocs.io/en/stable/#installation). | |
| 65 | +2. Run `ddev config` to configure the project. | |
| 66 | +3. Run `ddev start` to start the project. | |
| 67 | +4. Run `ddev composer install` to download the project dependencies. | |
| 68 | +5. If you notice problems with accessing to the repository, run `ddev auth ssh` to add the keys from your `~/.ssh` directory to the web container and run `ddev composer install` command once again. | |
| 69 | +6. Run `ddev theme` to install the theme dependencies and compile assets. By default, production assets are compiled. You can run `ddev theme dev` to compile assets for development. You can also run `ddev theme watch` to watch for changes in SCSS and JS and process them on the fly. | |
| 70 | +7. Go to the URL provided by ddev and finish installing the website. You can also run `ddev build-profile` to build the Droopler profile from the CLI (you will get a fully featured version, with blog, products and demo content). | |
| 71 | + | |
| 72 | +### Using Lando | |
| 73 | +1. [Install lando](https://docs.lando.dev/getting-started/installation.html). | |
| 74 | +2. Run `lando start` to start the project. | |
| 75 | +3. Run `lando prepare` to build the project's code. Alternatively, you can run `lando composer install` to download the project dependencies, and then `lando theme-production` and `lando subtheme-production` to compile assets. | |
| 76 | +4. Go to the URL provided by `lando info` and finish installing the website. You can also build the Droopler profile from the CLI. Run `lando build-full-profile` for the fully-featured version, or `lando build-full-profile` for the minimal one. | |
| 77 | + | |
| 78 | +### Using DDEV connected to a database instance on an active Platform.sh environment | |
| 79 | +This is instructions for running the template locally, connected to a live database instance on an active Platform.sh environment. | |
| 80 | + | |
| 81 | +In all cases for developing with Platform.sh, it's important to develop on an isolated environment - do not connect to data on your production environment when developing locally. | |
| 82 | +Each of the options below assume that you have already deployed this template to Platform.sh, as well as the following starting commands: | |
| 83 | + | |
| 84 | +```bash | |
| 85 | +platform get PROJECT_ID | |
| 86 | +cd project-name | |
| 87 | +platform environment:branch updates | |
| 88 | +``` | |
| 89 | + | |
| 90 | +DDEV provides an integration with Platform.sh that makes it simple to develop Drupal locally. Check the [providers documentation](https://ddev.readthedocs.io/en/latest/users/providers/platform/) for the most up-to-date information. | |
| 91 | + | |
| 92 | +In general, the steps are as follows: | |
| 93 | + | |
| 94 | +1. [Install ddev](https://ddev.readthedocs.io/en/stable/#installation). | |
| 95 | +1. A configuration file has already been provided at `.ddev/providers/platform.yaml`, so you should not need to run `ddev config`. | |
| 96 | +1. [Retrieve an API token](https://docs.platform.sh/development/cli/api-tokens.html#get-a-token) for your organization via the management console. | |
| 97 | +1. Update your ddev global configuration file to use the token you've just retrieved: | |
| 98 | + ```yaml | |
| 99 | + web_environment: | |
| 100 | + - PLATFORMSH_CLI_TOKEN=abcdeyourtoken | |
| 101 | + ``` | |
| 102 | +1. Run `ddev restart`. | |
| 103 | +1. Get your project ID with `platform project:info`. If you have not already connected your local repo with the project (as is the case with a source integration, by default), you can run `platform project:list` to locate the project ID, and `platform project:set-remote PROJECT_ID` to configure Platform.sh locally. | |
| 104 | +1. Update the `.ddev/providers/platform.yaml` file for your current setup: | |
| 105 | + ```yaml | |
| 106 | + environment_variables: | |
| 107 | + project_id: PROJECT_ID | |
| 108 | + environment: CURRENT_ENVIRONMENT | |
| 109 | + application: drupal | |
| 110 | + ``` | |
| 111 | +1. Get the current environment's data with `ddev pull platform`. | |
| 112 | +1. When you have finished with your work, run `ddev stop` and `ddev poweroff`. | |
| 113 | + | |
| 114 | +> **Note:** | |
| 115 | +> | |
| 116 | +> For many of the steps above, you may need to include the CLI flags `-p PROJECT_ID` and `-e ENVIRONMENT_ID` if you are not in the project directory or if the environment is associated with an existing pull request. | |
| 117 | + | |
| 118 | +## How to work with the subtheme? | |
| 119 | + | |
| 120 | +### Using DDEV | |
| 121 | +There are several comands that help you to work with the subtheme. You can run them from the root directory of your project. | |
| 122 | + | |
| 123 | +- `ddev theme watch` - watches for changes in SCSS and JS and processes them on the fly | |
| 124 | +- `ddev theme dev` - cleans derivative files and compiles all SCSS/JS in the subtheme for DEV environment | |
| 125 | +- `ddev theme production` - cleans derivative files and compiles all SCSS/JS in the subtheme for PROD environment | |
| 126 | + | |
| 127 | +### Using lando | |
| 128 | +There are several comands that help you to work with the subtheme. You can run them from the root directory of your project. | |
| 129 | + | |
| 130 | +- `lando theme-watch` or `lando subtheme-watch` - watches for changes in SCSS and JS and processes them on the fly | |
| 131 | +- `lando theme-dev` or `lando subtheme-dev` - cleans derivative files and compiles all SCSS/JS in the theme for DEV environment | |
| 132 | +- `lando theme-production` or `lando subtheme-production` - cleans derivative files and compiles all SCSS/JS in the theme for PROD environment | |
| 133 | + | |
| 134 | +### Running npm on your own | |
| 135 | +First run <strong>npm run watch</strong> in your subtheme's directory. It will track all the changes in theme source files and compile assets in the fly. | |
| 136 | + | |
| 137 | +```sh | |
| 138 | +$ cd web/themes/custom/droopler_subtheme | |
| 139 | +$ npm run watch | |
| 140 | +``` | |
| 141 | + | |
| 142 | +There are also other npm commands for theme developers, here's the full reference: | |
| 143 | + | |
| 144 | +- `npm run watch` - watches for changes in SCSS and JS and processes them on the fly | |
| 145 | +- `npm run dev` - cleans derivative files and compiles all SCSS/JS in the subtheme for DEV environment | |
| 146 | +- `npm run production` - cleans derivative files and compiles all SCSS/JS in the subtheme for PROD environment | |
| 147 | +- `npm run stylint` - run stylint | |
| 148 | +- `npm run stylint-fix` - run stylint and fix errors automatically | |
| 149 | + | |
| 150 | +## SCSS structure | |
| 151 | + | |
| 152 | +- **src/scss/main.style.scss** - combines all SCSS code from base theme and subtheme | |
| 153 | +- **src/components** - directory where you can keep all your components, see [components/README.md](web/themes/custom/droopler_subtheme/src/components/README.md) | |
| 154 | + | |
| 155 | +You can use any SCSS structure you like. We recommend dividing files into **layout/** and **components/** directories. Just remember to include your files in **main.style.scss**. | |
| 156 | + | |
| 157 | +## SCSS Configuration | |
| 158 | + | |
| 159 | +Droopler is designed to make your work easier. You don't have to override SCSS or CSS code to make your own adjustments. In most cases it is enough to modify the configuration. | |
| 160 | + | |
| 161 | +Just look into variables definitions in the subtheme. | |
| 162 | + | |
| 163 | +Use **src/scss/bootstrap/_variables.scss** file to overwrite base bootstrap variables. | |
| 164 | +```scss | |
| 165 | +// Colors. | |
| 166 | +// $red: #ac0000 !default; | |
| 167 | +// $orange: #ff9475 !default; | |
| 168 | +// $primary: $red !default; | |
| 169 | +``` | |
| 170 | + | |
| 171 | +Use **src/scss/base/_themes.scss** file to overwrite project specific colors in each theme. | |
| 172 | +```scss | |
| 173 | +// *[data-theme="theme-light"] { | |
| 174 | +// --section-background-color: #fff; | |
| 175 | +// --overlay-background-color: #fff; | |
| 176 | +// --divider-background-color: #{$red}; | |
| 177 | +// ... | |
| 178 | +// } | |
| 179 | +``` | |
| 180 | + | |
| 181 | +Use **src/scss/base/_variables.scss** file to overwrite components/paragraphs variables. | |
| 182 | +```scss | |
| 183 | +// :root { | |
| 184 | +// // Base component: CTA. | |
| 185 | +// --cta-width: 100%; | |
| 186 | +// --cta-max-width: 18rem; | |
| 187 | +// --cta-margin-top-bottom: 0.25rem; | |
| 188 | +// ... | |
| 189 | +// } | |
| 190 | +``` | |
| 191 | + | |
| 192 | +When you save this config file, **npm run dev** will recompile all SCSS with your own config. | |
| 193 | + | |
| 194 | +> **Extending and overwriting components** | |
| 195 | +> | |
| 196 | +> Instead of overwriting the particular component through the CSS variables in the `_variables.scss` file, you can extend or overwrite it in the `src/components` directory. | |
| 197 | +> | |
| 198 | +> See: [components/README.md](web/themes/custom/droopler_subtheme/src/components/README.md) | |
| 199 | + | |
| 200 | +## Updating Droopler | |
| 201 | + | |
| 202 | +See the [UPDATE.md](https://github.com/droptica/droopler/blob/master/UPDATE.md) file from the Droopler profile. | |
| 203 | + | |
| 204 | +## How to install Google Fonts? | |
| 205 | + | |
| 206 | +By default Droopler uses free [Inter](https://fonts.google.com/specimen/Inter) webfont. If you wish to install your own fonts from Google - put their definitions into **droopler_subtheme.libraries.yml** like this: | |
| 207 | + | |
| 208 | +```yaml | |
| 209 | +global-styling: | |
| 210 | + version: VERSION | |
| 211 | + css: | |
| 212 | + theme: | |
| 213 | + '//fonts.googleapis.com/css?family=Rajdhani:500,600,700|Roboto:400,700&subset=latin-ext': { type: external, minified: true } | |
| 214 | + css/style.css: {} | |
| 215 | +``` | |
| 216 | + | |
| 217 | +## How to install icon fonts? | |
| 218 | + | |
| 219 | +If you wish to install FontAwesome or Glyphicons from the CDN - just grab their URLs and follow the steps described in previous chapter about Google Fonts. You'll find a FontAwesome example in **droopler_subtheme.libraries.yml** and **droopler_subtheme.info.yml**. | |
| 220 | + | |
| 221 | +## Setup git hooks | |
| 222 | + | |
| 223 | +In the `.githooks` directory you can find the pre-commit hooks to run the quality tools and to make sure that the front-end has been compiled in the `production` mode. | |
| 224 | + | |
| 225 | +To set-up git hooks run: | |
| 226 | +```shell | |
| 227 | +git config --local core.hooksPath .githooks/ | |
| 228 | +``` | |
| 229 | + | |
| 230 | +For the first time or when you get no permission error add `+x` to those scripts. | |
| 231 | +```shell | |
| 232 | +chmod -R +x .githooks/ | |
| 233 | +``` | ... | ... |
composer.json
0 → 100644
| 1 | +{ | |
| 2 | + "name": "droptica/droopler-project", | |
| 3 | + "description": "Project template for Droopler with Composer", | |
| 4 | + "type": "project", | |
| 5 | + "license": "GPL-2.0-or-later", | |
| 6 | + "homepage": "https://www.droopler.com", | |
| 7 | + "support": { | |
| 8 | + "docs": "https://www.droopler.com/developers", | |
| 9 | + "issues": "https://www.drupal.org/project/issues/droopler?categories=All" | |
| 10 | + }, | |
| 11 | + "repositories": { | |
| 12 | + "drupal": { | |
| 13 | + "type": "composer", | |
| 14 | + "url": "https://packages.drupal.org/8" | |
| 15 | + }, | |
| 16 | + "asset": { | |
| 17 | + "type": "composer", | |
| 18 | + "url": "https://asset-packagist.org" | |
| 19 | + } | |
| 20 | + }, | |
| 21 | + "require": { | |
| 22 | + "composer/installers": "^2.2", | |
| 23 | + "droptica/droopler": "4.0.0-alpha3", | |
| 24 | + "drupal/better_exposed_filters": "^6.0", | |
| 25 | + "drupal/core-composer-scaffold": "^10.0", | |
| 26 | + "drupal/core-recommended": "^10.0", | |
| 27 | + "drupal/facets": "^2.0", | |
| 28 | + "drupal/redis": "^1.7", | |
| 29 | + "drupal/search_api": "^1.29", | |
| 30 | + "drupal/tvi": "2.0.x-dev@dev", | |
| 31 | + "drush/drush": "^12", | |
| 32 | + "oomphinc/composer-installers-extender": "^2.0", | |
| 33 | + "platformsh/config-reader": "^2.4" | |
| 34 | + }, | |
| 35 | + "require-dev": { | |
| 36 | + "drupal/core-dev": "^10.0", | |
| 37 | + "drupal/devel": "^5.0" | |
| 38 | + }, | |
| 39 | + "conflict": { | |
| 40 | + "drupal/drupal": "*" | |
| 41 | + }, | |
| 42 | + "minimum-stability": "dev", | |
| 43 | + "prefer-stable": true, | |
| 44 | + "config": { | |
| 45 | + "sort-packages": true, | |
| 46 | + "allow-plugins": { | |
| 47 | + "dealerdirect/phpcodesniffer-composer-installer": true, | |
| 48 | + "composer/installers": true, | |
| 49 | + "cweagans/composer-patches": true, | |
| 50 | + "drupal/console-extend-plugin": true, | |
| 51 | + "drupal/core-composer-scaffold": true, | |
| 52 | + "oomphinc/composer-installers-extender": true, | |
| 53 | + "zaporylie/composer-drupal-optimizations": true, | |
| 54 | + "phpstan/extension-installer": true, | |
| 55 | + "php-http/discovery": true | |
| 56 | + }, | |
| 57 | + "preferred-install": { | |
| 58 | + "droptica/droopler": "source", | |
| 59 | + "*": "dist" | |
| 60 | + } | |
| 61 | + }, | |
| 62 | + "extra": { | |
| 63 | + "enable-patching": true, | |
| 64 | + "drupal-scaffold": { | |
| 65 | + "locations": { | |
| 66 | + "web-root": "web/" | |
| 67 | + } | |
| 68 | + }, | |
| 69 | + "installer-types": ["bower-asset", "npm-asset"], | |
| 70 | + "installer-paths": { | |
| 71 | + "web/core": ["type:drupal-core"], | |
| 72 | + "web/libraries/{$name}": ["type:drupal-library", "type:git", "type:bower-asset", "type:npm-asset"], | |
| 73 | + "web/modules/contrib/{$name}": ["type:drupal-module"], | |
| 74 | + "web/profiles/contrib/droopler": ["type:drupal-profile"], | |
| 75 | + "web/themes/contrib/{$name}": ["type:drupal-theme"], | |
| 76 | + "drush/Commands/contrib/{$name}": ["type:drupal-drush"], | |
| 77 | + "web/modules/custom/{$name}": ["type:drupal-custom-module"], | |
| 78 | + "web/themes/custom/{$name}": ["type:drupal-custom-theme"] | |
| 79 | + } | |
| 80 | + } | |
| 81 | +} | ... | ... |
Please
register
or
login
to post a comment