Copy disabled (too large)
Download .txt
Showing preview only (16,368K chars total). Download the full file to get everything.
Repository: mailcow/mailcow-dockerized
Branch: master
Commit: f399c07c8577
Files: 2768
Total size: 20.0 MB
Directory structure:
gitextract_rwp4yo6n/
├── .editorconfig
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── Bug_report.yml
│ │ ├── Feature_request.yml
│ │ ├── config.yml
│ │ └── pr_to_nighty_template.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── renovate.json
│ └── workflows/
│ ├── check_if_support_labeled.yml
│ ├── check_prs_if_on_staging.yml
│ ├── close_old_issues_and_prs.yml
│ ├── image_builds.yml
│ ├── pr_to_nightly.yml
│ ├── rebuild_backup_image.yml
│ └── update_postscreen_access_list.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── _modules/
│ └── scripts/
│ ├── core.sh
│ ├── ipv6_controller.sh
│ ├── migrate_options.sh
│ └── new_options.sh
├── data/
│ ├── Dockerfiles/
│ │ ├── acme/
│ │ │ ├── Dockerfile
│ │ │ ├── acme.sh
│ │ │ ├── expand6.sh
│ │ │ ├── functions.sh
│ │ │ ├── load-dns-config.sh
│ │ │ ├── obtain-certificate-dns.sh
│ │ │ ├── obtain-certificate.sh
│ │ │ └── reload-configurations.sh
│ │ ├── backup/
│ │ │ └── Dockerfile
│ │ ├── clamd/
│ │ │ ├── Dockerfile
│ │ │ ├── clamd.sh
│ │ │ ├── clamdcheck.sh
│ │ │ └── healthcheck.sh
│ │ ├── dockerapi/
│ │ │ ├── Dockerfile
│ │ │ ├── docker-entrypoint.sh
│ │ │ ├── main.py
│ │ │ └── modules/
│ │ │ ├── DockerApi.py
│ │ │ └── __init__.py
│ │ ├── dovecot/
│ │ │ ├── Dockerfile
│ │ │ ├── clean_q_aged.sh
│ │ │ ├── docker-entrypoint.sh
│ │ │ ├── imapsync
│ │ │ ├── imapsync_runner.pl
│ │ │ ├── maildir_gc.sh
│ │ │ ├── optimize-fts.sh
│ │ │ ├── quarantine_notify.py
│ │ │ ├── quota_notify.py
│ │ │ ├── repl_health.sh
│ │ │ ├── report-ham.sieve
│ │ │ ├── report-spam.sieve
│ │ │ ├── rspamd-pipe-ham
│ │ │ ├── rspamd-pipe-spam
│ │ │ ├── sa-rules.sh
│ │ │ ├── stop-supervisor.sh
│ │ │ ├── supervisord.conf
│ │ │ ├── syslog-ng-redis_slave.conf
│ │ │ ├── syslog-ng.conf
│ │ │ └── trim_logs.sh
│ │ ├── netfilter/
│ │ │ ├── Dockerfile
│ │ │ ├── docker-entrypoint.sh
│ │ │ ├── main.py
│ │ │ └── modules/
│ │ │ ├── IPTables.py
│ │ │ ├── Logger.py
│ │ │ ├── NFTables.py
│ │ │ └── __init__.py
│ │ ├── nginx/
│ │ │ ├── Dockerfile
│ │ │ ├── bootstrap.py
│ │ │ └── docker-entrypoint.sh
│ │ ├── olefy/
│ │ │ ├── Dockerfile
│ │ │ └── olefy.py
│ │ ├── phpfpm/
│ │ │ ├── Dockerfile
│ │ │ └── docker-entrypoint.sh
│ │ ├── postfix/
│ │ │ ├── Dockerfile
│ │ │ ├── docker-entrypoint.sh
│ │ │ ├── postfix.sh
│ │ │ ├── rspamd-pipe-ham
│ │ │ ├── rspamd-pipe-spam
│ │ │ ├── stop-supervisor.sh
│ │ │ ├── supervisord.conf
│ │ │ ├── syslog-ng-redis_slave.conf
│ │ │ ├── syslog-ng.conf
│ │ │ └── whitelist_forwardinghosts.sh
│ │ ├── postfix-tlspol/
│ │ │ ├── Dockerfile
│ │ │ ├── docker-entrypoint.sh
│ │ │ ├── postfix-tlspol.sh
│ │ │ ├── stop-supervisor.sh
│ │ │ ├── supervisord.conf
│ │ │ ├── syslog-ng-redis_slave.conf
│ │ │ └── syslog-ng.conf
│ │ ├── rspamd/
│ │ │ ├── Dockerfile
│ │ │ ├── docker-entrypoint.sh
│ │ │ ├── sa_trivial_convert.lua
│ │ │ ├── set_worker_password.sh
│ │ │ └── settings.conf
│ │ ├── sogo/
│ │ │ ├── Dockerfile
│ │ │ ├── acl.diff
│ │ │ ├── bootstrap-sogo.sh
│ │ │ ├── docker-entrypoint.sh
│ │ │ ├── navMailcowBtns.diff
│ │ │ ├── stop-supervisor.sh
│ │ │ ├── supervisord.conf
│ │ │ ├── syslog-ng-redis_slave.conf
│ │ │ └── syslog-ng.conf
│ │ ├── unbound/
│ │ │ ├── Dockerfile
│ │ │ ├── docker-entrypoint.sh
│ │ │ ├── healthcheck.sh
│ │ │ ├── stop-supervisor.sh
│ │ │ ├── supervisord.conf
│ │ │ └── syslog-ng.conf
│ │ └── watchdog/
│ │ ├── Dockerfile
│ │ ├── check_dns.sh
│ │ ├── check_mysql_slavestatus.sh
│ │ ├── client.cnf
│ │ └── watchdog.sh
│ ├── assets/
│ │ ├── mysql/
│ │ │ └── docker-entrypoint.sh
│ │ ├── passwd/
│ │ │ └── generate_passwords.sh
│ │ └── templates/
│ │ ├── pw_reset_html.tpl
│ │ ├── pw_reset_text.tpl
│ │ ├── quarantine.tpl
│ │ └── quota.tpl
│ ├── conf/
│ │ ├── acme/
│ │ │ └── .gitkeep
│ │ ├── clamav/
│ │ │ ├── clamd.conf
│ │ │ └── freshclam.conf
│ │ ├── dovecot/
│ │ │ ├── auth/
│ │ │ │ ├── mailcowauth.php
│ │ │ │ └── passwd-verify.lua
│ │ │ ├── dovecot.conf
│ │ │ ├── dovecot.folders.conf
│ │ │ └── ldap/
│ │ │ └── passdb.conf
│ │ ├── mysql/
│ │ │ └── my.cnf
│ │ ├── nginx/
│ │ │ └── templates/
│ │ │ ├── nginx.conf.j2
│ │ │ └── sites-default.conf.j2
│ │ ├── phpfpm/
│ │ │ ├── crons/
│ │ │ │ ├── keycloak-sync.php
│ │ │ │ └── ldap-sync.php
│ │ │ ├── php-conf.d/
│ │ │ │ ├── opcache-recommended.ini
│ │ │ │ ├── other.ini
│ │ │ │ └── upload.ini
│ │ │ ├── php-fpm.d/
│ │ │ │ └── pools.conf
│ │ │ └── sogo-sso/
│ │ │ └── .gitkeep
│ │ ├── postfix/
│ │ │ ├── anonymize_headers.pcre
│ │ │ ├── local_transport
│ │ │ ├── main.cf
│ │ │ ├── master.cf
│ │ │ ├── postscreen_access.cidr
│ │ │ └── smtp_dsn_filter
│ │ ├── redis/
│ │ │ └── redis-conf.sh
│ │ ├── rspamd/
│ │ │ ├── dynmaps/
│ │ │ │ ├── aliasexp.php
│ │ │ │ ├── bcc.php
│ │ │ │ ├── footer.php
│ │ │ │ ├── forwardinghosts.php
│ │ │ │ ├── index.html
│ │ │ │ ├── sasl_logs.php
│ │ │ │ ├── settings.php
│ │ │ │ └── vars.inc.php
│ │ │ ├── lua/
│ │ │ │ ├── ratelimit.lua
│ │ │ │ └── rspamd.local.lua
│ │ │ ├── meta_exporter/
│ │ │ │ ├── pipe.php
│ │ │ │ ├── pipe_rl.php
│ │ │ │ ├── pushover.php
│ │ │ │ └── vars.inc.php
│ │ │ ├── plugins.d/
│ │ │ │ └── README.md
│ │ │ ├── rspamd.conf.local
│ │ │ └── rspamd.conf.override
│ │ ├── sogo/
│ │ │ ├── custom-sogo.js
│ │ │ └── sogo.conf
│ │ └── unbound/
│ │ └── unbound.conf
│ ├── hooks/
│ │ └── README.md
│ └── web/
│ ├── _rspamderror.php
│ ├── _status.502.html
│ ├── admin/
│ │ ├── dashboard.php
│ │ ├── index.php
│ │ ├── mailbox.php
│ │ ├── queue.php
│ │ └── system.php
│ ├── api/
│ │ ├── index.css
│ │ ├── index.html
│ │ ├── oauth2-redirect.html
│ │ ├── openapi.yaml
│ │ ├── swagger-initializer.js
│ │ ├── swagger-ui-bundle.js
│ │ ├── swagger-ui-es-bundle-core.js
│ │ ├── swagger-ui-es-bundle.js
│ │ ├── swagger-ui-standalone-preset.js
│ │ ├── swagger-ui.css
│ │ └── swagger-ui.js
│ ├── autoconfig.php
│ ├── autodiscover-json.php
│ ├── autodiscover.php
│ ├── css/
│ │ ├── build/
│ │ │ ├── 003-bootstrap-select.css
│ │ │ ├── 011-datatables.css
│ │ │ ├── 012-bootstrap-icons.css
│ │ │ ├── 013-datatables.css
│ │ │ ├── 014-mailcow.css
│ │ │ └── 015-responsive.css
│ │ ├── site/
│ │ │ ├── admin.css
│ │ │ ├── debug.css
│ │ │ ├── edit.css
│ │ │ ├── index.css
│ │ │ ├── mailbox.css
│ │ │ ├── quarantine.css
│ │ │ └── user.css
│ │ └── themes/
│ │ ├── lumen-bootstrap.css
│ │ └── mailcow-darkmode.css
│ ├── domainadmin/
│ │ ├── index.php
│ │ ├── mailbox.php
│ │ └── user.php
│ ├── edit.php
│ ├── f2b-banlist.php
│ ├── inc/
│ │ ├── ajax/
│ │ │ ├── container_ctrl.php
│ │ │ ├── destroy_tfa_auth.php
│ │ │ ├── dns_diagnostics.php
│ │ │ ├── qitem_details.php
│ │ │ ├── qr_gen.php
│ │ │ ├── show_rspamd_global_filters.php
│ │ │ ├── sieve_validation.php
│ │ │ ├── syncjob_logs.php
│ │ │ └── transport_check.php
│ │ ├── footer.inc.php
│ │ ├── functions.acl.inc.php
│ │ ├── functions.address_rewriting.inc.php
│ │ ├── functions.admin.inc.php
│ │ ├── functions.app_passwd.inc.php
│ │ ├── functions.auth.inc.php
│ │ ├── functions.customize.inc.php
│ │ ├── functions.dkim.inc.php
│ │ ├── functions.docker.inc.php
│ │ ├── functions.domain_admin.inc.php
│ │ ├── functions.fail2ban.inc.php
│ │ ├── functions.fwdhost.inc.php
│ │ ├── functions.inc.php
│ │ ├── functions.mailbox.inc.php
│ │ ├── functions.mailq.inc.php
│ │ ├── functions.oauth2.inc.php
│ │ ├── functions.policy.inc.php
│ │ ├── functions.presets.inc.php
│ │ ├── functions.pushover.inc.php
│ │ ├── functions.quarantine.inc.php
│ │ ├── functions.quota_notification.inc.php
│ │ ├── functions.ratelimit.inc.php
│ │ ├── functions.rspamd.inc.php
│ │ ├── functions.tls_policy_maps.inc.php
│ │ ├── functions.transports.inc.php
│ │ ├── header.inc.php
│ │ ├── init_db.inc.php
│ │ ├── lib/
│ │ │ ├── CSSminifierExtended.php
│ │ │ ├── JSminifierExtended.php
│ │ │ ├── WebAuthn/
│ │ │ │ ├── Attestation/
│ │ │ │ │ ├── AttestationObject.php
│ │ │ │ │ ├── AuthenticatorData.php
│ │ │ │ │ └── Format/
│ │ │ │ │ ├── AndroidKey.php
│ │ │ │ │ ├── AndroidSafetyNet.php
│ │ │ │ │ ├── Apple.php
│ │ │ │ │ ├── FormatBase.php
│ │ │ │ │ ├── None.php
│ │ │ │ │ ├── Packed.php
│ │ │ │ │ ├── Tpm.php
│ │ │ │ │ └── U2f.php
│ │ │ │ ├── Binary/
│ │ │ │ │ └── ByteBuffer.php
│ │ │ │ ├── CBOR/
│ │ │ │ │ └── CborDecoder.php
│ │ │ │ ├── WebAuthn.php
│ │ │ │ ├── WebAuthnException.php
│ │ │ │ └── rootCertificates/
│ │ │ │ ├── apple.pem
│ │ │ │ ├── bsi.pem
│ │ │ │ ├── globalSign.pem
│ │ │ │ ├── googleHardware.pem
│ │ │ │ ├── huawei.pem
│ │ │ │ ├── hypersecu.pem
│ │ │ │ ├── microsoftTpmCollection.pem
│ │ │ │ ├── nitro.pem
│ │ │ │ ├── solo.pem
│ │ │ │ ├── trustkey.pem
│ │ │ │ └── yubico.pem
│ │ │ ├── Yubico.php
│ │ │ ├── array_merge_real.php
│ │ │ ├── composer.json
│ │ │ ├── sieve/
│ │ │ │ ├── SieveDumpable.php
│ │ │ │ ├── SieveException.php
│ │ │ │ ├── SieveKeywordRegistry.php
│ │ │ │ ├── SieveParser.php
│ │ │ │ ├── SieveScanner.php
│ │ │ │ ├── SieveScript.php
│ │ │ │ ├── SieveSemantics.php
│ │ │ │ ├── SieveToken.php
│ │ │ │ ├── SieveTree.php
│ │ │ │ ├── extensions/
│ │ │ │ │ ├── body.xml
│ │ │ │ │ ├── comparator-ascii-numeric.xml
│ │ │ │ │ ├── copy.xml
│ │ │ │ │ ├── date.xml
│ │ │ │ │ ├── duplicate.xml
│ │ │ │ │ ├── editheader.xml
│ │ │ │ │ ├── enotify.xml
│ │ │ │ │ ├── envelope.xml
│ │ │ │ │ ├── environment.xml
│ │ │ │ │ ├── ereject.xml
│ │ │ │ │ ├── fileinto.xml
│ │ │ │ │ ├── imap4flags.xml
│ │ │ │ │ ├── imapflags.xml
│ │ │ │ │ ├── index.xml
│ │ │ │ │ ├── mailbox.xml
│ │ │ │ │ ├── mime.xml
│ │ │ │ │ ├── notify.xml
│ │ │ │ │ ├── regex.xml
│ │ │ │ │ ├── reject.xml
│ │ │ │ │ ├── relational.xml
│ │ │ │ │ ├── spamtest.xml
│ │ │ │ │ ├── spamtestplus.xml
│ │ │ │ │ ├── subaddress.xml
│ │ │ │ │ ├── vacation-seconds.xml
│ │ │ │ │ ├── vacation.xml
│ │ │ │ │ ├── variables.xml
│ │ │ │ │ ├── virustest.xml
│ │ │ │ │ ├── vnd.dovecot.execute.xml
│ │ │ │ │ ├── vnd.dovecot.filter.xml
│ │ │ │ │ └── vnd.dovecot.pipe.xml
│ │ │ │ └── keywords.xml
│ │ │ ├── ssp.class.php
│ │ │ └── vendor/
│ │ │ ├── adldap2/
│ │ │ │ └── adldap2/
│ │ │ │ ├── .gitattributes
│ │ │ │ ├── .github/
│ │ │ │ │ └── issue_template.md
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .scrutinizer.yml
│ │ │ │ ├── .styleci.yml
│ │ │ │ ├── .travis.yml
│ │ │ │ ├── composer.json
│ │ │ │ ├── docs/
│ │ │ │ │ ├── .nojekyll
│ │ │ │ │ ├── _coverpage.md
│ │ │ │ │ ├── _sidebar.md
│ │ │ │ │ ├── distinguished-names.md
│ │ │ │ │ ├── events.md
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── installation.md
│ │ │ │ │ ├── logging.md
│ │ │ │ │ ├── models/
│ │ │ │ │ │ ├── computer.md
│ │ │ │ │ │ ├── contact.md
│ │ │ │ │ │ ├── container.md
│ │ │ │ │ │ ├── group.md
│ │ │ │ │ │ ├── model.md
│ │ │ │ │ │ ├── organization.md
│ │ │ │ │ │ ├── ou.md
│ │ │ │ │ │ ├── printer.md
│ │ │ │ │ │ ├── root-dse.md
│ │ │ │ │ │ ├── traits/
│ │ │ │ │ │ │ ├── has-critical-system-object.md
│ │ │ │ │ │ │ ├── has-description.md
│ │ │ │ │ │ │ ├── has-last-login-last-logoff.md
│ │ │ │ │ │ │ └── has-member-of.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── readme.md
│ │ │ │ │ ├── searching.md
│ │ │ │ │ ├── setup.md
│ │ │ │ │ └── troubleshooting.md
│ │ │ │ ├── license.md
│ │ │ │ ├── phpunit.xml
│ │ │ │ ├── readme.md
│ │ │ │ └── src/
│ │ │ │ ├── Adldap.php
│ │ │ │ ├── AdldapException.php
│ │ │ │ ├── AdldapInterface.php
│ │ │ │ ├── Auth/
│ │ │ │ │ ├── BindException.php
│ │ │ │ │ ├── Events/
│ │ │ │ │ │ ├── Attempting.php
│ │ │ │ │ │ ├── Binding.php
│ │ │ │ │ │ ├── Bound.php
│ │ │ │ │ │ ├── Event.php
│ │ │ │ │ │ ├── Failed.php
│ │ │ │ │ │ └── Passed.php
│ │ │ │ │ ├── Guard.php
│ │ │ │ │ ├── GuardInterface.php
│ │ │ │ │ ├── PasswordRequiredException.php
│ │ │ │ │ └── UsernameRequiredException.php
│ │ │ │ ├── Configuration/
│ │ │ │ │ ├── ConfigurationException.php
│ │ │ │ │ ├── DomainConfiguration.php
│ │ │ │ │ └── Validators/
│ │ │ │ │ ├── ArrayValidator.php
│ │ │ │ │ ├── BooleanValidator.php
│ │ │ │ │ ├── ClassValidator.php
│ │ │ │ │ ├── IntegerValidator.php
│ │ │ │ │ ├── StringOrNullValidator.php
│ │ │ │ │ └── Validator.php
│ │ │ │ ├── Connections/
│ │ │ │ │ ├── ConnectionException.php
│ │ │ │ │ ├── ConnectionInterface.php
│ │ │ │ │ ├── DetailedError.php
│ │ │ │ │ ├── Ldap.php
│ │ │ │ │ ├── Provider.php
│ │ │ │ │ └── ProviderInterface.php
│ │ │ │ ├── Events/
│ │ │ │ │ ├── Dispatcher.php
│ │ │ │ │ ├── DispatcherInterface.php
│ │ │ │ │ └── DispatchesEvents.php
│ │ │ │ ├── Log/
│ │ │ │ │ ├── EventLogger.php
│ │ │ │ │ └── LogsInformation.php
│ │ │ │ ├── Models/
│ │ │ │ │ ├── Attributes/
│ │ │ │ │ │ ├── AccountControl.php
│ │ │ │ │ │ ├── DistinguishedName.php
│ │ │ │ │ │ ├── Guid.php
│ │ │ │ │ │ ├── MbString.php
│ │ │ │ │ │ ├── Sid.php
│ │ │ │ │ │ ├── TSProperty.php
│ │ │ │ │ │ └── TSPropertyArray.php
│ │ │ │ │ ├── BatchModification.php
│ │ │ │ │ ├── Computer.php
│ │ │ │ │ ├── Concerns/
│ │ │ │ │ │ ├── HasAttributes.php
│ │ │ │ │ │ ├── HasCriticalSystemObject.php
│ │ │ │ │ │ ├── HasDescription.php
│ │ │ │ │ │ ├── HasEvents.php
│ │ │ │ │ │ ├── HasLastLogonAndLogOff.php
│ │ │ │ │ │ ├── HasMemberOf.php
│ │ │ │ │ │ ├── HasUserAccountControl.php
│ │ │ │ │ │ └── HasUserProperties.php
│ │ │ │ │ ├── Contact.php
│ │ │ │ │ ├── Container.php
│ │ │ │ │ ├── Entry.php
│ │ │ │ │ ├── Events/
│ │ │ │ │ │ ├── Created.php
│ │ │ │ │ │ ├── Creating.php
│ │ │ │ │ │ ├── Deleted.php
│ │ │ │ │ │ ├── Deleting.php
│ │ │ │ │ │ ├── Event.php
│ │ │ │ │ │ ├── Saved.php
│ │ │ │ │ │ ├── Saving.php
│ │ │ │ │ │ ├── Updated.php
│ │ │ │ │ │ └── Updating.php
│ │ │ │ │ ├── Factory.php
│ │ │ │ │ ├── ForeignSecurityPrincipal.php
│ │ │ │ │ ├── Group.php
│ │ │ │ │ ├── Model.php
│ │ │ │ │ ├── ModelDoesNotExistException.php
│ │ │ │ │ ├── ModelNotFoundException.php
│ │ │ │ │ ├── Organization.php
│ │ │ │ │ ├── OrganizationalUnit.php
│ │ │ │ │ ├── Printer.php
│ │ │ │ │ ├── RootDse.php
│ │ │ │ │ ├── User.php
│ │ │ │ │ ├── UserPasswordIncorrectException.php
│ │ │ │ │ └── UserPasswordPolicyException.php
│ │ │ │ ├── Query/
│ │ │ │ │ ├── Builder.php
│ │ │ │ │ ├── Cache.php
│ │ │ │ │ ├── Collection.php
│ │ │ │ │ ├── Events/
│ │ │ │ │ │ ├── Listing.php
│ │ │ │ │ │ ├── Paginate.php
│ │ │ │ │ │ ├── QueryExecuted.php
│ │ │ │ │ │ ├── Read.php
│ │ │ │ │ │ └── Search.php
│ │ │ │ │ ├── Factory.php
│ │ │ │ │ ├── Grammar.php
│ │ │ │ │ ├── Operator.php
│ │ │ │ │ ├── Paginator.php
│ │ │ │ │ └── Processor.php
│ │ │ │ ├── Schemas/
│ │ │ │ │ ├── ActiveDirectory.php
│ │ │ │ │ ├── Directory389.php
│ │ │ │ │ ├── EDirectory.php
│ │ │ │ │ ├── FreeIPA.php
│ │ │ │ │ ├── OpenLDAP.php
│ │ │ │ │ ├── Schema.php
│ │ │ │ │ └── SchemaInterface.php
│ │ │ │ └── Utilities.php
│ │ │ ├── autoload.php
│ │ │ ├── bacon/
│ │ │ │ └── bacon-qr-code/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── composer.json
│ │ │ │ ├── phpunit.xml.dist
│ │ │ │ ├── src/
│ │ │ │ │ ├── Common/
│ │ │ │ │ │ ├── BitArray.php
│ │ │ │ │ │ ├── BitMatrix.php
│ │ │ │ │ │ ├── BitUtils.php
│ │ │ │ │ │ ├── CharacterSetEci.php
│ │ │ │ │ │ ├── EcBlock.php
│ │ │ │ │ │ ├── EcBlocks.php
│ │ │ │ │ │ ├── ErrorCorrectionLevel.php
│ │ │ │ │ │ ├── FormatInformation.php
│ │ │ │ │ │ ├── Mode.php
│ │ │ │ │ │ ├── ReedSolomonCodec.php
│ │ │ │ │ │ └── Version.php
│ │ │ │ │ ├── Encoder/
│ │ │ │ │ │ ├── BlockPair.php
│ │ │ │ │ │ ├── ByteMatrix.php
│ │ │ │ │ │ ├── Encoder.php
│ │ │ │ │ │ ├── MaskUtil.php
│ │ │ │ │ │ ├── MatrixUtil.php
│ │ │ │ │ │ └── QrCode.php
│ │ │ │ │ ├── Exception/
│ │ │ │ │ │ ├── ExceptionInterface.php
│ │ │ │ │ │ ├── InvalidArgumentException.php
│ │ │ │ │ │ ├── OutOfBoundsException.php
│ │ │ │ │ │ ├── RuntimeException.php
│ │ │ │ │ │ ├── UnexpectedValueException.php
│ │ │ │ │ │ └── WriterException.php
│ │ │ │ │ ├── Renderer/
│ │ │ │ │ │ ├── Color/
│ │ │ │ │ │ │ ├── Alpha.php
│ │ │ │ │ │ │ ├── Cmyk.php
│ │ │ │ │ │ │ ├── ColorInterface.php
│ │ │ │ │ │ │ ├── Gray.php
│ │ │ │ │ │ │ └── Rgb.php
│ │ │ │ │ │ ├── Eye/
│ │ │ │ │ │ │ ├── CompositeEye.php
│ │ │ │ │ │ │ ├── EyeInterface.php
│ │ │ │ │ │ │ ├── ModuleEye.php
│ │ │ │ │ │ │ ├── SimpleCircleEye.php
│ │ │ │ │ │ │ └── SquareEye.php
│ │ │ │ │ │ ├── Image/
│ │ │ │ │ │ │ ├── EpsImageBackEnd.php
│ │ │ │ │ │ │ ├── ImageBackEndInterface.php
│ │ │ │ │ │ │ ├── ImagickImageBackEnd.php
│ │ │ │ │ │ │ ├── SvgImageBackEnd.php
│ │ │ │ │ │ │ └── TransformationMatrix.php
│ │ │ │ │ │ ├── ImageRenderer.php
│ │ │ │ │ │ ├── Module/
│ │ │ │ │ │ │ ├── DotsModule.php
│ │ │ │ │ │ │ ├── EdgeIterator/
│ │ │ │ │ │ │ │ ├── Edge.php
│ │ │ │ │ │ │ │ └── EdgeIterator.php
│ │ │ │ │ │ │ ├── ModuleInterface.php
│ │ │ │ │ │ │ ├── RoundnessModule.php
│ │ │ │ │ │ │ └── SquareModule.php
│ │ │ │ │ │ ├── Path/
│ │ │ │ │ │ │ ├── Close.php
│ │ │ │ │ │ │ ├── Curve.php
│ │ │ │ │ │ │ ├── EllipticArc.php
│ │ │ │ │ │ │ ├── Line.php
│ │ │ │ │ │ │ ├── Move.php
│ │ │ │ │ │ │ ├── OperationInterface.php
│ │ │ │ │ │ │ └── Path.php
│ │ │ │ │ │ ├── PlainTextRenderer.php
│ │ │ │ │ │ ├── RendererInterface.php
│ │ │ │ │ │ └── RendererStyle/
│ │ │ │ │ │ ├── EyeFill.php
│ │ │ │ │ │ ├── Fill.php
│ │ │ │ │ │ ├── Gradient.php
│ │ │ │ │ │ ├── GradientType.php
│ │ │ │ │ │ └── RendererStyle.php
│ │ │ │ │ └── Writer.php
│ │ │ │ └── test/
│ │ │ │ ├── Common/
│ │ │ │ │ ├── BitArrayTest.php
│ │ │ │ │ ├── BitMatrixTest.php
│ │ │ │ │ ├── BitUtilsTest.php
│ │ │ │ │ ├── ErrorCorrectionLevelTest.php
│ │ │ │ │ ├── FormatInformationTest.php
│ │ │ │ │ ├── ModeTest.php
│ │ │ │ │ ├── ReedSolomonCodecTest.php
│ │ │ │ │ └── VersionTest.php
│ │ │ │ ├── Encoder/
│ │ │ │ │ ├── EncoderTest.php
│ │ │ │ │ ├── MaskUtilTest.php
│ │ │ │ │ └── MatrixUtilTest.php
│ │ │ │ └── Integration/
│ │ │ │ └── ImagickRenderingTest.php
│ │ │ ├── bin/
│ │ │ │ ├── carbon
│ │ │ │ ├── minifycss
│ │ │ │ └── minifyjs
│ │ │ ├── bshaffer/
│ │ │ │ └── oauth2-server-php/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── composer.json
│ │ │ │ ├── src/
│ │ │ │ │ └── OAuth2/
│ │ │ │ │ ├── Autoloader.php
│ │ │ │ │ ├── ClientAssertionType/
│ │ │ │ │ │ ├── ClientAssertionTypeInterface.php
│ │ │ │ │ │ └── HttpBasic.php
│ │ │ │ │ ├── Controller/
│ │ │ │ │ │ ├── AuthorizeController.php
│ │ │ │ │ │ ├── AuthorizeControllerInterface.php
│ │ │ │ │ │ ├── ResourceController.php
│ │ │ │ │ │ ├── ResourceControllerInterface.php
│ │ │ │ │ │ ├── TokenController.php
│ │ │ │ │ │ └── TokenControllerInterface.php
│ │ │ │ │ ├── Encryption/
│ │ │ │ │ │ ├── EncryptionInterface.php
│ │ │ │ │ │ ├── FirebaseJwt.php
│ │ │ │ │ │ └── Jwt.php
│ │ │ │ │ ├── GrantType/
│ │ │ │ │ │ ├── AuthorizationCode.php
│ │ │ │ │ │ ├── ClientCredentials.php
│ │ │ │ │ │ ├── GrantTypeInterface.php
│ │ │ │ │ │ ├── JwtBearer.php
│ │ │ │ │ │ ├── RefreshToken.php
│ │ │ │ │ │ └── UserCredentials.php
│ │ │ │ │ ├── OpenID/
│ │ │ │ │ │ ├── Controller/
│ │ │ │ │ │ │ ├── AuthorizeController.php
│ │ │ │ │ │ │ ├── AuthorizeControllerInterface.php
│ │ │ │ │ │ │ ├── UserInfoController.php
│ │ │ │ │ │ │ └── UserInfoControllerInterface.php
│ │ │ │ │ │ ├── GrantType/
│ │ │ │ │ │ │ └── AuthorizationCode.php
│ │ │ │ │ │ ├── ResponseType/
│ │ │ │ │ │ │ ├── AuthorizationCode.php
│ │ │ │ │ │ │ ├── AuthorizationCodeInterface.php
│ │ │ │ │ │ │ ├── CodeIdToken.php
│ │ │ │ │ │ │ ├── CodeIdTokenInterface.php
│ │ │ │ │ │ │ ├── IdToken.php
│ │ │ │ │ │ │ ├── IdTokenInterface.php
│ │ │ │ │ │ │ ├── IdTokenToken.php
│ │ │ │ │ │ │ └── IdTokenTokenInterface.php
│ │ │ │ │ │ └── Storage/
│ │ │ │ │ │ ├── AuthorizationCodeInterface.php
│ │ │ │ │ │ └── UserClaimsInterface.php
│ │ │ │ │ ├── Request.php
│ │ │ │ │ ├── RequestInterface.php
│ │ │ │ │ ├── Response.php
│ │ │ │ │ ├── ResponseInterface.php
│ │ │ │ │ ├── ResponseType/
│ │ │ │ │ │ ├── AccessToken.php
│ │ │ │ │ │ ├── AccessTokenInterface.php
│ │ │ │ │ │ ├── AuthorizationCode.php
│ │ │ │ │ │ ├── AuthorizationCodeInterface.php
│ │ │ │ │ │ ├── JwtAccessToken.php
│ │ │ │ │ │ └── ResponseTypeInterface.php
│ │ │ │ │ ├── Scope.php
│ │ │ │ │ ├── ScopeInterface.php
│ │ │ │ │ ├── Server.php
│ │ │ │ │ ├── Storage/
│ │ │ │ │ │ ├── AccessTokenInterface.php
│ │ │ │ │ │ ├── AuthorizationCodeInterface.php
│ │ │ │ │ │ ├── Cassandra.php
│ │ │ │ │ │ ├── ClientCredentialsInterface.php
│ │ │ │ │ │ ├── ClientInterface.php
│ │ │ │ │ │ ├── CouchbaseDB.php
│ │ │ │ │ │ ├── DynamoDB.php
│ │ │ │ │ │ ├── JwtAccessToken.php
│ │ │ │ │ │ ├── JwtAccessTokenInterface.php
│ │ │ │ │ │ ├── JwtBearerInterface.php
│ │ │ │ │ │ ├── Memory.php
│ │ │ │ │ │ ├── Mongo.php
│ │ │ │ │ │ ├── MongoDB.php
│ │ │ │ │ │ ├── Pdo.php
│ │ │ │ │ │ ├── PublicKeyInterface.php
│ │ │ │ │ │ ├── Redis.php
│ │ │ │ │ │ ├── RefreshTokenInterface.php
│ │ │ │ │ │ ├── ScopeInterface.php
│ │ │ │ │ │ └── UserCredentialsInterface.php
│ │ │ │ │ └── TokenType/
│ │ │ │ │ ├── Bearer.php
│ │ │ │ │ ├── Mac.php
│ │ │ │ │ └── TokenTypeInterface.php
│ │ │ │ └── test/
│ │ │ │ ├── OAuth2/
│ │ │ │ │ ├── AutoloadTest.php
│ │ │ │ │ ├── Controller/
│ │ │ │ │ │ ├── AuthorizeControllerTest.php
│ │ │ │ │ │ ├── ResourceControllerTest.php
│ │ │ │ │ │ └── TokenControllerTest.php
│ │ │ │ │ ├── Encryption/
│ │ │ │ │ │ ├── FirebaseJwtTest.php
│ │ │ │ │ │ └── JwtTest.php
│ │ │ │ │ ├── GrantType/
│ │ │ │ │ │ ├── AuthorizationCodeTest.php
│ │ │ │ │ │ ├── ClientCredentialsTest.php
│ │ │ │ │ │ ├── ImplicitTest.php
│ │ │ │ │ │ ├── JwtBearerTest.php
│ │ │ │ │ │ ├── RefreshTokenTest.php
│ │ │ │ │ │ └── UserCredentialsTest.php
│ │ │ │ │ ├── OpenID/
│ │ │ │ │ │ ├── Controller/
│ │ │ │ │ │ │ ├── AuthorizeControllerTest.php
│ │ │ │ │ │ │ └── UserInfoControllerTest.php
│ │ │ │ │ │ ├── GrantType/
│ │ │ │ │ │ │ └── AuthorizationCodeTest.php
│ │ │ │ │ │ ├── ResponseType/
│ │ │ │ │ │ │ ├── CodeIdTokenTest.php
│ │ │ │ │ │ │ ├── IdTokenTest.php
│ │ │ │ │ │ │ └── IdTokenTokenTest.php
│ │ │ │ │ │ └── Storage/
│ │ │ │ │ │ ├── AuthorizationCodeTest.php
│ │ │ │ │ │ └── UserClaimsTest.php
│ │ │ │ │ ├── RequestTest.php
│ │ │ │ │ ├── ResponseTest.php
│ │ │ │ │ ├── ResponseType/
│ │ │ │ │ │ ├── AccessTokenTest.php
│ │ │ │ │ │ └── JwtAccessTokenTest.php
│ │ │ │ │ ├── ScopeTest.php
│ │ │ │ │ ├── ServerTest.php
│ │ │ │ │ ├── Storage/
│ │ │ │ │ │ ├── AccessTokenTest.php
│ │ │ │ │ │ ├── AuthorizationCodeTest.php
│ │ │ │ │ │ ├── ClientCredentialsTest.php
│ │ │ │ │ │ ├── ClientTest.php
│ │ │ │ │ │ ├── DynamoDBTest.php
│ │ │ │ │ │ ├── JwtAccessTokenTest.php
│ │ │ │ │ │ ├── JwtBearerTest.php
│ │ │ │ │ │ ├── PdoTest.php
│ │ │ │ │ │ ├── PublicKeyTest.php
│ │ │ │ │ │ ├── RefreshTokenTest.php
│ │ │ │ │ │ ├── ScopeTest.php
│ │ │ │ │ │ └── UserCredentialsTest.php
│ │ │ │ │ └── TokenType/
│ │ │ │ │ └── BearerTest.php
│ │ │ │ ├── bootstrap.php
│ │ │ │ ├── cleanup.php
│ │ │ │ ├── config/
│ │ │ │ │ ├── keys/
│ │ │ │ │ │ ├── id_rsa
│ │ │ │ │ │ └── id_rsa.pub
│ │ │ │ │ └── storage.json
│ │ │ │ └── lib/
│ │ │ │ └── OAuth2/
│ │ │ │ ├── Request/
│ │ │ │ │ └── TestRequest.php
│ │ │ │ └── Storage/
│ │ │ │ ├── BaseTest.php
│ │ │ │ ├── Bootstrap.php
│ │ │ │ └── NullStorage.php
│ │ │ ├── carbonphp/
│ │ │ │ └── carbon-doctrine-types/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── composer.json
│ │ │ │ └── src/
│ │ │ │ └── Carbon/
│ │ │ │ └── Doctrine/
│ │ │ │ ├── CarbonDoctrineType.php
│ │ │ │ ├── CarbonImmutableType.php
│ │ │ │ ├── CarbonType.php
│ │ │ │ ├── CarbonTypeConverter.php
│ │ │ │ ├── DateTimeDefaultPrecision.php
│ │ │ │ ├── DateTimeImmutableType.php
│ │ │ │ └── DateTimeType.php
│ │ │ ├── composer/
│ │ │ │ ├── ClassLoader.php
│ │ │ │ ├── InstalledVersions.php
│ │ │ │ ├── LICENSE
│ │ │ │ ├── autoload_classmap.php
│ │ │ │ ├── autoload_files.php
│ │ │ │ ├── autoload_namespaces.php
│ │ │ │ ├── autoload_psr4.php
│ │ │ │ ├── autoload_real.php
│ │ │ │ ├── autoload_static.php
│ │ │ │ ├── installed.json
│ │ │ │ ├── installed.php
│ │ │ │ └── platform_check.php
│ │ │ ├── dasprid/
│ │ │ │ └── enum/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── composer.json
│ │ │ │ └── src/
│ │ │ │ ├── AbstractEnum.php
│ │ │ │ ├── EnumMap.php
│ │ │ │ ├── Exception/
│ │ │ │ │ ├── CloneNotSupportedException.php
│ │ │ │ │ ├── ExceptionInterface.php
│ │ │ │ │ ├── ExpectationException.php
│ │ │ │ │ ├── IllegalArgumentException.php
│ │ │ │ │ ├── MismatchException.php
│ │ │ │ │ ├── SerializeNotSupportedException.php
│ │ │ │ │ └── UnserializeNotSupportedException.php
│ │ │ │ └── NullValue.php
│ │ │ ├── ddeboer/
│ │ │ │ └── imap/
│ │ │ │ ├── .php-cs-fixer.php
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── composer.json
│ │ │ │ └── src/
│ │ │ │ ├── Connection.php
│ │ │ │ ├── ConnectionInterface.php
│ │ │ │ ├── Exception/
│ │ │ │ │ ├── AbstractException.php
│ │ │ │ │ ├── AuthenticationFailedException.php
│ │ │ │ │ ├── CreateMailboxException.php
│ │ │ │ │ ├── DeleteMailboxException.php
│ │ │ │ │ ├── ImapFetchbodyException.php
│ │ │ │ │ ├── ImapFetchheaderException.php
│ │ │ │ │ ├── ImapGetmailboxesException.php
│ │ │ │ │ ├── ImapMsgnoException.php
│ │ │ │ │ ├── ImapNumMsgException.php
│ │ │ │ │ ├── ImapQuotaException.php
│ │ │ │ │ ├── ImapStatusException.php
│ │ │ │ │ ├── InvalidDateHeaderException.php
│ │ │ │ │ ├── InvalidHeadersException.php
│ │ │ │ │ ├── InvalidResourceException.php
│ │ │ │ │ ├── InvalidSearchCriteriaException.php
│ │ │ │ │ ├── MailboxDoesNotExistException.php
│ │ │ │ │ ├── MessageCopyException.php
│ │ │ │ │ ├── MessageDeleteException.php
│ │ │ │ │ ├── MessageDoesNotExistException.php
│ │ │ │ │ ├── MessageMoveException.php
│ │ │ │ │ ├── MessageStructureException.php
│ │ │ │ │ ├── MessageUndeleteException.php
│ │ │ │ │ ├── NotEmbeddedMessageException.php
│ │ │ │ │ ├── OutOfBoundsException.php
│ │ │ │ │ ├── ReopenMailboxException.php
│ │ │ │ │ ├── ResourceCheckFailureException.php
│ │ │ │ │ ├── UnexpectedEncodingException.php
│ │ │ │ │ └── UnsupportedCharsetException.php
│ │ │ │ ├── ImapResource.php
│ │ │ │ ├── ImapResourceInterface.php
│ │ │ │ ├── Mailbox.php
│ │ │ │ ├── MailboxInterface.php
│ │ │ │ ├── Message/
│ │ │ │ │ ├── AbstractMessage.php
│ │ │ │ │ ├── AbstractPart.php
│ │ │ │ │ ├── Attachment.php
│ │ │ │ │ ├── AttachmentInterface.php
│ │ │ │ │ ├── BasicMessageInterface.php
│ │ │ │ │ ├── EmailAddress.php
│ │ │ │ │ ├── EmbeddedMessage.php
│ │ │ │ │ ├── EmbeddedMessageInterface.php
│ │ │ │ │ ├── Headers.php
│ │ │ │ │ ├── Parameters.php
│ │ │ │ │ ├── PartInterface.php
│ │ │ │ │ ├── SimplePart.php
│ │ │ │ │ └── Transcoder.php
│ │ │ │ ├── Message.php
│ │ │ │ ├── MessageInterface.php
│ │ │ │ ├── MessageIterator.php
│ │ │ │ ├── MessageIteratorInterface.php
│ │ │ │ ├── Search/
│ │ │ │ │ ├── AbstractDate.php
│ │ │ │ │ ├── AbstractText.php
│ │ │ │ │ ├── ConditionInterface.php
│ │ │ │ │ ├── Date/
│ │ │ │ │ │ ├── Before.php
│ │ │ │ │ │ ├── On.php
│ │ │ │ │ │ └── Since.php
│ │ │ │ │ ├── Email/
│ │ │ │ │ │ ├── Bcc.php
│ │ │ │ │ │ ├── Cc.php
│ │ │ │ │ │ ├── From.php
│ │ │ │ │ │ └── To.php
│ │ │ │ │ ├── Flag/
│ │ │ │ │ │ ├── Answered.php
│ │ │ │ │ │ ├── Flagged.php
│ │ │ │ │ │ ├── Recent.php
│ │ │ │ │ │ ├── Seen.php
│ │ │ │ │ │ ├── Unanswered.php
│ │ │ │ │ │ ├── Unflagged.php
│ │ │ │ │ │ └── Unseen.php
│ │ │ │ │ ├── LogicalOperator/
│ │ │ │ │ │ ├── All.php
│ │ │ │ │ │ └── OrConditions.php
│ │ │ │ │ ├── RawExpression.php
│ │ │ │ │ ├── State/
│ │ │ │ │ │ ├── Deleted.php
│ │ │ │ │ │ ├── NewMessage.php
│ │ │ │ │ │ ├── Old.php
│ │ │ │ │ │ └── Undeleted.php
│ │ │ │ │ └── Text/
│ │ │ │ │ ├── Body.php
│ │ │ │ │ ├── Keyword.php
│ │ │ │ │ ├── Subject.php
│ │ │ │ │ ├── Text.php
│ │ │ │ │ └── Unkeyword.php
│ │ │ │ ├── SearchExpression.php
│ │ │ │ ├── Server.php
│ │ │ │ ├── ServerInterface.php
│ │ │ │ └── Test/
│ │ │ │ └── RawMessageIterator.php
│ │ │ ├── firebase/
│ │ │ │ └── php-jwt/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── composer.json
│ │ │ │ └── src/
│ │ │ │ ├── BeforeValidException.php
│ │ │ │ ├── CachedKeySet.php
│ │ │ │ ├── ExpiredException.php
│ │ │ │ ├── JWK.php
│ │ │ │ ├── JWT.php
│ │ │ │ ├── Key.php
│ │ │ │ └── SignatureInvalidException.php
│ │ │ ├── guzzlehttp/
│ │ │ │ ├── guzzle/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── UPGRADING.md
│ │ │ │ │ ├── composer.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── BodySummarizer.php
│ │ │ │ │ ├── BodySummarizerInterface.php
│ │ │ │ │ ├── Client.php
│ │ │ │ │ ├── ClientInterface.php
│ │ │ │ │ ├── ClientTrait.php
│ │ │ │ │ ├── Cookie/
│ │ │ │ │ │ ├── CookieJar.php
│ │ │ │ │ │ ├── CookieJarInterface.php
│ │ │ │ │ │ ├── FileCookieJar.php
│ │ │ │ │ │ ├── SessionCookieJar.php
│ │ │ │ │ │ └── SetCookie.php
│ │ │ │ │ ├── Exception/
│ │ │ │ │ │ ├── BadResponseException.php
│ │ │ │ │ │ ├── ClientException.php
│ │ │ │ │ │ ├── ConnectException.php
│ │ │ │ │ │ ├── GuzzleException.php
│ │ │ │ │ │ ├── InvalidArgumentException.php
│ │ │ │ │ │ ├── RequestException.php
│ │ │ │ │ │ ├── ServerException.php
│ │ │ │ │ │ ├── TooManyRedirectsException.php
│ │ │ │ │ │ └── TransferException.php
│ │ │ │ │ ├── Handler/
│ │ │ │ │ │ ├── CurlFactory.php
│ │ │ │ │ │ ├── CurlFactoryInterface.php
│ │ │ │ │ │ ├── CurlHandler.php
│ │ │ │ │ │ ├── CurlMultiHandler.php
│ │ │ │ │ │ ├── EasyHandle.php
│ │ │ │ │ │ ├── HeaderProcessor.php
│ │ │ │ │ │ ├── MockHandler.php
│ │ │ │ │ │ ├── Proxy.php
│ │ │ │ │ │ └── StreamHandler.php
│ │ │ │ │ ├── HandlerStack.php
│ │ │ │ │ ├── MessageFormatter.php
│ │ │ │ │ ├── MessageFormatterInterface.php
│ │ │ │ │ ├── Middleware.php
│ │ │ │ │ ├── Pool.php
│ │ │ │ │ ├── PrepareBodyMiddleware.php
│ │ │ │ │ ├── RedirectMiddleware.php
│ │ │ │ │ ├── RequestOptions.php
│ │ │ │ │ ├── RetryMiddleware.php
│ │ │ │ │ ├── TransferStats.php
│ │ │ │ │ ├── Utils.php
│ │ │ │ │ ├── functions.php
│ │ │ │ │ └── functions_include.php
│ │ │ │ ├── promises/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── composer.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── AggregateException.php
│ │ │ │ │ ├── CancellationException.php
│ │ │ │ │ ├── Coroutine.php
│ │ │ │ │ ├── Create.php
│ │ │ │ │ ├── Each.php
│ │ │ │ │ ├── EachPromise.php
│ │ │ │ │ ├── FulfilledPromise.php
│ │ │ │ │ ├── Is.php
│ │ │ │ │ ├── Promise.php
│ │ │ │ │ ├── PromiseInterface.php
│ │ │ │ │ ├── PromisorInterface.php
│ │ │ │ │ ├── RejectedPromise.php
│ │ │ │ │ ├── RejectionException.php
│ │ │ │ │ ├── TaskQueue.php
│ │ │ │ │ ├── TaskQueueInterface.php
│ │ │ │ │ ├── Utils.php
│ │ │ │ │ ├── functions.php
│ │ │ │ │ └── functions_include.php
│ │ │ │ └── psr7/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── composer.json
│ │ │ │ └── src/
│ │ │ │ ├── AppendStream.php
│ │ │ │ ├── BufferStream.php
│ │ │ │ ├── CachingStream.php
│ │ │ │ ├── DroppingStream.php
│ │ │ │ ├── Exception/
│ │ │ │ │ └── MalformedUriException.php
│ │ │ │ ├── FnStream.php
│ │ │ │ ├── Header.php
│ │ │ │ ├── HttpFactory.php
│ │ │ │ ├── InflateStream.php
│ │ │ │ ├── LazyOpenStream.php
│ │ │ │ ├── LimitStream.php
│ │ │ │ ├── Message.php
│ │ │ │ ├── MessageTrait.php
│ │ │ │ ├── MimeType.php
│ │ │ │ ├── MultipartStream.php
│ │ │ │ ├── NoSeekStream.php
│ │ │ │ ├── PumpStream.php
│ │ │ │ ├── Query.php
│ │ │ │ ├── Request.php
│ │ │ │ ├── Response.php
│ │ │ │ ├── Rfc7230.php
│ │ │ │ ├── ServerRequest.php
│ │ │ │ ├── Stream.php
│ │ │ │ ├── StreamDecoratorTrait.php
│ │ │ │ ├── StreamWrapper.php
│ │ │ │ ├── UploadedFile.php
│ │ │ │ ├── Uri.php
│ │ │ │ ├── UriComparator.php
│ │ │ │ ├── UriNormalizer.php
│ │ │ │ ├── UriResolver.php
│ │ │ │ └── Utils.php
│ │ │ ├── illuminate/
│ │ │ │ ├── collections/
│ │ │ │ │ ├── Arr.php
│ │ │ │ │ ├── Collection.php
│ │ │ │ │ ├── Enumerable.php
│ │ │ │ │ ├── HigherOrderCollectionProxy.php
│ │ │ │ │ ├── ItemNotFoundException.php
│ │ │ │ │ ├── LICENSE.md
│ │ │ │ │ ├── LazyCollection.php
│ │ │ │ │ ├── MultipleItemsFoundException.php
│ │ │ │ │ ├── Traits/
│ │ │ │ │ │ └── EnumeratesValues.php
│ │ │ │ │ ├── composer.json
│ │ │ │ │ ├── functions.php
│ │ │ │ │ └── helpers.php
│ │ │ │ ├── conditionable/
│ │ │ │ │ ├── HigherOrderWhenProxy.php
│ │ │ │ │ ├── LICENSE.md
│ │ │ │ │ ├── Traits/
│ │ │ │ │ │ └── Conditionable.php
│ │ │ │ │ └── composer.json
│ │ │ │ ├── contracts/
│ │ │ │ │ ├── Auth/
│ │ │ │ │ │ ├── Access/
│ │ │ │ │ │ │ ├── Authorizable.php
│ │ │ │ │ │ │ └── Gate.php
│ │ │ │ │ │ ├── Authenticatable.php
│ │ │ │ │ │ ├── CanResetPassword.php
│ │ │ │ │ │ ├── Factory.php
│ │ │ │ │ │ ├── Guard.php
│ │ │ │ │ │ ├── Middleware/
│ │ │ │ │ │ │ └── AuthenticatesRequests.php
│ │ │ │ │ │ ├── MustVerifyEmail.php
│ │ │ │ │ │ ├── PasswordBroker.php
│ │ │ │ │ │ ├── PasswordBrokerFactory.php
│ │ │ │ │ │ ├── StatefulGuard.php
│ │ │ │ │ │ ├── SupportsBasicAuth.php
│ │ │ │ │ │ └── UserProvider.php
│ │ │ │ │ ├── Broadcasting/
│ │ │ │ │ │ ├── Broadcaster.php
│ │ │ │ │ │ ├── Factory.php
│ │ │ │ │ │ ├── HasBroadcastChannel.php
│ │ │ │ │ │ ├── ShouldBeUnique.php
│ │ │ │ │ │ ├── ShouldBroadcast.php
│ │ │ │ │ │ └── ShouldBroadcastNow.php
│ │ │ │ │ ├── Bus/
│ │ │ │ │ │ ├── Dispatcher.php
│ │ │ │ │ │ └── QueueingDispatcher.php
│ │ │ │ │ ├── Cache/
│ │ │ │ │ │ ├── Factory.php
│ │ │ │ │ │ ├── Lock.php
│ │ │ │ │ │ ├── LockProvider.php
│ │ │ │ │ │ ├── LockTimeoutException.php
│ │ │ │ │ │ ├── Repository.php
│ │ │ │ │ │ └── Store.php
│ │ │ │ │ ├── Config/
│ │ │ │ │ │ └── Repository.php
│ │ │ │ │ ├── Console/
│ │ │ │ │ │ ├── Application.php
│ │ │ │ │ │ ├── Isolatable.php
│ │ │ │ │ │ ├── Kernel.php
│ │ │ │ │ │ └── PromptsForMissingInput.php
│ │ │ │ │ ├── Container/
│ │ │ │ │ │ ├── BindingResolutionException.php
│ │ │ │ │ │ ├── CircularDependencyException.php
│ │ │ │ │ │ ├── Container.php
│ │ │ │ │ │ └── ContextualBindingBuilder.php
│ │ │ │ │ ├── Cookie/
│ │ │ │ │ │ ├── Factory.php
│ │ │ │ │ │ └── QueueingFactory.php
│ │ │ │ │ ├── Database/
│ │ │ │ │ │ ├── Eloquent/
│ │ │ │ │ │ │ ├── Builder.php
│ │ │ │ │ │ │ ├── Castable.php
│ │ │ │ │ │ │ ├── CastsAttributes.php
│ │ │ │ │ │ │ ├── CastsInboundAttributes.php
│ │ │ │ │ │ │ ├── DeviatesCastableAttributes.php
│ │ │ │ │ │ │ ├── SerializesCastableAttributes.php
│ │ │ │ │ │ │ └── SupportsPartialRelations.php
│ │ │ │ │ │ ├── Events/
│ │ │ │ │ │ │ └── MigrationEvent.php
│ │ │ │ │ │ ├── ModelIdentifier.php
│ │ │ │ │ │ └── Query/
│ │ │ │ │ │ ├── Builder.php
│ │ │ │ │ │ ├── ConditionExpression.php
│ │ │ │ │ │ └── Expression.php
│ │ │ │ │ ├── Debug/
│ │ │ │ │ │ └── ExceptionHandler.php
│ │ │ │ │ ├── Encryption/
│ │ │ │ │ │ ├── DecryptException.php
│ │ │ │ │ │ ├── EncryptException.php
│ │ │ │ │ │ ├── Encrypter.php
│ │ │ │ │ │ └── StringEncrypter.php
│ │ │ │ │ ├── Events/
│ │ │ │ │ │ ├── Dispatcher.php
│ │ │ │ │ │ ├── ShouldDispatchAfterCommit.php
│ │ │ │ │ │ └── ShouldHandleEventsAfterCommit.php
│ │ │ │ │ ├── Filesystem/
│ │ │ │ │ │ ├── Cloud.php
│ │ │ │ │ │ ├── Factory.php
│ │ │ │ │ │ ├── FileNotFoundException.php
│ │ │ │ │ │ ├── Filesystem.php
│ │ │ │ │ │ └── LockTimeoutException.php
│ │ │ │ │ ├── Foundation/
│ │ │ │ │ │ ├── Application.php
│ │ │ │ │ │ ├── CachesConfiguration.php
│ │ │ │ │ │ ├── CachesRoutes.php
│ │ │ │ │ │ ├── ExceptionRenderer.php
│ │ │ │ │ │ └── MaintenanceMode.php
│ │ │ │ │ ├── Hashing/
│ │ │ │ │ │ └── Hasher.php
│ │ │ │ │ ├── Http/
│ │ │ │ │ │ └── Kernel.php
│ │ │ │ │ ├── LICENSE.md
│ │ │ │ │ ├── Mail/
│ │ │ │ │ │ ├── Attachable.php
│ │ │ │ │ │ ├── Factory.php
│ │ │ │ │ │ ├── MailQueue.php
│ │ │ │ │ │ ├── Mailable.php
│ │ │ │ │ │ └── Mailer.php
│ │ │ │ │ ├── Notifications/
│ │ │ │ │ │ ├── Dispatcher.php
│ │ │ │ │ │ └── Factory.php
│ │ │ │ │ ├── Pagination/
│ │ │ │ │ │ ├── CursorPaginator.php
│ │ │ │ │ │ ├── LengthAwarePaginator.php
│ │ │ │ │ │ └── Paginator.php
│ │ │ │ │ ├── Pipeline/
│ │ │ │ │ │ ├── Hub.php
│ │ │ │ │ │ └── Pipeline.php
│ │ │ │ │ ├── Process/
│ │ │ │ │ │ ├── InvokedProcess.php
│ │ │ │ │ │ └── ProcessResult.php
│ │ │ │ │ ├── Queue/
│ │ │ │ │ │ ├── ClearableQueue.php
│ │ │ │ │ │ ├── EntityNotFoundException.php
│ │ │ │ │ │ ├── EntityResolver.php
│ │ │ │ │ │ ├── Factory.php
│ │ │ │ │ │ ├── Job.php
│ │ │ │ │ │ ├── Monitor.php
│ │ │ │ │ │ ├── Queue.php
│ │ │ │ │ │ ├── QueueableCollection.php
│ │ │ │ │ │ ├── QueueableEntity.php
│ │ │ │ │ │ ├── ShouldBeEncrypted.php
│ │ │ │ │ │ ├── ShouldBeUnique.php
│ │ │ │ │ │ ├── ShouldBeUniqueUntilProcessing.php
│ │ │ │ │ │ ├── ShouldQueue.php
│ │ │ │ │ │ └── ShouldQueueAfterCommit.php
│ │ │ │ │ ├── Redis/
│ │ │ │ │ │ ├── Connection.php
│ │ │ │ │ │ ├── Connector.php
│ │ │ │ │ │ ├── Factory.php
│ │ │ │ │ │ └── LimiterTimeoutException.php
│ │ │ │ │ ├── Routing/
│ │ │ │ │ │ ├── BindingRegistrar.php
│ │ │ │ │ │ ├── Registrar.php
│ │ │ │ │ │ ├── ResponseFactory.php
│ │ │ │ │ │ ├── UrlGenerator.php
│ │ │ │ │ │ └── UrlRoutable.php
│ │ │ │ │ ├── Session/
│ │ │ │ │ │ ├── Middleware/
│ │ │ │ │ │ │ └── AuthenticatesSessions.php
│ │ │ │ │ │ └── Session.php
│ │ │ │ │ ├── Support/
│ │ │ │ │ │ ├── Arrayable.php
│ │ │ │ │ │ ├── CanBeEscapedWhenCastToString.php
│ │ │ │ │ │ ├── DeferrableProvider.php
│ │ │ │ │ │ ├── DeferringDisplayableValue.php
│ │ │ │ │ │ ├── Htmlable.php
│ │ │ │ │ │ ├── Jsonable.php
│ │ │ │ │ │ ├── MessageBag.php
│ │ │ │ │ │ ├── MessageProvider.php
│ │ │ │ │ │ ├── Renderable.php
│ │ │ │ │ │ ├── Responsable.php
│ │ │ │ │ │ └── ValidatedData.php
│ │ │ │ │ ├── Translation/
│ │ │ │ │ │ ├── HasLocalePreference.php
│ │ │ │ │ │ ├── Loader.php
│ │ │ │ │ │ └── Translator.php
│ │ │ │ │ ├── Validation/
│ │ │ │ │ │ ├── DataAwareRule.php
│ │ │ │ │ │ ├── Factory.php
│ │ │ │ │ │ ├── ImplicitRule.php
│ │ │ │ │ │ ├── InvokableRule.php
│ │ │ │ │ │ ├── Rule.php
│ │ │ │ │ │ ├── UncompromisedVerifier.php
│ │ │ │ │ │ ├── ValidatesWhenResolved.php
│ │ │ │ │ │ ├── ValidationRule.php
│ │ │ │ │ │ ├── Validator.php
│ │ │ │ │ │ └── ValidatorAwareRule.php
│ │ │ │ │ ├── View/
│ │ │ │ │ │ ├── Engine.php
│ │ │ │ │ │ ├── Factory.php
│ │ │ │ │ │ ├── View.php
│ │ │ │ │ │ └── ViewCompilationException.php
│ │ │ │ │ └── composer.json
│ │ │ │ └── macroable/
│ │ │ │ ├── LICENSE.md
│ │ │ │ ├── Traits/
│ │ │ │ │ └── Macroable.php
│ │ │ │ └── composer.json
│ │ │ ├── league/
│ │ │ │ └── oauth2-client/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── composer.json
│ │ │ │ └── src/
│ │ │ │ ├── Grant/
│ │ │ │ │ ├── AbstractGrant.php
│ │ │ │ │ ├── AuthorizationCode.php
│ │ │ │ │ ├── ClientCredentials.php
│ │ │ │ │ ├── Exception/
│ │ │ │ │ │ └── InvalidGrantException.php
│ │ │ │ │ ├── GrantFactory.php
│ │ │ │ │ ├── Password.php
│ │ │ │ │ └── RefreshToken.php
│ │ │ │ ├── OptionProvider/
│ │ │ │ │ ├── HttpBasicAuthOptionProvider.php
│ │ │ │ │ ├── OptionProviderInterface.php
│ │ │ │ │ └── PostAuthOptionProvider.php
│ │ │ │ ├── Provider/
│ │ │ │ │ ├── AbstractProvider.php
│ │ │ │ │ ├── Exception/
│ │ │ │ │ │ └── IdentityProviderException.php
│ │ │ │ │ ├── GenericProvider.php
│ │ │ │ │ ├── GenericResourceOwner.php
│ │ │ │ │ └── ResourceOwnerInterface.php
│ │ │ │ ├── Token/
│ │ │ │ │ ├── AccessToken.php
│ │ │ │ │ ├── AccessTokenInterface.php
│ │ │ │ │ └── ResourceOwnerAccessTokenInterface.php
│ │ │ │ └── Tool/
│ │ │ │ ├── ArrayAccessorTrait.php
│ │ │ │ ├── BearerAuthorizationTrait.php
│ │ │ │ ├── GuardedPropertyTrait.php
│ │ │ │ ├── MacAuthorizationTrait.php
│ │ │ │ ├── ProviderRedirectTrait.php
│ │ │ │ ├── QueryBuilderTrait.php
│ │ │ │ ├── RequestFactory.php
│ │ │ │ └── RequiredParameterTrait.php
│ │ │ ├── matthiasmullie/
│ │ │ │ ├── minify/
│ │ │ │ │ ├── .github/
│ │ │ │ │ │ └── FUNDING.yml
│ │ │ │ │ ├── CONTRIBUTING.md
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── bin/
│ │ │ │ │ │ ├── minifycss
│ │ │ │ │ │ └── minifyjs
│ │ │ │ │ ├── composer.json
│ │ │ │ │ ├── data/
│ │ │ │ │ │ └── js/
│ │ │ │ │ │ ├── keywords_after.txt
│ │ │ │ │ │ ├── keywords_before.txt
│ │ │ │ │ │ ├── keywords_reserved.txt
│ │ │ │ │ │ ├── operators.txt
│ │ │ │ │ │ ├── operators_after.txt
│ │ │ │ │ │ └── operators_before.txt
│ │ │ │ │ ├── docker-compose.yml
│ │ │ │ │ └── src/
│ │ │ │ │ ├── CSS.php
│ │ │ │ │ ├── Exception.php
│ │ │ │ │ ├── Exceptions/
│ │ │ │ │ │ ├── BasicException.php
│ │ │ │ │ │ ├── FileImportException.php
│ │ │ │ │ │ └── IOException.php
│ │ │ │ │ ├── JS.php
│ │ │ │ │ └── Minify.php
│ │ │ │ └── path-converter/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── composer.json
│ │ │ │ └── src/
│ │ │ │ ├── Converter.php
│ │ │ │ ├── ConverterInterface.php
│ │ │ │ └── NoConverter.php
│ │ │ ├── nesbot/
│ │ │ │ └── carbon/
│ │ │ │ ├── .phpstorm.meta.php
│ │ │ │ ├── LICENSE
│ │ │ │ ├── bin/
│ │ │ │ │ ├── carbon
│ │ │ │ │ └── carbon.bat
│ │ │ │ ├── composer.json
│ │ │ │ ├── extension.neon
│ │ │ │ ├── lazy/
│ │ │ │ │ └── Carbon/
│ │ │ │ │ ├── MessageFormatter/
│ │ │ │ │ │ ├── MessageFormatterMapperStrongType.php
│ │ │ │ │ │ └── MessageFormatterMapperWeakType.php
│ │ │ │ │ ├── PHPStan/
│ │ │ │ │ │ ├── AbstractMacroBuiltin.php
│ │ │ │ │ │ ├── AbstractMacroStatic.php
│ │ │ │ │ │ ├── MacroStrongType.php
│ │ │ │ │ │ └── MacroWeakType.php
│ │ │ │ │ ├── TranslatorStrongType.php
│ │ │ │ │ └── TranslatorWeakType.php
│ │ │ │ ├── readme.md
│ │ │ │ ├── sponsors.php
│ │ │ │ └── src/
│ │ │ │ └── Carbon/
│ │ │ │ ├── AbstractTranslator.php
│ │ │ │ ├── Carbon.php
│ │ │ │ ├── CarbonConverterInterface.php
│ │ │ │ ├── CarbonImmutable.php
│ │ │ │ ├── CarbonInterface.php
│ │ │ │ ├── CarbonInterval.php
│ │ │ │ ├── CarbonPeriod.php
│ │ │ │ ├── CarbonPeriodImmutable.php
│ │ │ │ ├── CarbonTimeZone.php
│ │ │ │ ├── Cli/
│ │ │ │ │ └── Invoker.php
│ │ │ │ ├── Exceptions/
│ │ │ │ │ ├── BadComparisonUnitException.php
│ │ │ │ │ ├── BadFluentConstructorException.php
│ │ │ │ │ ├── BadFluentSetterException.php
│ │ │ │ │ ├── BadMethodCallException.php
│ │ │ │ │ ├── EndLessPeriodException.php
│ │ │ │ │ ├── Exception.php
│ │ │ │ │ ├── ImmutableException.php
│ │ │ │ │ ├── InvalidArgumentException.php
│ │ │ │ │ ├── InvalidCastException.php
│ │ │ │ │ ├── InvalidDateException.php
│ │ │ │ │ ├── InvalidFormatException.php
│ │ │ │ │ ├── InvalidIntervalException.php
│ │ │ │ │ ├── InvalidPeriodDateException.php
│ │ │ │ │ ├── InvalidPeriodParameterException.php
│ │ │ │ │ ├── InvalidTimeZoneException.php
│ │ │ │ │ ├── InvalidTypeException.php
│ │ │ │ │ ├── NotACarbonClassException.php
│ │ │ │ │ ├── NotAPeriodException.php
│ │ │ │ │ ├── NotLocaleAwareException.php
│ │ │ │ │ ├── OutOfRangeException.php
│ │ │ │ │ ├── ParseErrorException.php
│ │ │ │ │ ├── RuntimeException.php
│ │ │ │ │ ├── UnitException.php
│ │ │ │ │ ├── UnitNotConfiguredException.php
│ │ │ │ │ ├── UnknownGetterException.php
│ │ │ │ │ ├── UnknownMethodException.php
│ │ │ │ │ ├── UnknownSetterException.php
│ │ │ │ │ ├── UnknownUnitException.php
│ │ │ │ │ └── UnreachableException.php
│ │ │ │ ├── Factory.php
│ │ │ │ ├── FactoryImmutable.php
│ │ │ │ ├── Lang/
│ │ │ │ │ ├── aa.php
│ │ │ │ │ ├── aa_DJ.php
│ │ │ │ │ ├── aa_ER.php
│ │ │ │ │ ├── aa_ER@saaho.php
│ │ │ │ │ ├── aa_ET.php
│ │ │ │ │ ├── af.php
│ │ │ │ │ ├── af_NA.php
│ │ │ │ │ ├── af_ZA.php
│ │ │ │ │ ├── agq.php
│ │ │ │ │ ├── agr.php
│ │ │ │ │ ├── agr_PE.php
│ │ │ │ │ ├── ak.php
│ │ │ │ │ ├── ak_GH.php
│ │ │ │ │ ├── am.php
│ │ │ │ │ ├── am_ET.php
│ │ │ │ │ ├── an.php
│ │ │ │ │ ├── an_ES.php
│ │ │ │ │ ├── anp.php
│ │ │ │ │ ├── anp_IN.php
│ │ │ │ │ ├── ar.php
│ │ │ │ │ ├── ar_AE.php
│ │ │ │ │ ├── ar_BH.php
│ │ │ │ │ ├── ar_DJ.php
│ │ │ │ │ ├── ar_DZ.php
│ │ │ │ │ ├── ar_EG.php
│ │ │ │ │ ├── ar_EH.php
│ │ │ │ │ ├── ar_ER.php
│ │ │ │ │ ├── ar_IL.php
│ │ │ │ │ ├── ar_IN.php
│ │ │ │ │ ├── ar_IQ.php
│ │ │ │ │ ├── ar_JO.php
│ │ │ │ │ ├── ar_KM.php
│ │ │ │ │ ├── ar_KW.php
│ │ │ │ │ ├── ar_LB.php
│ │ │ │ │ ├── ar_LY.php
│ │ │ │ │ ├── ar_MA.php
│ │ │ │ │ ├── ar_MR.php
│ │ │ │ │ ├── ar_OM.php
│ │ │ │ │ ├── ar_PS.php
│ │ │ │ │ ├── ar_QA.php
│ │ │ │ │ ├── ar_SA.php
│ │ │ │ │ ├── ar_SD.php
│ │ │ │ │ ├── ar_SO.php
│ │ │ │ │ ├── ar_SS.php
│ │ │ │ │ ├── ar_SY.php
│ │ │ │ │ ├── ar_Shakl.php
│ │ │ │ │ ├── ar_TD.php
│ │ │ │ │ ├── ar_TN.php
│ │ │ │ │ ├── ar_YE.php
│ │ │ │ │ ├── as.php
│ │ │ │ │ ├── as_IN.php
│ │ │ │ │ ├── asa.php
│ │ │ │ │ ├── ast.php
│ │ │ │ │ ├── ast_ES.php
│ │ │ │ │ ├── ayc.php
│ │ │ │ │ ├── ayc_PE.php
│ │ │ │ │ ├── az.php
│ │ │ │ │ ├── az_AZ.php
│ │ │ │ │ ├── az_Cyrl.php
│ │ │ │ │ ├── az_IR.php
│ │ │ │ │ ├── az_Latn.php
│ │ │ │ │ ├── bas.php
│ │ │ │ │ ├── be.php
│ │ │ │ │ ├── be_BY.php
│ │ │ │ │ ├── be_BY@latin.php
│ │ │ │ │ ├── bem.php
│ │ │ │ │ ├── bem_ZM.php
│ │ │ │ │ ├── ber.php
│ │ │ │ │ ├── ber_DZ.php
│ │ │ │ │ ├── ber_MA.php
│ │ │ │ │ ├── bez.php
│ │ │ │ │ ├── bg.php
│ │ │ │ │ ├── bg_BG.php
│ │ │ │ │ ├── bhb.php
│ │ │ │ │ ├── bhb_IN.php
│ │ │ │ │ ├── bho.php
│ │ │ │ │ ├── bho_IN.php
│ │ │ │ │ ├── bi.php
│ │ │ │ │ ├── bi_VU.php
│ │ │ │ │ ├── bm.php
│ │ │ │ │ ├── bn.php
│ │ │ │ │ ├── bn_BD.php
│ │ │ │ │ ├── bn_IN.php
│ │ │ │ │ ├── bo.php
│ │ │ │ │ ├── bo_CN.php
│ │ │ │ │ ├── bo_IN.php
│ │ │ │ │ ├── br.php
│ │ │ │ │ ├── br_FR.php
│ │ │ │ │ ├── brx.php
│ │ │ │ │ ├── brx_IN.php
│ │ │ │ │ ├── bs.php
│ │ │ │ │ ├── bs_BA.php
│ │ │ │ │ ├── bs_Cyrl.php
│ │ │ │ │ ├── bs_Latn.php
│ │ │ │ │ ├── byn.php
│ │ │ │ │ ├── byn_ER.php
│ │ │ │ │ ├── ca.php
│ │ │ │ │ ├── ca_AD.php
│ │ │ │ │ ├── ca_ES.php
│ │ │ │ │ ├── ca_ES_Valencia.php
│ │ │ │ │ ├── ca_FR.php
│ │ │ │ │ ├── ca_IT.php
│ │ │ │ │ ├── ccp.php
│ │ │ │ │ ├── ccp_IN.php
│ │ │ │ │ ├── ce.php
│ │ │ │ │ ├── ce_RU.php
│ │ │ │ │ ├── cgg.php
│ │ │ │ │ ├── chr.php
│ │ │ │ │ ├── chr_US.php
│ │ │ │ │ ├── ckb.php
│ │ │ │ │ ├── cmn.php
│ │ │ │ │ ├── cmn_TW.php
│ │ │ │ │ ├── crh.php
│ │ │ │ │ ├── crh_UA.php
│ │ │ │ │ ├── cs.php
│ │ │ │ │ ├── cs_CZ.php
│ │ │ │ │ ├── csb.php
│ │ │ │ │ ├── csb_PL.php
│ │ │ │ │ ├── cu.php
│ │ │ │ │ ├── cv.php
│ │ │ │ │ ├── cv_RU.php
│ │ │ │ │ ├── cy.php
│ │ │ │ │ ├── cy_GB.php
│ │ │ │ │ ├── da.php
│ │ │ │ │ ├── da_DK.php
│ │ │ │ │ ├── da_GL.php
│ │ │ │ │ ├── dav.php
│ │ │ │ │ ├── de.php
│ │ │ │ │ ├── de_AT.php
│ │ │ │ │ ├── de_BE.php
│ │ │ │ │ ├── de_CH.php
│ │ │ │ │ ├── de_DE.php
│ │ │ │ │ ├── de_IT.php
│ │ │ │ │ ├── de_LI.php
│ │ │ │ │ ├── de_LU.php
│ │ │ │ │ ├── dje.php
│ │ │ │ │ ├── doi.php
│ │ │ │ │ ├── doi_IN.php
│ │ │ │ │ ├── dsb.php
│ │ │ │ │ ├── dsb_DE.php
│ │ │ │ │ ├── dua.php
│ │ │ │ │ ├── dv.php
│ │ │ │ │ ├── dv_MV.php
│ │ │ │ │ ├── dyo.php
│ │ │ │ │ ├── dz.php
│ │ │ │ │ ├── dz_BT.php
│ │ │ │ │ ├── ebu.php
│ │ │ │ │ ├── ee.php
│ │ │ │ │ ├── ee_TG.php
│ │ │ │ │ ├── el.php
│ │ │ │ │ ├── el_CY.php
│ │ │ │ │ ├── el_GR.php
│ │ │ │ │ ├── en.php
│ │ │ │ │ ├── en_001.php
│ │ │ │ │ ├── en_150.php
│ │ │ │ │ ├── en_AG.php
│ │ │ │ │ ├── en_AI.php
│ │ │ │ │ ├── en_AS.php
│ │ │ │ │ ├── en_AT.php
│ │ │ │ │ ├── en_AU.php
│ │ │ │ │ ├── en_BB.php
│ │ │ │ │ ├── en_BE.php
│ │ │ │ │ ├── en_BI.php
│ │ │ │ │ ├── en_BM.php
│ │ │ │ │ ├── en_BS.php
│ │ │ │ │ ├── en_BW.php
│ │ │ │ │ ├── en_BZ.php
│ │ │ │ │ ├── en_CA.php
│ │ │ │ │ ├── en_CC.php
│ │ │ │ │ ├── en_CH.php
│ │ │ │ │ ├── en_CK.php
│ │ │ │ │ ├── en_CM.php
│ │ │ │ │ ├── en_CX.php
│ │ │ │ │ ├── en_CY.php
│ │ │ │ │ ├── en_DE.php
│ │ │ │ │ ├── en_DG.php
│ │ │ │ │ ├── en_DK.php
│ │ │ │ │ ├── en_DM.php
│ │ │ │ │ ├── en_ER.php
│ │ │ │ │ ├── en_FI.php
│ │ │ │ │ ├── en_FJ.php
│ │ │ │ │ ├── en_FK.php
│ │ │ │ │ ├── en_FM.php
│ │ │ │ │ ├── en_GB.php
│ │ │ │ │ ├── en_GD.php
│ │ │ │ │ ├── en_GG.php
│ │ │ │ │ ├── en_GH.php
│ │ │ │ │ ├── en_GI.php
│ │ │ │ │ ├── en_GM.php
│ │ │ │ │ ├── en_GU.php
│ │ │ │ │ ├── en_GY.php
│ │ │ │ │ ├── en_HK.php
│ │ │ │ │ ├── en_IE.php
│ │ │ │ │ ├── en_IL.php
│ │ │ │ │ ├── en_IM.php
│ │ │ │ │ ├── en_IN.php
│ │ │ │ │ ├── en_IO.php
│ │ │ │ │ ├── en_ISO.php
│ │ │ │ │ ├── en_JE.php
│ │ │ │ │ ├── en_JM.php
│ │ │ │ │ ├── en_KE.php
│ │ │ │ │ ├── en_KI.php
│ │ │ │ │ ├── en_KN.php
│ │ │ │ │ ├── en_KY.php
│ │ │ │ │ ├── en_LC.php
│ │ │ │ │ ├── en_LR.php
│ │ │ │ │ ├── en_LS.php
│ │ │ │ │ ├── en_MG.php
│ │ │ │ │ ├── en_MH.php
│ │ │ │ │ ├── en_MO.php
│ │ │ │ │ ├── en_MP.php
│ │ │ │ │ ├── en_MS.php
│ │ │ │ │ ├── en_MT.php
│ │ │ │ │ ├── en_MU.php
│ │ │ │ │ ├── en_MW.php
│ │ │ │ │ ├── en_MY.php
│ │ │ │ │ ├── en_NA.php
│ │ │ │ │ ├── en_NF.php
│ │ │ │ │ ├── en_NG.php
│ │ │ │ │ ├── en_NL.php
│ │ │ │ │ ├── en_NR.php
│ │ │ │ │ ├── en_NU.php
│ │ │ │ │ ├── en_NZ.php
│ │ │ │ │ ├── en_PG.php
│ │ │ │ │ ├── en_PH.php
│ │ │ │ │ ├── en_PK.php
│ │ │ │ │ ├── en_PN.php
│ │ │ │ │ ├── en_PR.php
│ │ │ │ │ ├── en_PW.php
│ │ │ │ │ ├── en_RW.php
│ │ │ │ │ ├── en_SB.php
│ │ │ │ │ ├── en_SC.php
│ │ │ │ │ ├── en_SD.php
│ │ │ │ │ ├── en_SE.php
│ │ │ │ │ ├── en_SG.php
│ │ │ │ │ ├── en_SH.php
│ │ │ │ │ ├── en_SI.php
│ │ │ │ │ ├── en_SL.php
│ │ │ │ │ ├── en_SS.php
│ │ │ │ │ ├── en_SX.php
│ │ │ │ │ ├── en_SZ.php
│ │ │ │ │ ├── en_TC.php
│ │ │ │ │ ├── en_TK.php
│ │ │ │ │ ├── en_TO.php
│ │ │ │ │ ├── en_TT.php
│ │ │ │ │ ├── en_TV.php
│ │ │ │ │ ├── en_TZ.php
│ │ │ │ │ ├── en_UG.php
│ │ │ │ │ ├── en_UM.php
│ │ │ │ │ ├── en_US.php
│ │ │ │ │ ├── en_US_Posix.php
│ │ │ │ │ ├── en_VC.php
│ │ │ │ │ ├── en_VG.php
│ │ │ │ │ ├── en_VI.php
│ │ │ │ │ ├── en_VU.php
│ │ │ │ │ ├── en_WS.php
│ │ │ │ │ ├── en_ZA.php
│ │ │ │ │ ├── en_ZM.php
│ │ │ │ │ ├── en_ZW.php
│ │ │ │ │ ├── eo.php
│ │ │ │ │ ├── es.php
│ │ │ │ │ ├── es_419.php
│ │ │ │ │ ├── es_AR.php
│ │ │ │ │ ├── es_BO.php
│ │ │ │ │ ├── es_BR.php
│ │ │ │ │ ├── es_BZ.php
│ │ │ │ │ ├── es_CL.php
│ │ │ │ │ ├── es_CO.php
│ │ │ │ │ ├── es_CR.php
│ │ │ │ │ ├── es_CU.php
│ │ │ │ │ ├── es_DO.php
│ │ │ │ │ ├── es_EA.php
│ │ │ │ │ ├── es_EC.php
│ │ │ │ │ ├── es_ES.php
│ │ │ │ │ ├── es_GQ.php
│ │ │ │ │ ├── es_GT.php
│ │ │ │ │ ├── es_HN.php
│ │ │ │ │ ├── es_IC.php
│ │ │ │ │ ├── es_MX.php
│ │ │ │ │ ├── es_NI.php
│ │ │ │ │ ├── es_PA.php
│ │ │ │ │ ├── es_PE.php
│ │ │ │ │ ├── es_PH.php
│ │ │ │ │ ├── es_PR.php
│ │ │ │ │ ├── es_PY.php
│ │ │ │ │ ├── es_SV.php
│ │ │ │ │ ├── es_US.php
│ │ │ │ │ ├── es_UY.php
│ │ │ │ │ ├── es_VE.php
│ │ │ │ │ ├── et.php
│ │ │ │ │ ├── et_EE.php
│ │ │ │ │ ├── eu.php
│ │ │ │ │ ├── eu_ES.php
│ │ │ │ │ ├── ewo.php
│ │ │ │ │ ├── fa.php
│ │ │ │ │ ├── fa_AF.php
│ │ │ │ │ ├── fa_IR.php
│ │ │ │ │ ├── ff.php
│ │ │ │ │ ├── ff_CM.php
│ │ │ │ │ ├── ff_GN.php
│ │ │ │ │ ├── ff_MR.php
│ │ │ │ │ ├── ff_SN.php
│ │ │ │ │ ├── fi.php
│ │ │ │ │ ├── fi_FI.php
│ │ │ │ │ ├── fil.php
│ │ │ │ │ ├── fil_PH.php
│ │ │ │ │ ├── fo.php
│ │ │ │ │ ├── fo_DK.php
│ │ │ │ │ ├── fo_FO.php
│ │ │ │ │ ├── fr.php
│ │ │ │ │ ├── fr_BE.php
│ │ │ │ │ ├── fr_BF.php
│ │ │ │ │ ├── fr_BI.php
│ │ │ │ │ ├── fr_BJ.php
│ │ │ │ │ ├── fr_BL.php
│ │ │ │ │ ├── fr_CA.php
│ │ │ │ │ ├── fr_CD.php
│ │ │ │ │ ├── fr_CF.php
│ │ │ │ │ ├── fr_CG.php
│ │ │ │ │ ├── fr_CH.php
│ │ │ │ │ ├── fr_CI.php
│ │ │ │ │ ├── fr_CM.php
│ │ │ │ │ ├── fr_DJ.php
│ │ │ │ │ ├── fr_DZ.php
│ │ │ │ │ ├── fr_FR.php
│ │ │ │ │ ├── fr_GA.php
│ │ │ │ │ ├── fr_GF.php
│ │ │ │ │ ├── fr_GN.php
│ │ │ │ │ ├── fr_GP.php
│ │ │ │ │ ├── fr_GQ.php
│ │ │ │ │ ├── fr_HT.php
│ │ │ │ │ ├── fr_KM.php
│ │ │ │ │ ├── fr_LU.php
│ │ │ │ │ ├── fr_MA.php
│ │ │ │ │ ├── fr_MC.php
│ │ │ │ │ ├── fr_MF.php
│ │ │ │ │ ├── fr_MG.php
│ │ │ │ │ ├── fr_ML.php
│ │ │ │ │ ├── fr_MQ.php
│ │ │ │ │ ├── fr_MR.php
│ │ │ │ │ ├── fr_MU.php
│ │ │ │ │ ├── fr_NC.php
│ │ │ │ │ ├── fr_NE.php
│ │ │ │ │ ├── fr_PF.php
│ │ │ │ │ ├── fr_PM.php
│ │ │ │ │ ├── fr_RE.php
│ │ │ │ │ ├── fr_RW.php
│ │ │ │ │ ├── fr_SC.php
│ │ │ │ │ ├── fr_SN.php
│ │ │ │ │ ├── fr_SY.php
│ │ │ │ │ ├── fr_TD.php
│ │ │ │ │ ├── fr_TG.php
│ │ │ │ │ ├── fr_TN.php
│ │ │ │ │ ├── fr_VU.php
│ │ │ │ │ ├── fr_WF.php
│ │ │ │ │ ├── fr_YT.php
│ │ │ │ │ ├── fur.php
│ │ │ │ │ ├── fur_IT.php
│ │ │ │ │ ├── fy.php
│ │ │ │ │ ├── fy_DE.php
│ │ │ │ │ ├── fy_NL.php
│ │ │ │ │ ├── ga.php
│ │ │ │ │ ├── ga_IE.php
│ │ │ │ │ ├── gd.php
│ │ │ │ │ ├── gd_GB.php
│ │ │ │ │ ├── gez.php
│ │ │ │ │ ├── gez_ER.php
│ │ │ │ │ ├── gez_ET.php
│ │ │ │ │ ├── gl.php
│ │ │ │ │ ├── gl_ES.php
│ │ │ │ │ ├── gom.php
│ │ │ │ │ ├── gom_Latn.php
│ │ │ │ │ ├── gsw.php
│ │ │ │ │ ├── gsw_CH.php
│ │ │ │ │ ├── gsw_FR.php
│ │ │ │ │ ├── gsw_LI.php
│ │ │ │ │ ├── gu.php
│ │ │ │ │ ├── gu_IN.php
│ │ │ │ │ ├── guz.php
│ │ │ │ │ ├── gv.php
│ │ │ │ │ ├── gv_GB.php
│ │ │ │ │ ├── ha.php
│ │ │ │ │ ├── ha_GH.php
│ │ │ │ │ ├── ha_NE.php
│ │ │ │ │ ├── ha_NG.php
│ │ │ │ │ ├── hak.php
│ │ │ │ │ ├── hak_TW.php
│ │ │ │ │ ├── haw.php
│ │ │ │ │ ├── he.php
│ │ │ │ │ ├── he_IL.php
│ │ │ │ │ ├── hi.php
│ │ │ │ │ ├── hi_IN.php
│ │ │ │ │ ├── hif.php
│ │ │ │ │ ├── hif_FJ.php
│ │ │ │ │ ├── hne.php
│ │ │ │ │ ├── hne_IN.php
│ │ │ │ │ ├── hr.php
│ │ │ │ │ ├── hr_BA.php
│ │ │ │ │ ├── hr_HR.php
│ │ │ │ │ ├── hsb.php
│ │ │ │ │ ├── hsb_DE.php
│ │ │ │ │ ├── ht.php
│ │ │ │ │ ├── ht_HT.php
│ │ │ │ │ ├── hu.php
│ │ │ │ │ ├── hu_HU.php
│ │ │ │ │ ├── hy.php
│ │ │ │ │ ├── hy_AM.php
│ │ │ │ │ ├── i18n.php
│ │ │ │ │ ├── ia.php
│ │ │ │ │ ├── ia_FR.php
│ │ │ │ │ ├── id.php
│ │ │ │ │ ├── id_ID.php
│ │ │ │ │ ├── ig.php
│ │ │ │ │ ├── ig_NG.php
│ │ │ │ │ ├── ii.php
│ │ │ │ │ ├── ik.php
│ │ │ │ │ ├── ik_CA.php
│ │ │ │ │ ├── in.php
│ │ │ │ │ ├── is.php
│ │ │ │ │ ├── is_IS.php
│ │ │ │ │ ├── it.php
│ │ │ │ │ ├── it_CH.php
│ │ │ │ │ ├── it_IT.php
│ │ │ │ │ ├── it_SM.php
│ │ │ │ │ ├── it_VA.php
│ │ │ │ │ ├── iu.php
│ │ │ │ │ ├── iu_CA.php
│ │ │ │ │ ├── iw.php
│ │ │ │ │ ├── ja.php
│ │ │ │ │ ├── ja_JP.php
│ │ │ │ │ ├── jgo.php
│ │ │ │ │ ├── jmc.php
│ │ │ │ │ ├── jv.php
│ │ │ │ │ ├── ka.php
│ │ │ │ │ ├── ka_GE.php
│ │ │ │ │ ├── kab.php
│ │ │ │ │ ├── kab_DZ.php
│ │ │ │ │ ├── kam.php
│ │ │ │ │ ├── kde.php
│ │ │ │ │ ├── kea.php
│ │ │ │ │ ├── khq.php
│ │ │ │ │ ├── ki.php
│ │ │ │ │ ├── kk.php
│ │ │ │ │ ├── kk_KZ.php
│ │ │ │ │ ├── kkj.php
│ │ │ │ │ ├── kl.php
│ │ │ │ │ ├── kl_GL.php
│ │ │ │ │ ├── kln.php
│ │ │ │ │ ├── km.php
│ │ │ │ │ ├── km_KH.php
│ │ │ │ │ ├── kn.php
│ │ │ │ │ ├── kn_IN.php
│ │ │ │ │ ├── ko.php
│ │ │ │ │ ├── ko_KP.php
│ │ │ │ │ ├── ko_KR.php
│ │ │ │ │ ├── kok.php
│ │ │ │ │ ├── kok_IN.php
│ │ │ │ │ ├── ks.php
│ │ │ │ │ ├── ks_IN.php
│ │ │ │ │ ├── ks_IN@devanagari.php
│ │ │ │ │ ├── ksb.php
│ │ │ │ │ ├── ksf.php
│ │ │ │ │ ├── ksh.php
│ │ │ │ │ ├── ku.php
│ │ │ │ │ ├── ku_TR.php
│ │ │ │ │ ├── kw.php
│ │ │ │ │ ├── kw_GB.php
│ │ │ │ │ ├── ky.php
│ │ │ │ │ ├── ky_KG.php
│ │ │ │ │ ├── lag.php
│ │ │ │ │ ├── lb.php
│ │ │ │ │ ├── lb_LU.php
│ │ │ │ │ ├── lg.php
│ │ │ │ │ ├── lg_UG.php
│ │ │ │ │ ├── li.php
│ │ │ │ │ ├── li_NL.php
│ │ │ │ │ ├── lij.php
│ │ │ │ │ ├── lij_IT.php
│ │ │ │ │ ├── lkt.php
│ │ │ │ │ ├── ln.php
│ │ │ │ │ ├── ln_AO.php
│ │ │ │ │ ├── ln_CD.php
│ │ │ │ │ ├── ln_CF.php
│ │ │ │ │ ├── ln_CG.php
│ │ │ │ │ ├── lo.php
│ │ │ │ │ ├── lo_LA.php
│ │ │ │ │ ├── lrc.php
│ │ │ │ │ ├── lrc_IQ.php
│ │ │ │ │ ├── lt.php
│ │ │ │ │ ├── lt_LT.php
│ │ │ │ │ ├── lu.php
│ │ │ │ │ ├── luo.php
│ │ │ │ │ ├── luy.php
│ │ │ │ │ ├── lv.php
│ │ │ │ │ ├── lv_LV.php
│ │ │ │ │ ├── lzh.php
│ │ │ │ │ ├── lzh_TW.php
│ │ │ │ │ ├── mag.php
│ │ │ │ │ ├── mag_IN.php
│ │ │ │ │ ├── mai.php
│ │ │ │ │ ├── mai_IN.php
│ │ │ │ │ ├── mas.php
│ │ │ │ │ ├── mas_TZ.php
│ │ │ │ │ ├── mer.php
│ │ │ │ │ ├── mfe.php
│ │ │ │ │ ├── mfe_MU.php
│ │ │ │ │ ├── mg.php
│ │ │ │ │ ├── mg_MG.php
│ │ │ │ │ ├── mgh.php
│ │ │ │ │ ├── mgo.php
│ │ │ │ │ ├── mhr.php
│ │ │ │ │ ├── mhr_RU.php
│ │ │ │ │ ├── mi.php
│ │ │ │ │ ├── mi_NZ.php
│ │ │ │ │ ├── miq.php
│ │ │ │ │ ├── miq_NI.php
│ │ │ │ │ ├── mjw.php
│ │ │ │ │ ├── mjw_IN.php
│ │ │ │ │ ├── mk.php
│ │ │ │ │ ├── mk_MK.php
│ │ │ │ │ ├── ml.php
│ │ │ │ │ ├── ml_IN.php
│ │ │ │ │ ├── mn.php
│ │ │ │ │ ├── mn_MN.php
│ │ │ │ │ ├── mni.php
│ │ │ │ │ ├── mni_IN.php
│ │ │ │ │ ├── mo.php
│ │ │ │ │ ├── mr.php
│ │ │ │ │ ├── mr_IN.php
│ │ │ │ │ ├── ms.php
│ │ │ │ │ ├── ms_BN.php
│ │ │ │ │ ├── ms_MY.php
│ │ │ │ │ ├── ms_SG.php
│ │ │ │ │ ├── mt.php
│ │ │ │ │ ├── mt_MT.php
│ │ │ │ │ ├── mua.php
│ │ │ │ │ ├── my.php
│ │ │ │ │ ├── my_MM.php
│ │ │ │ │ ├── mzn.php
│ │ │ │ │ ├── nan.php
│ │ │ │ │ ├── nan_TW.php
│ │ │ │ │ ├── nan_TW@latin.php
│ │ │ │ │ ├── naq.php
│ │ │ │ │ ├── nb.php
│ │ │ │ │ ├── nb_NO.php
│ │ │ │ │ ├── nb_SJ.php
│ │ │ │ │ ├── nd.php
│ │ │ │ │ ├── nds.php
│ │ │ │ │ ├── nds_DE.php
│ │ │ │ │ ├── nds_NL.php
│ │ │ │ │ ├── ne.php
│ │ │ │ │ ├── ne_IN.php
│ │ │ │ │ ├── ne_NP.php
│ │ │ │ │ ├── nhn.php
│ │ │ │ │ ├── nhn_MX.php
│ │ │ │ │ ├── niu.php
│ │ │ │ │ ├── niu_NU.php
│ │ │ │ │ ├── nl.php
│ │ │ │ │ ├── nl_AW.php
│ │ │ │ │ ├── nl_BE.php
│ │ │ │ │ ├── nl_BQ.php
│ │ │ │ │ ├── nl_CW.php
│ │ │ │ │ ├── nl_NL.php
│ │ │ │ │ ├── nl_SR.php
│ │ │ │ │ ├── nl_SX.php
│ │ │ │ │ ├── nmg.php
│ │ │ │ │ ├── nn.php
│ │ │ │ │ ├── nn_NO.php
│ │ │ │ │ ├── nnh.php
│ │ │ │ │ ├── no.php
│ │ │ │ │ ├── nr.php
│ │ │ │ │ ├── nr_ZA.php
│ │ │ │ │ ├── nso.php
│ │ │ │ │ ├── nso_ZA.php
│ │ │ │ │ ├── nus.php
│ │ │ │ │ ├── nyn.php
│ │ │ │ │ ├── oc.php
│ │ │ │ │ ├── oc_FR.php
│ │ │ │ │ ├── om.php
│ │ │ │ │ ├── om_ET.php
│ │ │ │ │ ├── om_KE.php
│ │ │ │ │ ├── or.php
│ │ │ │ │ ├── or_IN.php
│ │ │ │ │ ├── os.php
│ │ │ │ │ ├── os_RU.php
│ │ │ │ │ ├── pa.php
│ │ │ │ │ ├── pa_Arab.php
│ │ │ │ │ ├── pa_Guru.php
│ │ │ │ │ ├── pa_IN.php
│ │ │ │ │ ├── pa_PK.php
│ │ │ │ │ ├── pap.php
│ │ │ │ │ ├── pap_AW.php
│ │ │ │ │ ├── pap_CW.php
│ │ │ │ │ ├── pl.php
│ │ │ │ │ ├── pl_PL.php
│ │ │ │ │ ├── prg.php
│ │ │ │ │ ├── ps.php
│ │ │ │ │ ├── ps_AF.php
│ │ │ │ │ ├── pt.php
│ │ │ │ │ ├── pt_AO.php
│ │ │ │ │ ├── pt_BR.php
│ │ │ │ │ ├── pt_CH.php
│ │ │ │ │ ├── pt_CV.php
│ │ │ │ │ ├── pt_GQ.php
│ │ │ │ │ ├── pt_GW.php
│ │ │ │ │ ├── pt_LU.php
│ │ │ │ │ ├── pt_MO.php
│ │ │ │ │ ├── pt_MZ.php
│ │ │ │ │ ├── pt_PT.php
│ │ │ │ │ ├── pt_ST.php
│ │ │ │ │ ├── pt_TL.php
│ │ │ │ │ ├── qu.php
│ │ │ │ │ ├── qu_BO.php
│ │ │ │ │ ├── qu_EC.php
│ │ │ │ │ ├── quz.php
│ │ │ │ │ ├── quz_PE.php
│ │ │ │ │ ├── raj.php
│ │ │ │ │ ├── raj_IN.php
│ │ │ │ │ ├── rm.php
│ │ │ │ │ ├── rn.php
│ │ │ │ │ ├── ro.php
│ │ │ │ │ ├── ro_MD.php
│ │ │ │ │ ├── ro_RO.php
│ │ │ │ │ ├── rof.php
│ │ │ │ │ ├── ru.php
│ │ │ │ │ ├── ru_BY.php
│ │ │ │ │ ├── ru_KG.php
│ │ │ │ │ ├── ru_KZ.php
│ │ │ │ │ ├── ru_MD.php
│ │ │ │ │ ├── ru_RU.php
│ │ │ │ │ ├── ru_UA.php
│ │ │ │ │ ├── rw.php
│ │ │ │ │ ├── rw_RW.php
│ │ │ │ │ ├── rwk.php
│ │ │ │ │ ├── sa.php
│ │ │ │ │ ├── sa_IN.php
│ │ │ │ │ ├── sah.php
│ │ │ │ │ ├── sah_RU.php
│ │ │ │ │ ├── saq.php
│ │ │ │ │ ├── sat.php
│ │ │ │ │ ├── sat_IN.php
│ │ │ │ │ ├── sbp.php
│ │ │ │ │ ├── sc.php
│ │ │ │ │ ├── sc_IT.php
│ │ │ │ │ ├── sd.php
│ │ │ │ │ ├── sd_IN.php
│ │ │ │ │ ├── sd_IN@devanagari.php
│ │ │ │ │ ├── se.php
│ │ │ │ │ ├── se_FI.php
│ │ │ │ │ ├── se_NO.php
│ │ │ │ │ ├── se_SE.php
│ │ │ │ │ ├── seh.php
│ │ │ │ │ ├── ses.php
│ │ │ │ │ ├── sg.php
│ │ │ │ │ ├── sgs.php
│ │ │ │ │ ├── sgs_LT.php
│ │ │ │ │ ├── sh.php
│ │ │ │ │ ├── shi.php
│ │ │ │ │ ├── shi_Latn.php
│ │ │ │ │ ├── shi_Tfng.php
│ │ │ │ │ ├── shn.php
│ │ │ │ │ ├── shn_MM.php
│ │ │ │ │ ├── shs.php
│ │ │ │ │ ├── shs_CA.php
│ │ │ │ │ ├── si.php
│ │ │ │ │ ├── si_LK.php
│ │ │ │ │ ├── sid.php
│ │ │ │ │ ├── sid_ET.php
│ │ │ │ │ ├── sk.php
│ │ │ │ │ ├── sk_SK.php
│ │ │ │ │ ├── sl.php
│ │ │ │ │ ├── sl_SI.php
│ │ │ │ │ ├── sm.php
│ │ │ │ │ ├── sm_WS.php
│ │ │ │ │ ├── smn.php
│ │ │ │ │ ├── sn.php
│ │ │ │ │ ├── so.php
│ │ │ │ │ ├── so_DJ.php
│ │ │ │ │ ├── so_ET.php
│ │ │ │ │ ├── so_KE.php
│ │ │ │ │ ├── so_SO.php
│ │ │ │ │ ├── sq.php
│ │ │ │ │ ├── sq_AL.php
│ │ │ │ │ ├── sq_MK.php
│ │ │ │ │ ├── sq_XK.php
│ │ │ │ │ ├── sr.php
│ │ │ │ │ ├── sr_Cyrl.php
│ │ │ │ │ ├── sr_Cyrl_BA.php
│ │ │ │ │ ├── sr_Cyrl_ME.php
│ │ │ │ │ ├── sr_Cyrl_XK.php
│ │ │ │ │ ├── sr_Latn.php
│ │ │ │ │ ├── sr_Latn_BA.php
│ │ │ │ │ ├── sr_Latn_ME.php
│ │ │ │ │ ├── sr_Latn_XK.php
│ │ │ │ │ ├── sr_ME.php
│ │ │ │ │ ├── sr_RS.php
│ │ │ │ │ ├── sr_RS@latin.php
│ │ │ │ │ ├── ss.php
│ │ │ │ │ ├── ss_ZA.php
│ │ │ │ │ ├── st.php
│ │ │ │ │ ├── st_ZA.php
│ │ │ │ │ ├── sv.php
│ │ │ │ │ ├── sv_AX.php
│ │ │ │ │ ├── sv_FI.php
│ │ │ │ │ ├── sv_SE.php
│ │ │ │ │ ├── sw.php
│ │ │ │ │ ├── sw_CD.php
│ │ │ │ │ ├── sw_KE.php
│ │ │ │ │ ├── sw_TZ.php
│ │ │ │ │ ├── sw_UG.php
│ │ │ │ │ ├── szl.php
│ │ │ │ │ ├── szl_PL.php
│ │ │ │ │ ├── ta.php
│ │ │ │ │ ├── ta_IN.php
│ │ │ │ │ ├── ta_LK.php
│ │ │ │ │ ├── ta_MY.php
│ │ │ │ │ ├── ta_SG.php
│ │ │ │ │ ├── tcy.php
│ │ │ │ │ ├── tcy_IN.php
│ │ │ │ │ ├── te.php
│ │ │ │ │ ├── te_IN.php
│ │ │ │ │ ├── teo.php
│ │ │ │ │ ├── teo_KE.php
│ │ │ │ │ ├── tet.php
│ │ │ │ │ ├── tg.php
│ │ │ │ │ ├── tg_TJ.php
│ │ │ │ │ ├── th.php
│ │ │ │ │ ├── th_TH.php
│ │ │ │ │ ├── the.php
│ │ │ │ │ ├── the_NP.php
│ │ │ │ │ ├── ti.php
│ │ │ │ │ ├── ti_ER.php
│ │ │ │ │ ├── ti_ET.php
│ │ │ │ │ ├── tig.php
│ │ │ │ │ ├── tig_ER.php
│ │ │ │ │ ├── tk.php
│ │ │ │ │ ├── tk_TM.php
│ │ │ │ │ ├── tl.php
│ │ │ │ │ ├── tl_PH.php
│ │ │ │ │ ├── tlh.php
│ │ │ │ │ ├── tn.php
│ │ │ │ │ ├── tn_ZA.php
│ │ │ │ │ ├── to.php
│ │ │ │ │ ├── to_TO.php
│ │ │ │ │ ├── tpi.php
│ │ │ │ │ ├── tpi_PG.php
│ │ │ │ │ ├── tr.php
│ │ │ │ │ ├── tr_CY.php
│ │ │ │ │ ├── tr_TR.php
│ │ │ │ │ ├── ts.php
│ │ │ │ │ ├── ts_ZA.php
│ │ │ │ │ ├── tt.php
│ │ │ │ │ ├── tt_RU.php
│ │ │ │ │ ├── tt_RU@iqtelif.php
│ │ │ │ │ ├── twq.php
│ │ │ │ │ ├── tzl.php
│ │ │ │ │ ├── tzm.php
│ │ │ │ │ ├── tzm_Latn.php
│ │ │ │ │ ├── ug.php
│ │ │ │ │ ├── ug_CN.php
│ │ │ │ │ ├── uk.php
│ │ │ │ │ ├── uk_UA.php
│ │ │ │ │ ├── unm.php
│ │ │ │ │ ├── unm_US.php
│ │ │ │ │ ├── ur.php
│ │ │ │ │ ├── ur_IN.php
│ │ │ │ │ ├── ur_PK.php
│ │ │ │ │ ├── uz.php
│ │ │ │ │ ├── uz_Arab.php
│ │ │ │ │ ├── uz_Cyrl.php
│ │ │ │ │ ├── uz_Latn.php
│ │ │ │ │ ├── uz_UZ.php
│ │ │ │ │ ├── uz_UZ@cyrillic.php
│ │ │ │ │ ├── vai.php
│ │ │ │ │ ├── vai_Latn.php
│ │ │ │ │ ├── vai_Vaii.php
│ │ │ │ │ ├── ve.php
│ │ │ │ │ ├── ve_ZA.php
│ │ │ │ │ ├── vi.php
│ │ │ │ │ ├── vi_VN.php
│ │ │ │ │ ├── vo.php
│ │ │ │ │ ├── vun.php
│ │ │ │ │ ├── wa.php
│ │ │ │ │ ├── wa_BE.php
│ │ │ │ │ ├── wae.php
│ │ │ │ │ ├── wae_CH.php
│ │ │ │ │ ├── wal.php
│ │ │ │ │ ├── wal_ET.php
│ │ │ │ │ ├── wo.php
│ │ │ │ │ ├── wo_SN.php
│ │ │ │ │ ├── xh.php
│ │ │ │ │ ├── xh_ZA.php
│ │ │ │ │ ├── xog.php
│ │ │ │ │ ├── yav.php
│ │ │ │ │ ├── yi.php
│ │ │ │ │ ├── yi_US.php
│ │ │ │ │ ├── yo.php
│ │ │ │ │ ├── yo_BJ.php
│ │ │ │ │ ├── yo_NG.php
│ │ │ │ │ ├── yue.php
│ │ │ │ │ ├── yue_HK.php
│ │ │ │ │ ├── yue_Hans.php
│ │ │ │ │ ├── yue_Hant.php
│ │ │ │ │ ├── yuw.php
│ │ │ │ │ ├── yuw_PG.php
│ │ │ │ │ ├── zgh.php
│ │ │ │ │ ├── zh.php
│ │ │ │ │ ├── zh_CN.php
│ │ │ │ │ ├── zh_HK.php
│ │ │ │ │ ├── zh_Hans.php
│ │ │ │ │ ├── zh_Hans_HK.php
│ │ │ │ │ ├── zh_Hans_MO.php
│ │ │ │ │ ├── zh_Hans_SG.php
│ │ │ │ │ ├── zh_Hant.php
│ │ │ │ │ ├── zh_Hant_HK.php
│ │ │ │ │ ├── zh_Hant_MO.php
│ │ │ │ │ ├── zh_Hant_TW.php
│ │ │ │ │ ├── zh_MO.php
│ │ │ │ │ ├── zh_SG.php
│ │ │ │ │ ├── zh_TW.php
│ │ │ │ │ ├── zh_YUE.php
│ │ │ │ │ ├── zu.php
│ │ │ │ │ └── zu_ZA.php
│ │ │ │ ├── Language.php
│ │ │ │ ├── Laravel/
│ │ │ │ │ └── ServiceProvider.php
│ │ │ │ ├── List/
│ │ │ │ │ ├── languages.php
│ │ │ │ │ └── regions.php
│ │ │ │ ├── MessageFormatter/
│ │ │ │ │ └── MessageFormatterMapper.php
│ │ │ │ ├── PHPStan/
│ │ │ │ │ ├── AbstractMacro.php
│ │ │ │ │ ├── Macro.php
│ │ │ │ │ ├── MacroExtension.php
│ │ │ │ │ └── MacroScanner.php
│ │ │ │ ├── Traits/
│ │ │ │ │ ├── Boundaries.php
│ │ │ │ │ ├── Cast.php
│ │ │ │ │ ├── Comparison.php
│ │ │ │ │ ├── Converter.php
│ │ │ │ │ ├── Creator.php
│ │ │ │ │ ├── Date.php
│ │ │ │ │ ├── DeprecatedProperties.php
│ │ │ │ │ ├── Difference.php
│ │ │ │ │ ├── IntervalRounding.php
│ │ │ │ │ ├── IntervalStep.php
│ │ │ │ │ ├── Localization.php
│ │ │ │ │ ├── Macro.php
│ │ │ │ │ ├── MagicParameter.php
│ │ │ │ │ ├── Mixin.php
│ │ │ │ │ ├── Modifiers.php
│ │ │ │ │ ├── Mutability.php
│ │ │ │ │ ├── ObjectInitialisation.php
│ │ │ │ │ ├── Options.php
│ │ │ │ │ ├── Rounding.php
│ │ │ │ │ ├── Serialization.php
│ │ │ │ │ ├── Test.php
│ │ │ │ │ ├── Timestamp.php
│ │ │ │ │ ├── ToStringFormat.php
│ │ │ │ │ ├── Units.php
│ │ │ │ │ └── Week.php
│ │ │ │ ├── Translator.php
│ │ │ │ ├── TranslatorImmutable.php
│ │ │ │ └── TranslatorStrongTypeInterface.php
│ │ │ ├── paragonie/
│ │ │ │ └── random_compat/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── build-phar.sh
│ │ │ │ ├── composer.json
│ │ │ │ ├── dist/
│ │ │ │ │ ├── random_compat.phar.pubkey
│ │ │ │ │ └── random_compat.phar.pubkey.asc
│ │ │ │ ├── lib/
│ │ │ │ │ └── random.php
│ │ │ │ ├── other/
│ │ │ │ │ └── build_phar.php
│ │ │ │ ├── psalm-autoload.php
│ │ │ │ └── psalm.xml
│ │ │ ├── php-mime-mail-parser/
│ │ │ │ └── php-mime-mail-parser/
│ │ │ │ ├── .github/
│ │ │ │ │ └── workflows/
│ │ │ │ │ └── main.yml
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── compile_mailparse.sh
│ │ │ │ ├── composer.json
│ │ │ │ ├── mailparse-stubs.php
│ │ │ │ ├── phpunit.xml.dist
│ │ │ │ └── src/
│ │ │ │ ├── Attachment.php
│ │ │ │ ├── Charset.php
│ │ │ │ ├── Contracts/
│ │ │ │ │ ├── CharsetManager.php
│ │ │ │ │ └── Middleware.php
│ │ │ │ ├── Exception.php
│ │ │ │ ├── Middleware.php
│ │ │ │ ├── MiddlewareStack.php
│ │ │ │ ├── MimePart.php
│ │ │ │ └── Parser.php
│ │ │ ├── phpmailer/
│ │ │ │ └── phpmailer/
│ │ │ │ ├── COMMITMENT
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── SECURITY.md
│ │ │ │ ├── VERSION
│ │ │ │ ├── composer.json
│ │ │ │ ├── get_oauth_token.php
│ │ │ │ ├── language/
│ │ │ │ │ ├── phpmailer.lang-af.php
│ │ │ │ │ ├── phpmailer.lang-ar.php
│ │ │ │ │ ├── phpmailer.lang-az.php
│ │ │ │ │ ├── phpmailer.lang-ba.php
│ │ │ │ │ ├── phpmailer.lang-be.php
│ │ │ │ │ ├── phpmailer.lang-bg.php
│ │ │ │ │ ├── phpmailer.lang-ca.php
│ │ │ │ │ ├── phpmailer.lang-ch.php
│ │ │ │ │ ├── phpmailer.lang-cs.php
│ │ │ │ │ ├── phpmailer.lang-da.php
│ │ │ │ │ ├── phpmailer.lang-de.php
│ │ │ │ │ ├── phpmailer.lang-el.php
│ │ │ │ │ ├── phpmailer.lang-eo.php
│ │ │ │ │ ├── phpmailer.lang-es.php
│ │ │ │ │ ├── phpmailer.lang-et.php
│ │ │ │ │ ├── phpmailer.lang-fa.php
│ │ │ │ │ ├── phpmailer.lang-fi.php
│ │ │ │ │ ├── phpmailer.lang-fo.php
│ │ │ │ │ ├── phpmailer.lang-fr.php
│ │ │ │ │ ├── phpmailer.lang-gl.php
│ │ │ │ │ ├── phpmailer.lang-he.php
│ │ │ │ │ ├── phpmailer.lang-hi.php
│ │ │ │ │ ├── phpmailer.lang-hr.php
│ │ │ │ │ ├── phpmailer.lang-hu.php
│ │ │ │ │ ├── phpmailer.lang-hy.php
│ │ │ │ │ ├── phpmailer.lang-id.php
│ │ │ │ │ ├── phpmailer.lang-it.php
│ │ │ │ │ ├── phpmailer.lang-ja.php
│ │ │ │ │ ├── phpmailer.lang-ka.php
│ │ │ │ │ ├── phpmailer.lang-ko.php
│ │ │ │ │ ├── phpmailer.lang-lt.php
│ │ │ │ │ ├── phpmailer.lang-lv.php
│ │ │ │ │ ├── phpmailer.lang-mg.php
│ │ │ │ │ ├── phpmailer.lang-ms.php
│ │ │ │ │ ├── phpmailer.lang-nb.php
│ │ │ │ │ ├── phpmailer.lang-nl.php
│ │ │ │ │ ├── phpmailer.lang-pl.php
│ │ │ │ │ ├── phpmailer.lang-pt.php
│ │ │ │ │ ├── phpmailer.lang-pt_br.php
│ │ │ │ │ ├── phpmailer.lang-ro.php
│ │ │ │ │ ├── phpmailer.lang-ru.php
│ │ │ │ │ ├── phpmailer.lang-sk.php
│ │ │ │ │ ├── phpmailer.lang-sl.php
│ │ │ │ │ ├── phpmailer.lang-sr.php
│ │ │ │ │ ├── phpmailer.lang-sr_latn.php
│ │ │ │ │ ├── phpmailer.lang-sv.php
│ │ │ │ │ ├── phpmailer.lang-tl.php
│ │ │ │ │ ├── phpmailer.lang-tr.php
│ │ │ │ │ ├── phpmailer.lang-uk.php
│ │ │ │ │ ├── phpmailer.lang-vi.php
│ │ │ │ │ ├── phpmailer.lang-zh.php
│ │ │ │ │ └── phpmailer.lang-zh_cn.php
│ │ │ │ └── src/
│ │ │ │ ├── Exception.php
│ │ │ │ ├── OAuth.php
│ │ │ │ ├── OAuthTokenProvider.php
│ │ │ │ ├── PHPMailer.php
│ │ │ │ ├── POP3.php
│ │ │ │ └── SMTP.php
│ │ │ ├── psr/
│ │ │ │ ├── clock/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── composer.json
│ │ │ │ │ └── src/
│ │ │ │ │ └── ClockInterface.php
│ │ │ │ ├── container/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── composer.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── ContainerExceptionInterface.php
│ │ │ │ │ ├── ContainerInterface.php
│ │ │ │ │ └── NotFoundExceptionInterface.php
│ │ │ │ ├── http-client/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── composer.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── ClientExceptionInterface.php
│ │ │ │ │ ├── ClientInterface.php
│ │ │ │ │ ├── NetworkExceptionInterface.php
│ │ │ │ │ └── RequestExceptionInterface.php
│ │ │ │ ├── http-message/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── composer.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── MessageInterface.php
│ │ │ │ │ ├── RequestInterface.php
│ │ │ │ │ ├── ResponseInterface.php
│ │ │ │ │ ├── ServerRequestInterface.php
│ │ │ │ │ ├── StreamInterface.php
│ │ │ │ │ ├── UploadedFileInterface.php
│ │ │ │ │ └── UriInterface.php
│ │ │ │ ├── log/
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── composer.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── AbstractLogger.php
│ │ │ │ │ ├── InvalidArgumentException.php
│ │ │ │ │ ├── LogLevel.php
│ │ │ │ │ ├── LoggerAwareInterface.php
│ │ │ │ │ ├── LoggerAwareTrait.php
│ │ │ │ │ ├── LoggerInterface.php
│ │ │ │ │ ├── LoggerTrait.php
│ │ │ │ │ └── NullLogger.php
│ │ │ │ └── simple-cache/
│ │ │ │ ├── .editorconfig
│ │ │ │ ├── LICENSE.md
│ │ │ │ ├── README.md
│ │ │ │ ├── composer.json
│ │ │ │ └── src/
│ │ │ │ ├── CacheException.php
│ │ │ │ ├── CacheInterface.php
│ │ │ │ └── InvalidArgumentException.php
│ │ │ ├── ralouphie/
│ │ │ │ └── getallheaders/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── composer.json
│ │ │ │ └── src/
│ │ │ │ └── getallheaders.php
│ │ │ ├── robthree/
│ │ │ │ └── twofactorauth/
│ │ │ │ ├── .github/
│ │ │ │ │ ├── FUNDING.yml
│ │ │ │ │ └── workflows/
│ │ │ │ │ └── test.yml
│ │ │ │ ├── .gitignore
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── TwoFactorAuth.phpproj
│ │ │ │ ├── TwoFactorAuth.sln
│ │ │ │ ├── composer.json
│ │ │ │ ├── demo/
│ │ │ │ │ └── demo.php
│ │ │ │ ├── docs/
│ │ │ │ │ ├── _config.yml
│ │ │ │ │ ├── _layouts/
│ │ │ │ │ │ └── post.html
│ │ │ │ │ ├── assets/
│ │ │ │ │ │ └── css/
│ │ │ │ │ │ └── style.scss
│ │ │ │ │ ├── getting-started.md
│ │ │ │ │ ├── improved-code-verification.md
│ │ │ │ │ ├── index.md
│ │ │ │ │ ├── optional-configuration.md
│ │ │ │ │ ├── qr-codes/
│ │ │ │ │ │ ├── bacon.md
│ │ │ │ │ │ ├── endroid.md
│ │ │ │ │ │ ├── image-charts.md
│ │ │ │ │ │ ├── qr-server.md
│ │ │ │ │ │ └── qrickit.md
│ │ │ │ │ └── qr-codes.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── Providers/
│ │ │ │ │ │ ├── Qr/
│ │ │ │ │ │ │ ├── BaconQrCodeProvider.php
│ │ │ │ │ │ │ ├── BaseHTTPQRCodeProvider.php
│ │ │ │ │ │ │ ├── EndroidQrCodeProvider.php
│ │ │ │ │ │ │ ├── EndroidQrCodeWithLogoProvider.php
│ │ │ │ │ │ │ ├── GoogleChartsQrCodeProvider.php
│ │ │ │ │ │ │ ├── IQRCodeProvider.php
│ │ │ │ │ │ │ ├── ImageChartsQRCodeProvider.php
│ │ │ │ │ │ │ ├── QRException.php
│ │ │ │ │ │ │ ├── QRServerProvider.php
│ │ │ │ │ │ │ └── QRicketProvider.php
│ │ │ │ │ │ ├── Rng/
│ │ │ │ │ │ │ ├── CSRNGProvider.php
│ │ │ │ │ │ │ ├── HashRNGProvider.php
│ │ │ │ │ │ │ ├── IRNGProvider.php
│ │ │ │ │ │ │ ├── MCryptRNGProvider.php
│ │ │ │ │ │ │ ├── OpenSSLRNGProvider.php
│ │ │ │ │ │ │ └── RNGException.php
│ │ │ │ │ │ └── Time/
│ │ │ │ │ │ ├── HttpTimeProvider.php
│ │ │ │ │ │ ├── ITimeProvider.php
│ │ │ │ │ │ ├── LocalMachineTimeProvider.php
│ │ │ │ │ │ ├── NTPTimeProvider.php
│ │ │ │ │ │ └── TimeException.php
│ │ │ │ │ ├── TwoFactorAuth.php
│ │ │ │ │ └── TwoFactorAuthException.php
│ │ │ │ ├── phpunit.xml
│ │ │ │ └── tests/
│ │ │ │ ├── MightNotMakeAssertions.php
│ │ │ │ ├── Providers/
│ │ │ │ │ ├── Qr/
│ │ │ │ │ │ ├── IQRCodeProviderTest.php
│ │ │ │ │ │ └── TestQrProvider.php
│ │ │ │ │ ├── Rng/
│ │ │ │ │ │ ├── CSRNGProviderTest.php
│ │ │ │ │ │ ├── HashRNGProviderTest.php
│ │ │ │ │ │ ├── IRNGProviderTest.php
│ │ │ │ │ │ ├── MCryptRNGProviderTest.php
│ │ │ │ │ │ ├── NeedsRngLengths.php
│ │ │ │ │ │ ├── OpenSSLRNGProviderTest.php
│ │ │ │ │ │ └── TestRNGProvider.php
│ │ │ │ │ └── Time/
│ │ │ │ │ ├── ITimeProviderTest.php
│ │ │ │ │ └── TestTimeProvider.php
│ │ │ │ └── TwoFactorAuthTest.php
│ │ │ ├── stevenmaguire/
│ │ │ │ └── oauth2-keycloak/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .scrutinizer.yml
│ │ │ │ ├── .travis.yml
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── CONTRIBUTING.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── composer.json
│ │ │ │ ├── examples/
│ │ │ │ │ └── index.php
│ │ │ │ ├── phpunit.xml.dist
│ │ │ │ ├── src/
│ │ │ │ │ └── Provider/
│ │ │ │ │ ├── Exception/
│ │ │ │ │ │ └── EncryptionConfigurationException.php
│ │ │ │ │ ├── Keycloak.php
│ │ │ │ │ └── KeycloakResourceOwner.php
│ │ │ │ └── test/
│ │ │ │ └── src/
│ │ │ │ └── Provider/
│ │ │ │ └── KeycloakTest.php
│ │ │ ├── symfony/
│ │ │ │ ├── deprecation-contracts/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── composer.json
│ │ │ │ │ └── function.php
│ │ │ │ ├── polyfill-ctype/
│ │ │ │ │ ├── Ctype.php
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── bootstrap.php
│ │ │ │ │ ├── bootstrap80.php
│ │ │ │ │ └── composer.json
│ │ │ │ ├── polyfill-mbstring/
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── Mbstring.php
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── Resources/
│ │ │ │ │ │ └── unidata/
│ │ │ │ │ │ ├── caseFolding.php
│ │ │ │ │ │ ├── lowerCase.php
│ │ │ │ │ │ ├── titleCaseRegexp.php
│ │ │ │ │ │ └── upperCase.php
│ │ │ │ │ ├── bootstrap.php
│ │ │ │ │ ├── bootstrap80.php
│ │ │ │ │ └── composer.json
│ │ │ │ ├── polyfill-php80/
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── Php80.php
│ │ │ │ │ ├── PhpToken.php
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── Resources/
│ │ │ │ │ │ └── stubs/
│ │ │ │ │ │ ├── Attribute.php
│ │ │ │ │ │ ├── PhpToken.php
│ │ │ │ │ │ ├── Stringable.php
│ │ │ │ │ │ ├── UnhandledMatchError.php
│ │ │ │ │ │ └── ValueError.php
│ │ │ │ │ ├── bootstrap.php
│ │ │ │ │ └── composer.json
│ │ │ │ ├── polyfill-php81/
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── Php81.php
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── Resources/
│ │ │ │ │ │ └── stubs/
│ │ │ │ │ │ ├── CURLStringFile.php
│ │ │ │ │ │ └── ReturnTypeWillChange.php
│ │ │ │ │ ├── bootstrap.php
│ │ │ │ │ └── composer.json
│ │ │ │ ├── translation/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── Catalogue/
│ │ │ │ │ │ ├── AbstractOperation.php
│ │ │ │ │ │ ├── MergeOperation.php
│ │ │ │ │ │ ├── OperationInterface.php
│ │ │ │ │ │ └── TargetOperation.php
│ │ │ │ │ ├── CatalogueMetadataAwareInterface.php
│ │ │ │ │ ├── Command/
│ │ │ │ │ │ ├── TranslationPullCommand.php
│ │ │ │ │ │ ├── TranslationPushCommand.php
│ │ │ │ │ │ ├── TranslationTrait.php
│ │ │ │ │ │ └── XliffLintCommand.php
│ │ │ │ │ ├── DataCollector/
│ │ │ │ │ │ └── TranslationDataCollector.php
│ │ │ │ │ ├── DataCollectorTranslator.php
│ │ │ │ │ ├── DependencyInjection/
│ │ │ │ │ │ ├── DataCollectorTranslatorPass.php
│ │ │ │ │ │ ├── LoggingTranslatorPass.php
│ │ │ │ │ │ ├── TranslationDumperPass.php
│ │ │ │ │ │ ├── TranslationExtractorPass.php
│ │ │ │ │ │ ├── TranslatorPass.php
│ │ │ │ │ │ └── TranslatorPathsPass.php
│ │ │ │ │ ├── Dumper/
│ │ │ │ │ │ ├── CsvFileDumper.php
│ │ │ │ │ │ ├── DumperInterface.php
│ │ │ │ │ │ ├── FileDumper.php
│ │ │ │ │ │ ├── IcuResFileDumper.php
│ │ │ │ │ │ ├── IniFileDumper.php
│ │ │ │ │ │ ├── JsonFileDumper.php
│ │ │ │ │ │ ├── MoFileDumper.php
│ │ │ │ │ │ ├── PhpFileDumper.php
│ │ │ │ │ │ ├── PoFileDumper.php
│ │ │ │ │ │ ├── QtFileDumper.php
│ │ │ │ │ │ ├── XliffFileDumper.php
│ │ │ │ │ │ └── YamlFileDumper.php
│ │ │ │ │ ├── Exception/
│ │ │ │ │ │ ├── ExceptionInterface.php
│ │ │ │ │ │ ├── IncompleteDsnException.php
│ │ │ │ │ │ ├── InvalidArgumentException.php
│ │ │ │ │ │ ├── InvalidResourceException.php
│ │ │ │ │ │ ├── LogicException.php
│ │ │ │ │ │ ├── MissingRequiredOptionException.php
│ │ │ │ │ │ ├── NotFoundResourceException.php
│ │ │ │ │ │ ├── ProviderException.php
│ │ │ │ │ │ ├── ProviderExceptionInterface.php
│ │ │ │ │ │ ├── RuntimeException.php
│ │ │ │ │ │ └── UnsupportedSchemeException.php
│ │ │ │ │ ├── Extractor/
│ │ │ │ │ │ ├── AbstractFileExtractor.php
│ │ │ │ │ │ ├── ChainExtractor.php
│ │ │ │ │ │ ├── ExtractorInterface.php
│ │ │ │ │ │ ├── PhpAstExtractor.php
│ │ │ │ │ │ ├── PhpExtractor.php
│ │ │ │ │ │ ├── PhpStringTokenParser.php
│ │ │ │ │ │ └── Visitor/
│ │ │ │ │ │ ├── AbstractVisitor.php
│ │ │ │ │ │ ├── ConstraintVisitor.php
│ │ │ │ │ │ ├── TransMethodVisitor.php
│ │ │ │ │ │ └── TranslatableMessageVisitor.php
│ │ │ │ │ ├── Formatter/
│ │ │ │ │ │ ├── IntlFormatter.php
│ │ │ │ │ │ ├── IntlFormatterInterface.php
│ │ │ │ │ │ ├── MessageFormatter.php
│ │ │ │ │ │ └── MessageFormatterInterface.php
│ │ │ │ │ ├── IdentityTranslator.php
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── Loader/
│ │ │ │ │ │ ├── ArrayLoader.php
│ │ │ │ │ │ ├── CsvFileLoader.php
│ │ │ │ │ │ ├── FileLoader.php
│ │ │ │ │ │ ├── IcuDatFileLoader.php
│ │ │ │ │ │ ├── IcuResFileLoader.php
│ │ │ │ │ │ ├── IniFileLoader.php
│ │ │ │ │ │ ├── JsonFileLoader.php
│ │ │ │ │ │ ├── LoaderInterface.php
│ │ │ │ │ │ ├── MoFileLoader.php
│ │ │ │ │ │ ├── PhpFileLoader.php
│ │ │ │ │ │ ├── PoFileLoader.php
│ │ │ │ │ │ ├── QtFileLoader.php
│ │ │ │ │ │ ├── XliffFileLoader.php
│ │ │ │ │ │ └── YamlFileLoader.php
│ │ │ │ │ ├── LocaleSwitcher.php
│ │ │ │ │ ├── LoggingTranslator.php
│ │ │ │ │ ├── MessageCatalogue.php
│ │ │ │ │ ├── MessageCatalogueInterface.php
│ │ │ │ │ ├── MetadataAwareInterface.php
│ │ │ │ │ ├── Provider/
│ │ │ │ │ │ ├── AbstractProviderFactory.php
│ │ │ │ │ │ ├── Dsn.php
│ │ │ │ │ │ ├── FilteringProvider.php
│ │ │ │ │ │ ├── NullProvider.php
│ │ │ │ │ │ ├── NullProviderFactory.php
│ │ │ │ │ │ ├── ProviderFactoryInterface.php
│ │ │ │ │ │ ├── ProviderInterface.php
│ │ │ │ │ │ ├── TranslationProviderCollection.php
│ │ │ │ │ │ └── TranslationProviderCollectionFactory.php
│ │ │ │ │ ├── PseudoLocalizationTranslator.php
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── Reader/
│ │ │ │ │ │ ├── TranslationReader.php
│ │ │ │ │ │ └── TranslationReaderInterface.php
│ │ │ │ │ ├── Resources/
│ │ │ │ │ │ ├── bin/
│ │ │ │ │ │ │ └── translation-status.php
│ │ │ │ │ │ ├── data/
│ │ │ │ │ │ │ └── parents.json
│ │ │ │ │ │ ├── functions.php
│ │ │ │ │ │ └── schemas/
│ │ │ │ │ │ ├── xliff-core-1.2-transitional.xsd
│ │ │ │ │ │ ├── xliff-core-2.0.xsd
│ │ │ │ │ │ └── xml.xsd
│ │ │ │ │ ├── Test/
│ │ │ │ │ │ ├── ProviderFactoryTestCase.php
│ │ │ │ │ │ └── ProviderTestCase.php
│ │ │ │ │ ├── TranslatableMessage.php
│ │ │ │ │ ├── Translator.php
│ │ │ │ │ ├── TranslatorBag.php
│ │ │ │ │ ├── TranslatorBagInterface.php
│ │ │ │ │ ├── Util/
│ │ │ │ │ │ ├── ArrayConverter.php
│ │ │ │ │ │ └── XliffUtils.php
│ │ │ │ │ ├── Writer/
│ │ │ │ │ │ ├── TranslationWriter.php
│ │ │ │ │ │ └── TranslationWriterInterface.php
│ │ │ │ │ └── composer.json
│ │ │ │ └── translation-contracts/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── LocaleAwareInterface.php
│ │ │ │ ├── README.md
│ │ │ │ ├── Test/
│ │ │ │ │ └── TranslatorTest.php
│ │ │ │ ├── TranslatableInterface.php
│ │ │ │ ├── TranslatorInterface.php
│ │ │ │ ├── TranslatorTrait.php
│ │ │ │ └── composer.json
│ │ │ └── twig/
│ │ │ └── twig/
│ │ │ ├── CHANGELOG
│ │ │ ├── LICENSE
│ │ │ ├── README.rst
│ │ │ ├── composer.json
│ │ │ └── src/
│ │ │ ├── AbstractTwigCallable.php
│ │ │ ├── Attribute/
│ │ │ │ ├── FirstClassTwigCallableReady.php
│ │ │ │ └── YieldReady.php
│ │ │ ├── Cache/
│ │ │ │ ├── CacheInterface.php
│ │ │ │ ├── ChainCache.php
│ │ │ │ ├── FilesystemCache.php
│ │ │ │ ├── NullCache.php
│ │ │ │ └── ReadOnlyFilesystemCache.php
│ │ │ ├── Compiler.php
│ │ │ ├── Environment.php
│ │ │ ├── Error/
│ │ │ │ ├── Error.php
│ │ │ │ ├── LoaderError.php
│ │ │ │ ├── RuntimeError.php
│ │ │ │ └── SyntaxError.php
│ │ │ ├── ExpressionParser.php
│ │ │ ├── Extension/
│ │ │ │ ├── AbstractExtension.php
│ │ │ │ ├── CoreExtension.php
│ │ │ │ ├── DebugExtension.php
│ │ │ │ ├── EscaperExtension.php
│ │ │ │ ├── ExtensionInterface.php
│ │ │ │ ├── GlobalsInterface.php
│ │ │ │ ├── OptimizerExtension.php
│ │ │ │ ├── ProfilerExtension.php
│ │ │ │ ├── RuntimeExtensionInterface.php
│ │ │ │ ├── SandboxExtension.php
│ │ │ │ ├── StagingExtension.php
│ │ │ │ ├── StringLoaderExtension.php
│ │ │ │ └── YieldNotReadyExtension.php
│ │ │ ├── ExtensionSet.php
│ │ │ ├── FileExtensionEscapingStrategy.php
│ │ │ ├── Lexer.php
│ │ │ ├── Loader/
│ │ │ │ ├── ArrayLoader.php
│ │ │ │ ├── ChainLoader.php
│ │ │ │ ├── FilesystemLoader.php
│ │ │ │ └── LoaderInterface.php
│ │ │ ├── Markup.php
│ │ │ ├── Node/
│ │ │ │ ├── AutoEscapeNode.php
│ │ │ │ ├── BlockNode.php
│ │ │ │ ├── BlockReferenceNode.php
│ │ │ │ ├── BodyNode.php
│ │ │ │ ├── CaptureNode.php
│ │ │ │ ├── CheckSecurityCallNode.php
│ │ │ │ ├── CheckSecurityNode.php
│ │ │ │ ├── CheckToStringNode.php
│ │ │ │ ├── DeprecatedNode.php
│ │ │ │ ├── DoNode.php
│ │ │ │ ├── EmbedNode.php
│ │ │ │ ├── Expression/
│ │ │ │ │ ├── AbstractExpression.php
│ │ │ │ │ ├── ArrayExpression.php
│ │ │ │ │ ├── ArrowFunctionExpression.php
│ │ │ │ │ ├── AssignNameExpression.php
│ │ │ │ │ ├── Binary/
│ │ │ │ │ │ ├── AbstractBinary.php
│ │ │ │ │ │ ├── AddBinary.php
│ │ │ │ │ │ ├── AndBinary.php
│ │ │ │ │ │ ├── BitwiseAndBinary.php
│ │ │ │ │ │ ├── BitwiseOrBinary.php
│ │ │ │ │ │ ├── BitwiseXorBinary.php
│ │ │ │ │ │ ├── ConcatBinary.php
│ │ │ │ │ │ ├── DivBinary.php
│ │ │ │ │ │ ├── EndsWithBinary.php
│ │ │ │ │ │ ├── EqualBinary.php
│ │ │ │ │ │ ├── FloorDivBinary.php
│ │ │ │ │ │ ├── GreaterBinary.php
│ │ │ │ │ │ ├── GreaterEqualBinary.php
│ │ │ │ │ │ ├── HasEveryBinary.php
│ │ │ │ │ │ ├── HasSomeBinary.php
│ │ │ │ │ │ ├── InBinary.php
│ │ │ │ │ │ ├── LessBinary.php
│ │ │ │ │ │ ├── LessEqualBinary.php
│ │ │ │ │ │ ├── MatchesBinary.php
│ │ │ │ │ │ ├── ModBinary.php
│ │ │ │ │ │ ├── MulBinary.php
│ │ │ │ │ │ ├── NotEqualBinary.php
│ │ │ │ │ │ ├── NotInBinary.php
│ │ │ │ │ │ ├── OrBinary.php
│ │ │ │ │ │ ├── PowerBinary.php
│ │ │ │ │ │ ├── RangeBinary.php
│ │ │ │ │ │ ├── SpaceshipBinary.php
│ │ │ │ │ │ ├── StartsWithBinary.php
│ │ │ │ │ │ └── SubBinary.php
│ │ │ │ │ ├── BlockReferenceExpression.php
│ │ │ │ │ ├── CallExpression.php
│ │ │ │ │ ├── ConditionalExpression.php
│ │ │ │ │ ├── ConstantExpression.php
│ │ │ │ │ ├── Filter/
│ │ │ │ │ │ ├── DefaultFilter.php
│ │ │ │ │ │ └── RawFilter.php
│ │ │ │ │ ├── FilterExpression.php
│ │ │ │ │ ├── FunctionExpression.php
│ │ │ │ │ ├── FunctionNode/
│ │ │ │ │ │ └── EnumCasesFunction.php
│ │ │ │ │ ├── GetAttrExpression.php
│ │ │ │ │ ├── InlinePrint.php
│ │ │ │ │ ├── MethodCallExpression.php
│ │ │ │ │ ├── NameExpression.php
│ │ │ │ │ ├── NullCoalesceExpression.php
│ │ │ │ │ ├── ParentExpression.php
│ │ │ │ │ ├── TempNameExpression.php
│ │ │ │ │ ├── Test/
│ │ │ │ │ │ ├── ConstantTest.php
│ │ │ │ │ │ ├── DefinedTest.php
│ │ │ │ │ │ ├── DivisiblebyTest.php
│ │ │ │ │ │ ├── EvenTest.php
│ │ │ │ │ │ ├── NullTest.php
│ │ │ │ │ │ ├── OddTest.php
│ │ │ │ │ │ └── SameasTest.php
│ │ │ │ │ ├── TestExpression.php
│ │ │ │ │ ├── Unary/
│ │ │ │ │ │ ├── AbstractUnary.php
│ │ │ │ │ │ ├── NegUnary.php
│ │ │ │ │ │ ├── NotUnary.php
│ │ │ │ │ │ └── PosUnary.php
│ │ │ │ │ └── VariadicExpression.php
│ │ │ │ ├── FlushNode.php
│ │ │ │ ├── ForLoopNode.php
│ │ │ │ ├── ForNode.php
│ │ │ │ ├── IfNode.php
│ │ │ │ ├── ImportNode.php
│ │ │ │ ├── IncludeNode.php
│ │ │ │ ├── MacroNode.php
│ │ │ │ ├── ModuleNode.php
│ │ │ │ ├── NameDeprecation.php
│ │ │ │ ├── Node.php
│ │ │ │ ├── NodeCaptureInterface.php
│ │ │ │ ├── NodeOutputInterface.php
│ │ │ │ ├── PrintNode.php
│ │ │ │ ├── SandboxNode.php
│ │ │ │ ├── SetNode.php
│ │ │ │ ├── TextNode.php
│ │ │ │ ├── TypesNode.php
│ │ │ │ └── WithNode.php
│ │ │ ├── NodeTraverser.php
│ │ │ ├── NodeVisitor/
│ │ │ │ ├── AbstractNodeVisitor.php
│ │ │ │ ├── EscaperNodeVisitor.php
│ │ │ │ ├── MacroAutoImportNodeVisitor.php
│ │ │ │ ├── NodeVisitorInterface.php
│ │ │ │ ├── OptimizerNodeVisitor.php
│ │ │ │ ├── SafeAnalysisNodeVisitor.php
│ │ │ │ ├── SandboxNodeVisitor.php
│ │ │ │ └── YieldNotReadyNodeVisitor.php
│ │ │ ├── Parser.php
│ │ │ ├── Profiler/
│ │ │ │ ├── Dumper/
│ │ │ │ │ ├── BaseDumper.php
│ │ │ │ │ ├── BlackfireDumper.php
│ │ │ │ │ ├── HtmlDumper.php
│ │ │ │ │ └── TextDumper.php
│ │ │ │ ├── Node/
│ │ │ │ │ ├── EnterProfileNode.php
│ │ │ │ │ └── LeaveProfileNode.php
│ │ │ │ ├── NodeVisitor/
│ │ │ │ │ └── ProfilerNodeVisitor.php
│ │ │ │ └── Profile.php
│ │ │ ├── Resources/
│ │ │ │ ├── core.php
│ │ │ │ ├── debug.php
│ │ │ │ ├── escaper.php
│ │ │ │ └── string_loader.php
│ │ │ ├── Runtime/
│ │ │ │ └── EscaperRuntime.php
│ │ │ ├── RuntimeLoader/
│ │ │ │ ├── ContainerRuntimeLoader.php
│ │ │ │ ├── FactoryRuntimeLoader.php
│ │ │ │ └── RuntimeLoaderInterface.php
│ │ │ ├── Sandbox/
│ │ │ │ ├── SecurityError.php
│ │ │ │ ├── SecurityNotAllowedFilterError.php
│ │ │ │ ├── SecurityNotAllowedFunctionError.php
│ │ │ │ ├── SecurityNotAllowedMethodError.php
│ │ │ │ ├── SecurityNotAllowedPropertyError.php
│ │ │ │ ├── SecurityNotAllowedTagError.php
│ │ │ │ ├── SecurityPolicy.php
│ │ │ │ ├── SecurityPolicyInterface.php
│ │ │ │ └── SourcePolicyInterface.php
│ │ │ ├── Source.php
│ │ │ ├── Template.php
│ │ │ ├── TemplateWrapper.php
│ │ │ ├── Test/
│ │ │ │ ├── IntegrationTestCase.php
│ │ │ │ └── NodeTestCase.php
│ │ │ ├── Token.php
│ │ │ ├── TokenParser/
│ │ │ │ ├── AbstractTokenParser.php
│ │ │ │ ├── ApplyTokenParser.php
│ │ │ │ ├── AutoEscapeTokenParser.php
│ │ │ │ ├── BlockTokenParser.php
│ │ │ │ ├── DeprecatedTokenParser.php
│ │ │ │ ├── DoTokenParser.php
│ │ │ │ ├── EmbedTokenParser.php
│ │ │ │ ├── ExtendsTokenParser.php
│ │ │ │ ├── FlushTokenParser.php
│ │ │ │ ├── ForTokenParser.php
│ │ │ │ ├── FromTokenParser.php
│ │ │ │ ├── IfTokenParser.php
│ │ │ │ ├── ImportTokenParser.php
│ │ │ │ ├── IncludeTokenParser.php
│ │ │ │ ├── MacroTokenParser.php
│ │ │ │ ├── SandboxTokenParser.php
│ │ │ │ ├── SetTokenParser.php
│ │ │ │ ├── TokenParserInterface.php
│ │ │ │ ├── TypesTokenParser.php
│ │ │ │ ├── UseTokenParser.php
│ │ │ │ └── WithTokenParser.php
│ │ │ ├── TokenStream.php
│ │ │ ├── TwigCallableInterface.php
│ │ │ ├── TwigFilter.php
│ │ │ ├── TwigFunction.php
│ │ │ ├── TwigTest.php
│ │ │ └── Util/
│ │ │ ├── CallableArgumentsExtractor.php
│ │ │ ├── DeprecationCollector.php
│ │ │ ├── ReflectionCallable.php
│ │ │ └── TemplateDirIterator.php
│ │ ├── prerequisites.inc.php
│ │ ├── presets/
│ │ │ ├── rspamd/
│ │ │ │ ├── preset_1.yml
│ │ │ │ ├── preset_3.yml
│ │ │ │ └── preset_4.yml
│ │ │ └── sieve/
│ │ │ ├── sieve_1.yml
│ │ │ ├── sieve_2.yml
│ │ │ ├── sieve_3.yml
│ │ │ ├── sieve_4.yml
│ │ │ ├── sieve_5.yml
│ │ │ ├── sieve_6.yml
│ │ │ ├── sieve_7.yml
│ │ │ └── sieve_8.yml
│ │ ├── sessions.inc.php
│ │ ├── spf.inc.php
│ │ ├── triggers.admin.inc.php
│ │ ├── triggers.domainadmin.inc.php
│ │ ├── triggers.global.inc.php
│ │ ├── triggers.user.inc.php
│ │ ├── twig.inc.php
│ │ └── vars.inc.php
│ ├── index.php
│ ├── js/
│ │ ├── build/
│ │ │ ├── 003-bootstrap-select.js
│ │ │ ├── 004-datatables.js
│ │ │ ├── 007-chart.js
│ │ │ ├── 008-chartjs-plugin-datalabels.js
│ │ │ ├── 011-api.js
│ │ │ └── 013-mailcow.js
│ │ ├── presets/
│ │ │ ├── rspamd.js
│ │ │ └── sieveMailbox.js
│ │ └── site/
│ │ ├── admin.js
│ │ ├── dashboard.js
│ │ ├── edit.js
│ │ ├── index.js
│ │ ├── mailbox.js
│ │ ├── pwgen.js
│ │ ├── qhandler.js
│ │ ├── quarantine.js
│ │ ├── queue.js
│ │ └── user.js
│ ├── json_api.php
│ ├── lang/
│ │ ├── lang.bg-bg.json
│ │ ├── lang.ca-es.json
│ │ ├── lang.cs-cz.json
│ │ ├── lang.da-dk.json
│ │ ├── lang.de-de.json
│ │ ├── lang.en-gb.json
│ │ ├── lang.es-es.json
│ │ ├── lang.fi-fi.json
│ │ ├── lang.fr-fr.json
│ │ ├── lang.gr-gr.json
│ │ ├── lang.hu-hu.json
│ │ ├── lang.it-it.json
│ │ ├── lang.ja-jp.json
│ │ ├── lang.ko-kr.json
│ │ ├── lang.lt-lt.json
│ │ ├── lang.lv-lv.json
│ │ ├── lang.nb-no.json
│ │ ├── lang.nl-nl.json
│ │ ├── lang.pl-pl.json
│ │ ├── lang.pt-br.json
│ │ ├── lang.pt-pt.json
│ │ ├── lang.ro-ro.json
│ │ ├── lang.ru-ru.json
│ │ ├── lang.si-si.json
│ │ ├── lang.sk-sk.json
│ │ ├── lang.sv-se.json
│ │ ├── lang.tr-tr.json
│ │ ├── lang.uk-ua.json
│ │ ├── lang.vi-vn.json
│ │ ├── lang.zh-cn.json
│ │ └── lang.zh-tw.json
│ ├── mobileconfig.php
│ ├── mta-sts.php
│ ├── oauth/
│ │ ├── authorize.php
│ │ ├── profile.php
│ │ └── token.php
│ ├── qhandler.php
│ ├── quarantine.php
│ ├── reset-password.php
│ ├── resource.php
│ ├── robots.txt
│ ├── sogo-auth.php
│ ├── templates/
│ │ ├── admin/
│ │ │ ├── customize/
│ │ │ │ └── logo.twig
│ │ │ ├── tab-config-admins.twig
│ │ │ ├── tab-config-customize.twig
│ │ │ ├── tab-config-dkim.twig
│ │ │ ├── tab-config-f2b.twig
│ │ │ ├── tab-config-fwdhosts.twig
│ │ │ ├── tab-config-identity-provider.twig
│ │ │ ├── tab-config-oauth2.twig
│ │ │ ├── tab-config-password-settings.twig
│ │ │ ├── tab-config-quarantine.twig
│ │ │ ├── tab-config-quota.twig
│ │ │ ├── tab-config-rsettings.twig
│ │ │ ├── tab-config-rspamd.twig
│ │ │ ├── tab-globalfilter-regex.twig
│ │ │ ├── tab-ldap.twig
│ │ │ ├── tab-routing.twig
│ │ │ └── tab-sys-mails.twig
│ │ ├── admin.twig
│ │ ├── admin_index.twig
│ │ ├── base.twig
│ │ ├── cache/
│ │ │ └── .gitkeep
│ │ ├── dashboard.twig
│ │ ├── domainadmin.twig
│ │ ├── domainadmin_index.twig
│ │ ├── edit/
│ │ │ ├── admin.twig
│ │ │ ├── alias.twig
│ │ │ ├── aliasdomain.twig
│ │ │ ├── app-passwd.twig
│ │ │ ├── bcc.twig
│ │ │ ├── domain-templates.twig
│ │ │ ├── domain.twig
│ │ │ ├── domainadmin.twig
│ │ │ ├── filter.twig
│ │ │ ├── mailbox-templates.twig
│ │ │ ├── mailbox.twig
│ │ │ ├── oauth2client.twig
│ │ │ ├── recipient_map.twig
│ │ │ ├── relayhost.twig
│ │ │ ├── resource.twig
│ │ │ ├── syncjob.twig
│ │ │ ├── tls_policy_map.twig
│ │ │ └── transport.twig
│ │ ├── edit.twig
│ │ ├── fido2.twig
│ │ ├── mailbox/
│ │ │ ├── rl-frame.twig
│ │ │ ├── tab-bcc.twig
│ │ │ ├── tab-domain-aliases.twig
│ │ │ ├── tab-domains.twig
│ │ │ ├── tab-filters.twig
│ │ │ ├── tab-mailboxes.twig
│ │ │ ├── tab-mbox-aliases.twig
│ │ │ ├── tab-resources.twig
│ │ │ ├── tab-syncjobs.twig
│ │ │ ├── tab-templates-domains.twig
│ │ │ ├── tab-templates-mbox.twig
│ │ │ └── tab-tls-policy.twig
│ │ ├── mailbox.twig
│ │ ├── modals/
│ │ │ ├── admin.twig
│ │ │ ├── footer.twig
│ │ │ ├── mailbox.twig
│ │ │ ├── quarantine.twig
│ │ │ ├── queue.twig
│ │ │ └── user.twig
│ │ ├── oauth/
│ │ │ └── authorize.twig
│ │ ├── qhandler.twig
│ │ ├── quarantine.twig
│ │ ├── queue.twig
│ │ ├── reset-password.twig
│ │ ├── tfa_keys.twig
│ │ ├── user/
│ │ │ ├── AppPasswds.twig
│ │ │ ├── Pushover.twig
│ │ │ ├── SpamAliases.twig
│ │ │ ├── Spamfilter.twig
│ │ │ ├── Syncjobs.twig
│ │ │ ├── tab-user-auth.twig
│ │ │ ├── tab-user-details.twig
│ │ │ └── tab-user-settings.twig
│ │ ├── user.twig
│ │ ├── user_domainadmin_common.twig
│ │ └── user_index.twig
│ └── user.php
├── docker-compose.yml
├── generate_config.sh
├── helper-scripts/
│ ├── _cold-standby.sh
│ ├── add-new-lang-keys.php
│ ├── backup_and_restore.sh
│ ├── check_translations.rb
│ ├── dev_tests/
│ │ ├── test_backup_and_restore.sh
│ │ └── view_autodiscover.sh
│ ├── expiry-dates.sh
│ ├── generate_caa_record.py
│ ├── mailcow-reset-admin.sh
│ ├── reset-learns.sh
│ ├── update_compose.sh
│ └── update_postscreen_whitelist.sh
└── update.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# editorconfig.org
root = true
[*]
# Change these settings to your own preference
indent_style = space
indent_size = 2
# We recommend you to keep these unchanged
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
================================================
FILE: .github/FUNDING.yml
================================================
github: mailcow
custom: ["https://www.servercow.de/mailcow?lang=en#sal"]
================================================
FILE: .github/ISSUE_TEMPLATE/Bug_report.yml
================================================
name: 🐞 Bug Report
description: Report a reproducible bug for mailcow. (NOT to be used for support questions.)
labels: ["bug"]
body:
- type: checkboxes
attributes:
label: Contribution guidelines
description: Please read the contribution guidelines before proceeding.
options:
- label: I've read the [contribution guidelines](https://github.com/mailcow/mailcow-dockerized/blob/master/CONTRIBUTING.md) and wholeheartedly agree
required: true
- type: checkboxes
attributes:
label: Checklist prior issue creation
description: Prior to creating the issue...
options:
- label: I understand that failure to follow below instructions may cause this issue to be closed.
required: true
- label: I understand that vague, incomplete or inaccurate information may cause this issue to be closed.
required: true
- label: I understand that this form is intended solely for reporting software bugs and not for support-related inquiries.
required: true
- label: I understand that all responses are voluntary and community-driven, and do not constitute commercial support.
required: true
- label: I confirm that I have reviewed previous [issues](https://github.com/mailcow/mailcow-dockerized/issues) to ensure this matter has not already been addressed.
required: true
- label: I confirm that my environment meets all [prerequisite requirements](https://docs.mailcow.email/getstarted/prerequisite-system/) as specified in the official documentation.
required: true
- type: textarea
attributes:
label: Description
description: Please provide a brief description of the bug. If applicable, add screenshots to help explain your problem. (Very useful for bugs in mailcow UI.)
validations:
required: true
- type: textarea
attributes:
label: "Steps to reproduce:"
description: "Please describe the steps to reproduce the bug. Screenshots can be added, if helpful."
placeholder: |-
1. ...
2. ...
3. ...
validations:
required: true
- type: textarea
attributes:
label: "Logs:"
description: "Please take a look at the [official documentation](https://docs.mailcow.email/troubleshooting/debug-logs/) and post the last few lines of logs, when the error occurs. For example, docker container logs of affected containers. This will be automatically formatted into code, so no need for backticks."
render: plain text
validations:
required: true
- type: markdown
attributes:
value: |
## System information
In this stage we would kindly ask you to attach general system information about your setup.
- type: dropdown
attributes:
label: "Which branch are you using?"
description: "#### Run: `git rev-parse --abbrev-ref HEAD`"
multiple: false
options:
- master (stable)
- staging
- nightly
validations:
required: true
- type: dropdown
attributes:
label: "Which architecture are you using?"
description: "#### Run: `uname -m`"
multiple: false
options:
- x86_64
- ARM64 (aarch64)
validations:
required: true
- type: input
attributes:
label: "Operating System:"
description: "#### Run: `lsb_release -ds`"
placeholder: "e.g. Ubuntu 22.04 LTS"
validations:
required: true
- type: input
attributes:
label: "Server/VM specifications:"
placeholder: "Memory, CPU Cores"
validations:
required: true
- type: input
attributes:
label: "Is Apparmor, SELinux or similar active?"
placeholder: "yes/no"
validations:
required: true
- type: input
attributes:
label: "Virtualization technology:"
description: "LXC and OpenVZ are not supported!"
placeholder: "KVM, VMware ESXi, Xen, etc"
validations:
required: true
- type: input
attributes:
label: "Docker version:"
description: "#### Run: `docker version`"
placeholder: "20.10.21"
validations:
required: true
- type: input
attributes:
label: "docker-compose version or docker compose version:"
description: "#### Run: `docker-compose version` or `docker compose version`"
placeholder: "v2.12.2"
validations:
required: true
- type: input
attributes:
label: "mailcow version:"
description: "#### Run: ```git describe --tags `git rev-list --tags --max-count=1` ```"
placeholder: "2022-08x"
validations:
required: true
- type: input
attributes:
label: "Reverse proxy:"
placeholder: "e.g. nginx/Traefik, or none"
validations:
required: true
- type: textarea
attributes:
label: "Logs of git diff:"
description: "#### Output of `git diff origin/master`, any other changes to the code? Sanitize if needed. If so, **please post them**:"
render: plain text
validations:
required: false
- type: textarea
attributes:
label: "Logs of iptables -L -vn:"
description: "#### Output of `iptables -L -vn`"
render: plain text
validations:
required: true
- type: textarea
attributes:
label: "Logs of ip6tables -L -vn:"
description: "#### Output of `ip6tables -L -vn`"
render: plain text
validations:
required: true
- type: textarea
attributes:
label: "Logs of iptables -L -vn -t nat:"
description: "#### Output of `iptables -L -vn -t nat`"
render: plain text
validations:
required: true
- type: textarea
attributes:
label: "Logs of ip6tables -L -vn -t nat:"
description: "#### Output of `ip6tables -L -vn -t nat`"
render: plain text
validations:
required: true
- type: textarea
attributes:
label: "DNS check:"
description: "#### Output of `docker exec -it $(docker ps -qf name=acme-mailcow) dig +short stackoverflow.com @172.22.1.254` (set the IP accordingly, if you changed the internal mailcow network)"
render: plain text
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/Feature_request.yml
================================================
name: 💡 Feature Request
description: Suggest an idea for mailcow.
labels: ["enhancement"]
body:
- type: textarea
attributes:
label: Summary
description: Please describe your idea in a reasonable amount of detail.
validations:
required: true
- type: textarea
attributes:
label: Motivation
description: Please describe how your idea would benefit you and other users.
validations:
required: true
- type: textarea
attributes:
label: Additional context
description: Add any other context or screenshots about the feature request.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: ❓ Community-driven support (Free)
url: https://docs.mailcow.email/#community-support-and-chat
about: Please use the community forum for questions or assistance
- name: 🔥 Premium Support (Paid)
url: https://www.servercow.de/mailcow?lang=en#support
about: Buy a support subscription for any critical issues and get assisted by the mailcow Team. See conditions!
- name: 🚨 Report a security vulnerability
url: "mailto:info@servercow.de?subject=mailcow: dockerized Security Vulnerability"
about: Please give us appropriate time to verify, respond and fix before disclosure.
================================================
FILE: .github/ISSUE_TEMPLATE/pr_to_nighty_template.yml
================================================
## :file_folder: Modified files
<!-- Diff files - START -->
<!-- Diff files - END -->
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!-- _Please make sure to review and check all of these items, otherwise we might refuse your PR:_ -->
## Contribution Guidelines
* [ ] I've read the [contribution guidelines](https://github.com/mailcow/mailcow-dockerized/blob/master/CONTRIBUTING.md) and wholeheartedly agree them
<!-- _NOTE: this tickbox is needed to fullfil on order to get your PR reviewed._ -->
## What does this PR include?
### Short Description
<!-- Please write a short description, what your PR does here. -->
### Affected Containers
<!-- Please list all affected Docker containers here, which you commited changes to -->
<!--
Please list them like this:
- container1
- container2
- container3
etc.
-->
## Did you run tests?
### What did you tested?
<!-- Please write shortly, what you've tested (which components etc.). -->
### What were the final results? (Awaited, got)
<!-- Please write shortly, what your final tests results were. What did you awaited? Was the outcome the awaited one? -->
================================================
FILE: .github/renovate.json
================================================
{
"enabled": true,
"timezone": "Europe/Berlin",
"dependencyDashboard": true,
"dependencyDashboardTitle": "Renovate Dashboard",
"commitBody": "Signed-off-by: milkmaker <milkmaker@mailcow.de>",
"rebaseWhen": "auto",
"labels": ["renovate"],
"assignees": [
"@magiccc"
],
"baseBranches": ["staging"],
"enabledManagers": ["github-actions", "regex", "docker-compose"],
"ignorePaths": [
"data\/web\/inc\/lib\/vendor\/**"
],
"regexManagers": [
{
"fileMatch": ["(^|/)Dockerfile[^/]*$"],
"matchStrings": [
"#\\srenovate:\\sdatasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?( extractVersion=(?<extractVersion>.*?))?\\s(ENV|ARG) .*?_VERSION=(?<currentValue>.*)\\s"
]
}
]
}
================================================
FILE: .github/workflows/check_if_support_labeled.yml
================================================
name: Check if labeled support, if so send message and close issue
on:
issues:
types:
- labeled
jobs:
add-comment:
if: github.event.label.name == 'support'
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- name: Add comment
run: gh issue comment "$NUMBER" --body "$BODY"
env:
GH_TOKEN: ${{ secrets.SUPPORTISSUES_ACTION_PAT }}
GH_REPO: ${{ github.repository }}
NUMBER: ${{ github.event.issue.number }}
BODY: |
**THIS IS A AUTOMATED MESSAGE!**
It seems your issue is not a bug.
Therefore we highly advise you to get support!
You can get support either by:
- ordering a paid [support contract at Servercow](https://www.servercow.de/mailcow?lang=en#support/) (Directly from the developers) or
- using the [community forum](https://community.mailcow.email) (**Based on volunteers! NO guaranteed answer**) or
- using the [Telegram support channel](https://t.me/mailcow) (**Based on volunteers! NO guaranteed answer**)
This issue will be closed. If you think your reported issue is not a support case feel free to comment above and if so the issue will reopened.
- name: Close issue
env:
GH_TOKEN: ${{ secrets.SUPPORTISSUES_ACTION_PAT }}
GH_REPO: ${{ github.repository }}
NUMBER: ${{ github.event.issue.number }}
run: gh issue close "$NUMBER" -r "not planned"
================================================
FILE: .github/workflows/check_prs_if_on_staging.yml
================================================
name: Check PRs if on staging
on:
pull_request_target:
types: [opened, edited]
permissions: {}
jobs:
is_not_staging:
runs-on: ubuntu-latest
if: github.event.pull_request.base.ref != 'staging' #check if the target branch is not staging
steps:
- name: Send message
uses: thollander/actions-comment-pull-request@v3.0.1
with:
github-token: ${{ secrets.CHECKIFPRISSTAGING_ACTION_PAT }}
message: |
Thanks for contributing!
I noticed that you didn't select `staging` as your base branch. Please change the base branch to `staging`.
See the attached picture on how to change the base branch to `staging`:

- name: Fail #we want to see failed checks in the PR
if: ${{ success() }} #set exit code to 1 even if commenting somehow failed
run: exit 1
is_staging:
runs-on: ubuntu-latest
if: github.event.pull_request.base.ref == 'staging' #check if the target branch is staging
steps:
- name: Success
run: exit 0
================================================
FILE: .github/workflows/close_old_issues_and_prs.yml
================================================
name: 'Close stale issues and PRs'
on:
schedule:
# Once every day at midnight UTC
- cron: "0 0 * * *"
workflow_dispatch: # Allow to run workflow manually
issue_comment: # Run workflow on comments
jobs:
stale:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- name: Mark/Close Stale Issues and Pull Requests 🗑️
uses: actions/stale@v10.2.0
with:
repo-token: ${{ secrets.STALE_ACTION_PAT }}
days-before-stale: 60
days-before-close: 7
stale-issue-message: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs.
stale-pr-message: >
This pull request has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs.
exempt-issue-labels: "pinned,security,enhancement,investigating,neverstale"
exempt-pr-labels: "pinned,security,enhancement,investigating,neverstale"
stale-issue-label: "stale"
stale-pr-label: "stale"
exempt-draft-pr: "true"
close-issue-reason: "not_planned"
operations-per-run: "250"
ascending: "true"
#DRY-RUN
debug-only: "false"
================================================
FILE: .github/workflows/image_builds.yml
================================================
name: Build mailcow Docker Images
on:
push:
branches: [ "master", "staging" ]
workflow_dispatch:
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
docker_image_builds:
strategy:
matrix:
images:
- "acme-mailcow"
- "clamd-mailcow"
- "dockerapi-mailcow"
- "dovecot-mailcow"
- "netfilter-mailcow"
- "olefy-mailcow"
- "php-fpm-mailcow"
- "postfix-mailcow"
- "rspamd-mailcow"
- "sogo-mailcow"
- "unbound-mailcow"
- "watchdog-mailcow"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup Docker
run: |
curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh
sudo service docker start
- name: Prepair Image Builds
run: |
cp helper-scripts/docker-compose.override.yml.d/BUILD_FLAGS/docker-compose.override.yml docker-compose.override.yml
- name: Build Docker Images
run: |
docker compose build ${image}
env:
image: ${{ matrix.images }}
================================================
FILE: .github/workflows/pr_to_nightly.yml
================================================
name: Create PR to merge to nightly from staging
on:
push:
branches:
- staging
jobs:
action-pull-request:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Run the Action
uses: devops-infra/action-pull-request@v1.0.2
with:
github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }}
title: Automatic PR to nightly from ${{ github.event.repository.updated_at}}
assignee: DerLinkman
source_branch: staging
target_branch: nightly
reviewer: DerLinkman
label: upstream
template: .github/ISSUE_TEMPLATE/pr_to_nighty_template.yml
get_diff: true
================================================
FILE: .github/workflows/rebuild_backup_image.yml
================================================
name: Build mailcow backup image
on:
schedule:
# At 00:00 on Sunday
- cron: "0 0 * * 0"
workflow_dispatch: # Allow to run workflow manually
jobs:
docker_image_build:
runs-on: ubuntu-latest
permissions:
packages: write
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Login to GHCR
if: github.event_name != 'pull_request'
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v7
with:
context: .
platforms: linux/amd64,linux/arm64
file: data/Dockerfiles/backup/Dockerfile
push: true
tags: ghcr.io/mailcow/backup:latest
================================================
FILE: .github/workflows/update_postscreen_access_list.yml
================================================
name: Update postscreen_access.cidr
on:
schedule:
# Monthly
- cron: "0 0 1 * *"
workflow_dispatch: # Allow to run workflow manually
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
Update-postscreen_access_cidr:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Generate postscreen_access.cidr
run: |
bash helper-scripts/update_postscreen_whitelist.sh
- name: Create Pull Request
uses: peter-evans/create-pull-request@v8
with:
token: ${{ secrets.mailcow_action_Update_postscreen_access_cidr_pat }}
commit-message: update postscreen_access.cidr
committer: milkmaker <milkmaker@mailcow.de>
author: milkmaker <milkmaker@mailcow.de>
signoff: false
branch: update/postscreen_access.cidr
base: staging
delete-branch: true
add-paths: |
data/conf/postfix/postscreen_access.cidr
title: '[Postfix] update postscreen_access.cidr'
body: |
This PR updates the postscreen_access.cidr using GitHub Actions and [helper-scripts/update_postscreen_whitelist.sh](https://github.com/mailcow/mailcow-dockerized/blob/master/helper-scripts/update_postscreen_whitelist.sh)
================================================
FILE: .gitignore
================================================
!data/conf/nginx/dynmaps.conf
!data/conf/nginx/meta_exporter.conf
!data/conf/nginx/site.conf
!/**/.gitkeep
*.iml
.idea
.vscode/*
data/assets/ssl-example/*
data/assets/ssl/*
data/conf/borgmatic/
data/conf/clamav/whitelist.ign2
data/conf/dovecot/acl_anyone
data/conf/dovecot/dovecot-master.passwd
data/conf/dovecot/dovecot-master.userdb
data/conf/dovecot/extra.conf
data/conf/dovecot/mail_replica.conf
data/conf/dovecot/global_sieve_*
data/conf/dovecot/last_login
data/conf/dovecot/lua
data/conf/dovecot/mail_plugins*
data/conf/dovecot/shared_namespace.conf
data/conf/dovecot/sni.conf
data/conf/dovecot/sogo-sso.conf
data/conf/dovecot/sogo_trusted_ip.conf
data/conf/dovecot/sql
data/conf/dovecot/conf.d/fts.conf
data/conf/nextcloud-*.bak
data/conf/nginx/*.active
data/conf/nginx/*.bak
data/conf/nginx/*.conf
data/conf/nginx/*.custom
data/conf/phpfpm/sogo-sso/sogo-sso.pass
data/conf/portainer/
data/conf/postfix/allow_mailcow_local.regexp
data/conf/postfix/custom_postscreen_whitelist.cidr
data/conf/postfix/custom_transport.pcre
data/conf/postfix/extra.cf
data/conf/postfix/sni.map
data/conf/postfix/sni.map.db
data/conf/postfix/sql
data/conf/postfix/dns_blocklists.cf
data/conf/postfix/dnsbl_reply.map
data/conf/rspamd/custom/*
data/conf/rspamd/local.d/*
data/conf/rspamd/override.d/*
data/conf/sogo/custom-theme.js
data/conf/sogo/plist_ldap
data/conf/sogo/plist_ldap.sh
data/conf/sogo/sieve.creds
data/conf/sogo/cron.creds
data/conf/sogo/custom-fulllogo.svg
data/conf/sogo/custom-shortlogo.svg
data/conf/sogo/custom-fulllogo.png
data/conf/acme/dns-01.conf
data/gitea/
data/gogs/
data/hooks/dovecot/*
data/hooks/phpfpm/*
data/hooks/postfix/*
data/hooks/rspamd/*
data/hooks/sogo/*
data/hooks/unbound/*
data/web/templates/cache/*
!data/web/templates/cache/.gitkeep
data/web/.well-known/acme-challenge
data/web/css/build/0081-custom-mailcow.css
data/web/inc/vars.local.inc.php
data/web/inc/app_info.inc.php
data/web/nextcloud*/
data/web/rc*/
docker-compose.override.yml
mailcow.conf
mailcow.conf_backup
rebuild-images.sh
refresh_images.sh
update_diffs/
create_cold_standby.sh
!data/conf/nginx/mailcow_auth.conf
data/conf/postfix/postfix-tlspol
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, documentation edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at info@servercow.de. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
================================================
FILE: CONTRIBUTING.md
================================================
# Contribution Guidelines
**_Last modified on 12th November 2025_**
First of all, thank you for wanting to provide a bugfix or a new feature for the mailcow community, it's because of your help that the project can continue to grow!
As we want to keep mailcow's development structured we setup these Guidelines which helps you to create your issue/pull request accordingly.
**PLEASE NOTE, THAT WE WILL CLOSE ISSUES/PULL REQUESTS IF THEY DON'T FULFILL OUR WRITTEN GUIDELINES WRITTEN INSIDE THIS DOCUMENT**. So please check this guidelines before you propose a Issue/Pull Request.
## Topics
- [Pull Requests](#pull-requests)
- [Issue Reporting](#issue-reporting)
- [Guidelines](#issue-reporting-guidelines)
- [Issue Report Guide](#issue-report-guide)
## Pull Requests
**_Last modified on 15th August 2024_**
However, please note the following regarding pull requests:
1. **ALWAYS** create your PR using the staging branch of your locally cloned mailcow instance, as the pull request will end up in said staging branch of mailcow once approved. Ideally, you should simply create a new branch for your pull request that is named after the type of your PR (e.g. `feat/` for function updates or `fix/` for bug fixes) and the actual content (e.g. `sogo-6.0.0` for an update from SOGo to version 6 or `html-escape` for a fix that includes escaping HTML in mailcow).
2. **ALWAYS** report/request issues/features in the english language, even though mailcow is a german based company. This is done to allow other GitHub users to reply to your issues/requests too which did not speak german or other languages besides english.
3. Please **keep** this pull request branch **clean** and free of commits that have nothing to do with the changes you have made (e.g. commits from other users from other branches). *If you make changes to the `update.sh` script or other scripts that trigger a commit, there is usually a developer mode for clean working in this case.*
4. **Test your changes before you commit them as a pull request.** <ins>If possible</ins>, write a small **test log** or demonstrate the functionality with a **screenshot or GIF**. *We will of course also test your pull request ourselves, but proof from you will save us the question of whether you have tested your own changes yourself.*
5. **Please use** the pull request template we provide once creating a pull request. *HINT: During editing you encounter comments which looks like: `<!-- CONTENT -->`. These can be removed or kept, as they will not rendered later on GitHub! Please only create actual content without the said comments.*
6. Please **ALWAYS** create the actual pull request against the staging branch and **NEVER** directly against the master branch. *If you forget to do this, our moobot will remind you to switch the branch to staging.*
7. Wait for a merge commit: It may happen that we do not accept your pull request immediately or sometimes not at all for various reasons. Please do not be disappointed if this is the case. We always endeavor to incorporate any meaningful changes from the community into the mailcow project.
8. If you are planning larger and therefore more complex pull requests, it would be advisable to first announce this in a separate issue and then start implementing it after the idea has been accepted in order to avoid unnecessary frustration and effort!
9. If your PR requires a Docker image rebuild (changes to Dockerfiles or files in data/Dockerfiles/), update the image tag in docker-compose.yml. Use the base-image versioning (e.g. ghcr.io/mailcow/sogo:5.12.4 → :5.12.5 for version bumps; append a letter for patch fixes, e.g. :5.12.4a). Follow this scheme.
---
## Issue Reporting
**_Last modified on 12th November 2025_**
If you plan to report a issue within mailcow please read and understand the following rules:
### Security disclosures / Security-related fixes
- Security vulnerabilities and security fixes must always be reported confidentially first to the contact address specified in SECURITY.md before they are integrated, published, or publicly disclosed in issues/PRs. Please wait for a response from the specified contact to ensure coordinated and responsible disclosure.
### Issue Reporting Guidelines
1. **ONLY** use the issue tracker for bug reports or improvement requests and NOT for support questions. For support questions you can either contact the [mailcow community on Telegram](https://docs.mailcow.email/#community-support-and-chat) or the mailcow team directly in exchange for a [support fee](https://docs.mailcow.email/#commercial-support).
2. **ONLY** report an error if you have the **necessary know-how (at least the basics)** for the administration of an e-mail server and the usage of Docker. mailcow is a complex and fully-fledged e-mail server including groupware components on a Docker basement and it requires a bit of technical know-how for debugging and operating.
3. **ALWAYS** report/request issues/features in the english language, even though mailcow is a german based company. This is done to allow other GitHub users to reply to your issues/requests too which did not speak german or other languages besides english.
4. **ONLY** report bugs that are contained in the latest mailcow release series. *The definition of the latest release series includes the last major patch (e.g. 2023-12) and all minor patches (revisions) below it (e.g. 2023-12a, b, c etc.).* New issue reports published starting from January 1, 2024 must meet this criterion, as versions below the latest releases are no longer supported by us.
5. When reporting a problem, please be as detailed as possible and include even the smallest changes to your mailcow installation. Simply fill out the corresponding bug report form in detail and accurately to minimize possible questions.
6. **Before you open an issue/feature request**, please first check whether a similar request already exists in the mailcow tracker on GitHub. If so, please include yourself in this request.
7. When you create a issue/feature request: Please note that the creation does <ins>**not guarantee an instant implementation or fix by the mailcow team or the community**</ins>.
8. Please **ALWAYS** anonymize any sensitive information in your bug report or feature request before submitting it.
### Issue Report Guide
1. Read your logs; follow them to see what the reason for your problem is.
2. Follow the leads given to you in your logfiles and start investigating.
3. Restarting the troubled service or the whole stack to see if the problem persists.
4. Read the [documentation](https://docs.mailcow.email/) of the troubled service and search its bugtracker for your problem.
5. Search our [issues](https://github.com/mailcow/mailcow-dockerized/issues) for your problem.
6. [Create an issue](https://github.com/mailcow/mailcow-dockerized/issues/new/choose) over at our GitHub repository if you think your problem might be a bug or a missing feature you badly need. But please make sure, that you include **all the logs** and a full description to your problem.
7. Ask your questions in our community-driven [support channels](https://docs.mailcow.email/#community-support-and-chat).
## When creating an issue/feature request or a pull request, you will be asked to confirm these guidelines.
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{one line to give the program's name and a brief idea of what it does.}
Copyright (C) {year} {name of author}
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
# mailcow: dockerized - 🐮 + 🐋 = 💕
[](https://translate.mailcow.email/engage/mailcow-dockerized/)
[](https://twitter.com/mailcow_email)

## Want to support mailcow?
Please [consider a support contract with Servercow](https://www.servercow.de/mailcow?lang=en#support) to support further development. _We_ support _you_ while _you_ support _us_. :)
You can also [get a SAL](https://www.servercow.de/mailcow?lang=en#sal) which is a one-time payment with no liabilities or returning fees.
Or just spread the word: moo.
## Many thanks to our GitHub Sponsors ❤️
A big thank you to everyone supporting us on GitHub Sponsors—your contributions mean the world to us! Special thanks to the following amazing supporters:
### 100$/Month Sponsors
<a href="https://www.colba.net/" target=_blank><img
src="https://avatars.githubusercontent.com/u/204464723" height="58"
/></a>
<a href="https://www.maehdros.com/" target=_blank><img
src="https://avatars.githubusercontent.com/u/173894712" height="58"
/></a>
### 50$/Month Sponsors
<a href="https://github.com/vnukhr" target=_blank><img
src="https://avatars.githubusercontent.com/u/7805987?s=52&v=4" height="58"
/></a>
## Info, documentation and support
Please see [the official documentation](https://docs.mailcow.email/) for installation and support instructions. 🐄
🐛 **If you found a critical security issue, please mail us to [info at servercow.de](mailto:info@servercow.de).**
## Cowmunity
[mailcow community](https://community.mailcow.email)
[Telegram mailcow channel](https://telegram.me/mailcow)
[Telegram mailcow Off-Topic channel](https://t.me/mailcowOfftopic)
[Official 𝕏 (Twitter) Account](https://twitter.com/mailcow_email)
[Official Mastodon Account](https://mailcow.social/@doncow)
Telegram desktop clients are available for [multiple platforms](https://desktop.telegram.org). You can search the groups history for keywords.
## Misc
**Important**: mailcow makes use of various open-source software. Please assure you agree with their license before using mailcow.
Any part of mailcow itself is released under **GNU General Public License, Version 3**.
mailcow is a registered word mark of The Infrastructure Company GmbH, Parkstr. 42, 47877 Willich, Germany.
The project is managed and maintained by The Infrastructure Company GmbH.
Originated from @andryyy (André)
================================================
FILE: SECURITY.md
================================================
# Security Policies and Procedures
This document outlines security procedures and general policies for the _mailcow: dockerized_ project as found on [mailcow-dockerized](https://github.com/mailcow/mailcow-dockerized).
* [Reporting a Vulnerability](#reporting-a-vulnerability)
* [Disclosure Policy](#disclosure-policy)
* [Comments on this Policy](#comments-on-this-policy)
## Reporting a Vulnerability
The mailcow team and community take all security vulnerabilities
seriously. Thank you for improving the security of our open source
software. We appreciate your efforts and responsible disclosure and will
make every effort to acknowledge your contributions.
Report security vulnerabilities by emailing the mailcow team at:
info at servercow.de
mailcow team will acknowledge your email as soon as possible, and will
send a more detailed response afterwards indicating the next steps in
handling your report. After the initial reply to your report, the mailcow
team will endeavor to keep you informed of the progress towards a fix and
full announcement, and may ask for additional information or guidance.
Report security vulnerabilities in third-party modules to the person or
team maintaining the module.
## Disclosure Policy
When the mailcow team receives a security bug report, they will assign it
to a primary handler. This person will coordinate the fix and release
process, involving the following steps:
* Confirm the problem and determine the affected versions.
* Audit code to find any potential similar problems.
* Prepare fixes for all releases still under maintenance.
## Comments on this Policy
If you have suggestions on how this process could be improved please submit a
pull request.
================================================
FILE: _modules/scripts/core.sh
================================================
#!/usr/bin/env bash
# _modules/scripts/core.sh
# THIS SCRIPT IS DESIGNED TO BE RUNNING BY MAILCOW SCRIPTS ONLY!
# DO NOT, AGAIN, NOT TRY TO RUN THIS SCRIPT STANDALONE!!!!!!
# ANSI color for red errors
RED='\e[31m'
GREEN='\e[32m'
YELLOW='\e[33m'
BLUE='\e[34m'
MAGENTA='\e[35m'
LIGHT_RED='\e[91m'
LIGHT_GREEN='\e[92m'
NC='\e[0m'
caller="${BASH_SOURCE[1]##*/}"
get_installed_tools(){
for bin in openssl curl docker git awk sha1sum grep cut jq; do
if [[ -z $(command -v ${bin}) ]]; then
echo "Error: Cannot find command '${bin}'. Cannot proceed."
echo "Solution: Please review system requirements and install requirements. Then, re-run the script."
echo "See System Requirements: https://docs.mailcow.email/getstarted/install/"
echo "Exiting..."
exit 1
fi
done
if grep --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo -e "${LIGHT_RED}BusyBox grep detected, please install gnu grep, \"apk add --no-cache --upgrade grep\"${NC}"; exit 1; fi
# This will also cover sort
if cp --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo -e "${LIGHT_RED}BusyBox cp detected, please install coreutils, \"apk add --no-cache --upgrade coreutils\"${NC}"; exit 1; fi
if sed --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo -e "${LIGHT_RED}BusyBox sed detected, please install gnu sed, \"apk add --no-cache --upgrade sed\"${NC}"; exit 1; fi
}
get_docker_version(){
# Check Docker Version (need at least 24.X)
docker_version=$(docker version --format '{{.Server.Version}}' | cut -d '.' -f 1)
}
get_compose_type(){
if docker compose > /dev/null 2>&1; then
if docker compose version --short | grep -e "^[2-9]\." -e "^v[2-9]\." -e "^[1-9][0-9]\." -e "^v[1-9][0-9]\." > /dev/null 2>&1; then
COMPOSE_VERSION=native
COMPOSE_COMMAND="docker compose"
if [[ "$caller" == "update.sh" ]]; then
sed -i 's/^DOCKER_COMPOSE_VERSION=.*/DOCKER_COMPOSE_VERSION=native/' "$SCRIPT_DIR/mailcow.conf"
fi
echo -e "\e[33mFound Docker Compose Plugin (native).\e[0m"
echo -e "\e[33mSetting the DOCKER_COMPOSE_VERSION Variable to native\e[0m"
sleep 2
echo -e "\e[33mNotice: You'll have to update this Compose Version via your Package Manager manually!\e[0m"
else
echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m"
echo -e "\e[31mPlease update/install it manually regarding to this doc site: https://docs.mailcow.email/install/\e[0m"
exit 1
fi
elif docker-compose > /dev/null 2>&1; then
if ! [[ $(alias docker-compose 2> /dev/null) ]] ; then
if docker-compose version --short | grep -e "^[2-9]\." -e "^[1-9][0-9]\." > /dev/null 2>&1; then
COMPOSE_VERSION=standalone
COMPOSE_COMMAND="docker-compose"
if [[ "$caller" == "update.sh" ]]; then
sed -i 's/^DOCKER_COMPOSE_VERSION=.*/DOCKER_COMPOSE_VERSION=standalone/' "$SCRIPT_DIR/mailcow.conf"
fi
echo -e "\e[33mFound Docker Compose Standalone.\e[0m"
echo -e "\e[33mSetting the DOCKER_COMPOSE_VERSION Variable to standalone\e[0m"
sleep 2
echo -e "\e[33mNotice: For an automatic update of docker-compose please use the update_compose.sh scripts located at the helper-scripts folder.\e[0m"
else
echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m"
echo -e "\e[31mPlease update/install manually regarding to this doc site: https://docs.mailcow.email/install/\e[0m"
exit 1
fi
fi
else
echo -e "\e[31mCannot find Docker Compose.\e[0m"
echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/install/\e[0m"
exit 1
fi
}
detect_bad_asn() {
echo -e "\e[33mDetecting if your IP is listed on Spamhaus Bad ASN List...\e[0m"
response=$(curl --connect-timeout 15 --max-time 30 -s -o /dev/null -w "%{http_code}" "https://asn-check.mailcow.email")
if [ "$response" -eq 503 ]; then
if [ -z "$SPAMHAUS_DQS_KEY" ]; then
echo -e "\e[33mYour server's public IP uses an AS that is blocked by Spamhaus to use their DNS public blocklists for Postfix.\e[0m"
echo -e "\e[33mmailcow did not detected a value for the variable SPAMHAUS_DQS_KEY inside mailcow.conf!\e[0m"
sleep 2
echo ""
echo -e "\e[33mTo use the Spamhaus DNS Blocklists again, you will need to create a FREE account for their Data Query Service (DQS) at: https://www.spamhaus.com/free-trial/sign-up-for-a-free-data-query-service-account\e[0m"
echo -e "\e[33mOnce done, enter your DQS API key in mailcow.conf and mailcow will do the rest for you!\e[0m"
echo ""
sleep 2
else
echo -e "\e[33mYour server's public IP uses an AS that is blocked by Spamhaus to use their DNS public blocklists for Postfix.\e[0m"
echo -e "\e[32mmailcow detected a Value for the variable SPAMHAUS_DQS_KEY inside mailcow.conf. Postfix will use DQS with the given API key...\e[0m"
fi
elif [ "$response" -eq 200 ]; then
echo -e "\e[33mCheck completed! Your IP is \e[32mclean\e[0m"
elif [ "$response" -eq 429 ]; then
echo -e "\e[33mCheck completed! \e[31mYour IP seems to be rate limited on the ASN Check service... please try again later!\e[0m"
else
echo -e "\e[31mCheck failed! \e[0mMaybe a DNS or Network problem?\e[0m"
fi
}
check_online_status() {
CHECK_ONLINE_DOMAINS=('https://github.com' 'https://hub.docker.com')
for domain in "${CHECK_ONLINE_DOMAINS[@]}"; do
if timeout 6 curl --head --silent --output /dev/null ${domain}; then
return 0
fi
done
return 1
}
prefetch_images() {
[[ -z ${BRANCH} ]] && { echo -e "\e[33m\nUnknown branch...\e[0m"; exit 1; }
git fetch origin #${BRANCH}
while read image; do
RET_C=0
until docker pull "${image}"; do
RET_C=$((RET_C + 1))
echo -e "\e[33m\nError pulling $image, retrying...\e[0m"
[ ${RET_C} -gt 3 ] && { echo -e "\e[31m\nToo many failed retries, exiting\e[0m"; exit 1; }
sleep 1
done
done < <(git show "origin/${BRANCH}:docker-compose.yml" | grep "image:" | awk '{ gsub("image:","", $3); print $2 }')
}
docker_garbage() {
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )"
IMGS_TO_DELETE=()
declare -A IMAGES_INFO
COMPOSE_IMAGES=($(grep -oP "image: \K(ghcr\.io/)?mailcow.+" "${SCRIPT_DIR}/docker-compose.yml"))
for existing_image in $(docker images --format "{{.ID}}:{{.Repository}}:{{.Tag}}" | grep -E '(mailcow/|ghcr\.io/mailcow/)'); do
ID=$(echo "$existing_image" | cut -d ':' -f 1)
REPOSITORY=$(echo "$existing_image" | cut -d ':' -f 2)
TAG=$(echo "$existing_image" | cut -d ':' -f 3)
if [[ "$REPOSITORY" == "mailcow/backup" || "$REPOSITORY" == "ghcr.io/mailcow/backup" ]]; then
if [[ "$TAG" != "<none>" ]]; then
continue
fi
fi
if [[ " ${COMPOSE_IMAGES[@]} " =~ " ${REPOSITORY}:${TAG} " ]]; then
continue
else
IMGS_TO_DELETE+=("$ID")
IMAGES_INFO["$ID"]="$REPOSITORY:$TAG"
fi
done
if [[ ! -z ${IMGS_TO_DELETE[*]} ]]; then
echo "The following unused mailcow images were found:"
for id in "${IMGS_TO_DELETE[@]}"; do
echo " ${IMAGES_INFO[$id]} ($id)"
done
if [ -z "$FORCE" ]; then
read -r -p "Do you want to delete them to free up some space? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
docker rmi ${IMGS_TO_DELETE[*]}
else
echo "OK, skipped."
fi
else
echo "Running in forced mode! Force removing old mailcow images..."
docker rmi ${IMGS_TO_DELETE[*]}
fi
echo -e "\e[32mFurther cleanup...\e[0m"
echo "If you want to cleanup further garbage collected by Docker, please make sure all containers are up and running before cleaning your system by executing \"docker system prune\""
fi
}
in_array() {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 0; done
return 1
}
detect_major_update() {
if [ ${BRANCH} == "master" ]; then
# Array with major versions
# Add major versions here
MAJOR_VERSIONS=(
"2025-02"
"2025-03"
"2025-09"
)
current_version=""
if [[ -f "${SCRIPT_DIR}/data/web/inc/app_info.inc.php" ]]; then
current_version=$(grep 'MAILCOW_GIT_VERSION' ${SCRIPT_DIR}/data/web/inc/app_info.inc.php | sed -E 's/.*MAILCOW_GIT_VERSION="([^"]+)".*/\1/')
fi
if [[ -z "$current_version" ]]; then
return 1
fi
release_url="https://github.com/mailcow/mailcow-dockerized/releases/tag"
updates_to_apply=()
for version in "${MAJOR_VERSIONS[@]}"; do
if [[ "$current_version" < "$version" ]]; then
updates_to_apply+=("$version")
fi
done
if [[ ${#updates_to_apply[@]} -gt 0 ]]; then
echo -e "\e[33m\nMAJOR UPDATES to be applied:\e[0m"
for update in "${updates_to_apply[@]}"; do
echo "$update - $release_url/$update"
done
echo -e "\nPlease read the release notes before proceeding."
read -p "Do you want to proceed with the update? [y/n] " response
if [[ "${response}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
echo "Proceeding with the update..."
else
echo "Update canceled. Exiting."
exit 1
fi
fi
fi
}
================================================
FILE: _modules/scripts/ipv6_controller.sh
================================================
#!/usr/bin/env bash
# _modules/scripts/ipv6_controller.sh
# THIS SCRIPT IS DESIGNED TO BE RUNNING BY MAILCOW SCRIPTS ONLY!
# DO NOT, AGAIN, NOT TRY TO RUN THIS SCRIPT STANDALONE!!!!!!
# 1) Check if the host supports IPv6
get_ipv6_support() {
# ---- helper: probe external IPv6 connectivity without DNS ----
_probe_ipv6_connectivity() {
# Use literal, always-on IPv6 echo responders (no DNS required)
local PROBE_IPS=("2001:4860:4860::8888" "2606:4700:4700::1111")
local ip rc=1
for ip in "${PROBE_IPS[@]}"; do
if command -v ping6 &>/dev/null; then
ping6 -c1 -W2 "$ip" &>/dev/null || ping6 -c1 -w2 "$ip" &>/dev/null
rc=$?
elif command -v ping &>/dev/null; then
ping -6 -c1 -W2 "$ip" &>/dev/null || ping -6 -c1 -w2 "$ip" &>/dev/null
rc=$?
else
rc=1
fi
[[ $rc -eq 0 ]] && return 0
done
return 1
}
if [[ ! -f /proc/net/if_inet6 ]] || grep -qs '^1' /proc/sys/net/ipv6/conf/all/disable_ipv6 2>/dev/null; then
DETECTED_IPV6=false
echo -e "${YELLOW}IPv6 not detected on host – ${LIGHT_RED}IPv6 is administratively disabled${YELLOW}.${NC}"
return
fi
if ip -6 route show default 2>/dev/null | grep -qE '^default'; then
echo -e "${YELLOW}Default IPv6 route found – testing external IPv6 connectivity...${NC}"
if _probe_ipv6_connectivity; then
DETECTED_IPV6=true
echo -e "IPv6 detected on host – ${LIGHT_GREEN}leaving IPv6 support enabled${YELLOW}.${NC}"
else
DETECTED_IPV6=false
echo -e "${YELLOW}Default IPv6 route present but external IPv6 connectivity failed – ${LIGHT_RED}disabling IPv6 support${YELLOW}.${NC}"
fi
return
fi
if ip -6 addr show scope global 2>/dev/null | grep -q 'inet6'; then
DETECTED_IPV6=false
echo -e "${YELLOW}Global IPv6 address present but no default route – ${LIGHT_RED}disabling IPv6 support${YELLOW}.${NC}"
return
fi
if ip -6 addr show scope link 2>/dev/null | grep -q 'inet6'; then
echo -e "${YELLOW}Only link-local IPv6 addresses found – testing external IPv6 connectivity...${NC}"
if _probe_ipv6_connectivity; then
DETECTED_IPV6=true
echo -e "External IPv6 connectivity available – ${LIGHT_GREEN}leaving IPv6 support enabled${YELLOW}.${NC}"
else
DETECTED_IPV6=false
echo -e "${YELLOW}Only link-local IPv6 present and no external connectivity – ${LIGHT_RED}disabling IPv6 support${YELLOW}.${NC}"
fi
return
fi
DETECTED_IPV6=false
echo -e "${YELLOW}IPv6 not detected on host – ${LIGHT_RED}disabling IPv6 support${YELLOW}.${NC}"
}
# 2) Ensure Docker daemon.json has (or create) the required IPv6 settings
docker_daemon_edit(){
DOCKER_DAEMON_CONFIG="/etc/docker/daemon.json"
DOCKER_MAJOR=$(docker version --format '{{.Server.Version}}' 2>/dev/null | cut -d. -f1)
MISSING=()
_has_kv() { grep -Eq "\"$1\"[[:space:]]*:[[:space:]]*$2" "$DOCKER_DAEMON_CONFIG" 2>/dev/null; }
if [[ -f "$DOCKER_DAEMON_CONFIG" ]]; then
# reject empty or whitespace-only file immediately
if [[ ! -s "$DOCKER_DAEMON_CONFIG" ]] || ! grep -Eq '[{}]' "$DOCKER_DAEMON_CONFIG"; then
echo -e "${RED}ERROR: $DOCKER_DAEMON_CONFIG exists but is empty or contains no JSON braces – please initialize it with valid JSON (e.g. {}).${NC}"
exit 1
fi
# Validate JSON if jq is present
if command -v jq &>/dev/null && ! jq empty "$DOCKER_DAEMON_CONFIG" &>/dev/null; then
echo -e "${RED}ERROR: Invalid JSON in $DOCKER_DAEMON_CONFIG – please correct manually.${NC}"
exit 1
fi
# Gather missing keys
! _has_kv ipv6 true && MISSING+=("ipv6: true")
# For Docker < 28, keep requiring fixed-cidr-v6 (default bridge needs it on old engines)
if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 28 ]]; then
! grep -Eq '"fixed-cidr-v6"[[:space:]]*:[[:space:]]*".+"' "$DOCKER_DAEMON_CONFIG" \
&& MISSING+=('fixed-cidr-v6: "fd00:dead:beef:c0::/80"')
fi
# For Docker < 27, ip6tables needed and was tied to experimental in older releases
if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 27 ]]; then
_has_kv ipv6 true && ! _has_kv ip6tables true && MISSING+=("ip6tables: true")
! _has_kv experimental true && MISSING+=("experimental: true")
fi
# Fix if needed
if ((${#MISSING[@]}>0)); then
echo -e "${MAGENTA}Your daemon.json is missing: ${YELLOW}${MISSING[*]}${NC}"
if [[ -n "$FORCE" ]]; then
ans=Y
else
read -p "Would you like to update $DOCKER_DAEMON_CONFIG now? [Y/n] " ans
ans=${ans:-Y}
fi
if [[ $ans =~ ^[Yy]$ ]]; then
cp "$DOCKER_DAEMON_CONFIG" "${DOCKER_DAEMON_CONFIG}.bak"
if command -v jq &>/dev/null; then
TMP=$(mktemp)
# Base filter: ensure ipv6 = true
JQ_FILTER='.ipv6 = true'
# Add fixed-cidr-v6 only for Docker < 28
if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 28 ]]; then
JQ_FILTER+=' | .["fixed-cidr-v6"] = (.["fixed-cidr-v6"] // "fd00:dead:beef:c0::/80")'
fi
# Add ip6tables/experimental only for Docker < 27
if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 27 ]]; then
JQ_FILTER+=' | .ip6tables = true | .experimental = true'
fi
jq "$JQ_FILTER" "$DOCKER_DAEMON_CONFIG" >"$TMP" && mv "$TMP" "$DOCKER_DAEMON_CONFIG"
echo -e "${LIGHT_GREEN}daemon.json updated. Restarting Docker...${NC}"
(command -v systemctl &>/dev/null && systemctl restart docker) || service docker restart
echo -e "${YELLOW}Docker restarted.${NC}"
else
echo -e "${RED}Please install jq or manually update daemon.json and restart Docker.${NC}"
exit 1
fi
else
echo -e "${YELLOW}User declined Docker update – please insert these changes manually:${NC}"
echo "${MISSING[*]}"
exit 1
fi
fi
else
# Create new daemon.json if missing
if [[ -n "$FORCE" ]]; then
ans=Y
else
read -p "$DOCKER_DAEMON_CONFIG not found. Create it with IPv6 settings? [Y/n] " ans
ans=${ans:-Y}
fi
if [[ $ans =~ ^[Yy]$ ]]; then
mkdir -p "$(dirname "$DOCKER_DAEMON_CONFIG")"
if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 27 ]]; then
cat > "$DOCKER_DAEMON_CONFIG" <<EOF
{
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:c0::/80",
"ip6tables": true,
"experimental": true
}
EOF
elif [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 28 ]]; then
cat > "$DOCKER_DAEMON_CONFIG" <<EOF
{
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:c0::/80"
}
EOF
else
# Docker 28+: ipv6 works without fixed-cidr-v6
cat > "$DOCKER_DAEMON_CONFIG" <<EOF
{
"ipv6": true
}
EOF
fi
echo -e "${GREEN}Created $DOCKER_DAEMON_CONFIG with IPv6 settings.${NC}"
echo "Restarting Docker..."
(command -v systemctl &>/dev/null && systemctl restart docker) || service docker restart
echo "Docker restarted."
else
echo "User declined to create daemon.json – please manually merge the docker daemon with these configs:"
echo "${MISSING[*]}"
exit 1
fi
fi
}
# 3) Main wrapper for generate_config.sh and update.sh
configure_ipv6() {
# detect manual override if mailcow.conf is present
if [[ -n "$MAILCOW_CONF" && -f "$MAILCOW_CONF" ]] && grep -q '^ENABLE_IPV6=' "$MAILCOW_CONF"; then
MANUAL_SETTING=$(grep '^ENABLE_IPV6=' "$MAILCOW_CONF" | cut -d= -f2)
elif [[ -z "$MAILCOW_CONF" ]] && [[ -n "${ENABLE_IPV6:-}" ]]; then
MANUAL_SETTING="$ENABLE_IPV6"
else
MANUAL_SETTING=""
fi
get_ipv6_support
# if user manually set it, check for mismatch
if [[ "$DETECTED_IPV6" != "true" ]]; then
if [[ -n "$MAILCOW_CONF" && -f "$MAILCOW_CONF" ]]; then
if grep -q '^ENABLE_IPV6=' "$MAILCOW_CONF"; then
sed -i 's/^ENABLE_IPV6=.*/ENABLE_IPV6=false/' "$MAILCOW_CONF"
else
echo "ENABLE_IPV6=false" >> "$MAILCOW_CONF"
fi
else
export IPV6_BOOL=false
fi
echo "Skipping Docker IPv6 configuration because host does not support IPv6."
echo "Make sure to check if your docker daemon.json does not include \"enable_ipv6\": true if you do not want IPv6."
echo "IPv6 configuration complete: ENABLE_IPV6=false"
sleep 2
return
fi
docker_daemon_edit
if [[ -n "$MAILCOW_CONF" && -f "$MAILCOW_CONF" ]]; then
if grep -q '^ENABLE_IPV6=' "$MAILCOW_CONF"; then
sed -i 's/^ENABLE_IPV6=.*/ENABLE_IPV6=true/' "$MAILCOW_CONF"
else
echo "ENABLE_IPV6=true" >> "$MAILCOW_CONF"
fi
else
export IPV6_BOOL=true
fi
echo "IPv6 configuration complete: ENABLE_IPV6=true"
}
================================================
FILE: _modules/scripts/migrate_options.sh
================================================
#!/usr/bin/env bash
# _modules/scripts/migrate_options.sh
# THIS SCRIPT IS DESIGNED TO BE RUNNING BY MAILCOW SCRIPTS ONLY!
# DO NOT, AGAIN, NOT TRY TO RUN THIS SCRIPT STANDALONE!!!!!!
migrate_config_options() {
sed -i --follow-symlinks '$a\' mailcow.conf
KEYS=(
SOLR_HEAP
SKIP_SOLR
SOLR_PORT
FLATCURVE_EXPERIMENTAL
DISABLE_IPv6
ACME_CONTACT
)
for key in "${KEYS[@]}"; do
if grep -q "${key}" mailcow.conf; then
case "${key}" in
SOLR_HEAP)
echo "Removing ${key} in mailcow.conf"
sed -i '/# Solr heap size in MB\b/d' mailcow.conf
sed -i '/# Solr is a prone to run\b/d' mailcow.conf
sed -i '/SOLR_HEAP\b/d' mailcow.conf
;;
SKIP_SOLR)
echo "Removing ${key} in mailcow.conf"
sed -i '/\bSkip Solr on low-memory\b/d' mailcow.conf
sed -i '/\bSolr is disabled by default\b/d' mailcow.conf
sed -i '/\bDisable Solr or\b/d' mailcow.conf
sed -i '/\bSKIP_SOLR\b/d' mailcow.conf
;;
SOLR_PORT)
echo "Removing ${key} in mailcow.conf"
sed -i '/\bSOLR_PORT\b/d' mailcow.conf
;;
FLATCURVE_EXPERIMENTAL)
echo "Removing ${key} in mailcow.conf"
sed -i '/\bFLATCURVE_EXPERIMENTAL\b/d' mailcow.conf
;;
DISABLE_IPv6)
echo "Migrating ${key} to ENABLE_IPv6 in mailcow.conf"
local old=$(grep '^DISABLE_IPv6=' "mailcow.conf" | cut -d'=' -f2)
local new
if [[ "$old" == "y" ]]; then
new="false"
else
new="true"
fi
sed -i '/^DISABLE_IPv6=/d' "mailcow.conf"
echo "ENABLE_IPV6=$new" >> "mailcow.conf"
;;
ACME_CONTACT)
echo "Deleting obsoleted ${key} in mailcow.conf"
sed -i '/^# Lets Encrypt registration contact information/d' mailcow.conf
sed -i '/^# Optional: Leave empty for none/d' mailcow.conf
sed -i '/^# This value is only used on first order!/d' mailcow.conf
sed -i '/^# Setting it at a later point will require the following steps:/d' mailcow.conf
sed -i '/^# https:\/\/docs.mailcow.email\/troubleshooting\/debug-reset_tls\//d' mailcow.conf
sed -i '/^ACME_CONTACT=.*/d' mailcow.conf
sed -i '/^#ACME_CONTACT=.*/d' mailcow.conf
;;
esac
fi
done
solr_volume=$(docker volume ls -qf name=^${COMPOSE_PROJECT_NAME}_solr-vol-1)
if [[ -n $solr_volume ]]; then
echo -e "\e[34mSolr has been replaced within mailcow since 2025-01.\nThe volume $solr_volume is unused.\e[0m"
sleep 1
if [ ! "$FORCE" ]; then
read -r -p "Remove $solr_volume? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
echo -e "\e[33mRemoving $solr_volume...\e[0m"
docker volume rm $solr_volume || echo -e "\e[31mFailed to remove. Remove it manually!\e[0m"
echo -e "\e[32mSuccessfully removed $solr_volume!\e[0m"
else
echo -e "Not removing $solr_volume. Run \`docker volume rm $solr_volume\` manually if needed."
fi
else
echo -e "\e[33mForce removing $solr_volume...\e[0m"
docker volume rm $solr_volume || echo -e "\e[31mFailed to remove. Remove it manually!\e[0m"
echo -e "\e[32mSuccessfully removed $solr_volume!\e[0m"
fi
fi
# Delete old fts.conf before forced switch to flatcurve to ensure update is working properly
FTS_CONF_PATH="${SCRIPT_DIR}/data/conf/dovecot/conf.d/fts.conf"
if [[ -f "$FTS_CONF_PATH" ]]; then
if grep -q "Autogenerated by mailcow" "$FTS_CONF_PATH"; then
rm -rf $FTS_CONF_PATH
fi
fi
}
================================================
FILE: _modules/scripts/new_options.sh
================================================
#!/usr/bin/env bash
# _modules/scripts/new_options.sh
# THIS SCRIPT IS DESIGNED TO BE RUNNING BY MAILCOW SCRIPTS ONLY!
# DO NOT, AGAIN, NOT TRY TO RUN THIS SCRIPT STANDALONE!!!!!!
adapt_new_options() {
CONFIG_ARRAY=(
"AUTODISCOVER_SAN"
"SKIP_LETS_ENCRYPT"
"SKIP_SOGO"
"USE_WATCHDOG"
"WATCHDOG_NOTIFY_EMAIL"
"WATCHDOG_NOTIFY_WEBHOOK"
"WATCHDOG_NOTIFY_WEBHOOK_BODY"
"WATCHDOG_NOTIFY_BAN"
"WATCHDOG_NOTIFY_START"
"WATCHDOG_EXTERNAL_CHECKS"
"WATCHDOG_SUBJECT"
"SKIP_CLAMD"
"SKIP_OLEFY"
"SKIP_IP_CHECK"
"ADDITIONAL_SAN"
"DOVEADM_PORT"
"IPV4_NETWORK"
"IPV6_NETWORK"
"LOG_LINES"
"SNAT_TO_SOURCE"
"SNAT6_TO_SOURCE"
"COMPOSE_PROJECT_NAME"
"DOCKER_COMPOSE_VERSION"
"SQL_PORT"
"API_KEY"
"API_KEY_READ_ONLY"
"API_ALLOW_FROM"
"MAILDIR_GC_TIME"
"MAILDIR_SUB"
"ACL_ANYONE"
"FTS_HEAP"
"FTS_PROCS"
"SKIP_FTS"
"ENABLE_SSL_SNI"
"ALLOW_ADMIN_EMAIL_LOGIN"
"SKIP_HTTP_VERIFICATION"
"SOGO_EXPIRE_SESSION"
"SOGO_URL_ENCRYPTION_KEY"
"REDIS_PORT"
"REDISPASS"
"DOVECOT_MASTER_USER"
"DOVECOT_MASTER_PASS"
"MAILCOW_PASS_SCHEME"
"ADDITIONAL_SERVER_NAMES"
"WATCHDOG_VERBOSE"
"WEBAUTHN_ONLY_TRUSTED_VENDORS"
"SPAMHAUS_DQS_KEY"
"SKIP_UNBOUND_HEALTHCHECK"
"DISABLE_NETFILTER_ISOLATION_RULE"
"HTTP_REDIRECT"
"ENABLE_IPV6"
"ACME_DNS_CHALLENGE"
"ACME_DNS_PROVIDER"
"ACME_ACCOUNT_EMAIL"
)
sed -i --follow-symlinks '$a\' mailcow.conf
for option in ${CONFIG_ARRAY[@]}; do
if grep -q "^#\?${option}=" mailcow.conf; then
continue
fi
echo "Adding new option \"${option}\" to mailcow.conf"
case "${option}" in
AUTODISCOVER_SAN)
echo '# Obtain certificates for autodiscover.* and autoconfig.* domains.' >> mailcow.conf
echo '# This can be useful to switch off in case you are in a scenario where a reverse proxy already handles those.' >> mailcow.conf
echo '# There are mixed scenarios where ports 80,443 are occupied and you do not want to share certs' >> mailcow.conf
echo '# between services. So acme-mailcow obtains for maildomains and all web-things get handled' >> mailcow.conf
echo '# in the reverse proxy.' >> mailcow.conf
echo 'AUTODISCOVER_SAN=y' >> mailcow.conf
;;
DOCKER_COMPOSE_VERSION)
echo "# Used Docker Compose version" >> mailcow.conf
echo "# Switch here between native (compose plugin) and standalone" >> mailcow.conf
echo "# For more informations take a look at the mailcow docs regarding the configuration options." >> mailcow.conf
echo "# Normally this should be untouched but if you decided to use either of those you can switch it manually here." >> mailcow.conf
echo "# Please be aware that at least one of those variants should be installed on your machine or mailcow will fail." >> mailcow.conf
echo "" >> mailcow.conf
echo "DOCKER_COMPOSE_VERSION=${DOCKER_COMPOSE_VERSION}" >> mailcow.conf
;;
DOVEADM_PORT)
echo "DOVEADM_PORT=127.0.0.1:19991" >> mailcow.conf
;;
LOG_LINES)
echo '# Max log lines per service to keep in Redis logs' >> mailcow.conf
echo "LOG_LINES=9999" >> mailcow.conf
;;
IPV4_NETWORK)
echo '# Internal IPv4 /24 subnet, format n.n.n. (expands to n.n.n.0/24)' >> mailcow.conf
echo "IPV4_NETWORK=172.22.1" >> mailcow.conf
;;
IPV6_NETWORK)
echo '# Internal IPv6 subnet in fc00::/7' >> mailcow.conf
echo "IPV6_NETWORK=fd4d:6169:6c63:6f77::/64" >> mailcow.conf
;;
SQL_PORT)
echo '# Bind SQL to 127.0.0.1 on port 13306' >> mailcow.conf
echo "SQL_PORT=127.0.0.1:13306" >> mailcow.conf
;;
API_KEY)
echo '# Create or override API key for web UI' >> mailcow.conf
echo "#API_KEY=" >> mailcow.conf
;;
API_KEY_READ_ONLY)
echo '# Create or override read-only API key for web UI' >> mailcow.conf
echo "#API_KEY_READ_ONLY=" >> mailcow.conf
;;
API_ALLOW_FROM)
echo '# Must be set for API_KEY to be active' >> mailcow.conf
echo '# IPs only, no networks (networks can be set via UI)' >> mailcow.conf
echo "#API_ALLOW_FROM=" >> mailcow.conf
;;
SNAT_TO_SOURCE)
echo '# Use this IPv4 for outgoing connections (SNAT)' >> mailcow.conf
echo "#SNAT_TO_SOURCE=" >> mailcow.conf
;;
SNAT6_TO_SOURCE)
echo '# Use this IPv6 for outgoing connections (SNAT)' >> mailcow.conf
echo "#SNAT6_TO_SOURCE=" >> mailcow.conf
;;
MAILDIR_GC_TIME)
echo '# Garbage collector cleanup' >> mailcow.conf
echo '# Deleted domains and mailboxes are moved to /var/vmail/_garbage/timestamp_sanitizedstring' >> mailcow.conf
echo '# How long should objects remain in the garbage until they are being deleted? (value in minutes)' >> mailcow.conf
echo '# Check interval is hourly' >> mailcow.conf
echo 'MAILDIR_GC_TIME=1440' >> mailcow.conf
;;
ACL_ANYONE)
echo '# Set this to "allow" to enable the anyone pseudo user. Disabled by default.' >> mailcow.conf
echo '# When enabled, ACL can be created, that apply to "All authenticated users"' >> mailcow.conf
echo '# This should probably only be activated on mail hosts, that are used exclusively by one organisation.' >> mailcow.conf
echo '# Otherwise a user might share data with too many other users.' >> mailcow.conf
echo 'ACL_ANYONE=disallow' >> mailcow.conf
;;
FTS_HEAP)
echo '# Dovecot Indexing (FTS) Process maximum heap size in MB, there is no recommendation, please see Dovecot docs.' >> mailcow.conf
echo '# Flatcurve is used as FTS Engine. It is supposed to be pretty efficient in CPU and RAM consumption.' >> mailcow.conf
echo '# Please always monitor your Resource consumption!' >> mailcow.conf
echo "FTS_HEAP=128" >> mailcow.conf
;;
SKIP_FTS)
echo '# Skip FTS (Fulltext Search) for Dovecot on low-memory, low-threaded systems or if you simply want to disable it.' >> mailcow.conf
echo "# Dovecot inside mailcow use Flatcurve as FTS Backend." >> mailcow.conf
echo "SKIP_FTS=y" >> mailcow.conf
;;
FTS_PROCS)
echo '# Controls how many processes the Dovecot indexing process can spawn at max.' >> mailcow.conf
echo '# Too many indexing processes can use a lot of CPU and Disk I/O' >> mailcow.conf
echo '# Please visit: https://doc.dovecot.org/configuration_manual/service_configuration/#indexer-worker for more informations' >> mailcow.conf
echo "FTS_PROCS=1" >> mailcow.conf
;;
ENABLE_SSL_SNI)
echo '# Create seperate certificates for all domains - y/n' >> mailcow.conf
echo '# this will allow adding more than 100 domains, but some email clients will not be able to connect with alternative hostnames' >> mailcow.conf
echo '# see https://wiki.dovecot.org/SSL/SNIClientSupport' >> mailcow.conf
echo "ENABLE_SSL_SNI=n" >> mailcow.conf
;;
SKIP_SOGO)
echo '# Skip SOGo: Will disable SOGo integration and therefore webmail, DAV protocols and ActiveSync support (experimental, unsupported, not fully implemented) - y/n' >> mailcow.conf
echo "SKIP_SOGO=n" >> mailcow.conf
;;
MAILDIR_SUB)
echo '# MAILDIR_SUB defines a path in a users virtual home to keep the maildir in. Leave empty for updated setups.' >> mailcow.conf
echo "#MAILDIR_SUB=Maildir" >> mailcow.conf
echo "MAILDIR_SUB=" >> mailcow.conf
;;
WATCHDOG_NOTIFY_WEBHOOK)
echo '# Send notifications to a webhook URL that receives a POST request with the content type "application/json".' >> mailcow.conf
echo '# You can use this to send notifications to services like Discord, Slack and others.' >> mailcow.conf
echo '#WATCHDOG_NOTIFY_WEBHOOK=https://discord.com/api/webhooks/XXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' >> mailcow.conf
;;
WATCHDOG_NOTIFY_WEBHOOK_BODY)
echo '# JSON body included in the webhook POST request. Needs to be in single quotes.' >> mailcow.conf
echo '# Following variables are available: SUBJECT, BODY' >> mailcow.conf
WEBHOOK_BODY='{"username": "mailcow Watchdog", "content": "**${SUBJECT}**\n${BODY}"}'
echo "#WATCHDOG_NOTIFY_WEBHOOK_BODY='${WEBHOOK_BODY}'" >> mailcow.conf
;;
WATCHDOG_NOTIFY_BAN)
echo '# Notify about banned IP. Includes whois lookup.' >> mailcow.conf
echo "WATCHDOG_NOTIFY_BAN=y" >> mailcow.conf
;;
WATCHDOG_NOTIFY_START)
echo '# Send a notification when the watchdog is started.' >> mailcow.conf
echo "WATCHDOG_NOTIFY_START=y" >> mailcow.conf
;;
WATCHDOG_SUBJECT)
echo '# Subject for watchdog mails. Defaults to "Watchdog ALERT" followed by the error message.' >> mailcow.conf
echo "#WATCHDOG_SUBJECT=" >> mailcow.conf
;;
WATCHDOG_EXTERNAL_CHECKS)
echo '# Checks if mailcow is an open relay. Requires a SAL. More checks will follow.' >> mailcow.conf
echo '# No data is collected. Opt-in and anonymous.' >> mailcow.conf
echo '# Will only work with unmodified mailcow setups.' >> mailcow.conf
echo "WATCHDOG_EXTERNAL_CHECKS=n" >> mailcow.conf
;;
SOGO_EXPIRE_SESSION)
echo '# SOGo session timeout in minutes' >> mailcow.conf
echo "SOGO_EXPIRE_SESSION=480" >> mailcow.conf
;;
REDIS_PORT)
echo "REDIS_PORT=127.0.0.1:7654" >> mailcow.conf
;;
DOVECOT_MASTER_USER)
echo '# DOVECOT_MASTER_USER and _PASS must _both_ be provided. No special chars.' >> mailcow.conf
echo '# Empty by default to auto-generate master user and password on start.' >> mailcow.conf
echo '# User expands to DOVECOT_MASTER_USER@mailcow.local' >> mailcow.conf
echo '# LEAVE EMPTY IF UNSURE' >> mailcow.conf
echo "DOVECOT_MASTER_USER=" >> mailcow.conf
;;
DOVECOT_MASTER_PASS)
echo '# LEAVE EMPTY IF UNSURE' >> mailcow.conf
echo "DOVECOT_MASTER_PASS=" >> mailcow.conf
;;
MAILCOW_PASS_SCHEME)
echo '# Password hash algorithm' >> mailcow.conf
echo '# Only certain password hash algorithm are supported. For a fully list of supported schemes,' >> mailcow.conf
echo '# see https://docs.mailcow.email/models/model-passwd/' >> mailcow.conf
echo "MAILCOW_PASS_SCHEME=BLF-CRYPT" >> mailcow.conf
;;
ADDITIONAL_SERVER_NAMES)
echo '# Additional server names for mailcow UI' >> mailcow.conf
echo '#' >> mailcow.conf
echo '# Specify alternative addresses for the mailcow UI to respond to' >> mailcow.conf
echo '# This is useful when you set mail.* as ADDITIONAL_SAN and want to make sure mail.maildomain.com will always point to the mailcow UI.' >> mailcow.conf
echo '# If the server name does not match a known site, Nginx decides by best-guess and may redirect users to the wrong web root.' >> mailcow.conf
echo '# You can understand this as server_name directive in Nginx.' >> mailcow.conf
echo '# Comma separated list without spaces! Example: ADDITIONAL_SERVER_NAMES=a.b.c,d.e.f' >> mailcow.conf
echo 'ADDITIONAL_SERVER_NAMES=' >> mailcow.conf
;;
WEBAUTHN_ONLY_TRUSTED_VENDORS)
echo "# WebAuthn device manufacturer verification" >> mailcow.conf
echo '# After setting WEBAUTHN_ONLY_TRUSTED_VENDORS=y only devices from trusted manufacturers are allowed' >> mailcow.conf
echo '# root certificates can be placed for validation under mailcow-dockerized/data/web/inc/lib/WebAuthn/rootCertificates' >> mailcow.conf
echo 'WEBAUTHN_ONLY_TRUSTED_VENDORS=n' >> mailcow.conf
;;
SPAMHAUS_DQS_KEY)
echo "# Spamhaus Data Query Service Key" >> mailcow.conf
echo '# Optional: Leave empty for none' >> mailcow.conf
echo '# Enter your key here if you are using a blocked ASN (OVH, AWS, Cloudflare e.g) for the unregistered Spamhaus Blocklist.' >> mailcow.conf
echo '# If empty, it will completely disable Spamhaus blocklists if it detects that you are running on a server using a blocked AS.' >> mailcow.conf
echo '# Otherwise it will work as usual.' >> mailcow.conf
echo 'SPAMHAUS_DQS_KEY=' >> mailcow.conf
;;
WATCHDOG_VERBOSE)
echo '# Enable watchdog verbose logging' >> mailcow.conf
echo 'WATCHDOG_VERBOSE=n' >> mailcow.conf
;;
SKIP_UNBOUND_HEALTHCHECK)
echo '# Skip Unbound (DNS Resolver) Healthchecks (NOT Recommended!) - y/n' >> mailcow.conf
echo 'SKIP_UNBOUND_HEALTHCHECK=n' >> mailcow.conf
;;
DISABLE_NETFILTER_ISOLATION_RULE)
echo '# Prevent netfilter from setting an iptables/nftables rule to isolate the mailcow docker network - y/n' >> mailcow.conf
echo '# CAUTION: Disabling this may expose container ports to other neighbors on the same subnet, even if the ports are bound to localhost' >> mailcow.conf
echo 'DISABLE_NETFILTER_ISOLATION_RULE=n' >> mailcow.conf
;;
HTTP_REDIRECT)
echo '# Redirect HTTP connections to HTTPS - y/n' >> mailcow.conf
echo 'HTTP_REDIRECT=n' >> mailcow.conf
;;
ENABLE_IPV6)
echo '# IPv6 Controller Section' >> mailcow.conf
echo '# This variable controls the usage of IPv6 within mailcow.' >> mailcow.conf
echo '# Can either be true or false | Defaults to true' >> mailcow.conf
echo '# WARNING: MAKE SURE TO PROPERLY CONFIGURE IPv6 ON YOUR HOST FIRST BEFORE ENABLING THIS AS FAULTY CONFIGURATIONS CAN LEAD TO OPEN RELAYS!' >> mailcow.conf
echo '# A COMPLETE DOCKER STACK REBUILD (compose down && compose up -d) IS NEEDED TO APPLY THIS.' >> mailcow.conf
echo ENABLE_IPV6=${IPV6_BOOL} >> mailcow.conf
;;
SKIP_CLAMD)
echo '# Skip ClamAV (clamd-mailcow) anti-virus (Rspamd will auto-detect a missing ClamAV container) - y/n' >> mailcow.conf
echo 'SKIP_CLAMD=n' >> mailcow.conf
;;
SKIP_OLEFY)
echo '# Skip Olefy (olefy-mailcow) anti-virus for Office documents (Rspamd will auto-detect a missing Olefy container) - y/n' >> mailcow.conf
echo 'SKIP_OLEFY=n' >> mailcow.conf
;;
REDISPASS)
echo "REDISPASS=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2>/dev/null | head -c 28)" >> mailcow.conf
;;
SOGO_URL_ENCRYPTION_KEY)
echo '# SOGo URL encryption key (exactly 16 characters, limited to A–Z, a–z, 0–9)' >> mailcow.conf
echo '# This key is used to encrypt email addresses within SOGo URLs' >> mailcow.conf
echo "SOGO_URL_ENCRYPTION_KEY=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2>/dev/null | head -c 16)" >> mailcow.conf
;;
ACME_DNS_CHALLENGE)
echo '# Enable DNS-01 challenge for ACME (acme-mailcow) - y/n' >> mailcow.conf
echo '# This requires you to set ACME_DNS_PROVIDER and ACME_ACCOUNT_EMAIL below' >> mailcow.conf
echo 'ACME_DNS_CHALLENGE=n' >> mailcow.conf
;;
ACME_DNS_PROVIDER)
echo '# DNS provider for DNS-01 challenge (e.g. dns_cf, dns_azure, dns_gd, etc.)' >> mailcow.conf
echo '# See the dns-01 provider documentation for more information.' >> mailcow.conf
echo 'ACME_DNS_PROVIDER=dns_xxx' >> mailcow.conf
;;
ACME_ACCOUNT_EMAIL)
echo '# Account email for ACME DNS-01 challenge registration' >> mailcow.conf
echo 'ACME_ACCOUNT_EMAIL=me@example.com' >> mailcow.conf
;;
*)
echo "${option}=" >> mailcow.conf
;;
esac
done
}
================================================
FILE: data/Dockerfiles/acme/Dockerfile
================================================
FROM alpine:3.23
LABEL maintainer = "The Infrastructure Company GmbH <info@servercow.de>"
RUN apk upgrade --no-cache \
&& apk add --update --no-cache \
bash \
curl \
openssl \
bind-tools \
jq \
mariadb-client \
redis \
tini \
tzdata \
python3 \
acme-tiny \
git \
socat \
&& git clone --depth 1 https://github.com/acmesh-official/acme.sh.git /opt/acme.sh \
&& chmod +x /opt/acme.sh/acme.sh \
&& mkdir -p /var/lib/acme/acme-sh
ENV ACME_SH_BIN=/opt/acme.sh/acme.sh \
ACME_SH_HOME=/opt/acme.sh \
ACME_SH_CONFIG_HOME=/var/lib/acme/acme-sh
COPY acme.sh /srv/acme.sh
COPY functions.sh /srv/functions.sh
COPY obtain-certificate.sh /srv/obtain-certificate.sh
COPY obtain-certificate-dns.sh /srv/obtain-certificate-dns.sh
COPY load-dns-config.sh /srv/load-dns-config.sh
COPY reload-configurations.sh /srv/reload-configurations.sh
COPY expand6.sh /srv/expand6.sh
RUN chmod +x /srv/*.sh
CMD ["/sbin/tini", "-g", "--", "/srv/acme.sh"]
================================================
FILE: data/Dockerfiles/acme/acme.sh
================================================
#!/bin/bash
set -o pipefail
exec 5>&1
# Do not attempt to write to slave
if [[ ! -z ${REDIS_SLAVEOF_IP} ]]; then
export REDIS_CMDLINE="redis-cli -h ${REDIS_SLAVEOF_IP} -p ${REDIS_SLAVEOF_PORT} -a ${REDISPASS} --no-auth-warning"
else
export REDIS_CMDLINE="redis-cli -h redis -p 6379 -a ${REDISPASS} --no-auth-warning"
fi
until [[ $(${REDIS_CMDLINE} PING) == "PONG" ]]; do
echo "Waiting for Redis..."
sleep 2
done
# Create DNS-01 configuration template if it doesn't exist
if [[ ! -f /etc/acme/dns-01.conf ]]; then
mkdir -p /etc/acme
cat > /etc/acme/dns-01.conf <<'EOF'
# Add here your DNS-01 challenge configuration
# For more information, visit the acme.sh documentation:
# https://github.com/acmesh-official/acme.sh/wiki/dnsapi
EOF
echo "Created DNS-01 configuration template at /etc/acme/dns-01.conf"
fi
source /srv/functions.sh
# Thanks to https://github.com/cvmiller -> https://github.com/cvmiller/expand6
source /srv/expand6.sh
# Skipping IP check when we like to live dangerously
if [[ "${SKIP_IP_CHECK}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
SKIP_IP_CHECK=y
fi
# Skipping HTTP check when we like to live dangerously
if [[ "${SKIP_HTTP_VERIFICATION}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
SKIP_HTTP_VERIFICATION=y
fi
# Request certificate for MAILCOW_HOSTNAME only
if [[ "${ONLY_MAILCOW_HOSTNAME}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
ONLY_MAILCOW_HOSTNAME=y
fi
if [[ "${AUTODISCOVER_SAN}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
AUTODISCOVER_SAN=y
fi
# Request individual certificate for every domain
if [[ "${ENABLE_SSL_SNI}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
ENABLE_SSL_SNI=y
fi
if [[ "${ACME_DNS_CHALLENGE}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
ACME_DNS_CHALLENGE=y
fi
if [[ "${SKIP_LETS_ENCRYPT}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
log_f "SKIP_LETS_ENCRYPT=y, skipping Let's Encrypt..."
sleep 365d
exec $(readlink -f "$0")
fi
log_f "Waiting for Docker API..."
until ping dockerapi -c1 > /dev/null; do
sleep 1
done
log_f "Docker API OK"
log_f "Waiting for Postfix..."
until ping postfix -c1 > /dev/null; do
sleep 1
done
log_f "Postfix OK"
log_f "Waiting for Dovecot..."
until ping dovecot -c1 > /dev/null; do
sleep 1
done
log_f "Dovecot OK"
ACME_BASE=/var/lib/acme
SSL_EXAMPLE=/var/lib/ssl-example
mkdir -p ${ACME_BASE}/acme
# Migrate
[[ -f ${ACME_BASE}/acme/private/privkey.pem ]] && mv ${ACME_BASE}/acme/private/privkey.pem ${ACME_BASE}/acme/key.pem
[[ -f ${ACME_BASE}/acme/private/account.key ]] && mv ${ACME_BASE}/acme/private/account.key ${ACME_BASE}/acme/account.pem
if [[ -f ${ACME_BASE}/acme/key.pem && -f ${ACME_BASE}/acme/cert.pem ]]; then
if verify_hash_match ${ACME_BASE}/acme/cert.pem ${ACME_BASE}/acme/key.pem; then
log_f "Migrating to SNI folder structure..."
CERT_DOMAIN=($(openssl x509 -noout -text -in ${ACME_BASE}/acme/cert.pem | grep "Subject:" | sed -e 's/\(Subject:\)\|\(CN = \)\|\(CN=\)//g' | sed -e 's/^[[:space:]]*//'))
CERT_DOMAINS=(${CERT_DOMAIN} $(openssl x509 -noout -text -in ${ACME_BASE}/acme/cert.pem | grep "DNS:" | sed -e 's/\(DNS:\)\|,//g' | sed "s/${CERT_DOMAIN}//" | sed -e 's/^[[:space:]]*//'))
mkdir -p ${ACME_BASE}/${CERT_DOMAIN}
mv ${ACME_BASE}/acme/cert.pem ${ACME_BASE}/${CERT_DOMAIN}/cert.pem
# key is only copied, not moved, because it is used by all other requests too
cp ${ACME_BASE}/acme/key.pem ${ACME_BASE}/${CERT_DOMAIN}/key.pem
chmod 600 ${ACME_BASE}/${CERT_DOMAIN}/key.pem
echo -n ${CERT_DOMAINS[*]} > ${ACME_BASE}/${CERT_DOMAIN}/domains
mv ${ACME_BASE}/acme/acme.csr ${ACME_BASE}/${CERT_DOMAIN}/acme.csr
log_f "OK" no_date
fi
fi
[[ ! -f ${ACME_BASE}/dhparams.pem ]] && cp ${SSL_EXAMPLE}/dhparams.pem ${ACME_BASE}/dhparams.pem
if [[ -f ${ACME_BASE}/cert.pem ]] && [[ -f ${ACME_BASE}/key.pem ]] && [[ $(stat -c%s ${ACME_BASE}/cert.pem) != 0 ]]; then
ISSUER=$(openssl x509 -in ${ACME_BASE}/cert.pem -noout -issuer)
if [[ ${ISSUER} != *"Let's Encrypt"* && ${ISSUER} != *"mailcow"* && ${ISSUER} != *"Fake LE Intermediate"* ]]; then
log_f "Found certificate with issuer other than mailcow snake-oil CA and Let's Encrypt, skipping ACME client..."
sleep 3650d
exec $(readlink -f "$0")
fi
else
if [[ -f ${ACME_BASE}/${MAILCOW_HOSTNAME}/cert.pem ]] && [[ -f ${ACME_BASE}/${MAILCOW_HOSTNAME}/key.pem ]] && verify_hash_match ${ACME_BASE}/${MAILCOW_HOSTNAME}/cert.pem ${ACME_BASE}/${MAILCOW_HOSTNAME}/key.pem; then
log_f "Restoring previous acme certificate and restarting script..."
cp ${ACME_BASE}/${MAILCOW_HOSTNAME}/cert.pem ${ACME_BASE}/cert.pem
cp ${ACME_BASE}/${MAILCOW_HOSTNAME}/key.pem ${ACME_BASE}/key.pem
# Restarting with env var set to trigger a restart,
exec env TRIGGER_RESTART=1 $(readlink -f "$0")
else
log_f "Restoring mailcow snake-oil certificates and restarting script..."
cp ${SSL_EXAMPLE}/cert.pem ${ACME_BASE}/cert.pem
cp ${SSL_EXAMPLE}/key.pem ${ACME_BASE}/key.pem
exec env TRIGGER_RESTART=1 $(readlink -f "$0")
fi
fi
chmod 600 ${ACME_BASE}/key.pem
log_f "Waiting for database..."
while ! /usr/bin/mariadb-admin status --ssl=false --socket=/var/run/mysqld/mysqld.sock -u${DBUSER} -p${DBPASS} --silent > /dev/null; do
sleep 2
done
log_f "Database OK"
log_f "Waiting for Nginx..."
until $(curl --output /dev/null --silent --head --fail http://nginx.${COMPOSE_PROJECT_NAME}_mailcow-network:8081); do
sleep 2
done
log_f "Nginx OK"
log_f "Waiting for resolver..."
until dig letsencrypt.org +time=3 +tries=1 @unbound > /dev/null; do
sleep 2
done
log_f "Resolver OK"
# Waiting for domain table
log_f "Waiting for domain table..."
while [[ -z ${DOMAIN_TABLE} ]]; do
curl --silent http://nginx.${COMPOSE_PROJECT_NAME}_mailcow-network/ >/dev/null 2>&1
DOMAIN_TABLE=$(mariadb --skip-ssl --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SHOW TABLES LIKE 'domain'" -Bs)
[[ -z ${DOMAIN_TABLE} ]] && sleep 10
done
log_f "OK" no_date
log_f "Initializing, please wait..."
while true; do
POSTFIX_CERT_SERIAL="$(echo | openssl s_client -connect postfix:25 -starttls smtp 2>/dev/null | openssl x509 -inform pem -noout -serial | cut -d "=" -f 2)"
DOVECOT_CERT_SERIAL="$(echo | openssl s_client -connect dovecot:143 -starttls imap 2>/dev/null | openssl x509 -inform pem -noout -serial | cut -d "=" -f 2)"
POSTFIX_CERT_SERIAL_NEW="$(echo | openssl s_client -connect postfix:25 -starttls smtp 2>/dev/null | openssl x509 -inform pem -noout -serial | cut -d "=" -f 2)"
DOVECOT_CERT_SERIAL_NEW="$(echo | openssl s_client -connect dovecot:143 -starttls imap 2>/dev/null | openssl x509 -inform pem -noout -serial | cut -d "=" -f 2)"
# Re-using previous acme-mailcow account and domain keys
if [[ ! -f ${ACME_BASE}/acme/key.pem ]]; then
log_f "Generating missing domain private rsa key..."
openssl genrsa 4096 > ${ACME_BASE}/acme/key.pem
else
log_f "Using existing domain rsa key ${ACME_BASE}/acme/key.pem"
fi
if [[ ! -f ${ACME_BASE}/acme/account.pem ]]; then
log_f "Generating missing Lets Encrypt account key..."
openssl genrsa 4096 > ${ACME_BASE}/acme/account.pem
else
log_f "Using existing Lets Encrypt account key ${ACME_BASE}/acme/account.pem"
fi
chmod 600 ${ACME_BASE}/acme/key.pem
chmod 600 ${ACME_BASE}/acme/account.pem
unset EXISTING_CERTS
declare -a EXISTING_CERTS
for cert_dir in ${ACME_BASE}/*/ ; do
if [[ ! -f ${cert_dir}domains ]] || [[ ! -f ${cert_dir}cert.pem ]] || [[ ! -f ${cert_dir}key.pem ]]; then
continue
fi
EXISTING_CERTS+=("$(basename ${cert_dir})")
done
# Cleaning up and init validation arrays
unset SQL_DOMAIN_ARR
unset VALIDATED_CONFIG_DOMAINS
unset ADDITIONAL_VALIDATED_SAN
unset ADDITIONAL_WC_ARR
unset ADDITIONAL_SAN_ARR
unset CERT_ERRORS
unset CERT_CHANGED
unset CERT_AMOUNT_CHANGED
unset VALIDATED_CERTIFICATES
CERT_ERRORS=0
CERT_CHANGED=0
CERT_AMOUNT_CHANGED=0
declare -a SQL_DOMAIN_ARR
declare -a VALIDATED_CONFIG_DOMAINS
declare -a ADDITIONAL_VALIDATED_SAN
declare -a ADDITIONAL_WC_ARR
declare -a ADDITIONAL_SAN_ARR
declare -a VALIDATED_CERTIFICATES
IFS=',' read -r -a TMP_ARR <<< "${ADDITIONAL_SAN}"
for i in "${TMP_ARR[@]}" ; do
if [[ "$i" =~ \.\*$ ]]; then
ADDITIONAL_WC_ARR+=(${i::-2})
else
ADDITIONAL_SAN_ARR+=($i)
fi
done
if [[ ${AUTODISCOVER_SAN} == "y" ]]; then
# Fetch certs for autoconfig and autodiscover subdomains
ADDITIONAL_WC_ARR+=('autodiscover' 'autoconfig' 'mta-sts')
fi
if [[ ${SKIP_IP_CHECK} != "y" ]]; then
# Start IP detection
log_f "Detecting IP addresses..."
IPV4=$(get_ipv4)
IPV6=$(get_ipv6)
log_f "OK: ${IPV4}, ${IPV6:-"0000:0000:0000:0000:0000:0000:0000:0000"}"
fi
#########################################
# IP and webroot challenge verification #
SQL_DOMAINS=$(mariadb --skip-ssl --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM domain WHERE backupmx=0 and active=1" -Bs)
if [[ ! $? -eq 0 ]]; then
log_f "Failed to read SQL domains, retrying in 1 minute..."
sleep 1m
exec $(readlink -f "$0")
fi
while read domains; do
if [[ -z "${domains}" ]]; then
# ignore empty lines
continue
fi
SQL_DOMAIN_ARR+=("${domains}")
done <<< "${SQL_DOMAINS}"
if [[ ${ONLY_MAILCOW_HOSTNAME} != "y" ]]; then
for SQL_DOMAIN in "${SQL_DOMAIN_ARR[@]}"; do
unset VALIDATED_CONFIG_DOMAINS_SUBDOMAINS
declare -a VALIDATED_CONFIG_DOMAINS_SUBDOMAINS
for SUBDOMAIN in "${ADDITIONAL_WC_ARR[@]}"; do
FULL_SUBDOMAIN="${SUBDOMAIN}.${SQL_DOMAIN}"
# Skip if subdomain matches MAILCOW_HOSTNAME
if [[ "${FULL_SUBDOMAIN}" == "${MAILCOW_HOSTNAME}" ]]; then
continue
fi
# Skip if subdomain is covered by a wildcard in ADDITIONAL_SAN
if is_covered_by_wildcard "${FULL_SUBDOMAIN}"; then
log_f "Subdomain '${FULL_SUBDOMAIN}' is covered by wildcard - skipping explicit subdomain"
continue
fi
# Validate and add subdomain
if check_domain "${FULL_SUBDOMAIN}"; then
VALIDATED_CONFIG_DOMAINS_SUBDOMAINS+=("${FULL_SUBDOMAIN}")
fi
done
VALIDATED_CONFIG_DOMAINS+=("${VALIDATED_CONFIG_DOMAINS_SUBDOMAINS[*]}")
done
# Fetch alias domains where target domain has MTA-STS enabled
if [[ ${AUTODISCOVER_SAN} == "y" ]]; then
SQL_ALIAS_DOMAINS=$(mariadb --skip-ssl --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT ad.alias_domain FROM alias_domain ad INNER JOIN mta_sts m ON ad.target_domain = m.domain WHERE ad.active = 1 AND m.active = 1" -Bs)
if [[ $? -eq 0 ]]; then
while read alias_domain; do
if [[ -z "${alias_domain}" ]]; then
# ignore empty lines
continue
fi
# Only add mta-sts subdomain for alias domains
if [[ "mta-sts.${alias_domain}" != "${MAILCOW_HOSTNAME}" ]]; then
# Skip if mta-sts subdomain is covered by a wildcard
if is_covered_by_wildcard "mta-sts.${alias_domain}"; then
log_f "Alias domain mta-sts subdomain 'mta-sts.${alias_domain}' is covered by wildcard - skipping"
elif check_domain "mta-sts.${alias_domain}"; then
VALIDATED_CONFIG_DOMAINS+=("mta-sts.${alias_domain}")
fi
fi
done <<< "${SQL_ALIAS_DOMAINS}"
fi
fi
fi
if check_domain ${MAILCOW_HOSTNAME}; then
VALIDATED_MAILCOW_HOSTNAME="${MAILCOW_HOSTNAME}"
fi
if [[ ${ONLY_MAILCOW_HOSTNAME} != "y" ]]; then
for SAN in "${ADDITIONAL_SAN_ARR[@]}"; do
# Skip on CAA errors for SAN
SAN_PARENT_DOMAIN=$(echo ${SAN} | cut -d. -f2-)
SAN_CAAS=( $(dig CAA ${SAN_PARENT_DOMAIN} +short | sed -n 's/\d issue "\(.*\)"/\1/p') )
if [[ ! -z ${SAN_CAAS} ]]; then
if [[ ${SAN_CAAS[@]} =~ "letsencrypt.org" ]]; then
log_f "Validated CAA for parent domain ${SAN_PARENT_DOMAIN} of ${SAN}"
else
log_f "Skipping ACME validation for ${SAN}: Lets Encrypt disallowed for ${SAN} by CAA record"
continue
fi
fi
if [[ ${SAN} == ${MAILCOW_HOSTNAME} ]]; then
continue
fi
if check_domain ${SAN}; then
ADDITIONAL_VALIDATED_SAN+=("${SAN}")
fi
done
fi
# Check if MAILCOW_HOSTNAME is covered by a wildcard in ADDITIONAL_SAN
MAILCOW_HOSTNAME_COVERED=0
if [[ ! -z ${VALIDATED_MAILCOW_HOSTNAME} ]]; then
if is_covered_by_wildcard "${VALIDATED_MAILCOW_HOSTNAME}"; then
MAILCOW_PARENT_DOMAIN=$(echo ${VALIDATED_MAILCOW_HOSTNAME} | cut -d. -f2-)
log_f "MAILCOW_HOSTNAME '${VALIDATED_MAILCOW_HOSTNAME}' is covered by wildcard '*.${MAILCOW_PARENT_DOMAIN}' - skipping explicit hostname"
MAILCOW_HOSTNAME_COVERED=1
fi
fi
# Unique domains for server certificate
if [[ ${ENABLE_SSL_SNI} == "y" ]]; then
# create certificate for server name and fqdn SANs only
if [[ ${MAILCOW_HOSTNAME_COVERED} == "1" ]]; then
SERVER_SAN_VALIDATED=($(echo ${ADDITIONAL_VALIDATED_SAN[*]} | xargs -n1 | sort -u | xargs))
else
SERVER_SAN_VALIDATED=(${VALIDATED_MAILCOW_HOSTNAME} $(echo ${ADDITIONAL_VALIDATED_SAN[*]} | xargs -n1 | sort -u | xargs))
fi
else
# create certificate for all domains, including all subdomains from other domains [*]
if [[ ${MAILCOW_HOSTNAME_COVERED} == "1" ]]; then
SERVER_SAN_VALIDATED=($(echo ${VALIDATED_CONFIG_DOMAINS[*]} ${ADDITIONAL_VALIDATED_SAN[*]} | xargs -n1 | sort -u | xargs))
else
SERVER_SAN_VALIDATED=(${VALIDATED_MAILCOW_HOSTNAME} $(echo ${VALIDATED_CONFIG_DOMAINS[*]} ${ADDITIONAL_VALIDATED_SAN[*]} | xargs -n1 | sort -u | xargs))
fi
fi
if [[ ! -z ${SERVER_SAN_VALIDATED[*]} ]]; then
CERT_NAME=${SERVER_SAN_VALIDATED[0]}
VALIDATED_CERTIFICATES+=("${CERT_NAME}")
# obtain server certificate if required
DOMAINS=${SERVER_SAN_VALIDATED[@]} /srv/obtain-certificate.sh rsa
RETURN="$?"
if [[ "$RETURN" == "0" ]]; then # 0 = cert created successfully
CERT_AMOUNT_CHANGED=1
CERT_CHANGED=1
elif [[ "$RETURN" == "1" ]]; then # 1 = cert renewed successfully
CERT_CHANGED=1
elif [[ "$RETURN" == "2" ]]; then # 2 = cert not due for renewal
:
else
CERT_ERRORS=1
fi
# copy hostname certificate to default/server certificate
# do not a key when cert is missing, this can lead to a mismatch of cert/key
if [[ -f ${ACME_BASE}/${CERT_NAME}/cert.pem ]]; then
cp ${ACME_BASE}/${CERT_NAME}/cert.pem ${ACME_BASE}/cert.pem
cp ${ACME_BASE}/${CERT_NAME}/key.pem ${ACME_BASE}/key.pem
fi
fi
# individual certificates for SNI [@]
if [[ ${ENABLE_SSL_SNI} == "y" ]]; then
for VALIDATED_DOMAINS in "${VALIDATED_CONFIG_DOMAINS[@]}"; do
VALIDATED_DOMAINS_ARR=(${VALIDATED_DOMAINS})
unset VALIDATED_DOMAINS_SORTED
declare -a VALIDATED_DOMAINS_SORTED
VALIDATED_DOMAINS_SORTED=(${VALIDATED_DOMAINS_ARR[0]} $(echo ${VALIDATED_DOMAINS_ARR[@]:1} | xargs -n1 | sort -u | xargs))
# remove all domain names that are already inside the server certificate (SERVER_SAN_VALIDATED)
for domain in "${SERVER_SAN_VALIDATED[@]}"; do
for i in "${!VALIDATED_DOMAINS_SORTED[@]}"; do
if [[ ${VALIDATED_DOMAINS_SORTED[i]} = $domain ]]; then
unset 'VALIDATED_DOMAINS_SORTED[i]'
fi
done
done
if [[ ! -z ${VALIDATED_DOMAINS_SORTED[*]} ]]; then
CERT_NAME=${VALIDATED_DOMAINS_SORTED[0]}
VALIDATED_CERTIFICATES+=("${CERT_NAME}")
# obtain certificate if required
DOMAINS=${VALIDATED_DOMAINS_SORTED[@]} /srv/obtain-certificate.sh rsa
RETURN="$?"
if [[ "$RETURN" == "0" ]]; then # 0 = cert created successfully
CERT_AMOUNT_CHANGED=1
CERT_CHANGED=1
elif [[ "$RETURN" == "1" ]]; then # 1 = cert renewed successfully
CERT_CHANGED=1
elif [[ "$RETURN" == "2" ]]; then # 2 = cert not due for renewal
:
else
CERT_ERRORS=1
fi
fi
done
fi
if [[ -z ${VALIDATED_CERTIFICATES[*]} ]]; then
log_f "Cannot validate any hostnames, skipping Let's Encrypt for 1 hour."
log_f "Use SKIP_LETS_ENCRYPT=y in mailcow.conf to skip it permanently."
${REDIS_CMDLINE} SET ACME_FAIL_TIME "$(date +%s)"
sleep 1h
exec $(readlink -f "$0")
fi
# find orphaned certificates if no errors occurred
if [[ "${CERT_ERRORS}" == "0" ]]; then
for EXISTING_CERT in "${EXISTING_CERTS[@]}"; do
if [[ ! "`printf '_%s_\n' "${VALIDATED_CERTIFICATES[@]}"`" == *"_${EXISTING_CERT}_"* ]]; then
DATE=$(date +%Y-%m-%d_%H_%M_%S)
log_f "Found orphaned certificate: ${EXISTING_CERT} - archiving it at ${ACME_BASE}/backups/${EXISTING_CERT}/"
BACKUP_DIR=${ACME_BASE}/backups/${EXISTING_CERT}/${DATE}
# archive rsa cert and any other files
mkdir -p ${ACME_BASE}/backups/${EXISTING_CERT}
mv ${ACME_BASE}/${EXISTING_CERT} ${BACKUP_DIR}
CERT_CHANGED=1
CERT_AMOUNT_CHANGED=1
fi
done
fi
# reload on new or changed certificates
if [[ "${CERT_CHANGED}" == "1" ]]; then
rm -f "${ACME_BASE}/force_renew" 2> /dev/null
RELOAD_LOOP_C=1
while [[ "${POSTFIX_CERT_SERIAL}" == "${POSTFIX_CERT_SERIAL_NEW}" ]] || [[ "${DOVECOT_CERT_SERIAL}" == "${DOVECOT_CERT_SERIAL_NEW}" ]] || [[ ${#POSTFIX_CERT_SERIAL_NEW} -ne 36 ]] || [[ ${#DOVECOT_CERT_SERIAL_NEW} -ne 36 ]]; do
log_f "Reloading or restarting services... (${RELOAD_LOOP_C})"
RELOAD_LOOP_C=$((RELOAD_LOOP_C + 1))
CERT_AMOUNT_CHANGED=${CERT_AMOUNT_CHANGED} /srv/reload-configurations.sh
log_f "Waiting for containers to settle..."
sleep 10
until nc -z dovecot 143; do
sleep 1
done
until nc -z postfix 25; do
sleep 1
done
POSTFIX_CERT_SERIAL_NEW="$(echo | openssl s_client -connect postfix:25 -starttls smtp 2>/dev/null | openssl x509 -inform pem -noout -serial | cut -d "=" -f 2)"
DOVECOT_CERT_SERIAL_NEW="$(echo | openssl s_client -connect dovecot:143 -starttls imap 2>/dev/null | openssl x509 -inform pem -noout -serial | cut -d "=" -f 2)"
if [[ ${RELOAD_LOOP_C} -gt 3 ]]; then
log_f "Some services do return old end dates, something went wrong!"
${REDIS_CMDLINE} SET ACME_FAIL_TIME "$(date +%s)"
break;
fi
done
fi
case "$CERT_ERRORS" in
0) # all successful
if [[ "${CERT_CHANGED}" == "1" ]]; then
if [[ "${CERT_AMOUNT_CHANGED}" == "1" ]]; then
log_f "Certificates successfully requested and renewed where required, sleeping one day"
else
log_f "Certificates were successfully renewed where required, sleeping for another day."
fi
else
log_f "Certificates were successfully validated, no changes or renewals required, sleeping for another day."
fi
sleep 1d
;;
*) # non-zero
log_f "Some errors occurred, retrying in 30 minutes..."
${REDIS_CMDLINE} SET ACME_FAIL_TIME "$(date +%s)"
sleep 30m
exec $(readlink -f "$0")
;;
esac
done
================================================
FILE: data/Dockerfiles/acme/expand6.sh
================================================
#!/bin/bash
##################################################################################
#
# Copyright (C) 2017 Craig Miller
#
# See the file "LICENSE" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# Distributed under GPLv2 License
#
##################################################################################
# IPv6 Address Expansion functions
#
# by Craig Miller 19 Feb 2017
#
# 16 Nov 2017 v0.93 - added CLI functionality
VERSION=0.93
empty_addr="0000:0000:0000:0000:0000:0000:0000:0000"
empty_addr_len=${#empty_addr}
function usage {
echo " $0 - expand compressed IPv6 addresss "
echo " e.g. $0 2001:db8:1:12:123::456 "
echo " "
echo " -t self test"
echo " "
echo " By Craig Miller - Version: $VERSION"
exit 1
}
if [ "$1" == "-h" ]; then
#call help
usage
fi
#
# Expands IPv6 quibble to 4 digits with leading zeros e.g. db8 -> 0db8
#
# Returns string with expanded quibble
function expand_quibble() {
addr=$1
# create array of quibbles
addr_array=(${addr//:/ })
addr_array_len=${#addr_array[@]}
# step thru quibbles
for ((i=0; i< $addr_array_len ; i++ ))
do
quibble=${addr_array[$i]}
quibble_len=${#quibble}
case $quibble_len in
1) quibble="000$quibble";;
2) quibble="00$quibble";;
3) quibble="0$quibble";;
esac
addr_array[$i]=$quibble
done
# reconstruct addr from quibbles
return_str=${addr_array[*]}
return_str="${return_str// /:}"
echo $return_str
}
#
# Expands IPv6 address :: format to full zeros
#
# Returns string with expanded address
function expand() {
if [[ $1 == *"::"* ]]; then
# check for leading zeros on front_addr
if [[ $1 == "::"* ]]; then
front_addr=0
else
front_addr=$(echo $1 | sed -r 's;([^ ]+)::.*;\1;')
fi
# check for trailing zeros on back_addr
if [[ $1 == *"::" ]]; then
back_addr=0
else
back_addr=$(echo $1 | sed -r 's;.*::([^ ]+);\1;')
fi
front_addr=$(expand_quibble $front_addr)
back_addr=$(expand_quibble $back_addr)
new_addr=$empty_addr
front_addr_len=${#front_addr}
back_addr_len=${#back_addr}
# calculate fill needed
num_zeros=$(($empty_addr_len - $front_addr_len - $back_addr_len - 1))
#fill_str=${empty_addr[0]:0:$num_zeros}
new_addr="$front_addr:${empty_addr[0]:0:$num_zeros}$back_addr"
# return expanded address
echo $new_addr
else
# return input with expandd quibbles
expand_quibble $1
fi
}
# self test - call with '-t' parameter
if [ "$1" == "-t" ]; then
# add address examples to test
expand fd11::1d70:cf84:18ef:d056
expand 2a01::1
expand fe80::f203:8cff:fe3f:f041
expand 2001:db8:123::5
expand 2001:470:ebbd:0:f203:8cff:fe3f:f041
# special cases
expand ::1
expand fd32:197d:3022:1101::
exit 1
fi
# allow script to be sourced (with no arguements)
if [[ $1 != "" ]]; then
# validate input is an IPv6 address
if [[ $1 == *":"* ]]; then
expand $1
else
echo "ERROR: unregcognized IPv6 address $1"
exit 1
fi
fi
================================================
FILE: data/Dockerfiles/acme/functions.sh
================================================
#!/bin/bash
log_f() {
if [[ ${2} == "no_nl" ]]; then
echo -n "$(date) - ${1}"
elif [[ ${2} == "no_date" ]]; then
echo "${1}"
elif [[ ${2} != "redis_only" ]]; then
echo "$(date) - ${1}"
fi
if [[ ${3} == "b64" ]]; then
${REDIS_CMDLINE} LPUSH ACME_LOG "{\"time\":\"$(date +%s)\",\"message\":\"base64,$(printf '%s' "${MAILCOW_HOSTNAME} - ${1}")\"}" > /dev/null
else
${REDIS_CMDLINE} LPUSH ACME_LOG "{\"time\":\"$(date +%s)\",\"message\":\"$(printf '%s' "${MAILCOW_HOSTNAME} - ${1}" | \
tr '%&;$"[]{}-\r\n' ' ')\"}" > /dev/null
fi
}
verify_email(){
regex="^(([A-Za-z0-9]+((\.|\-|\_|\+)?[A-Za-z0-9]?)*[A-Za-z0-9]+)|[A-Za-z0-9]+)@(([A-Za-z0-9]+)+((\.|\-|\_)?([A-Za-z0-9]+)+)*)+\.([A-Za-z]{2,})+$"
if [[ $1 =~ ${regex} ]]; then
return 0
else
return 1
fi
}
verify_hash_match(){
CERT_HASH=$(openssl x509 -in "${1}" -noout -pubkey | openssl md5)
KEY_HASH=$(openssl pkey -in "${2}" -pubout | openssl md5)
if [[ ${CERT_HASH} != ${KEY_HASH} ]]; then
log_f "Certificate and key hashes do not match!"
return 1
else
log_f "Verified hashes."
return 0
fi
}
get_ipv4(){
local IPV4=
local IPV4_SRCS=
local TRY=
IPV4_SRCS[0]="ip4.mailcow.email"
IPV4_SRCS[1]="ip4.nevondo.com"
until [[ ! -z ${IPV4} ]] || [[ ${TRY} -ge 10 ]]; do
IPV4=$(curl --connect-timeout 3 -m 10 -L4s ${IPV4_SRCS[$RANDOM % ${#IPV4_SRCS[@]} ]} | grep -E "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")
[[ ! -z ${TRY} ]] && sleep 1
TRY=$((TRY+1))
done
echo ${IPV4}
}
get_ipv6(){
local IPV6=
local IPV6_SRCS=
local TRY=
IPV6_SRCS[0]="ip6.mailcow.email"
IPV6_SRCS[1]="ip6.nevondo.com"
until [[ ! -z ${IPV6} ]] || [[ ${TRY} -ge 10 ]]; do
IPV6=$(curl --connect-timeout 3 -m 10 -L6s ${IPV6_SRCS[$RANDOM % ${#IPV6_SRCS[@]} ]} | grep "^\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}$")
[[ ! -z ${TRY} ]] && sleep 1
TRY=$((TRY+1))
done
echo ${IPV6}
}
check_domain(){
DOMAIN=$1
A_DOMAIN=$(dig A ${DOMAIN} +short | tail -n 1)
AAAA_DOMAIN=$(dig AAAA ${DOMAIN} +short | tail -n 1)
# Hard-fail on CAA errors for MAILCOW_HOSTNAME
PARENT_DOMAIN=$(echo ${DOMAIN} | cut -d. -f2-)
CAAS=( $(dig CAA ${PARENT_DOMAIN} +short | sed -n 's/\d issue "\(.*\)"/\1/p') )
if [[ ! -z ${CAAS} ]]; then
if [[ ${CAAS[@]} =~ "letsencrypt.org" ]]; then
log_f "Validated CAA for parent domain ${PARENT_DOMAIN}"
else
log_f "Lets Encrypt disallowed for ${PARENT_DOMAIN} by CAA record"
return 1
fi
fi
if [[ ${ACME_DNS_CHALLENGE} == "y" ]]; then
log_f "ACME_DNS_CHALLENGE=y - skipping IP and HTTP validation for ${DOMAIN}"
return 0
fi
# Check if CNAME without v6 enabled target
if [[ ! -z ${AAAA_DOMAIN} ]] && [[ -z $(echo ${AAAA_DOMAIN} | grep "^\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}$") ]]; then
AAAA_DOMAIN=
fi
if [[ ! -z ${AAAA_DOMAIN} ]]; then
log_f "Found AAAA record for ${DOMAIN}: ${AAAA_DOMAIN} - skipping A record check"
if [[ $(expand ${IPV6:-"0000:0000:0000:0000:0000:0000:0000:0000"}) == $(expand ${AAAA_DOMAIN}) ]] || [[ ${SKIP_IP_CHECK} == "y" ]] || [[ ${SNAT6_TO_SOURCE} != "n" ]]; then
if verify_challenge_path "${DOMAIN}" 6; then
log_f "Confirmed AAAA record with IP $(expand ${AAAA_DOMAIN})"
return 0
else
log_f "Confirmed AAAA record with IP $(expand ${AAAA_DOMAIN}), but HTTP validation failed"
fi
else
log_f "Cannot match your IP $(expand ${IPV6:-"0000:0000:0000:0000:0000:0000:0000:0000"}) against hostname ${DOMAIN} (DNS returned $(expand ${AAAA_DOMAIN}))"
fi
elif [[ ! -z ${A_DOMAIN} ]]; then
log_f "Found A record for ${DOMAIN}: ${A_DOMAIN}"
if [[ ${IPV4:-ERR} == ${A_DOMAIN} ]] || [[ ${SKIP_IP_CHECK} == "y" ]] || [[ ${SNAT_TO_SOURCE} != "n" ]]; then
if verify_challenge_path "${DOMAIN}" 4; then
log_f "Confirmed A record ${A_DOMAIN}"
return 0
else
log_f "Confirmed A record with IP ${A_DOMAIN}, but HTTP validation failed"
fi
else
log_f "Cannot match your IP ${IPV4} against hostname ${DOMAIN} (DNS returned ${A_DOMAIN})"
fi
else
log_f "No A or AAAA record found for hostname ${DOMAIN}"
fi
return 1
}
verify_challenge_path(){
if [[ ${SKIP_HTTP_VERIFICATION} == "y" ]]; then
echo '(skipping check, returning 0)'
return 0
fi
# verify_challenge_path URL 4|6
RANDOM_N=${RANDOM}${RANDOM}${RANDOM}
echo ${RANDOM_N} > /var/www/acme/${RANDOM_N}
if [[ "$(curl --insecure -${2} -L http://${1}/.well-known/acme-challenge/${RANDOM_N} --silent)" == "${RANDOM_N}" ]]; then
rm /var/www/acme/${RANDOM_N}
return 0
else
rm /var/www/acme/${RANDOM_N}
return 1
fi
}
# Check if a domain is covered by a wildcard (*.example.com) in ADDITIONAL_SAN
# Usage: is_covered_by_wildcard "subdomain.example.com"
# Returns: 0 if covered, 1 if not covered
# Note: Only returns 0 (covered) when DNS-01 challenge is enabled,
# as wildcards cannot be validated with HTTP-01 challenge
is_covered_by_wildcard() {
local DOMAIN=$1
# Only skip if DNS challenge is enabled (wildcards require DNS-01)
if [[ ${ACME_DNS_CHALLENGE} != "y" ]]; then
return 1
fi
# Return early if no ADDITIONAL_SAN is set
if [[ -z ${ADDITIONAL_SAN} ]]; then
return 1
fi
# Extract parent domain (e.g., mail.example.com -> example.com)
local PARENT_DOMAIN=$(echo ${DOMAIN} | cut -d. -f2-)
# Check if ADDITIONAL_SAN contains a wildcard for this parent domain
if [[ "${ADDITIONAL_SAN}" == *"*.${PARENT_DOMAIN}"* ]]; then
return 0 # Covered by wildcard
fi
return 1 # Not covered
}
================================================
FILE: data/Dockerfiles/acme/load-dns-config.sh
================================================
#!/bin/bash
SCRIPT_SOURCE="${BASH_SOURCE[0]:-${0}}"
if [[ "${SCRIPT_SOURCE}" == "${0}" ]]; then
__dns_loader_standalone=1
else
__dns_loader_standalone=0
fi
CONFIG_PATH="${ACME_DNS_CONFIG_FILE:-/etc/acme/dns-01.conf}"
if [[ ! -f "${CONFIG_PATH}" ]]; then
if [[ $__dns_loader_standalone -eq 1 ]]; then
exit 0
else
return 0
fi
fi
source /srv/functions.sh
log_f "Loading DNS-01 configuration from ${CONFIG_PATH}"
LINE_NO=0
while IFS= read -r line || [[ -n "${line}" ]]; do
LINE_NO=$((LINE_NO+1))
line="${line%$'\r'}"
line_trimmed="$(printf '%s' "${line}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
[[ -z "${line_trimmed}" ]] && continue
[[ "${line_trimmed:0:1}" == "#" ]] && continue
if [[ "${line_trimmed}" != *=* ]]; then
log_f "Skipping invalid DNS config line ${LINE_NO} (missing key=value)"
continue
fi
KEY="${line_trimmed%%=*}"
VALUE="${line_trimmed#*=}"
KEY="$(printf '%s' "${KEY}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
VALUE="$(printf '%s' "${VALUE}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
if [[ -z "${KEY}" ]]; then
log_f "Skipping invalid DNS config line ${LINE_NO} (empty key)"
continue
fi
if [[ "${VALUE}" =~ ^\".*\"$ ]]; then
VALUE="${VALUE:1:-1}"
elif [[ "${VALUE}" =~ ^\'.*\'$ ]]; then
VALUE="${VALUE:1:-1}"
fi
export "${KEY}"="${VALUE}"
log_f "Exported DNS config key ${KEY}"
done < "${CONFIG_PATH}"
if [[ $__dns_loader_standalone -eq 1 ]]; then
exit 0
else
return 0
fi
================================================
FILE: data/Dockerfiles/acme/obtain-certificate-dns.sh
================================================
#!/bin/bash
# Return values / exit codes
# 0 = cert created successfully
# 1 = cert renewed successfully
# 2 = cert not due for renewal
# * = errors
source /srv/functions.sh
CERT_DOMAINS=(${DOMAINS[@]})
CERT_DOMAIN=${CERT_DOMAINS[0]}
ACME_BASE=/var/lib/acme
# Load optional DNS provider secrets from /etc/acme/dns-01.conf
if [[ -f /srv/load-dns-config.sh ]]; then
source /srv/load-dns-config.sh
if declare -F log_f >/dev/null; then
log_f "ACME_DNS_CHALLENGE is enabled, DNS provider secrets loaded"
fi
fi
TYPE=${1}
PREFIX=""
# only support rsa certificates for now
if [[ "${TYPE}" != "rsa" ]]; then
log_f "Unknown certificate type '${TYPE}' requested"
exit 5
fi
if [[ -z "${ACME_DNS_PROVIDER}" ]]; then
log_f "ACME_DNS_PROVIDER is required when ACME_DNS_CHALLENGE is enabled"
exit 6
fi
DOMAINS_FILE=${ACME_BASE}/${CERT_DOMAIN}/domains
CERT=${ACME_BASE}/${CERT_DOMAIN}/${PREFIX}cert.pem
SHARED_KEY=${ACME_BASE}/acme/${PREFIX}key.pem # must already exist
KEY=${ACME_BASE}/${CERT_DOMAIN}/${PREFIX}key.pem
CSR=${ACME_BASE}/${CERT_DOMAIN}/${PREFIX}acme.csr
if [[ -z ${CERT_DOMAINS[*]} ]]; then
log_f "Missing CERT_DOMAINS to obtain a certificate"
exit 3
fi
if [[ "${LE_STAGING}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
if [[ ! -z "${DIRECTORY_URL}" ]]; then
log_f "Cannot use DIRECTORY_URL with LE_STAGING=y - ignoring DIRECTORY_URL"
fi
log_f "Using Let's Encrypt staging servers"
ACME_SH_SERVER_ARGS=("--staging")
elif [[ ! -z "${DIRECTORY_URL}" ]]; then
log_f "Using custom directory URL ${DIRECTORY_URL}"
ACME_SH_SERVER_ARGS=("--server" "${DIRECTORY_URL}")
else
log_f "Using Let's Encrypt production servers"
ACME_SH_SERVER_ARGS=("--server" "letsencrypt")
fi
if [[ -f ${DOMAINS_FILE} && "$(cat ${DOMAINS_FILE})" == "${CERT_DOMAINS[*]}" ]]; then
if [[ ! -f ${CERT} || ! -f "${KEY}" || -f "${ACME_BASE}/force_renew" ]]; then
log_f "Certificate ${CERT} doesn't exist yet or forced renewal - start obtaining"
elif ! openssl x509 -checkend 2592000 -noout -in ${CERT} > /dev/null; then
log_f "Certificate ${CERT} is due for renewal (< 30 days) - start renewing"
else
log_f "Certificate ${CERT} validation done, neither changed nor due for renewal."
exit 2
fi
else
log_f "Certificate ${CERT} missing or changed domains '${CERT_DOMAINS[*]}' - start obtaining"
fi
# Make backup
if [[ -f ${CERT} ]]; then
DATE=$(date +%Y-%m-%d_%H_%M_%S)
BACKUP_DIR=${ACME_BASE}/backups/${CERT_DOMAIN}/${PREFIX}${DATE}
log_f "Creating backups in ${BACKUP_DIR} ..."
mkdir -p ${BACKUP_DIR}/
[[ -f ${DOMAINS_FILE} ]] && cp ${DOMAINS_FILE} ${BACKUP_DIR}/
[[ -f ${CERT} ]] && cp ${CERT} ${BACKUP_DIR}/
[[ -f ${KEY} ]] && cp ${KEY} ${BACKUP_DIR}/
[[ -f ${CSR} ]] && cp ${CSR} ${BACKUP_DIR}/
fi
mkdir -p ${ACME_BASE}/${CERT_DOMAIN}
if [[ ! -f ${KEY} ]]; then
log_f "Copying shared private key for this certificate..."
cp ${SHARED_KEY} ${KEY}
chmod 600 ${KEY}
fi
# Generating CSR to keep layout parity with HTTP challenge flow
printf "[SAN]\nsubjectAltName=" > /tmp/_SAN
printf "DNS:%s," "${CERT_DOMAINS[@]}" >> /tmp/_SAN
sed -i '$s/,$//' /tmp/_SAN
openssl req -new -sha256 -key ${KEY} -subj "/" -reqexts SAN -config <(cat "$(openssl version -d | sed 's/.*\"\(.*\)\"/\1/g')/openssl.cnf" /tmp/_SAN) > ${CSR}
log_f "Checking resolver..."
until dig letsencrypt.org +time=3 +tries=1 @unbound > /dev/null; do
sleep 2
done
log_f "Resolver OK"
ACME_SH_BIN_PATH=${ACME_SH_BIN:-/opt/acme.sh/acme.sh}
ACME_SH_WORK_HOME=${ACME_SH_CONFIG_HOME:-/var/lib/acme/acme-sh}
mkdir -p ${ACME_SH_WORK_HOME}
if [[ ! -x ${ACME_SH_BIN_PATH} ]]; then
log_f "acme.sh binary not found at ${ACME_SH_BIN_PATH}"
exit 7
fi
if [[ ! -f ${ACME_SH_WORK_HOME}/account.conf ]]; then
if [[ -z "${ACME_ACCOUNT_EMAIL}" ]]; then
log_f "ACME_ACCOUNT_EMAIL is required to register a new acme.sh account"
exit 8
fi
log_f "Registering acme.sh account for ${ACME_ACCOUNT_EMAIL}"
REGISTER_CMD=("${ACME_SH_BIN_PATH}" "--home" "${ACME_SH_WORK_HOME}" "--config-home" "${ACME_SH_WORK_HOME}" "--cert-home" "${ACME_SH_WORK_HOME}" "--register-account" "-m" "${ACME_ACCOUNT_EMAIL}")
REGISTER_CMD+=("${ACME_SH_SERVER_ARGS[@]}")
REGISTER_RESPONSE=$("${REGISTER_CMD[@]}" 2>&1)
if [[ $? -ne 0 ]]; then
log_f "Failed to register acme.sh account: ${REGISTER_RESPONSE}"
exit 9
fi
fi
TMP_CERT=$(mktemp /tmp/acme-cert.XXXXXX)
TMP_FULLCHAIN=$(mktemp /tmp/acme-fullchain.XXXXXX)
ACME_CMD=("${ACME_SH_BIN_PATH}" "--home" "${ACME_SH_WORK_HOME}" "--config-home" "${ACME_SH_WORK_HOME}" "--cert-home" "${ACME_SH_WORK_HOME}")
ACME_CMD+=("${ACME_SH_SERVER_ARGS[@]}")
ACME_CMD+=("--issue" "--dns" "${ACME_DNS_PROVIDER}" "--key-file" "${KEY}" "--cert-file" "${TMP_CERT}" "--fullchain-file" "${TMP_FULLCHAIN}" "--force")
for domain in "${CERT_DOMAINS[@]}"; do
ACME_CMD+=("-d" "${domain}")
done
log_f "Using command ${ACME_CMD[*]}"
if [[ -n "${ACME_DNS_PROVIDER}" ]]; then
log_f "DNS provider: ${ACME_DNS_PROVIDER}"
fi
if compgen -A variable | grep -Eq "^DNS_|^ACME_"; then
LOG_KEYS=$(env | grep -E "^(DNS_|ACME_)" | cut -d= -f1 | tr '\n' ' ')
log_f "Available DNS/ACME env keys: ${LOG_KEYS}" redis_only
fi
ACME_RESPONSE=$("${ACME_CMD[@]}" 2>&1 | tee /dev/fd/5; exit ${PIPESTATUS[0]})
SUCCESS="$?"
ACME_RESPONSE_B64=$(echo "${ACME_RESPONSE}" | openssl enc -e -A -base64)
log_f "${ACME_RESPONSE_B64}" redis_only b64
case "$SUCCESS" in
0)
log_f "Deploying certificate ${CERT}..."
if verify_hash_match ${TMP_FULLCHAIN} ${KEY}; then
RETURN=0
if [[ -f ${CERT} ]]; then
RETURN=1
fi
mv -f ${TMP_FULLCHAIN} ${CERT}
rm -f ${TMP_CERT}
echo -n ${CERT_DOMAINS[*]} > ${DOMAINS_FILE}
log_f "Certificate successfully obtained via DNS challenge"
exit ${RETURN}
else
log_f "Certificate was requested, but key and certificate hashes do not match"
rm -f ${TMP_CERT} ${TMP_FULLCHAIN}
exit 4
fi
;;
*)
log_f "Failed to obtain certificate ${CERT} for domains '${CERT_DOMAINS[*]}' via DNS challenge"
redis-cli -h redis -a ${REDISPASS} --no-auth-warning SET ACME_FAIL_TIME "$(date +%s)"
rm -f ${TMP_CERT} ${TMP_FULLCHAIN}
exit 100${SUCCESS}
;;
esac
================================================
FILE: data/Dockerfiles/acme/obtain-certificate.sh
================================================
#!/bin/bash
# Return values / exit codes
# 0 = cert created successfully
# 1 = cert renewed successfully
# 2 = cert not due for renewal
# * = errors
source /srv/functions.sh
CERT_DOMAINS=(${DOMAINS[@]})
CERT_DOMAIN=${CERT_DOMAINS[0]}
ACME_BASE=/var/lib/acme
TYPE=${1}
PREFIX=""
# only support rsa certificates for now
if [[ "${TYPE}" != "rsa" ]]; then
log_f "Unknown certificate type '${TYPE}' requested"
exit 5
fi
if [[ "${ACME_DNS_CHALLENGE}" == "y" ]]; then
exec /srv/obtain-certificate-dns.sh "$@"
fi
DOMAINS_FILE=${ACME_BASE}/${CERT_DOMAIN}/domains
CERT=${ACME_BASE}/${CERT_DOMAIN}/${PREFIX}cert.pem
SHARED_KEY=${ACME_BASE}/acme/${PREFIX}key.pem # must already exist
KEY=${ACME_BASE}/${CERT_DOMAIN}/${PREFIX}key.pem
CSR=${ACME_BASE}/${CERT_DOMAIN}/${PREFIX}acme.csr
if [[ -z ${CERT_DOMAINS[*]} ]]; then
log_f "Missing CERT_DOMAINS to obtain a certificate"
exit 3
fi
if [[ "${LE_STAGING}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
if [[ ! -z "${DIRECTORY_URL}" ]]; then
log_f "Cannot use DIRECTORY_URL with LE_STAGING=y - ignoring DIRECTORY_URL"
fi
log_f "Using Let's Encrypt staging servers"
DIRECTORY_URL='--directory-url https://acme-staging-v02.api.letsencrypt.org/directory'
elif [[ ! -z "${DIRECTORY_URL}" ]]; then
log_f "Using custom directory URL ${DIRECTORY_URL}"
DIRECTORY_URL="--directory-url ${DIRECTORY_URL}"
fi
if [[ -f ${DOMAINS_FILE} && "$(cat ${DOMAINS_FILE})" == "${CERT_DOMAINS[*]}" ]]; then
if [[ ! -f ${CERT} || ! -f "${KEY}" || -f "${ACME_BASE}/force_renew" ]]; then
log_f "Certificate ${CERT} doesn't exist yet or forced renewal - start obtaining"
# Certificate exists and did not change but could be due for renewal (30 days)
elif ! openssl x509 -checkend 2592000 -noout -in ${CERT} > /dev/null; then
log_f "Certificate ${CERT} is due for renewal (< 30 days) - start renewing"
else
log_f "Certificate ${CERT} validation done, neither changed nor due for renewal."
exit 2
fi
else
log_f "Certificate ${CERT} missing or changed domains '${CERT_DOMAINS[*]}' - start obtaining"
fi
# Make backup
if [[ -f ${CERT} ]]; then
DATE=$(date +%Y-%m-%d_%H_%M_%S)
BACKUP_DIR=${ACME_BASE}/backups/${CERT_DOMAIN}/${PREFIX}${DATE}
log_f "Creating backups in ${BACKUP_DIR} ..."
mkdir -p ${BACKUP_DIR}/
[[ -f ${DOMAINS_FILE} ]] && cp ${DOMAINS_FILE} ${BACKUP_DIR}/
[[ -f ${CERT} ]] && cp ${CERT} ${BACKUP_DIR}/
[[ -f ${KEY} ]] && cp ${KEY} ${BACKUP_DIR}/
[[ -f ${CSR} ]] && cp ${CSR} ${BACKUP_DIR}/
fi
mkdir -p ${ACME_BASE}/${CERT_DOMAIN}
if [[ ! -f ${KEY} ]]; then
log_f "Copying shared private key for this certificate..."
cp ${SHARED_KEY} ${KEY}
chmod 600 ${KEY}
fi
# Generating CSR
printf "[SAN]\nsubjectAltName=" > /tmp/_SAN
printf "DNS:%s," "${CERT_DOMAINS[@]}" >> /tmp/_SAN
sed -i '$s/,$//' /tmp/_SAN
openssl req -new -sha256 -key ${KEY} -subj "/" -reqexts SAN -config <(cat "$(openssl version -d | sed 's/.*"\(.*\)"/\1/g')/openssl.cnf" /tmp/_SAN) > ${CSR}
# acme-tiny writes info to stderr and ceritifcate to stdout
# The redirects will do the following:
# - redirect stdout to temp certificate file
# - redirect acme-tiny stderr to stdout (logs to variable ACME_RESPONSE)
# - tee stderr to get live output and log to dockerd
log_f "Checking resolver..."
until dig letsencrypt.org +time=3 +tries=1 @unbound > /dev/null; do
sleep 2
done
log_f "Resolver OK"
log_f "Using command acme-tiny ${DIRECTORY_URL} --account-key ${ACME_BASE}/acme/account.pem --disable-check --csr ${CSR} --acme-dir /var/www/acme/"
ACME_RESPONSE=$(acme-tiny ${DIRECTORY_URL} \
--account-key ${ACME_BASE}/acme/account.pem \
--disable-check \
--csr ${CSR} \
--acme-dir /var/www/acme/ 2>&1 > /tmp/_cert.pem | tee /dev/fd/5; exit ${PIPESTATUS[0]})
SUCCESS="$?"
ACME_RESPONSE_B64=$(echo "${ACME_RESPONSE}" | openssl enc -e -A -base64)
log_f "${ACME_RESPONSE_B64}" redis_only b64
case "$SUCCESS" in
0) # cert requested
log_f "Deploying certificate ${CERT}..."
# Deploy the new certificate and key
# Moving temp cert to {domain} folder
if verify_hash_match /tmp/_cert.pem ${KEY}; then
RETURN=0 # certificate created
if [[ -f ${CERT} ]]; then
RETURN=1 # certificate renewed
fi
mv -f /tmp/_cert.pem ${CERT}
echo -n ${CERT_DOMAINS[*]} > ${DOMAINS_FILE}
rm /var/www/acme/* 2> /dev/null
log_f "Certificate successfully obtained"
exit ${RETURN}
else
log_f "Certificate was successfully requested, but key and certificate have non-matching hashes, ignoring certificate"
exit 4
fi
;;
*) # non-zero is non-fun
log_f "Failed to obtain certificate ${CERT} for domains '${CERT_DOMAINS[*]}'"
redis-cli -h redis -a ${REDISPASS} --no-auth-warning SET ACME_FAIL_TIME "$(date +%s)"
exit 100${SUCCESS}
;;
esac
================================================
FILE: data/Dockerfiles/acme/reload-configurations.sh
================================================
#!/bin/bash
# Reading container IDs
# Wrapping as array to ensure trimmed content when calling $NGINX etc.
NGINX=($(curl --silent --insecure https://dockerapi.${COMPOSE_PROJECT_NAME}_mailcow-network/containers/json | jq -r ".[] | {name: .Config.Labels[\"com.docker.compose.service\"], project: .Config.Labels[\"com.docker.compose.project\"], id: .Id}" | jq -rc "select( .name | tostring | contains(\"nginx-mailcow\")) | select( .project | tostring | contains(\"${COMPOSE_PROJECT_NAME,,}\")) | .id" | tr "\n" " "))
DOVECOT=($(curl --silent --insecure https://dockerapi.${COMPOSE_PROJECT_NAME}_mailcow-network/containers/json | jq -r ".[] | {name: .Config.Labels[\"com.docker.compose.service\"], project: .Config.Labels[\"com.docker.compose.project\"], id: .Id}" | jq -rc "select( .name | tostring | contains(\"dovecot-mailcow\")) | select( .project | tostring | contains(\"${COMPOSE_PROJECT_NAME,,}\")) | .id" | tr "\n" " "))
POSTFIX=($(curl --silent --insecure https://dockerapi.${COMPOSE_PROJECT_NAME}_mailcow-network/containers/json | jq -r ".[] | {name: .Config.Labels[\"com.docker.compose.service\"], project: .Config.Labels[\"com.docker.compose.project\"], id: .Id}" | jq -rc "select( .name | tostring | contains(\"postfix-mailcow\")) | select( .project | tostring | contains(\"${COMPOSE_PROJECT_NAME,,}\")) | .id" | tr "\n" " "))
reload_nginx(){
echo "Reloading Nginx..."
NGINX_RELOAD_RET=$(curl -X POST --insecure https://dockerapi.${COMPOSE_PROJECT_NAME}_mailcow-network/containers/${NGINX}/exec -d '{"cmd":"reload", "task":"nginx"}' --silent -H 'Content-type: application/json' | jq -r .type)
[[ ${NGINX_RELOAD_RET} != 'success' ]] && { echo "Could not reload Nginx, restarting container..."; restart_container ${NGINX} ; }
}
reload_dovecot(){
echo "Reloading Dovecot..."
DOVECOT_RELOAD_RET=$(curl -X POST --insecure https://dockerapi.${COMPOSE_PROJECT_NAME}_mailcow-network/containers/${DOVECOT}/exec -d '{"cmd":"reload", "task":"dovecot"}' --silent -H 'Content-type: application/json' | jq -r .type)
[[ ${DOVECOT_RELOAD_RET} != 'success' ]] && { echo "Could not reload Dovecot, restarting container..."; restart_container ${DOVECOT} ; }
}
reload_postfix(){
echo "Reloading Postfix..."
POSTFIX_RELOAD_RET=$(curl -X POST --insecure https://dockerapi.${COMPOSE_PROJECT_NAME}_mailcow-network/containers/${POSTFIX}/exec -d '{"cmd":"reload", "task":"postfix"}' --silent -H 'Content-type: application/json' | jq -r .type)
[[ ${POSTFIX_RELOAD_RET} != 'success' ]] && { echo "Could not reload Postfix, restarting container..."; restart_container ${POSTFIX} ; }
}
restart_container(){
for container in $*; do
echo "Restarting ${container}..."
C_REST_OUT=$(curl -X POST --insecure https://dockerapi.${COMPOSE_PROJECT_NAME}_mailcow-network/containers/${container}/restart --silent | jq -r '.msg')
echo "${C_REST_OUT}"
done
}
if [[ "${CERT_AMOUNT_CHANGED}" == "1" ]]; then
restart_container ${NGINX}
restart_container ${DOVECOT}
restart_container ${POSTFIX}
else
reload_nginx
#reload_dovecot
restart_container ${DOVECOT}
#reload_postfix
restart_container ${POSTFIX}
fi
================================================
FILE: data/Dockerfiles/backup/Dockerfile
================================================
FROM debian:trixie-slim
RUN apt update && apt install pigz zstd -y --no-install-recommends
================================================
FILE: data/Dockerfiles/clamd/Dockerfile
================================================
FROM alpine:3.21 AS builder
WORKDIR /src
ENV CLAMD_VERSION=1.4.2
RUN apk upgrade --no-cache \
&& apk add --update --no-cache \
g++ \
gcc \
gdb \
make \
cmake \
py3-pytest \
python3 \
valgrind \
bzip2-dev \
check-dev \
curl-dev \
json-c-dev \
libmilter-dev \
libxml2-dev \
linux-headers \
ncurses-dev \
openssl-dev \
pcre2-dev \
zlib-dev \
cargo \
rust
RUN wget -P /src https://www.clamav.net/downloads/production/clamav-${CLAMD_VERSION}.tar.gz \
&& tar xzfv /src/clamav-${CLAMD_VERSION}.tar.gz \
&& cd /src/clamav-${CLAMD_VERSION} \
&& cmake . \
-D CMAKE_BUILD_TYPE="Release" \
-D CMAKE_INSTALL_PREFIX="/usr" \
-D CMAKE_INSTALL_LIBDIR="/usr/lib" \
-D APP_CONFIG_DIRECTORY="/etc/clamav" \
-D DATABASE_DIRECTORY="/var/lib/clamav" \
-D ENABLE_CLAMONACC=OFF \
-D ENABLE_EXAMPLES=OFF \
-D ENABLE_MILTER=ON \
-D ENABLE_MAN_PAGES=OFF \
-D ENABLE_STATIC_LIB=OFF \
-D ENABLE_JSON_SHARED=ON \
&& cmake --build . \
&& make DESTDIR="/clamav" -j$(($(nproc) - 1)) install \
&& rm -r "/clamav/usr/lib/pkgconfig/" \
&& sed -e "s|^\(Example\)|\# \1|" \
-e "s|.*\(LocalSocket\) .*|\1 /tmp/clamd.sock|" \
-e "s|.*\(TCPSocket\) .*|\1 3310|" \
-e "s|.*\(TCPAddr\) .*|#\1 0.0.0.0|" \
-e "s|.*\(User\) .*|\1 clamav|" \
-e "s|^\#\(LogFile\) .*|\1 /var/log/clamav/clamd.log|" \
-e "s|^\#\(LogTime\).*|\1 yes|" \
"/clamav/etc/clamav/clamd.conf.sample" > "/clamav/etc/clamav/clamd.conf" \
&& sed -e "s|^\(Example\)|\# \1|" \
-e "s|.*\(DatabaseOwner\) .*|\1 clamav|" \
-e "s|^\#\(UpdateLogFile\) .*|\1 /var/log/clamav/freshclam.log|" \
-e "s|^\#\(NotifyClamd\).*|\1 /etc/clamav/clamd.conf|" \
-e "s|^\#\(ScriptedUpdates\).*|\1 yes|" \
"/clamav/etc/clamav/freshclam.conf.sample" > "/clamav/etc/clamav/freshclam.conf" \
&& sed -e "s|^\(Example\)|\# \1|" \
-e "s|.*\(MilterSocket\) .*|\1 inet:7357|" \
-e "s|.*\(User\) .*|\1 clamav|" \
-e "s|^\#\(LogFile\) .*|\1 /var/log/clamav/milter.log|" \
-e "s|^\#\(LogTime\).*|\1 yes|" \
-e "s|.*\(\ClamdSocket\) .*|\1 unix:/tmp/clamd.sock|" \
"/clamav/etc/clamav/clamav-milter.conf.sample" > "/clamav/etc/clamav/clamav-milter.conf" || exit 1
FROM alpine:3.21
LABEL maintainer = "The Infrastructure Company GmbH <info@servercow.de>"
RUN apk upgrade --no-cache \
&& apk add --update --no-cache \
tzdata \
rsync \
bind-tools \
bash \
tini \
json-c \
libbz2 \
libcurl \
libmilter \
libxml2 \
ncurses-libs \
pcre2 \
zlib \
libgcc \
&& addgroup -S "clamav" && \
adduser -D -G "clamav" -h "/var/lib/clamav" -s "/bin/false" -S "clamav" && \
install -d -m 755 -g "clamav" -o "clamav" "/var/log/clamav" && \
chown -R clamav:clamav /var/lib/clamav
COPY --from=builder "/clamav" "/"
# init
COPY clamd.sh /clamd.sh
RUN chmod +x /sbin/tini
# healthcheck
COPY healthcheck.sh /healthcheck.sh
COPY clamdcheck.sh /usr/local/bin
RUN chmod +x /healthcheck.sh
RUN chmod +x /usr/local/bin/clamdcheck.sh
HEALTHCHECK --start-period=6m CMD "/healthcheck.sh"
ENTRYPOINT []
CMD ["/sbin/tini", "-g", "--", "/clamd.sh"]
================================================
FILE: data/Dockerfiles/clamd/clamd.sh
================================================
#!/bin/bash
if [[ "${SKIP_CLAMD}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
echo "SKIP_CLAMD=y, skipping ClamAV..."
sleep 365d
exit 0
fi
# Cleaning up garbage
echo "Cleaning up tmp files..."
rm -rf /var/lib/clamav/tmp.*
# Prepare whitelist
mkdir -p /run/clamav /var/lib/clamav
if [[ -s /etc/clamav/whitelist.ign2 ]]; then
echo "Copying non-empty whitelist.ign2 to /var/lib/clamav/whitelist.ign2"
cp /etc/clamav/whitelist.ign2 /var/lib/clamav/whitelist.ign2
fi
if [[ ! -f /var/lib/clamav/whitelist.ign2 ]]; then
echo "Creating /var/lib/clamav/whitelist.ign2"
cat <<EOF > /var/lib/clamav/whitelist.ign2
# Please restart ClamAV after changing signatures
Example-Signature.Ignore-1
PUA.Win.Trojan.EmbeddedPDF-1
PUA.Pdf.Trojan.EmbeddedJavaScript-1
PUA.Pdf.Trojan.OpenActionObjectwithJavascript-1
EOF
fi
chown clamav:clamav -R /var/lib/clamav /run/clamav
chmod 755 /var/lib/clamav
chmod 644 -R /var/lib/clamav/*
chmod 750 /run/clamav
stat /var/lib/clamav/whitelist.ign2
dos2unix /var/lib/clamav/whitelist.ign2
sed -i '/^\s*$/d' /var/lib/clamav/whitelist.ign2
# Copying to /etc/clamav to expose file as-is to administrator
cp -p /var/lib/clamav/whitelist.ign2 /etc/clamav/whitelist.ign2
BACKGROUND_TASKS=()
echo "Running freshclam..."
freshclam
(
while true; do
sleep 12600
freshclam
done
) &
BACKGROUND_TASKS+=($!)
(
while true; do
sleep 10m
SANE_MIRRORS="$(dig +ignore +short rsync.sanesecurity.net)"
for sane_mirror in ${SANE_MIRRORS}; do
CE=
rsync -avp --chown=clamav:clamav --chmod=Du=rwx,Dgo=rx,Fu=rw,Fog=r --timeout=5 rsync://${sane_mirror}/sanesecurity/ \
--include 'blurl.ndb' \
--include 'junk.ndb' \
--include 'jurlbl.ndb' \
--include 'jurbla.ndb' \
--include 'phishtank.ndb' \
--include 'phish.ndb' \
--include 'spamimg.hdb' \
--include 'scam.ndb' \
--include 'rogue.hdb' \
--include 'sanesecurity.ftm' \
--include 'sigwhitelist.ign2' \
--exclude='*' /var/lib/clamav/
CE=$?
chmod 755 /var/lib/clamav/
if [ ${CE} -eq 0 ]; then
while [ ! -z "$(pidof freshclam)" ]; do
echo "Freshclam is active, waiting..."
sleep 5
done
echo RELOAD | nc clamd-mailcow 3310
break
fi
done
sleep 12h
done
) &
BACKGROUND_TASKS+=($!)
echo "$(clamd -V) is starting... please wait a moment."
nice -n10 clamd &
BACKGROUND_TASKS+=($!)
while true; do
for bg_task in ${BACKGROUND_TASKS[*]}; do
if ! kill -0 ${bg_task} 1>&2; then
echo "Worker ${bg_task} died, stopping container waiting for respawn..."
kill -TERM 1
fi
sleep 10
done
done
================================================
FILE: data/Dockerfiles/clamd/clamdcheck.sh
================================================
#!/bin/sh
set -eu
if [ "${CLAMAV_NO_CLAMD:-}" != "false" ]; then
if [ "$(echo "PING" | nc localhost 3310)" != "PONG" ]; then
echo "ERROR: Unable to contact server"
exit 1
fi
echo "Clamd is up"
fi
exit 0
================================================
FILE: data/Dockerfiles/clamd/healthcheck.sh
================================================
#!/bin/bash
if [[ "${SKIP_CLAMD}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
echo "SKIP_CLAMD=y, skipping ClamAV..."
exit 0
fi
# run clamd healthcheck
/usr/local/bin/clamdcheck.sh
================================================
FILE: data/Dockerfiles/dockerapi/Dockerfile
================================================
FROM alpine:3.23
LABEL maintainer = "The Infrastructure Company GmbH <info@servercow.de>"
ARG PIP_BREAK_SYSTEM_PACKAGES=1
WORKDIR /app
RUN apk add --update --no-cache python3 \
py3-pip \
openssl \
tzdata \
py3-psutil \
py3-redis \
py3-async-timeout \
&& pip3 install --upgrade pip \
fastapi \
uvicorn \
aiodocker \
docker
RUN mkdir /app/modules
COPY docker-entrypoint.sh /app/
COPY main.py /app/main.py
COPY modules/ /app/modules/
ENTRYPOINT ["/bin/sh", "/app/docker-entrypoint.sh"]
CMD ["python", "main.py"]
================================================
FILE: data/Dockerfiles/dockerapi/docker-entrypoint.sh
================================================
#!/bin/bash
`openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
-keyout /app/dockerapi_key.pem \
-out /app/dockerapi_cert.pem \
-subj /CN=dockerapi/O=mailcow \
-addext subjectAltName=DNS:dockerapi`
exec "$@"
================================================
FILE: data/Dockerfiles/dockerapi/main.py
================================================
import os
import sys
import uvicorn
import json
import uuid
import async_timeout
import asyncio
import aiodocker
import docker
import logging
from logging.config import dictConfig
from fastapi import FastAPI, Response, Request
from modules.DockerApi import DockerApi
from redis import asyncio as aioredis
from contextlib import asynccontextmanager
dockerapi = None
@asynccontextmanager
async def lifespan(app: FastAPI):
global dockerapi
# Initialize a custom logger
logger = logging.getLogger("dockerapi")
logger.setLevel(logging.INFO)
# Configure the logger to output logs to the terminal
handler = logging.StreamHandler()
handler.setLevel(logging.INFO)
formatter = logging.Formatter("%(levelname)s: %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("Init APP")
# Init redis client
if os.environ['REDIS_SLAVEOF_IP'] != "":
redis_client = redis = await aioredis.from_url(f"redis://{os.environ['REDIS_SLAVEOF_IP']}:{os.environ['REDIS_SLAVEOF_PORT']}/0", password=os.environ['REDISPASS'])
else:
redis_client = redis = await aioredis.from_url("redis://redis-mailcow:6379/0", password=os.environ['REDISPASS'])
# Init docker clients
sync_docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock', version='auto')
async_docker_client = aiodocker.Docker(url='unix:///var/run/docker.sock')
dockerapi = DockerApi(redis_client, sync_docker_client, async_docker_client, logger)
logger.info("Subscribe to redis channel")
# Subscribe to redis channel
dockerapi.pubsub = redis.pubsub()
await dockerapi.pubsub.subscribe("MC_CHANNEL")
asyncio.create_task(handle_pubsub_messages(dockerapi.pubsub))
yield
# Close docker connections
dockerapi.sync_docker_client.close()
await dockerapi.async_docker_client.close()
# Close redis
await dockerapi.pubsub.unsubscribe("MC_CHANNEL")
await dockerapi.redis_client.close()
app = FastAPI(lifespan=lifespan)
# Define Routes
@app.get("/host/stats")
async def get_host_update_stats():
global dockerapi
if dockerapi.host_stats_isUpdating == False:
asyncio.create_task(dockerapi.get_host_stats())
dockerapi.host_stats_isUpdating = True
while True:
if await dockerapi.redis_client.exists('host_stats'):
break
await asyncio.sleep(1.5)
stats = json.loads(await dockerapi.redis_client.get('host_stats'))
return Response(content=json.dumps(stats, indent=4), media_type="application/json")
@app.get("/containers/{container_id}/json")
async def get_container(container_id : str):
global dockerapi
if container_id and container_id.isalnum():
try:
for container in (await dockerapi.async_docker_client.containers.list()):
if container._id == container_id:
container_info = await container.show()
return Response(content=json.dumps(container_info, indent=4), media_type="application/json")
res = {
"type": "danger",
"msg": "no container found"
}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
except Exception as e:
res = {
"type": "danger",
"msg": str(e)
}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
else:
res = {
"type": "danger",
"msg": "no or invalid id defined"
}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
@app.get("/containers/json")
async def get_containers(all: bool = False):
global dockerapi
containers = {}
try:
for container in (await dockerapi.async_docker_client.containers.list(all=all)):
container_info = await container.show()
containers.update({container_info['Id']: container_info})
return Response(content=json.dumps(containers, indent=4), media_type="application/json")
except Exception as e:
res = {
"type": "danger",
"msg": str(e)
}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
@app.post("/containers/{container_id}/{post_action}")
async def post_containers(container_id : str, post_action : str, request: Request):
global dockerapi
try:
request_json = await request.json()
except Exception as err:
request_json = {}
if container_id and container_id.isalnum() and post_action:
try:
"""Dispatch container_post api call"""
if post_action == 'exec':
if not request_json or not 'cmd' in request_json:
res = {
"type": "danger",
"msg": "cmd is missing"
}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
if not request_json or not 'task' in request_json:
res = {
"type": "danger",
"msg": "task is missing"
}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
api_call_method_name = '__'.join(['container_post', str(post_action), str(request_json['cmd']), str(request_json['task']) ])
else:
api_call_method_name = '__'.join(['container_post', str(post_action) ])
api_call_method = getattr(dockerapi, api_call_method_name, lambda container_id: Response(content=json.dumps({'type': 'danger', 'msg':'container_post - unknown api call' }, indent=4), media_type="application/json"))
dockerapi.logger.info("api call: %s, container_id: %s" % (api_call_method_name, container_id))
return api_call_method(request_json, container_id=container_id)
except Exception as e:
dockerapi.logger.error("error - container_post: %s" % str(e))
res = {
"type": "danger",
"msg": str(e)
}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
else:
res = {
"type": "danger",
"msg": "invalid container id or missing action"
}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
@app.post("/container/{container_id}/stats/update")
async def post_container_update_stats(container_id : str):
global dockerapi
# start update task for container if no task is running
if container_id not in dockerapi.containerIds_to_update:
asyncio.create_task(dockerapi.get_container_stats(container_id))
dockerapi.containerIds_to_update.append(container_id)
while True:
if await dockerapi.redis_client.exists(container_id + '_stats'):
break
await asyncio.sleep(1.5)
stats = json.loads(await dockerapi.redis_client.get(container_id + '_stats'))
return Response(content=json.dumps(stats, indent=4), media_type="application/json")
# PubSub Handler
async def handle_pubsub_messages(channel: aioredis.client.PubSub):
global dockerapi
while True:
try:
async with async_timeout.timeout(60):
message = await channel.get_message(ignore_subscribe_messages=True, timeout=30)
if message is not None:
# Parse message
data_json = json.loads(message['data'].decode('utf-8'))
dockerapi.logger.info(f"PubSub Received - {json.dumps(data_json)}")
# Handle api_call
if 'api_call' in data_json:
# api_call: container_post
if data_json['api_call'] == "container_post":
if 'post_action' in data_json and 'container_name' in data_json:
try:
"""Dispatch container_post api call"""
request_json = {}
if data_json['post_action'] == 'exec':
if 'request' in data_json:
request_json = data_json['request']
if 'cmd' in request_json:
if 'task' in request_json:
api_call_method_name = '__'.join(['container_post', str(data_json['post_action']), str(request_json['cmd']), str(request_json['task']) ])
else:
dockerapi.logger.error("api call: task missing")
else:
dockerapi.logger.error("api call: cmd missing")
else:
dockerapi.logger.error("api call: request missing")
else:
api_call_method_name = '__'.join(['container_post', str(data_json['post_action'])])
if api_call_method_name:
api_call_method = getattr(dockerapi, api_call_method_name)
if api_call_method:
dockerapi.logger.info("api call: %s, container_name: %s" % (api_call_method_name, data_json['container_name']))
api_call_method(request_json, container_name=data_json['container_name'])
else:
dockerapi.logger.error("api call not found: %s, container_name: %s" % (api_call_method_name, data_json['container_name']))
except Exception as e:
dockerapi.logger.error("container_post: %s" % str(e))
else:
dockerapi.logger.error("api call: missing container_name, post_action or request")
else:
dockerapi.logger.error("Unknown PubSub received - %s" % json.dumps(data_json))
else:
dockerapi.logger.error("Unknown PubSub received - %s" % json.dumps(data_json))
await asyncio.sleep(0.0)
except asyncio.TimeoutError:
pass
if __name__ == '__main__':
uvicorn.run(
app,
host="0.0.0.0",
port=443,
ssl_certfile="/app/dockerapi_cert.pem",
ssl_keyfile="/app/dockerapi_key.pem",
log_level="info",
loop="none"
)
================================================
FILE: data/Dockerfiles/dockerapi/modules/DockerApi.py
================================================
import psutil
import sys
import os
import re
import time
import json
import asyncio
import platform
from datetime import datetime
from fastapi import FastAPI, Response, Request
class DockerApi:
def __init__(self, redis_client, sync_docker_client, async_docker_client, logger):
self.redis_client = redis_client
self.sync_docker_client = sync_docker_client
self.async_docker_client = async_docker_client
self.logger = logger
self.host_stats_isUpdating = False
self.containerIds_to_update = []
# api call: container_post - post_action: stop
def container_post__stop(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(all=True, filters=filters):
container.stop()
res = { 'type': 'success', 'msg': 'command completed successfully'}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
# api call: container_post - post_action: start
def container_post__start(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(all=True, filters=filters):
container.start()
res = { 'type': 'success', 'msg': 'command completed successfully'}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
# api call: container_post - post_action: restart
def container_post__restart(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(all=True, filters=filters):
container.restart()
res = { 'type': 'success', 'msg': 'command completed successfully'}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
# api call: container_post - post_action: top
def container_post__top(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(all=True, filters=filters):
res = { 'type': 'success', 'msg': container.top()}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
# api call: container_post - post_action: stats
def container_post__stats(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(all=True, filters=filters):
for stat in container.stats(decode=True, stream=True):
res = { 'type': 'success', 'msg': stat}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
# api call: container_post - post_action: exec - cmd: mailq - task: delete
def container_post__exec__mailq__delete(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'items' in request_json:
r = re.compile("^[0-9a-fA-F]+$")
filtered_qids = filter(r.match, request_json['items'])
if filtered_qids:
flagged_qids = ['-d %s' % i for i in filtered_qids]
sanitized_string = str(' '.join(flagged_qids))
for container in self.sync_docker_client.containers.list(filters=filters):
postsuper_r = container.exec_run(["/bin/bash", "-c", "/usr/sbin/postsuper " + sanitized_string])
return self.exec_run_handler('generic', postsuper_r)
# api call: container_post - post_action: exec - cmd: mailq - task: hold
def container_post__exec__mailq__hold(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'items' in request_json:
r = re.compile("^[0-9a-fA-F]+$")
filtered_qids = filter(r.match, request_json['items'])
if filtered_qids:
flagged_qids = ['-h %s' % i for i in filtered_qids]
sanitized_string = str(' '.join(flagged_qids))
for container in self.sync_docker_client.containers.list(filters=filters):
postsuper_r = container.exec_run(["/bin/bash", "-c", "/usr/sbin/postsuper " + sanitized_string])
return self.exec_run_handler('generic', postsuper_r)
# api call: container_post - post_action: exec - cmd: mailq - task: cat
def container_post__exec__mailq__cat(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'items' in request_json:
r = re.compile("^[0-9a-fA-F]+$")
filtered_qids = filter(r.match, request_json['items'])
if filtered_qids:
sanitized_string = str(' '.join(filtered_qids))
for container in self.sync_docker_client.containers.list(filters=filters):
postcat_return = container.exec_run(["/bin/bash", "-c", "/usr/sbin/postcat -q " + sanitized_string], user='postfix')
if not postcat_return:
postcat_return = 'err: invalid'
return self.exec_run_handler('utf8_text_only', postcat_return)
# api call: container_post - post_action: exec - cmd: mailq - task: unhold
def container_post__exec__mailq__unhold(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'items' in request_json:
r = re.compile("^[0-9a-fA-F]+$")
filtered_qids = filter(r.match, request_json['items'])
if filtered_qids:
flagged_qids = ['-H %s' % i for i in filtered_qids]
sanitized_string = str(' '.join(flagged_qids))
for container in self.sync_docker_client.containers.list(filters=filters):
postsuper_r = container.exec_run(["/bin/bash", "-c", "/usr/sbin/postsuper " + sanitized_string])
return self.exec_run_handler('generic', postsuper_r)
# api call: container_post - post_action: exec - cmd: mailq - task: deliver
def container_post__exec__mailq__deliver(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'items' in request_json:
r = re.compile("^[0-9a-fA-F]+$")
filtered_qids = filter(r.match, request_json['items'])
if filtered_qids:
flagged_qids = ['-i %s' % i for i in filtered_qids]
for container in self.sync_docker_client.containers.list(filters=filters):
for i in flagged_qids:
postqueue_r = container.exec_run(["/bin/bash", "-c", "/usr/sbin/postqueue " + i], user='postfix')
# todo: check each exit code
res = { 'type': 'success', 'msg': 'Scheduled immediate delivery'}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
# api call: container_post - post_action: exec - cmd: mailq - task: list
def container_post__exec__mailq__list(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(filters=filters):
mailq_return = container.exec_run(["/usr/sbin/postqueue", "-j"], user='postfix')
return self.exec_run_handler('utf8_text_only', mailq_return)
# api call: container_post - post_action: exec - cmd: mailq - task: flush
def container_post__exec__mailq__flush(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(filters=filters):
postqueue_r = container.exec_run(["/usr/sbin/postqueue", "-f"], user='postfix')
return self.exec_run_handler('generic', postqueue_r)
# api call: container_post - post_action: exec - cmd: mailq - task: super_delete
def container_post__exec__mailq__super_delete(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(filters=filters):
postsuper_r = container.exec_run(["/usr/sbin/postsuper", "-d", "ALL"])
return self.exec_run_handler('generic', postsuper_r)
# api call: container_post - post_action: exec - cmd: system - task: fts_rescan
def container_post__exec__system__fts_rescan(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'username' in request_json:
for container in self.sync_docker_client.containers.list(filters=filters):
rescan_return = container.exec_run(["/bin/bash", "-c", "/usr/bin/doveadm fts rescan -u '" + request_json['username'].replace("'", "'\\''") + "'"], user='vmail')
if rescan_return.exit_code == 0:
res = { 'type': 'success', 'msg': 'fts_rescan: rescan triggered'}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
else:
res = { 'type': 'warning', 'msg': 'fts_rescan error'}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
if 'all' in request_json:
for container in self.sync_docker_client.containers.list(filters=filters):
rescan_return = container.exec_run(["/bin/bash", "-c", "/usr/bin/doveadm fts rescan -A"], user='vmail')
if rescan_return.exit_code == 0:
res = { 'type': 'success', 'msg': 'fts_rescan: rescan triggered'}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
else:
res = { 'type': 'warning', 'msg': 'fts_rescan error'}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
# api call: container_post - post_action: exec - cmd: system - task: df
def container_post__exec__system__df(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'dir' in request_json:
for container in self.sync_docker_client.containers.list(filters=filters):
df_return = container.exec_run(["/bin/bash", "-c", "/bin/df -H '" + request_json['dir'].replace("'", "'\\''") + "' | /usr/bin/tail -n1 | /usr/bin/tr -s [:blank:] | /usr/bin/tr ' ' ','"], user='nobody')
if df_return.exit_code == 0:
return df_return.output.decode('utf-8').rstrip()
else:
return "0,0,0,0,0,0"
# api call: container_post - post_action: exec - cmd: system - task: mysql_upgrade
def container_post__exec__system__mysql_upgrade(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(filters=filters):
sql_return = container.exec_run(["/bin/bash", "-c", "/usr/bin/mysql_upgrade -uroot -p'" + os.environ['DBROOT'].replace("'", "'\\''") + "'\n"], user='mysql')
if sql_return.exit_code == 0:
matched = False
for line in sql_return.output.decode('utf-8').split("\n"):
if 'is already upgraded to' in line:
matched = True
if matched:
res = { 'type': 'success', 'msg':'mysql_upgrade: already upgraded', 'text': sql_return.output.decode('utf-8')}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
else:
container.restart()
res = { 'type': 'warning', 'msg':'mysql_upgrade: upgrade was applied', 'text': sql_return.output.decode('utf-8')}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
else:
res = { 'type': 'error', 'msg': 'mysql_upgrade: error running command', 'text': sql_return.output.decode('utf-8')}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
# api call: container_post - post_action: exec - cmd: system - task: mysql_tzinfo_to_sql
def container_post__exec__system__mysql_tzinfo_to_sql(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(filters=filters):
sql_return = container.exec_run(["/bin/bash", "-c", "/usr/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | /bin/sed 's/Local time zone must be set--see zic manual page/FCTY/' | /usr/bin/mysql -uroot -p'" + os.environ['DBROOT'].replace("'", "'\\''") + "' mysql \n"], user='mysql')
if sql_return.exit_code == 0:
res = { 'type': 'info', 'msg': 'mysql_tzinfo_to_sql: command completed successfully', 'text': sql_return.output.decode('utf-8')}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
else:
res = { 'type': 'error', 'msg': 'mysql_tzinfo_to_sql: error running command', 'text': sql_return.output.decode('utf-8')}
return Response(content=json.dumps(res, indent=4), media_type="application/json")
# api call: container_post - post_action: exec - cmd: reload - task: dovecot
def container_post__exec__reload__dovecot(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(filters=filters):
reload_return = container.exec_run(["/bin/bash", "-c", "/usr/sbin/dovecot reload"])
return self.exec_run_handler('generic', reload_return)
# api call: container_post - post_action: exec - cmd: reload - task: postfix
def container_post__exec__reload__postfix(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(filters=filters):
reload_return = container.exec_run(["/bin/bash", "-c", "/usr/sbin/postfix reload"])
return self.exec_run_handler('generic', reload_return)
# api call: container_post - post_action: exec - cmd: reload - task: nginx
def container_post__exec__reload__nginx(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(filters=filters):
reload_return = container.exec_run(["/bin/sh", "-c", "/usr/sbin/nginx -s reload"])
return self.exec_run_handler('generic', reload_return)
# api call: container_post - post_action: exec - cmd: sieve - task: list
def container_post__exec__sieve__list(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'username' in request_json:
for container in self.sync_docker_client.containers.list(filters=filters):
sieve_return = container.exec_run(["/bin/bash", "-c", "/usr/bin/doveadm sieve list -u '" + request_json['username'].replace("'", "'\\''") + "'"])
return self.exec_run_handler('utf8_text_only', sieve_return)
# api call: container_post - post_action: exec - cmd: sieve - task: print
def container_post__exec__sieve__print(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'username' in request_json and 'script_name' in request_json:
for container in self.sync_docker_client.containers.list(filters=filters):
cmd = ["/bin/bash", "-c", "/usr/bin/doveadm sieve get -u '" + request_json['username'].replace("'", "'\\''") + "' '" + request_json['script_name'].replace("'", "'\\''") + "'"]
sieve_return = container.exec_run(cmd)
return self.exec_run_handler('utf8_text_only', sieve_return)
# api call: container_post - post_action: exec - cmd: maildir - task: cleanup
def container_post__exec__maildir__cleanup(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'maildir' in request_json:
for container in self.sync_docker_client.containers.list(filters=filters):
sane_name = re.sub(r'\W+', '', request_json['maildir'])
vmail_name = request_json['maildir'].replace("'", "'\\''")
cmd_vmail = "if [[ -d '/var/vmail/" + vmail_name + "' ]]; then /bin/mv '/var/vmail/" + vmail_name + "' '/var/vmail/_garbage/" + str(int(time.time())) + "_" + sane_name + "'; fi"
index_name = request_json['maildir'].split("/")
if len(index_name) > 1:
index_name = index_name[1].replace("'", "'\\''") + "@" + index_name[0].replace("'", "'\\''")
cmd_vmail_index = "if [[ -d '/var/vmail_index/" + index_name + "' ]]; then /bin/mv '/var/vmail_index/" + index_name + "' '/var/vmail/_garbage/" + str(int(time.time())) + "_" + sane_name + "_index'; fi"
cmd = ["/bin/bash", "-c", cmd_vmail + " && " + cmd_vmail_index]
else:
cmd = ["/bin/bash", "-c", cmd_vmail]
maildir_cleanup = container.exec_run(cmd, user='vmail')
return self.exec_run_handler('generic', maildir_cleanup)
# api call: container_post - post_action: exec - cmd: maildir - task: move
def container_post__exec__maildir__move(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'old_maildir' in request_json and 'new_maildir' in request_json:
for container in self.sync_docker_client.containers.list(filters=filters):
vmail_name = request_json['old_maildir'].replace("'", "'\\''")
new_vmail_name = request_json['new_maildir'].replace("'", "'\\''")
cmd_vmail = f"if [[ -d '/var/vmail/{vmail_name}' ]]; then /bin/mv '/var/vmail/{vmail_name}' '/var/vmail/{new_vmail_name}'; fi"
index_name = request_json['old_maildir'].split("/")
new_index_name = request_json['new_maildir'].split("/")
if len(index_name) > 1 and len(new_index_name) > 1:
index_name = index_name[1].replace("'", "'\\''") + "@" + index_name[0].replace("'", "'\\''")
new_index_name = new_index_name[1].replace("'", "'\\''") + "@" + new_index_name[0].replace("'", "'\\''")
cmd_vmail_index = f"if [[ -d '/var/vmail_index/{index_name}' ]]; then /bin/mv '/var/vmail_index/{index_name}' '/var/vmail_index/{new_index_name}_index'; fi"
cmd = ["/bin/bash", "-c", cmd_vmail + " && " + cmd_vmail_index]
else:
cmd = ["/bin/bash", "-c", cmd_vmail]
maildir_move = container.exec_run(cmd, user='vmail')
return self.exec_run_handler('generic', maildir_move)
# api call: container_post - post_action: exec - cmd: rspamd - task: worker_password
def container_post__exec__rspamd__worker_password(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'raw' in request_json:
for container in self.sync_docker_client.containers.list(filters=filters):
cmd = "/usr/bin/rspamadm pw -e -p '" + request_json['raw'].replace("'", "'\\''") + "' 2> /dev/null"
cmd_response = self.exec_cmd_container(container, cmd, user="_rspamd")
matched = False
for line in cmd_response.split("\n"):
if '$2$' in line:
hash = line.strip()
hash_out = re.search(r'\$2\$.+$', hash).group(0)
rspamd_passphrase_hash = re.sub(r'[^0-9a-zA-Z\$]+', '', hash_out.rstrip())
rspamd_password_filename = "/etc/rspamd/override.d/worker-controller-password.inc"
cmd = '''/bin/echo 'enable_password = "%s";' > %s && cat %s''' % (rspamd_passphrase_hash, rspamd_password_filename, rspamd_password_filename)
cmd_response = self.exec_cmd_container(container, cmd, user="_rspamd")
if rspamd_passphrase_hash.startswith("$2$") and rspamd_passphrase_hash in cmd_response:
container.restart()
matched = True
if matched:
res = { 'type': 'success', 'msg': 'command completed successfully' }
self.logger.info('success changing Rspamd password')
return Response(content=json.dumps(res, indent=4), media_type="application/json")
else:
self.logger.error('failed changing Rspamd password')
res = { 'type': 'danger', 'msg': 'command did not complete' }
return Response(content=json.dumps(res, indent=4), media_type="application/json")
# api call: container_post - post_action: exec - cmd: sogo - task: rename
def container_post__exec__sogo__rename_user(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
if 'old_username' in request_json and 'new_username' in request_json:
for container in self.sync_docker_client.containers.list(filters=filters):
old_username = request_json['old_username'].replace("'", "'\\''")
new_username = request_json['new_username'].replace("'", "'\\''")
sogo_return = container.exec_run(["/bin/bash", "-c", f"sogo-tool rename-user '{old_username}' '{new_username}'"], user='sogo')
return self.exec_run_handler('generic', sogo_return)
# api call: container_post - post_action: exec - cmd: doveadm - task: get_acl
def container_post__exec__doveadm__get_acl(self, request_json, **kwargs):
if 'container_id' in kwargs:
filters = {"id": kwargs['container_id']}
elif 'container_name' in kwargs:
filters = {"name": kwargs['container_name']}
for container in self.sync_docker_client.containers.list(filters=filters):
id = request_json['id'].replace("'", "'\\''")
shared_folders = container.exec_run(["/bin/
gitextract_rwp4yo6n/ ├── .editorconfig ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── Bug_report.yml │ │ ├── Feature_request.yml │ │ ├── config.yml │ │ └── pr_to_nighty_template.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── renovate.json │ └── workflows/ │ ├── check_if_support_labeled.yml │ ├── check_prs_if_on_staging.yml │ ├── close_old_issues_and_prs.yml │ ├── image_builds.yml │ ├── pr_to_nightly.yml │ ├── rebuild_backup_image.yml │ └── update_postscreen_access_list.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── _modules/ │ └── scripts/ │ ├── core.sh │ ├── ipv6_controller.sh │ ├── migrate_options.sh │ └── new_options.sh ├── data/ │ ├── Dockerfiles/ │ │ ├── acme/ │ │ │ ├── Dockerfile │ │ │ ├── acme.sh │ │ │ ├── expand6.sh │ │ │ ├── functions.sh │ │ │ ├── load-dns-config.sh │ │ │ ├── obtain-certificate-dns.sh │ │ │ ├── obtain-certificate.sh │ │ │ └── reload-configurations.sh │ │ ├── backup/ │ │ │ └── Dockerfile │ │ ├── clamd/ │ │ │ ├── Dockerfile │ │ │ ├── clamd.sh │ │ │ ├── clamdcheck.sh │ │ │ └── healthcheck.sh │ │ ├── dockerapi/ │ │ │ ├── Dockerfile │ │ │ ├── docker-entrypoint.sh │ │ │ ├── main.py │ │ │ └── modules/ │ │ │ ├── DockerApi.py │ │ │ └── __init__.py │ │ ├── dovecot/ │ │ │ ├── Dockerfile │ │ │ ├── clean_q_aged.sh │ │ │ ├── docker-entrypoint.sh │ │ │ ├── imapsync │ │ │ ├── imapsync_runner.pl │ │ │ ├── maildir_gc.sh │ │ │ ├── optimize-fts.sh │ │ │ ├── quarantine_notify.py │ │ │ ├── quota_notify.py │ │ │ ├── repl_health.sh │ │ │ ├── report-ham.sieve │ │ │ ├── report-spam.sieve │ │ │ ├── rspamd-pipe-ham │ │ │ ├── rspamd-pipe-spam │ │ │ ├── sa-rules.sh │ │ │ ├── stop-supervisor.sh │ │ │ ├── supervisord.conf │ │ │ ├── syslog-ng-redis_slave.conf │ │ │ ├── syslog-ng.conf │ │ │ └── trim_logs.sh │ │ ├── netfilter/ │ │ │ ├── Dockerfile │ │ │ ├── docker-entrypoint.sh │ │ │ ├── main.py │ │ │ └── modules/ │ │ │ ├── IPTables.py │ │ │ ├── Logger.py │ │ │ ├── NFTables.py │ │ │ └── __init__.py │ │ ├── nginx/ │ │ │ ├── Dockerfile │ │ │ ├── bootstrap.py │ │ │ └── docker-entrypoint.sh │ │ ├── olefy/ │ │ │ ├── Dockerfile │ │ │ └── olefy.py │ │ ├── phpfpm/ │ │ │ ├── Dockerfile │ │ │ └── docker-entrypoint.sh │ │ ├── postfix/ │ │ │ ├── Dockerfile │ │ │ ├── docker-entrypoint.sh │ │ │ ├── postfix.sh │ │ │ ├── rspamd-pipe-ham │ │ │ ├── rspamd-pipe-spam │ │ │ ├── stop-supervisor.sh │ │ │ ├── supervisord.conf │ │ │ ├── syslog-ng-redis_slave.conf │ │ │ ├── syslog-ng.conf │ │ │ └── whitelist_forwardinghosts.sh │ │ ├── postfix-tlspol/ │ │ │ ├── Dockerfile │ │ │ ├── docker-entrypoint.sh │ │ │ ├── postfix-tlspol.sh │ │ │ ├── stop-supervisor.sh │ │ │ ├── supervisord.conf │ │ │ ├── syslog-ng-redis_slave.conf │ │ │ └── syslog-ng.conf │ │ ├── rspamd/ │ │ │ ├── Dockerfile │ │ │ ├── docker-entrypoint.sh │ │ │ ├── sa_trivial_convert.lua │ │ │ ├── set_worker_password.sh │ │ │ └── settings.conf │ │ ├── sogo/ │ │ │ ├── Dockerfile │ │ │ ├── acl.diff │ │ │ ├── bootstrap-sogo.sh │ │ │ ├── docker-entrypoint.sh │ │ │ ├── navMailcowBtns.diff │ │ │ ├── stop-supervisor.sh │ │ │ ├── supervisord.conf │ │ │ ├── syslog-ng-redis_slave.conf │ │ │ └── syslog-ng.conf │ │ ├── unbound/ │ │ │ ├── Dockerfile │ │ │ ├── docker-entrypoint.sh │ │ │ ├── healthcheck.sh │ │ │ ├── stop-supervisor.sh │ │ │ ├── supervisord.conf │ │ │ └── syslog-ng.conf │ │ └── watchdog/ │ │ ├── Dockerfile │ │ ├── check_dns.sh │ │ ├── check_mysql_slavestatus.sh │ │ ├── client.cnf │ │ └── watchdog.sh │ ├── assets/ │ │ ├── mysql/ │ │ │ └── docker-entrypoint.sh │ │ ├── passwd/ │ │ │ └── generate_passwords.sh │ │ └── templates/ │ │ ├── pw_reset_html.tpl │ │ ├── pw_reset_text.tpl │ │ ├── quarantine.tpl │ │ └── quota.tpl │ ├── conf/ │ │ ├── acme/ │ │ │ └── .gitkeep │ │ ├── clamav/ │ │ │ ├── clamd.conf │ │ │ └── freshclam.conf │ │ ├── dovecot/ │ │ │ ├── auth/ │ │ │ │ ├── mailcowauth.php │ │ │ │ └── passwd-verify.lua │ │ │ ├── dovecot.conf │ │ │ ├── dovecot.folders.conf │ │ │ └── ldap/ │ │ │ └── passdb.conf │ │ ├── mysql/ │ │ │ └── my.cnf │ │ ├── nginx/ │ │ │ └── templates/ │ │ │ ├── nginx.conf.j2 │ │ │ └── sites-default.conf.j2 │ │ ├── phpfpm/ │ │ │ ├── crons/ │ │ │ │ ├── keycloak-sync.php │ │ │ │ └── ldap-sync.php │ │ │ ├── php-conf.d/ │ │ │ │ ├── opcache-recommended.ini │ │ │ │ ├── other.ini │ │ │ │ └── upload.ini │ │ │ ├── php-fpm.d/ │ │ │ │ └── pools.conf │ │ │ └── sogo-sso/ │ │ │ └── .gitkeep │ │ ├── postfix/ │ │ │ ├── anonymize_headers.pcre │ │ │ ├── local_transport │ │ │ ├── main.cf │ │ │ ├── master.cf │ │ │ ├── postscreen_access.cidr │ │ │ └── smtp_dsn_filter │ │ ├── redis/ │ │ │ └── redis-conf.sh │ │ ├── rspamd/ │ │ │ ├── dynmaps/ │ │ │ │ ├── aliasexp.php │ │ │ │ ├── bcc.php │ │ │ │ ├── footer.php │ │ │ │ ├── forwardinghosts.php │ │ │ │ ├── index.html │ │ │ │ ├── sasl_logs.php │ │ │ │ ├── settings.php │ │ │ │ └── vars.inc.php │ │ │ ├── lua/ │ │ │ │ ├── ratelimit.lua │ │ │ │ └── rspamd.local.lua │ │ │ ├── meta_exporter/ │ │ │ │ ├── pipe.php │ │ │ │ ├── pipe_rl.php │ │ │ │ ├── pushover.php │ │ │ │ └── vars.inc.php │ │ │ ├── plugins.d/ │ │ │ │ └── README.md │ │ │ ├── rspamd.conf.local │ │ │ └── rspamd.conf.override │ │ ├── sogo/ │ │ │ ├── custom-sogo.js │ │ │ └── sogo.conf │ │ └── unbound/ │ │ └── unbound.conf │ ├── hooks/ │ │ └── README.md │ └── web/ │ ├── _rspamderror.php │ ├── _status.502.html │ ├── admin/ │ │ ├── dashboard.php │ │ ├── index.php │ │ ├── mailbox.php │ │ ├── queue.php │ │ └── system.php │ ├── api/ │ │ ├── index.css │ │ ├── index.html │ │ ├── oauth2-redirect.html │ │ ├── openapi.yaml │ │ ├── swagger-initializer.js │ │ ├── swagger-ui-bundle.js │ │ ├── swagger-ui-es-bundle-core.js │ │ ├── swagger-ui-es-bundle.js │ │ ├── swagger-ui-standalone-preset.js │ │ ├── swagger-ui.css │ │ └── swagger-ui.js │ ├── autoconfig.php │ ├── autodiscover-json.php │ ├── autodiscover.php │ ├── css/ │ │ ├── build/ │ │ │ ├── 003-bootstrap-select.css │ │ │ ├── 011-datatables.css │ │ │ ├── 012-bootstrap-icons.css │ │ │ ├── 013-datatables.css │ │ │ ├── 014-mailcow.css │ │ │ └── 015-responsive.css │ │ ├── site/ │ │ │ ├── admin.css │ │ │ ├── debug.css │ │ │ ├── edit.css │ │ │ ├── index.css │ │ │ ├── mailbox.css │ │ │ ├── quarantine.css │ │ │ └── user.css │ │ └── themes/ │ │ ├── lumen-bootstrap.css │ │ └── mailcow-darkmode.css │ ├── domainadmin/ │ │ ├── index.php │ │ ├── mailbox.php │ │ └── user.php │ ├── edit.php │ ├── f2b-banlist.php │ ├── inc/ │ │ ├── ajax/ │ │ │ ├── container_ctrl.php │ │ │ ├── destroy_tfa_auth.php │ │ │ ├── dns_diagnostics.php │ │ │ ├── qitem_details.php │ │ │ ├── qr_gen.php │ │ │ ├── show_rspamd_global_filters.php │ │ │ ├── sieve_validation.php │ │ │ ├── syncjob_logs.php │ │ │ └── transport_check.php │ │ ├── footer.inc.php │ │ ├── functions.acl.inc.php │ │ ├── functions.address_rewriting.inc.php │ │ ├── functions.admin.inc.php │ │ ├── functions.app_passwd.inc.php │ │ ├── functions.auth.inc.php │ │ ├── functions.customize.inc.php │ │ ├── functions.dkim.inc.php │ │ ├── functions.docker.inc.php │ │ ├── functions.domain_admin.inc.php │ │ ├── functions.fail2ban.inc.php │ │ ├── functions.fwdhost.inc.php │ │ ├── functions.inc.php │ │ ├── functions.mailbox.inc.php │ │ ├── functions.mailq.inc.php │ │ ├── functions.oauth2.inc.php │ │ ├── functions.policy.inc.php │ │ ├── functions.presets.inc.php │ │ ├── functions.pushover.inc.php │ │ ├── functions.quarantine.inc.php │ │ ├── functions.quota_notification.inc.php │ │ ├── functions.ratelimit.inc.php │ │ ├── functions.rspamd.inc.php │ │ ├── functions.tls_policy_maps.inc.php │ │ ├── functions.transports.inc.php │ │ ├── header.inc.php │ │ ├── init_db.inc.php │ │ ├── lib/ │ │ │ ├── CSSminifierExtended.php │ │ │ ├── JSminifierExtended.php │ │ │ ├── WebAuthn/ │ │ │ │ ├── Attestation/ │ │ │ │ │ ├── AttestationObject.php │ │ │ │ │ ├── AuthenticatorData.php │ │ │ │ │ └── Format/ │ │ │ │ │ ├── AndroidKey.php │ │ │ │ │ ├── AndroidSafetyNet.php │ │ │ │ │ ├── Apple.php │ │ │ │ │ ├── FormatBase.php │ │ │ │ │ ├── None.php │ │ │ │ │ ├── Packed.php │ │ │ │ │ ├── Tpm.php │ │ │ │ │ └── U2f.php │ │ │ │ ├── Binary/ │ │ │ │ │ └── ByteBuffer.php │ │ │ │ ├── CBOR/ │ │ │ │ │ └── CborDecoder.php │ │ │ │ ├── WebAuthn.php │ │ │ │ ├── WebAuthnException.php │ │ │ │ └── rootCertificates/ │ │ │ │ ├── apple.pem │ │ │ │ ├── bsi.pem │ │ │ │ ├── globalSign.pem │ │ │ │ ├── googleHardware.pem │ │ │ │ ├── huawei.pem │ │ │ │ ├── hypersecu.pem │ │ │ │ ├── microsoftTpmCollection.pem │ │ │ │ ├── nitro.pem │ │ │ │ ├── solo.pem │ │ │ │ ├── trustkey.pem │ │ │ │ └── yubico.pem │ │ │ ├── Yubico.php │ │ │ ├── array_merge_real.php │ │ │ ├── composer.json │ │ │ ├── sieve/ │ │ │ │ ├── SieveDumpable.php │ │ │ │ ├── SieveException.php │ │ │ │ ├── SieveKeywordRegistry.php │ │ │ │ ├── SieveParser.php │ │ │ │ ├── SieveScanner.php │ │ │ │ ├── SieveScript.php │ │ │ │ ├── SieveSemantics.php │ │ │ │ ├── SieveToken.php │ │ │ │ ├── SieveTree.php │ │ │ │ ├── extensions/ │ │ │ │ │ ├── body.xml │ │ │ │ │ ├── comparator-ascii-numeric.xml │ │ │ │ │ ├── copy.xml │ │ │ │ │ ├── date.xml │ │ │ │ │ ├── duplicate.xml │ │ │ │ │ ├── editheader.xml │ │ │ │ │ ├── enotify.xml │ │ │ │ │ ├── envelope.xml │ │ │ │ │ ├── environment.xml │ │ │ │ │ ├── ereject.xml │ │ │ │ │ ├── fileinto.xml │ │ │ │ │ ├── imap4flags.xml │ │ │ │ │ ├── imapflags.xml │ │ │ │ │ ├── index.xml │ │ │ │ │ ├── mailbox.xml │ │ │ │ │ ├── mime.xml │ │ │ │ │ ├── notify.xml │ │ │ │ │ ├── regex.xml │ │ │ │ │ ├── reject.xml │ │ │ │ │ ├── relational.xml │ │ │ │ │ ├── spamtest.xml │ │ │ │ │ ├── spamtestplus.xml │ │ │ │ │ ├── subaddress.xml │ │ │ │ │ ├── vacation-seconds.xml │ │ │ │ │ ├── vacation.xml │ │ │ │ │ ├── variables.xml │ │ │ │ │ ├── virustest.xml │ │ │ │ │ ├── vnd.dovecot.execute.xml │ │ │ │ │ ├── vnd.dovecot.filter.xml │ │ │ │ │ └── vnd.dovecot.pipe.xml │ │ │ │ └── keywords.xml │ │ │ ├── ssp.class.php │ │ │ └── vendor/ │ │ │ ├── adldap2/ │ │ │ │ └── adldap2/ │ │ │ │ ├── .gitattributes │ │ │ │ ├── .github/ │ │ │ │ │ └── issue_template.md │ │ │ │ ├── .gitignore │ │ │ │ ├── .scrutinizer.yml │ │ │ │ ├── .styleci.yml │ │ │ │ ├── .travis.yml │ │ │ │ ├── composer.json │ │ │ │ ├── docs/ │ │ │ │ │ ├── .nojekyll │ │ │ │ │ ├── _coverpage.md │ │ │ │ │ ├── _sidebar.md │ │ │ │ │ ├── distinguished-names.md │ │ │ │ │ ├── events.md │ │ │ │ │ ├── index.html │ │ │ │ │ ├── installation.md │ │ │ │ │ ├── logging.md │ │ │ │ │ ├── models/ │ │ │ │ │ │ ├── computer.md │ │ │ │ │ │ ├── contact.md │ │ │ │ │ │ ├── container.md │ │ │ │ │ │ ├── group.md │ │ │ │ │ │ ├── model.md │ │ │ │ │ │ ├── organization.md │ │ │ │ │ │ ├── ou.md │ │ │ │ │ │ ├── printer.md │ │ │ │ │ │ ├── root-dse.md │ │ │ │ │ │ ├── traits/ │ │ │ │ │ │ │ ├── has-critical-system-object.md │ │ │ │ │ │ │ ├── has-description.md │ │ │ │ │ │ │ ├── has-last-login-last-logoff.md │ │ │ │ │ │ │ └── has-member-of.md │ │ │ │ │ │ └── user.md │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── searching.md │ │ │ │ │ ├── setup.md │ │ │ │ │ └── troubleshooting.md │ │ │ │ ├── license.md │ │ │ │ ├── phpunit.xml │ │ │ │ ├── readme.md │ │ │ │ └── src/ │ │ │ │ ├── Adldap.php │ │ │ │ ├── AdldapException.php │ │ │ │ ├── AdldapInterface.php │ │ │ │ ├── Auth/ │ │ │ │ │ ├── BindException.php │ │ │ │ │ ├── Events/ │ │ │ │ │ │ ├── Attempting.php │ │ │ │ │ │ ├── Binding.php │ │ │ │ │ │ ├── Bound.php │ │ │ │ │ │ ├── Event.php │ │ │ │ │ │ ├── Failed.php │ │ │ │ │ │ └── Passed.php │ │ │ │ │ ├── Guard.php │ │ │ │ │ ├── GuardInterface.php │ │ │ │ │ ├── PasswordRequiredException.php │ │ │ │ │ └── UsernameRequiredException.php │ │ │ │ ├── Configuration/ │ │ │ │ │ ├── ConfigurationException.php │ │ │ │ │ ├── DomainConfiguration.php │ │ │ │ │ └── Validators/ │ │ │ │ │ ├── ArrayValidator.php │ │ │ │ │ ├── BooleanValidator.php │ │ │ │ │ ├── ClassValidator.php │ │ │ │ │ ├── IntegerValidator.php │ │ │ │ │ ├── StringOrNullValidator.php │ │ │ │ │ └── Validator.php │ │ │ │ ├── Connections/ │ │ │ │ │ ├── ConnectionException.php │ │ │ │ │ ├── ConnectionInterface.php │ │ │ │ │ ├── DetailedError.php │ │ │ │ │ ├── Ldap.php │ │ │ │ │ ├── Provider.php │ │ │ │ │ └── ProviderInterface.php │ │ │ │ ├── Events/ │ │ │ │ │ ├── Dispatcher.php │ │ │ │ │ ├── DispatcherInterface.php │ │ │ │ │ └── DispatchesEvents.php │ │ │ │ ├── Log/ │ │ │ │ │ ├── EventLogger.php │ │ │ │ │ └── LogsInformation.php │ │ │ │ ├── Models/ │ │ │ │ │ ├── Attributes/ │ │ │ │ │ │ ├── AccountControl.php │ │ │ │ │ │ ├── DistinguishedName.php │ │ │ │ │ │ ├── Guid.php │ │ │ │ │ │ ├── MbString.php │ │ │ │ │ │ ├── Sid.php │ │ │ │ │ │ ├── TSProperty.php │ │ │ │ │ │ └── TSPropertyArray.php │ │ │ │ │ ├── BatchModification.php │ │ │ │ │ ├── Computer.php │ │ │ │ │ ├── Concerns/ │ │ │ │ │ │ ├── HasAttributes.php │ │ │ │ │ │ ├── HasCriticalSystemObject.php │ │ │ │ │ │ ├── HasDescription.php │ │ │ │ │ │ ├── HasEvents.php │ │ │ │ │ │ ├── HasLastLogonAndLogOff.php │ │ │ │ │ │ ├── HasMemberOf.php │ │ │ │ │ │ ├── HasUserAccountControl.php │ │ │ │ │ │ └── HasUserProperties.php │ │ │ │ │ ├── Contact.php │ │ │ │ │ ├── Container.php │ │ │ │ │ ├── Entry.php │ │ │ │ │ ├── Events/ │ │ │ │ │ │ ├── Created.php │ │ │ │ │ │ ├── Creating.php │ │ │ │ │ │ ├── Deleted.php │ │ │ │ │ │ ├── Deleting.php │ │ │ │ │ │ ├── Event.php │ │ │ │ │ │ ├── Saved.php │ │ │ │ │ │ ├── Saving.php │ │ │ │ │ │ ├── Updated.php │ │ │ │ │ │ └── Updating.php │ │ │ │ │ ├── Factory.php │ │ │ │ │ ├── ForeignSecurityPrincipal.php │ │ │ │ │ ├── Group.php │ │ │ │ │ ├── Model.php │ │ │ │ │ ├── ModelDoesNotExistException.php │ │ │ │ │ ├── ModelNotFoundException.php │ │ │ │ │ ├── Organization.php │ │ │ │ │ ├── OrganizationalUnit.php │ │ │ │ │ ├── Printer.php │ │ │ │ │ ├── RootDse.php │ │ │ │ │ ├── User.php │ │ │ │ │ ├── UserPasswordIncorrectException.php │ │ │ │ │ └── UserPasswordPolicyException.php │ │ │ │ ├── Query/ │ │ │ │ │ ├── Builder.php │ │ │ │ │ ├── Cache.php │ │ │ │ │ ├── Collection.php │ │ │ │ │ ├── Events/ │ │ │ │ │ │ ├── Listing.php │ │ │ │ │ │ ├── Paginate.php │ │ │ │ │ │ ├── QueryExecuted.php │ │ │ │ │ │ ├── Read.php │ │ │ │ │ │ └── Search.php │ │ │ │ │ ├── Factory.php │ │ │ │ │ ├── Grammar.php │ │ │ │ │ ├── Operator.php │ │ │ │ │ ├── Paginator.php │ │ │ │ │ └── Processor.php │ │ │ │ ├── Schemas/ │ │ │ │ │ ├── ActiveDirectory.php │ │ │ │ │ ├── Directory389.php │ │ │ │ │ ├── EDirectory.php │ │ │ │ │ ├── FreeIPA.php │ │ │ │ │ ├── OpenLDAP.php │ │ │ │ │ ├── Schema.php │ │ │ │ │ └── SchemaInterface.php │ │ │ │ └── Utilities.php │ │ │ ├── autoload.php │ │ │ ├── bacon/ │ │ │ │ └── bacon-qr-code/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ ├── phpunit.xml.dist │ │ │ │ ├── src/ │ │ │ │ │ ├── Common/ │ │ │ │ │ │ ├── BitArray.php │ │ │ │ │ │ ├── BitMatrix.php │ │ │ │ │ │ ├── BitUtils.php │ │ │ │ │ │ ├── CharacterSetEci.php │ │ │ │ │ │ ├── EcBlock.php │ │ │ │ │ │ ├── EcBlocks.php │ │ │ │ │ │ ├── ErrorCorrectionLevel.php │ │ │ │ │ │ ├── FormatInformation.php │ │ │ │ │ │ ├── Mode.php │ │ │ │ │ │ ├── ReedSolomonCodec.php │ │ │ │ │ │ └── Version.php │ │ │ │ │ ├── Encoder/ │ │ │ │ │ │ ├── BlockPair.php │ │ │ │ │ │ ├── ByteMatrix.php │ │ │ │ │ │ ├── Encoder.php │ │ │ │ │ │ ├── MaskUtil.php │ │ │ │ │ │ ├── MatrixUtil.php │ │ │ │ │ │ └── QrCode.php │ │ │ │ │ ├── Exception/ │ │ │ │ │ │ ├── ExceptionInterface.php │ │ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ │ │ ├── OutOfBoundsException.php │ │ │ │ │ │ ├── RuntimeException.php │ │ │ │ │ │ ├── UnexpectedValueException.php │ │ │ │ │ │ └── WriterException.php │ │ │ │ │ ├── Renderer/ │ │ │ │ │ │ ├── Color/ │ │ │ │ │ │ │ ├── Alpha.php │ │ │ │ │ │ │ ├── Cmyk.php │ │ │ │ │ │ │ ├── ColorInterface.php │ │ │ │ │ │ │ ├── Gray.php │ │ │ │ │ │ │ └── Rgb.php │ │ │ │ │ │ ├── Eye/ │ │ │ │ │ │ │ ├── CompositeEye.php │ │ │ │ │ │ │ ├── EyeInterface.php │ │ │ │ │ │ │ ├── ModuleEye.php │ │ │ │ │ │ │ ├── SimpleCircleEye.php │ │ │ │ │ │ │ └── SquareEye.php │ │ │ │ │ │ ├── Image/ │ │ │ │ │ │ │ ├── EpsImageBackEnd.php │ │ │ │ │ │ │ ├── ImageBackEndInterface.php │ │ │ │ │ │ │ ├── ImagickImageBackEnd.php │ │ │ │ │ │ │ ├── SvgImageBackEnd.php │ │ │ │ │ │ │ └── TransformationMatrix.php │ │ │ │ │ │ ├── ImageRenderer.php │ │ │ │ │ │ ├── Module/ │ │ │ │ │ │ │ ├── DotsModule.php │ │ │ │ │ │ │ ├── EdgeIterator/ │ │ │ │ │ │ │ │ ├── Edge.php │ │ │ │ │ │ │ │ └── EdgeIterator.php │ │ │ │ │ │ │ ├── ModuleInterface.php │ │ │ │ │ │ │ ├── RoundnessModule.php │ │ │ │ │ │ │ └── SquareModule.php │ │ │ │ │ │ ├── Path/ │ │ │ │ │ │ │ ├── Close.php │ │ │ │ │ │ │ ├── Curve.php │ │ │ │ │ │ │ ├── EllipticArc.php │ │ │ │ │ │ │ ├── Line.php │ │ │ │ │ │ │ ├── Move.php │ │ │ │ │ │ │ ├── OperationInterface.php │ │ │ │ │ │ │ └── Path.php │ │ │ │ │ │ ├── PlainTextRenderer.php │ │ │ │ │ │ ├── RendererInterface.php │ │ │ │ │ │ └── RendererStyle/ │ │ │ │ │ │ ├── EyeFill.php │ │ │ │ │ │ ├── Fill.php │ │ │ │ │ │ ├── Gradient.php │ │ │ │ │ │ ├── GradientType.php │ │ │ │ │ │ └── RendererStyle.php │ │ │ │ │ └── Writer.php │ │ │ │ └── test/ │ │ │ │ ├── Common/ │ │ │ │ │ ├── BitArrayTest.php │ │ │ │ │ ├── BitMatrixTest.php │ │ │ │ │ ├── BitUtilsTest.php │ │ │ │ │ ├── ErrorCorrectionLevelTest.php │ │ │ │ │ ├── FormatInformationTest.php │ │ │ │ │ ├── ModeTest.php │ │ │ │ │ ├── ReedSolomonCodecTest.php │ │ │ │ │ └── VersionTest.php │ │ │ │ ├── Encoder/ │ │ │ │ │ ├── EncoderTest.php │ │ │ │ │ ├── MaskUtilTest.php │ │ │ │ │ └── MatrixUtilTest.php │ │ │ │ └── Integration/ │ │ │ │ └── ImagickRenderingTest.php │ │ │ ├── bin/ │ │ │ │ ├── carbon │ │ │ │ ├── minifycss │ │ │ │ └── minifyjs │ │ │ ├── bshaffer/ │ │ │ │ └── oauth2-server-php/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ ├── src/ │ │ │ │ │ └── OAuth2/ │ │ │ │ │ ├── Autoloader.php │ │ │ │ │ ├── ClientAssertionType/ │ │ │ │ │ │ ├── ClientAssertionTypeInterface.php │ │ │ │ │ │ └── HttpBasic.php │ │ │ │ │ ├── Controller/ │ │ │ │ │ │ ├── AuthorizeController.php │ │ │ │ │ │ ├── AuthorizeControllerInterface.php │ │ │ │ │ │ ├── ResourceController.php │ │ │ │ │ │ ├── ResourceControllerInterface.php │ │ │ │ │ │ ├── TokenController.php │ │ │ │ │ │ └── TokenControllerInterface.php │ │ │ │ │ ├── Encryption/ │ │ │ │ │ │ ├── EncryptionInterface.php │ │ │ │ │ │ ├── FirebaseJwt.php │ │ │ │ │ │ └── Jwt.php │ │ │ │ │ ├── GrantType/ │ │ │ │ │ │ ├── AuthorizationCode.php │ │ │ │ │ │ ├── ClientCredentials.php │ │ │ │ │ │ ├── GrantTypeInterface.php │ │ │ │ │ │ ├── JwtBearer.php │ │ │ │ │ │ ├── RefreshToken.php │ │ │ │ │ │ └── UserCredentials.php │ │ │ │ │ ├── OpenID/ │ │ │ │ │ │ ├── Controller/ │ │ │ │ │ │ │ ├── AuthorizeController.php │ │ │ │ │ │ │ ├── AuthorizeControllerInterface.php │ │ │ │ │ │ │ ├── UserInfoController.php │ │ │ │ │ │ │ └── UserInfoControllerInterface.php │ │ │ │ │ │ ├── GrantType/ │ │ │ │ │ │ │ └── AuthorizationCode.php │ │ │ │ │ │ ├── ResponseType/ │ │ │ │ │ │ │ ├── AuthorizationCode.php │ │ │ │ │ │ │ ├── AuthorizationCodeInterface.php │ │ │ │ │ │ │ ├── CodeIdToken.php │ │ │ │ │ │ │ ├── CodeIdTokenInterface.php │ │ │ │ │ │ │ ├── IdToken.php │ │ │ │ │ │ │ ├── IdTokenInterface.php │ │ │ │ │ │ │ ├── IdTokenToken.php │ │ │ │ │ │ │ └── IdTokenTokenInterface.php │ │ │ │ │ │ └── Storage/ │ │ │ │ │ │ ├── AuthorizationCodeInterface.php │ │ │ │ │ │ └── UserClaimsInterface.php │ │ │ │ │ ├── Request.php │ │ │ │ │ ├── RequestInterface.php │ │ │ │ │ ├── Response.php │ │ │ │ │ ├── ResponseInterface.php │ │ │ │ │ ├── ResponseType/ │ │ │ │ │ │ ├── AccessToken.php │ │ │ │ │ │ ├── AccessTokenInterface.php │ │ │ │ │ │ ├── AuthorizationCode.php │ │ │ │ │ │ ├── AuthorizationCodeInterface.php │ │ │ │ │ │ ├── JwtAccessToken.php │ │ │ │ │ │ └── ResponseTypeInterface.php │ │ │ │ │ ├── Scope.php │ │ │ │ │ ├── ScopeInterface.php │ │ │ │ │ ├── Server.php │ │ │ │ │ ├── Storage/ │ │ │ │ │ │ ├── AccessTokenInterface.php │ │ │ │ │ │ ├── AuthorizationCodeInterface.php │ │ │ │ │ │ ├── Cassandra.php │ │ │ │ │ │ ├── ClientCredentialsInterface.php │ │ │ │ │ │ ├── ClientInterface.php │ │ │ │ │ │ ├── CouchbaseDB.php │ │ │ │ │ │ ├── DynamoDB.php │ │ │ │ │ │ ├── JwtAccessToken.php │ │ │ │ │ │ ├── JwtAccessTokenInterface.php │ │ │ │ │ │ ├── JwtBearerInterface.php │ │ │ │ │ │ ├── Memory.php │ │ │ │ │ │ ├── Mongo.php │ │ │ │ │ │ ├── MongoDB.php │ │ │ │ │ │ ├── Pdo.php │ │ │ │ │ │ ├── PublicKeyInterface.php │ │ │ │ │ │ ├── Redis.php │ │ │ │ │ │ ├── RefreshTokenInterface.php │ │ │ │ │ │ ├── ScopeInterface.php │ │ │ │ │ │ └── UserCredentialsInterface.php │ │ │ │ │ └── TokenType/ │ │ │ │ │ ├── Bearer.php │ │ │ │ │ ├── Mac.php │ │ │ │ │ └── TokenTypeInterface.php │ │ │ │ └── test/ │ │ │ │ ├── OAuth2/ │ │ │ │ │ ├── AutoloadTest.php │ │ │ │ │ ├── Controller/ │ │ │ │ │ │ ├── AuthorizeControllerTest.php │ │ │ │ │ │ ├── ResourceControllerTest.php │ │ │ │ │ │ └── TokenControllerTest.php │ │ │ │ │ ├── Encryption/ │ │ │ │ │ │ ├── FirebaseJwtTest.php │ │ │ │ │ │ └── JwtTest.php │ │ │ │ │ ├── GrantType/ │ │ │ │ │ │ ├── AuthorizationCodeTest.php │ │ │ │ │ │ ├── ClientCredentialsTest.php │ │ │ │ │ │ ├── ImplicitTest.php │ │ │ │ │ │ ├── JwtBearerTest.php │ │ │ │ │ │ ├── RefreshTokenTest.php │ │ │ │ │ │ └── UserCredentialsTest.php │ │ │ │ │ ├── OpenID/ │ │ │ │ │ │ ├── Controller/ │ │ │ │ │ │ │ ├── AuthorizeControllerTest.php │ │ │ │ │ │ │ └── UserInfoControllerTest.php │ │ │ │ │ │ ├── GrantType/ │ │ │ │ │ │ │ └── AuthorizationCodeTest.php │ │ │ │ │ │ ├── ResponseType/ │ │ │ │ │ │ │ ├── CodeIdTokenTest.php │ │ │ │ │ │ │ ├── IdTokenTest.php │ │ │ │ │ │ │ └── IdTokenTokenTest.php │ │ │ │ │ │ └── Storage/ │ │ │ │ │ │ ├── AuthorizationCodeTest.php │ │ │ │ │ │ └── UserClaimsTest.php │ │ │ │ │ ├── RequestTest.php │ │ │ │ │ ├── ResponseTest.php │ │ │ │ │ ├── ResponseType/ │ │ │ │ │ │ ├── AccessTokenTest.php │ │ │ │ │ │ └── JwtAccessTokenTest.php │ │ │ │ │ ├── ScopeTest.php │ │ │ │ │ ├── ServerTest.php │ │ │ │ │ ├── Storage/ │ │ │ │ │ │ ├── AccessTokenTest.php │ │ │ │ │ │ ├── AuthorizationCodeTest.php │ │ │ │ │ │ ├── ClientCredentialsTest.php │ │ │ │ │ │ ├── ClientTest.php │ │ │ │ │ │ ├── DynamoDBTest.php │ │ │ │ │ │ ├── JwtAccessTokenTest.php │ │ │ │ │ │ ├── JwtBearerTest.php │ │ │ │ │ │ ├── PdoTest.php │ │ │ │ │ │ ├── PublicKeyTest.php │ │ │ │ │ │ ├── RefreshTokenTest.php │ │ │ │ │ │ ├── ScopeTest.php │ │ │ │ │ │ └── UserCredentialsTest.php │ │ │ │ │ └── TokenType/ │ │ │ │ │ └── BearerTest.php │ │ │ │ ├── bootstrap.php │ │ │ │ ├── cleanup.php │ │ │ │ ├── config/ │ │ │ │ │ ├── keys/ │ │ │ │ │ │ ├── id_rsa │ │ │ │ │ │ └── id_rsa.pub │ │ │ │ │ └── storage.json │ │ │ │ └── lib/ │ │ │ │ └── OAuth2/ │ │ │ │ ├── Request/ │ │ │ │ │ └── TestRequest.php │ │ │ │ └── Storage/ │ │ │ │ ├── BaseTest.php │ │ │ │ ├── Bootstrap.php │ │ │ │ └── NullStorage.php │ │ │ ├── carbonphp/ │ │ │ │ └── carbon-doctrine-types/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ └── Carbon/ │ │ │ │ └── Doctrine/ │ │ │ │ ├── CarbonDoctrineType.php │ │ │ │ ├── CarbonImmutableType.php │ │ │ │ ├── CarbonType.php │ │ │ │ ├── CarbonTypeConverter.php │ │ │ │ ├── DateTimeDefaultPrecision.php │ │ │ │ ├── DateTimeImmutableType.php │ │ │ │ └── DateTimeType.php │ │ │ ├── composer/ │ │ │ │ ├── ClassLoader.php │ │ │ │ ├── InstalledVersions.php │ │ │ │ ├── LICENSE │ │ │ │ ├── autoload_classmap.php │ │ │ │ ├── autoload_files.php │ │ │ │ ├── autoload_namespaces.php │ │ │ │ ├── autoload_psr4.php │ │ │ │ ├── autoload_real.php │ │ │ │ ├── autoload_static.php │ │ │ │ ├── installed.json │ │ │ │ ├── installed.php │ │ │ │ └── platform_check.php │ │ │ ├── dasprid/ │ │ │ │ └── enum/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── AbstractEnum.php │ │ │ │ ├── EnumMap.php │ │ │ │ ├── Exception/ │ │ │ │ │ ├── CloneNotSupportedException.php │ │ │ │ │ ├── ExceptionInterface.php │ │ │ │ │ ├── ExpectationException.php │ │ │ │ │ ├── IllegalArgumentException.php │ │ │ │ │ ├── MismatchException.php │ │ │ │ │ ├── SerializeNotSupportedException.php │ │ │ │ │ └── UnserializeNotSupportedException.php │ │ │ │ └── NullValue.php │ │ │ ├── ddeboer/ │ │ │ │ └── imap/ │ │ │ │ ├── .php-cs-fixer.php │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── Connection.php │ │ │ │ ├── ConnectionInterface.php │ │ │ │ ├── Exception/ │ │ │ │ │ ├── AbstractException.php │ │ │ │ │ ├── AuthenticationFailedException.php │ │ │ │ │ ├── CreateMailboxException.php │ │ │ │ │ ├── DeleteMailboxException.php │ │ │ │ │ ├── ImapFetchbodyException.php │ │ │ │ │ ├── ImapFetchheaderException.php │ │ │ │ │ ├── ImapGetmailboxesException.php │ │ │ │ │ ├── ImapMsgnoException.php │ │ │ │ │ ├── ImapNumMsgException.php │ │ │ │ │ ├── ImapQuotaException.php │ │ │ │ │ ├── ImapStatusException.php │ │ │ │ │ ├── InvalidDateHeaderException.php │ │ │ │ │ ├── InvalidHeadersException.php │ │ │ │ │ ├── InvalidResourceException.php │ │ │ │ │ ├── InvalidSearchCriteriaException.php │ │ │ │ │ ├── MailboxDoesNotExistException.php │ │ │ │ │ ├── MessageCopyException.php │ │ │ │ │ ├── MessageDeleteException.php │ │ │ │ │ ├── MessageDoesNotExistException.php │ │ │ │ │ ├── MessageMoveException.php │ │ │ │ │ ├── MessageStructureException.php │ │ │ │ │ ├── MessageUndeleteException.php │ │ │ │ │ ├── NotEmbeddedMessageException.php │ │ │ │ │ ├── OutOfBoundsException.php │ │ │ │ │ ├── ReopenMailboxException.php │ │ │ │ │ ├── ResourceCheckFailureException.php │ │ │ │ │ ├── UnexpectedEncodingException.php │ │ │ │ │ └── UnsupportedCharsetException.php │ │ │ │ ├── ImapResource.php │ │ │ │ ├── ImapResourceInterface.php │ │ │ │ ├── Mailbox.php │ │ │ │ ├── MailboxInterface.php │ │ │ │ ├── Message/ │ │ │ │ │ ├── AbstractMessage.php │ │ │ │ │ ├── AbstractPart.php │ │ │ │ │ ├── Attachment.php │ │ │ │ │ ├── AttachmentInterface.php │ │ │ │ │ ├── BasicMessageInterface.php │ │ │ │ │ ├── EmailAddress.php │ │ │ │ │ ├── EmbeddedMessage.php │ │ │ │ │ ├── EmbeddedMessageInterface.php │ │ │ │ │ ├── Headers.php │ │ │ │ │ ├── Parameters.php │ │ │ │ │ ├── PartInterface.php │ │ │ │ │ ├── SimplePart.php │ │ │ │ │ └── Transcoder.php │ │ │ │ ├── Message.php │ │ │ │ ├── MessageInterface.php │ │ │ │ ├── MessageIterator.php │ │ │ │ ├── MessageIteratorInterface.php │ │ │ │ ├── Search/ │ │ │ │ │ ├── AbstractDate.php │ │ │ │ │ ├── AbstractText.php │ │ │ │ │ ├── ConditionInterface.php │ │ │ │ │ ├── Date/ │ │ │ │ │ │ ├── Before.php │ │ │ │ │ │ ├── On.php │ │ │ │ │ │ └── Since.php │ │ │ │ │ ├── Email/ │ │ │ │ │ │ ├── Bcc.php │ │ │ │ │ │ ├── Cc.php │ │ │ │ │ │ ├── From.php │ │ │ │ │ │ └── To.php │ │ │ │ │ ├── Flag/ │ │ │ │ │ │ ├── Answered.php │ │ │ │ │ │ ├── Flagged.php │ │ │ │ │ │ ├── Recent.php │ │ │ │ │ │ ├── Seen.php │ │ │ │ │ │ ├── Unanswered.php │ │ │ │ │ │ ├── Unflagged.php │ │ │ │ │ │ └── Unseen.php │ │ │ │ │ ├── LogicalOperator/ │ │ │ │ │ │ ├── All.php │ │ │ │ │ │ └── OrConditions.php │ │ │ │ │ ├── RawExpression.php │ │ │ │ │ ├── State/ │ │ │ │ │ │ ├── Deleted.php │ │ │ │ │ │ ├── NewMessage.php │ │ │ │ │ │ ├── Old.php │ │ │ │ │ │ └── Undeleted.php │ │ │ │ │ └── Text/ │ │ │ │ │ ├── Body.php │ │ │ │ │ ├── Keyword.php │ │ │ │ │ ├── Subject.php │ │ │ │ │ ├── Text.php │ │ │ │ │ └── Unkeyword.php │ │ │ │ ├── SearchExpression.php │ │ │ │ ├── Server.php │ │ │ │ ├── ServerInterface.php │ │ │ │ └── Test/ │ │ │ │ └── RawMessageIterator.php │ │ │ ├── firebase/ │ │ │ │ └── php-jwt/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── BeforeValidException.php │ │ │ │ ├── CachedKeySet.php │ │ │ │ ├── ExpiredException.php │ │ │ │ ├── JWK.php │ │ │ │ ├── JWT.php │ │ │ │ ├── Key.php │ │ │ │ └── SignatureInvalidException.php │ │ │ ├── guzzlehttp/ │ │ │ │ ├── guzzle/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── UPGRADING.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── BodySummarizer.php │ │ │ │ │ ├── BodySummarizerInterface.php │ │ │ │ │ ├── Client.php │ │ │ │ │ ├── ClientInterface.php │ │ │ │ │ ├── ClientTrait.php │ │ │ │ │ ├── Cookie/ │ │ │ │ │ │ ├── CookieJar.php │ │ │ │ │ │ ├── CookieJarInterface.php │ │ │ │ │ │ ├── FileCookieJar.php │ │ │ │ │ │ ├── SessionCookieJar.php │ │ │ │ │ │ └── SetCookie.php │ │ │ │ │ ├── Exception/ │ │ │ │ │ │ ├── BadResponseException.php │ │ │ │ │ │ ├── ClientException.php │ │ │ │ │ │ ├── ConnectException.php │ │ │ │ │ │ ├── GuzzleException.php │ │ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ │ │ ├── RequestException.php │ │ │ │ │ │ ├── ServerException.php │ │ │ │ │ │ ├── TooManyRedirectsException.php │ │ │ │ │ │ └── TransferException.php │ │ │ │ │ ├── Handler/ │ │ │ │ │ │ ├── CurlFactory.php │ │ │ │ │ │ ├── CurlFactoryInterface.php │ │ │ │ │ │ ├── CurlHandler.php │ │ │ │ │ │ ├── CurlMultiHandler.php │ │ │ │ │ │ ├── EasyHandle.php │ │ │ │ │ │ ├── HeaderProcessor.php │ │ │ │ │ │ ├── MockHandler.php │ │ │ │ │ │ ├── Proxy.php │ │ │ │ │ │ └── StreamHandler.php │ │ │ │ │ ├── HandlerStack.php │ │ │ │ │ ├── MessageFormatter.php │ │ │ │ │ ├── MessageFormatterInterface.php │ │ │ │ │ ├── Middleware.php │ │ │ │ │ ├── Pool.php │ │ │ │ │ ├── PrepareBodyMiddleware.php │ │ │ │ │ ├── RedirectMiddleware.php │ │ │ │ │ ├── RequestOptions.php │ │ │ │ │ ├── RetryMiddleware.php │ │ │ │ │ ├── TransferStats.php │ │ │ │ │ ├── Utils.php │ │ │ │ │ ├── functions.php │ │ │ │ │ └── functions_include.php │ │ │ │ ├── promises/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── AggregateException.php │ │ │ │ │ ├── CancellationException.php │ │ │ │ │ ├── Coroutine.php │ │ │ │ │ ├── Create.php │ │ │ │ │ ├── Each.php │ │ │ │ │ ├── EachPromise.php │ │ │ │ │ ├── FulfilledPromise.php │ │ │ │ │ ├── Is.php │ │ │ │ │ ├── Promise.php │ │ │ │ │ ├── PromiseInterface.php │ │ │ │ │ ├── PromisorInterface.php │ │ │ │ │ ├── RejectedPromise.php │ │ │ │ │ ├── RejectionException.php │ │ │ │ │ ├── TaskQueue.php │ │ │ │ │ ├── TaskQueueInterface.php │ │ │ │ │ ├── Utils.php │ │ │ │ │ ├── functions.php │ │ │ │ │ └── functions_include.php │ │ │ │ └── psr7/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── AppendStream.php │ │ │ │ ├── BufferStream.php │ │ │ │ ├── CachingStream.php │ │ │ │ ├── DroppingStream.php │ │ │ │ ├── Exception/ │ │ │ │ │ └── MalformedUriException.php │ │ │ │ ├── FnStream.php │ │ │ │ ├── Header.php │ │ │ │ ├── HttpFactory.php │ │ │ │ ├── InflateStream.php │ │ │ │ ├── LazyOpenStream.php │ │ │ │ ├── LimitStream.php │ │ │ │ ├── Message.php │ │ │ │ ├── MessageTrait.php │ │ │ │ ├── MimeType.php │ │ │ │ ├── MultipartStream.php │ │ │ │ ├── NoSeekStream.php │ │ │ │ ├── PumpStream.php │ │ │ │ ├── Query.php │ │ │ │ ├── Request.php │ │ │ │ ├── Response.php │ │ │ │ ├── Rfc7230.php │ │ │ │ ├── ServerRequest.php │ │ │ │ ├── Stream.php │ │ │ │ ├── StreamDecoratorTrait.php │ │ │ │ ├── StreamWrapper.php │ │ │ │ ├── UploadedFile.php │ │ │ │ ├── Uri.php │ │ │ │ ├── UriComparator.php │ │ │ │ ├── UriNormalizer.php │ │ │ │ ├── UriResolver.php │ │ │ │ └── Utils.php │ │ │ ├── illuminate/ │ │ │ │ ├── collections/ │ │ │ │ │ ├── Arr.php │ │ │ │ │ ├── Collection.php │ │ │ │ │ ├── Enumerable.php │ │ │ │ │ ├── HigherOrderCollectionProxy.php │ │ │ │ │ ├── ItemNotFoundException.php │ │ │ │ │ ├── LICENSE.md │ │ │ │ │ ├── LazyCollection.php │ │ │ │ │ ├── MultipleItemsFoundException.php │ │ │ │ │ ├── Traits/ │ │ │ │ │ │ └── EnumeratesValues.php │ │ │ │ │ ├── composer.json │ │ │ │ │ ├── functions.php │ │ │ │ │ └── helpers.php │ │ │ │ ├── conditionable/ │ │ │ │ │ ├── HigherOrderWhenProxy.php │ │ │ │ │ ├── LICENSE.md │ │ │ │ │ ├── Traits/ │ │ │ │ │ │ └── Conditionable.php │ │ │ │ │ └── composer.json │ │ │ │ ├── contracts/ │ │ │ │ │ ├── Auth/ │ │ │ │ │ │ ├── Access/ │ │ │ │ │ │ │ ├── Authorizable.php │ │ │ │ │ │ │ └── Gate.php │ │ │ │ │ │ ├── Authenticatable.php │ │ │ │ │ │ ├── CanResetPassword.php │ │ │ │ │ │ ├── Factory.php │ │ │ │ │ │ ├── Guard.php │ │ │ │ │ │ ├── Middleware/ │ │ │ │ │ │ │ └── AuthenticatesRequests.php │ │ │ │ │ │ ├── MustVerifyEmail.php │ │ │ │ │ │ ├── PasswordBroker.php │ │ │ │ │ │ ├── PasswordBrokerFactory.php │ │ │ │ │ │ ├── StatefulGuard.php │ │ │ │ │ │ ├── SupportsBasicAuth.php │ │ │ │ │ │ └── UserProvider.php │ │ │ │ │ ├── Broadcasting/ │ │ │ │ │ │ ├── Broadcaster.php │ │ │ │ │ │ ├── Factory.php │ │ │ │ │ │ ├── HasBroadcastChannel.php │ │ │ │ │ │ ├── ShouldBeUnique.php │ │ │ │ │ │ ├── ShouldBroadcast.php │ │ │ │ │ │ └── ShouldBroadcastNow.php │ │ │ │ │ ├── Bus/ │ │ │ │ │ │ ├── Dispatcher.php │ │ │ │ │ │ └── QueueingDispatcher.php │ │ │ │ │ ├── Cache/ │ │ │ │ │ │ ├── Factory.php │ │ │ │ │ │ ├── Lock.php │ │ │ │ │ │ ├── LockProvider.php │ │ │ │ │ │ ├── LockTimeoutException.php │ │ │ │ │ │ ├── Repository.php │ │ │ │ │ │ └── Store.php │ │ │ │ │ ├── Config/ │ │ │ │ │ │ └── Repository.php │ │ │ │ │ ├── Console/ │ │ │ │ │ │ ├── Application.php │ │ │ │ │ │ ├── Isolatable.php │ │ │ │ │ │ ├── Kernel.php │ │ │ │ │ │ └── PromptsForMissingInput.php │ │ │ │ │ ├── Container/ │ │ │ │ │ │ ├── BindingResolutionException.php │ │ │ │ │ │ ├── CircularDependencyException.php │ │ │ │ │ │ ├── Container.php │ │ │ │ │ │ └── ContextualBindingBuilder.php │ │ │ │ │ ├── Cookie/ │ │ │ │ │ │ ├── Factory.php │ │ │ │ │ │ └── QueueingFactory.php │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Eloquent/ │ │ │ │ │ │ │ ├── Builder.php │ │ │ │ │ │ │ ├── Castable.php │ │ │ │ │ │ │ ├── CastsAttributes.php │ │ │ │ │ │ │ ├── CastsInboundAttributes.php │ │ │ │ │ │ │ ├── DeviatesCastableAttributes.php │ │ │ │ │ │ │ ├── SerializesCastableAttributes.php │ │ │ │ │ │ │ └── SupportsPartialRelations.php │ │ │ │ │ │ ├── Events/ │ │ │ │ │ │ │ └── MigrationEvent.php │ │ │ │ │ │ ├── ModelIdentifier.php │ │ │ │ │ │ └── Query/ │ │ │ │ │ │ ├── Builder.php │ │ │ │ │ │ ├── ConditionExpression.php │ │ │ │ │ │ └── Expression.php │ │ │ │ │ ├── Debug/ │ │ │ │ │ │ └── ExceptionHandler.php │ │ │ │ │ ├── Encryption/ │ │ │ │ │ │ ├── DecryptException.php │ │ │ │ │ │ ├── EncryptException.php │ │ │ │ │ │ ├── Encrypter.php │ │ │ │ │ │ └── StringEncrypter.php │ │ │ │ │ ├── Events/ │ │ │ │ │ │ ├── Dispatcher.php │ │ │ │ │ │ ├── ShouldDispatchAfterCommit.php │ │ │ │ │ │ └── ShouldHandleEventsAfterCommit.php │ │ │ │ │ ├── Filesystem/ │ │ │ │ │ │ ├── Cloud.php │ │ │ │ │ │ ├── Factory.php │ │ │ │ │ │ ├── FileNotFoundException.php │ │ │ │ │ │ ├── Filesystem.php │ │ │ │ │ │ └── LockTimeoutException.php │ │ │ │ │ ├── Foundation/ │ │ │ │ │ │ ├── Application.php │ │ │ │ │ │ ├── CachesConfiguration.php │ │ │ │ │ │ ├── CachesRoutes.php │ │ │ │ │ │ ├── ExceptionRenderer.php │ │ │ │ │ │ └── MaintenanceMode.php │ │ │ │ │ ├── Hashing/ │ │ │ │ │ │ └── Hasher.php │ │ │ │ │ ├── Http/ │ │ │ │ │ │ └── Kernel.php │ │ │ │ │ ├── LICENSE.md │ │ │ │ │ ├── Mail/ │ │ │ │ │ │ ├── Attachable.php │ │ │ │ │ │ ├── Factory.php │ │ │ │ │ │ ├── MailQueue.php │ │ │ │ │ │ ├── Mailable.php │ │ │ │ │ │ └── Mailer.php │ │ │ │ │ ├── Notifications/ │ │ │ │ │ │ ├── Dispatcher.php │ │ │ │ │ │ └── Factory.php │ │ │ │ │ ├── Pagination/ │ │ │ │ │ │ ├── CursorPaginator.php │ │ │ │ │ │ ├── LengthAwarePaginator.php │ │ │ │ │ │ └── Paginator.php │ │ │ │ │ ├── Pipeline/ │ │ │ │ │ │ ├── Hub.php │ │ │ │ │ │ └── Pipeline.php │ │ │ │ │ ├── Process/ │ │ │ │ │ │ ├── InvokedProcess.php │ │ │ │ │ │ └── ProcessResult.php │ │ │ │ │ ├── Queue/ │ │ │ │ │ │ ├── ClearableQueue.php │ │ │ │ │ │ ├── EntityNotFoundException.php │ │ │ │ │ │ ├── EntityResolver.php │ │ │ │ │ │ ├── Factory.php │ │ │ │ │ │ ├── Job.php │ │ │ │ │ │ ├── Monitor.php │ │ │ │ │ │ ├── Queue.php │ │ │ │ │ │ ├── QueueableCollection.php │ │ │ │ │ │ ├── QueueableEntity.php │ │ │ │ │ │ ├── ShouldBeEncrypted.php │ │ │ │ │ │ ├── ShouldBeUnique.php │ │ │ │ │ │ ├── ShouldBeUniqueUntilProcessing.php │ │ │ │ │ │ ├── ShouldQueue.php │ │ │ │ │ │ └── ShouldQueueAfterCommit.php │ │ │ │ │ ├── Redis/ │ │ │ │ │ │ ├── Connection.php │ │ │ │ │ │ ├── Connector.php │ │ │ │ │ │ ├── Factory.php │ │ │ │ │ │ └── LimiterTimeoutException.php │ │ │ │ │ ├── Routing/ │ │ │ │ │ │ ├── BindingRegistrar.php │ │ │ │ │ │ ├── Registrar.php │ │ │ │ │ │ ├── ResponseFactory.php │ │ │ │ │ │ ├── UrlGenerator.php │ │ │ │ │ │ └── UrlRoutable.php │ │ │ │ │ ├── Session/ │ │ │ │ │ │ ├── Middleware/ │ │ │ │ │ │ │ └── AuthenticatesSessions.php │ │ │ │ │ │ └── Session.php │ │ │ │ │ ├── Support/ │ │ │ │ │ │ ├── Arrayable.php │ │ │ │ │ │ ├── CanBeEscapedWhenCastToString.php │ │ │ │ │ │ ├── DeferrableProvider.php │ │ │ │ │ │ ├── DeferringDisplayableValue.php │ │ │ │ │ │ ├── Htmlable.php │ │ │ │ │ │ ├── Jsonable.php │ │ │ │ │ │ ├── MessageBag.php │ │ │ │ │ │ ├── MessageProvider.php │ │ │ │ │ │ ├── Renderable.php │ │ │ │ │ │ ├── Responsable.php │ │ │ │ │ │ └── ValidatedData.php │ │ │ │ │ ├── Translation/ │ │ │ │ │ │ ├── HasLocalePreference.php │ │ │ │ │ │ ├── Loader.php │ │ │ │ │ │ └── Translator.php │ │ │ │ │ ├── Validation/ │ │ │ │ │ │ ├── DataAwareRule.php │ │ │ │ │ │ ├── Factory.php │ │ │ │ │ │ ├── ImplicitRule.php │ │ │ │ │ │ ├── InvokableRule.php │ │ │ │ │ │ ├── Rule.php │ │ │ │ │ │ ├── UncompromisedVerifier.php │ │ │ │ │ │ ├── ValidatesWhenResolved.php │ │ │ │ │ │ ├── ValidationRule.php │ │ │ │ │ │ ├── Validator.php │ │ │ │ │ │ └── ValidatorAwareRule.php │ │ │ │ │ ├── View/ │ │ │ │ │ │ ├── Engine.php │ │ │ │ │ │ ├── Factory.php │ │ │ │ │ │ ├── View.php │ │ │ │ │ │ └── ViewCompilationException.php │ │ │ │ │ └── composer.json │ │ │ │ └── macroable/ │ │ │ │ ├── LICENSE.md │ │ │ │ ├── Traits/ │ │ │ │ │ └── Macroable.php │ │ │ │ └── composer.json │ │ │ ├── league/ │ │ │ │ └── oauth2-client/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── Grant/ │ │ │ │ │ ├── AbstractGrant.php │ │ │ │ │ ├── AuthorizationCode.php │ │ │ │ │ ├── ClientCredentials.php │ │ │ │ │ ├── Exception/ │ │ │ │ │ │ └── InvalidGrantException.php │ │ │ │ │ ├── GrantFactory.php │ │ │ │ │ ├── Password.php │ │ │ │ │ └── RefreshToken.php │ │ │ │ ├── OptionProvider/ │ │ │ │ │ ├── HttpBasicAuthOptionProvider.php │ │ │ │ │ ├── OptionProviderInterface.php │ │ │ │ │ └── PostAuthOptionProvider.php │ │ │ │ ├── Provider/ │ │ │ │ │ ├── AbstractProvider.php │ │ │ │ │ ├── Exception/ │ │ │ │ │ │ └── IdentityProviderException.php │ │ │ │ │ ├── GenericProvider.php │ │ │ │ │ ├── GenericResourceOwner.php │ │ │ │ │ └── ResourceOwnerInterface.php │ │ │ │ ├── Token/ │ │ │ │ │ ├── AccessToken.php │ │ │ │ │ ├── AccessTokenInterface.php │ │ │ │ │ └── ResourceOwnerAccessTokenInterface.php │ │ │ │ └── Tool/ │ │ │ │ ├── ArrayAccessorTrait.php │ │ │ │ ├── BearerAuthorizationTrait.php │ │ │ │ ├── GuardedPropertyTrait.php │ │ │ │ ├── MacAuthorizationTrait.php │ │ │ │ ├── ProviderRedirectTrait.php │ │ │ │ ├── QueryBuilderTrait.php │ │ │ │ ├── RequestFactory.php │ │ │ │ └── RequiredParameterTrait.php │ │ │ ├── matthiasmullie/ │ │ │ │ ├── minify/ │ │ │ │ │ ├── .github/ │ │ │ │ │ │ └── FUNDING.yml │ │ │ │ │ ├── CONTRIBUTING.md │ │ │ │ │ ├── Dockerfile │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── bin/ │ │ │ │ │ │ ├── minifycss │ │ │ │ │ │ └── minifyjs │ │ │ │ │ ├── composer.json │ │ │ │ │ ├── data/ │ │ │ │ │ │ └── js/ │ │ │ │ │ │ ├── keywords_after.txt │ │ │ │ │ │ ├── keywords_before.txt │ │ │ │ │ │ ├── keywords_reserved.txt │ │ │ │ │ │ ├── operators.txt │ │ │ │ │ │ ├── operators_after.txt │ │ │ │ │ │ └── operators_before.txt │ │ │ │ │ ├── docker-compose.yml │ │ │ │ │ └── src/ │ │ │ │ │ ├── CSS.php │ │ │ │ │ ├── Exception.php │ │ │ │ │ ├── Exceptions/ │ │ │ │ │ │ ├── BasicException.php │ │ │ │ │ │ ├── FileImportException.php │ │ │ │ │ │ └── IOException.php │ │ │ │ │ ├── JS.php │ │ │ │ │ └── Minify.php │ │ │ │ └── path-converter/ │ │ │ │ ├── LICENSE │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── Converter.php │ │ │ │ ├── ConverterInterface.php │ │ │ │ └── NoConverter.php │ │ │ ├── nesbot/ │ │ │ │ └── carbon/ │ │ │ │ ├── .phpstorm.meta.php │ │ │ │ ├── LICENSE │ │ │ │ ├── bin/ │ │ │ │ │ ├── carbon │ │ │ │ │ └── carbon.bat │ │ │ │ ├── composer.json │ │ │ │ ├── extension.neon │ │ │ │ ├── lazy/ │ │ │ │ │ └── Carbon/ │ │ │ │ │ ├── MessageFormatter/ │ │ │ │ │ │ ├── MessageFormatterMapperStrongType.php │ │ │ │ │ │ └── MessageFormatterMapperWeakType.php │ │ │ │ │ ├── PHPStan/ │ │ │ │ │ │ ├── AbstractMacroBuiltin.php │ │ │ │ │ │ ├── AbstractMacroStatic.php │ │ │ │ │ │ ├── MacroStrongType.php │ │ │ │ │ │ └── MacroWeakType.php │ │ │ │ │ ├── TranslatorStrongType.php │ │ │ │ │ └── TranslatorWeakType.php │ │ │ │ ├── readme.md │ │ │ │ ├── sponsors.php │ │ │ │ └── src/ │ │ │ │ └── Carbon/ │ │ │ │ ├── AbstractTranslator.php │ │ │ │ ├── Carbon.php │ │ │ │ ├── CarbonConverterInterface.php │ │ │ │ ├── CarbonImmutable.php │ │ │ │ ├── CarbonInterface.php │ │ │ │ ├── CarbonInterval.php │ │ │ │ ├── CarbonPeriod.php │ │ │ │ ├── CarbonPeriodImmutable.php │ │ │ │ ├── CarbonTimeZone.php │ │ │ │ ├── Cli/ │ │ │ │ │ └── Invoker.php │ │ │ │ ├── Exceptions/ │ │ │ │ │ ├── BadComparisonUnitException.php │ │ │ │ │ ├── BadFluentConstructorException.php │ │ │ │ │ ├── BadFluentSetterException.php │ │ │ │ │ ├── BadMethodCallException.php │ │ │ │ │ ├── EndLessPeriodException.php │ │ │ │ │ ├── Exception.php │ │ │ │ │ ├── ImmutableException.php │ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ │ ├── InvalidCastException.php │ │ │ │ │ ├── InvalidDateException.php │ │ │ │ │ ├── InvalidFormatException.php │ │ │ │ │ ├── InvalidIntervalException.php │ │ │ │ │ ├── InvalidPeriodDateException.php │ │ │ │ │ ├── InvalidPeriodParameterException.php │ │ │ │ │ ├── InvalidTimeZoneException.php │ │ │ │ │ ├── InvalidTypeException.php │ │ │ │ │ ├── NotACarbonClassException.php │ │ │ │ │ ├── NotAPeriodException.php │ │ │ │ │ ├── NotLocaleAwareException.php │ │ │ │ │ ├── OutOfRangeException.php │ │ │ │ │ ├── ParseErrorException.php │ │ │ │ │ ├── RuntimeException.php │ │ │ │ │ ├── UnitException.php │ │ │ │ │ ├── UnitNotConfiguredException.php │ │ │ │ │ ├── UnknownGetterException.php │ │ │ │ │ ├── UnknownMethodException.php │ │ │ │ │ ├── UnknownSetterException.php │ │ │ │ │ ├── UnknownUnitException.php │ │ │ │ │ └── UnreachableException.php │ │ │ │ ├── Factory.php │ │ │ │ ├── FactoryImmutable.php │ │ │ │ ├── Lang/ │ │ │ │ │ ├── aa.php │ │ │ │ │ ├── aa_DJ.php │ │ │ │ │ ├── aa_ER.php │ │ │ │ │ ├── aa_ER@saaho.php │ │ │ │ │ ├── aa_ET.php │ │ │ │ │ ├── af.php │ │ │ │ │ ├── af_NA.php │ │ │ │ │ ├── af_ZA.php │ │ │ │ │ ├── agq.php │ │ │ │ │ ├── agr.php │ │ │ │ │ ├── agr_PE.php │ │ │ │ │ ├── ak.php │ │ │ │ │ ├── ak_GH.php │ │ │ │ │ ├── am.php │ │ │ │ │ ├── am_ET.php │ │ │ │ │ ├── an.php │ │ │ │ │ ├── an_ES.php │ │ │ │ │ ├── anp.php │ │ │ │ │ ├── anp_IN.php │ │ │ │ │ ├── ar.php │ │ │ │ │ ├── ar_AE.php │ │ │ │ │ ├── ar_BH.php │ │ │ │ │ ├── ar_DJ.php │ │ │ │ │ ├── ar_DZ.php │ │ │ │ │ ├── ar_EG.php │ │ │ │ │ ├── ar_EH.php │ │ │ │ │ ├── ar_ER.php │ │ │ │ │ ├── ar_IL.php │ │ │ │ │ ├── ar_IN.php │ │ │ │ │ ├── ar_IQ.php │ │ │ │ │ ├── ar_JO.php │ │ │ │ │ ├── ar_KM.php │ │ │ │ │ ├── ar_KW.php │ │ │ │ │ ├── ar_LB.php │ │ │ │ │ ├── ar_LY.php │ │ │ │ │ ├── ar_MA.php │ │ │ │ │ ├── ar_MR.php │ │ │ │ │ ├── ar_OM.php │ │ │ │ │ ├── ar_PS.php │ │ │ │ │ ├── ar_QA.php │ │ │ │ │ ├── ar_SA.php │ │ │ │ │ ├── ar_SD.php │ │ │ │ │ ├── ar_SO.php │ │ │ │ │ ├── ar_SS.php │ │ │ │ │ ├── ar_SY.php │ │ │ │ │ ├── ar_Shakl.php │ │ │ │ │ ├── ar_TD.php │ │ │ │ │ ├── ar_TN.php │ │ │ │ │ ├── ar_YE.php │ │ │ │ │ ├── as.php │ │ │ │ │ ├── as_IN.php │ │ │ │ │ ├── asa.php │ │ │ │ │ ├── ast.php │ │ │ │ │ ├── ast_ES.php │ │ │ │ │ ├── ayc.php │ │ │ │ │ ├── ayc_PE.php │ │ │ │ │ ├── az.php │ │ │ │ │ ├── az_AZ.php │ │ │ │ │ ├── az_Cyrl.php │ │ │ │ │ ├── az_IR.php │ │ │ │ │ ├── az_Latn.php │ │ │ │ │ ├── bas.php │ │ │ │ │ ├── be.php │ │ │ │ │ ├── be_BY.php │ │ │ │ │ ├── be_BY@latin.php │ │ │ │ │ ├── bem.php │ │ │ │ │ ├── bem_ZM.php │ │ │ │ │ ├── ber.php │ │ │ │ │ ├── ber_DZ.php │ │ │ │ │ ├── ber_MA.php │ │ │ │ │ ├── bez.php │ │ │ │ │ ├── bg.php │ │ │ │ │ ├── bg_BG.php │ │ │ │ │ ├── bhb.php │ │ │ │ │ ├── bhb_IN.php │ │ │ │ │ ├── bho.php │ │ │ │ │ ├── bho_IN.php │ │ │ │ │ ├── bi.php │ │ │ │ │ ├── bi_VU.php │ │ │ │ │ ├── bm.php │ │ │ │ │ ├── bn.php │ │ │ │ │ ├── bn_BD.php │ │ │ │ │ ├── bn_IN.php │ │ │ │ │ ├── bo.php │ │ │ │ │ ├── bo_CN.php │ │ │ │ │ ├── bo_IN.php │ │ │ │ │ ├── br.php │ │ │ │ │ ├── br_FR.php │ │ │ │ │ ├── brx.php │ │ │ │ │ ├── brx_IN.php │ │ │ │ │ ├── bs.php │ │ │ │ │ ├── bs_BA.php │ │ │ │ │ ├── bs_Cyrl.php │ │ │ │ │ ├── bs_Latn.php │ │ │ │ │ ├── byn.php │ │ │ │ │ ├── byn_ER.php │ │ │ │ │ ├── ca.php │ │ │ │ │ ├── ca_AD.php │ │ │ │ │ ├── ca_ES.php │ │ │ │ │ ├── ca_ES_Valencia.php │ │ │ │ │ ├── ca_FR.php │ │ │ │ │ ├── ca_IT.php │ │ │ │ │ ├── ccp.php │ │ │ │ │ ├── ccp_IN.php │ │ │ │ │ ├── ce.php │ │ │ │ │ ├── ce_RU.php │ │ │ │ │ ├── cgg.php │ │ │ │ │ ├── chr.php │ │ │ │ │ ├── chr_US.php │ │ │ │ │ ├── ckb.php │ │ │ │ │ ├── cmn.php │ │ │ │ │ ├── cmn_TW.php │ │ │ │ │ ├── crh.php │ │ │ │ │ ├── crh_UA.php │ │ │ │ │ ├── cs.php │ │ │ │ │ ├── cs_CZ.php │ │ │ │ │ ├── csb.php │ │ │ │ │ ├── csb_PL.php │ │ │ │ │ ├── cu.php │ │ │ │ │ ├── cv.php │ │ │ │ │ ├── cv_RU.php │ │ │ │ │ ├── cy.php │ │ │ │ │ ├── cy_GB.php │ │ │ │ │ ├── da.php │ │ │ │ │ ├── da_DK.php │ │ │ │ │ ├── da_GL.php │ │ │ │ │ ├── dav.php │ │ │ │ │ ├── de.php │ │ │ │ │ ├── de_AT.php │ │ │ │ │ ├── de_BE.php │ │ │ │ │ ├── de_CH.php │ │ │ │ │ ├── de_DE.php │ │ │ │ │ ├── de_IT.php │ │ │ │ │ ├── de_LI.php │ │ │ │ │ ├── de_LU.php │ │ │ │ │ ├── dje.php │ │ │ │ │ ├── doi.php │ │ │ │ │ ├── doi_IN.php │ │ │ │ │ ├── dsb.php │ │ │ │ │ ├── dsb_DE.php │ │ │ │ │ ├── dua.php │ │ │ │ │ ├── dv.php │ │ │ │ │ ├── dv_MV.php │ │ │ │ │ ├── dyo.php │ │ │ │ │ ├── dz.php │ │ │ │ │ ├── dz_BT.php │ │ │ │ │ ├── ebu.php │ │ │ │ │ ├── ee.php │ │ │ │ │ ├── ee_TG.php │ │ │ │ │ ├── el.php │ │ │ │ │ ├── el_CY.php │ │ │ │ │ ├── el_GR.php │ │ │ │ │ ├── en.php │ │ │ │ │ ├── en_001.php │ │ │ │ │ ├── en_150.php │ │ │ │ │ ├── en_AG.php │ │ │ │ │ ├── en_AI.php │ │ │ │ │ ├── en_AS.php │ │ │ │ │ ├── en_AT.php │ │ │ │ │ ├── en_AU.php │ │ │ │ │ ├── en_BB.php │ │ │ │ │ ├── en_BE.php │ │ │ │ │ ├── en_BI.php │ │ │ │ │ ├── en_BM.php │ │ │ │ │ ├── en_BS.php │ │ │ │ │ ├── en_BW.php │ │ │ │ │ ├── en_BZ.php │ │ │ │ │ ├── en_CA.php │ │ │ │ │ ├── en_CC.php │ │ │ │ │ ├── en_CH.php │ │ │ │ │ ├── en_CK.php │ │ │ │ │ ├── en_CM.php │ │ │ │ │ ├── en_CX.php │ │ │ │ │ ├── en_CY.php │ │ │ │ │ ├── en_DE.php │ │ │ │ │ ├── en_DG.php │ │ │ │ │ ├── en_DK.php │ │ │ │ │ ├── en_DM.php │ │ │ │ │ ├── en_ER.php │ │ │ │ │ ├── en_FI.php │ │ │ │ │ ├── en_FJ.php │ │ │ │ │ ├── en_FK.php │ │ │ │ │ ├── en_FM.php │ │ │ │ │ ├── en_GB.php │ │ │ │ │ ├── en_GD.php │ │ │ │ │ ├── en_GG.php │ │ │ │ │ ├── en_GH.php │ │ │ │ │ ├── en_GI.php │ │ │ │ │ ├── en_GM.php │ │ │ │ │ ├── en_GU.php │ │ │ │ │ ├── en_GY.php │ │ │ │ │ ├── en_HK.php │ │ │ │ │ ├── en_IE.php │ │ │ │ │ ├── en_IL.php │ │ │ │ │ ├── en_IM.php │ │ │ │ │ ├── en_IN.php │ │ │ │ │ ├── en_IO.php │ │ │ │ │ ├── en_ISO.php │ │ │ │ │ ├── en_JE.php │ │ │ │ │ ├── en_JM.php │ │ │ │ │ ├── en_KE.php │ │ │ │ │ ├── en_KI.php │ │ │ │ │ ├── en_KN.php │ │ │ │ │ ├── en_KY.php │ │ │ │ │ ├── en_LC.php │ │ │ │ │ ├── en_LR.php │ │ │ │ │ ├── en_LS.php │ │ │ │ │ ├── en_MG.php │ │ │ │ │ ├── en_MH.php │ │ │ │ │ ├── en_MO.php │ │ │ │ │ ├── en_MP.php │ │ │ │ │ ├── en_MS.php │ │ │ │ │ ├── en_MT.php │ │ │ │ │ ├── en_MU.php │ │ │ │ │ ├── en_MW.php │ │ │ │ │ ├── en_MY.php │ │ │ │ │ ├── en_NA.php │ │ │ │ │ ├── en_NF.php │ │ │ │ │ ├── en_NG.php │ │ │ │ │ ├── en_NL.php │ │ │ │ │ ├── en_NR.php │ │ │ │ │ ├── en_NU.php │ │ │ │ │ ├── en_NZ.php │ │ │ │ │ ├── en_PG.php │ │ │ │ │ ├── en_PH.php │ │ │ │ │ ├── en_PK.php │ │ │ │ │ ├── en_PN.php │ │ │ │ │ ├── en_PR.php │ │ │ │ │ ├── en_PW.php │ │ │ │ │ ├── en_RW.php │ │ │ │ │ ├── en_SB.php │ │ │ │ │ ├── en_SC.php │ │ │ │ │ ├── en_SD.php │ │ │ │ │ ├── en_SE.php │ │ │ │ │ ├── en_SG.php │ │ │ │ │ ├── en_SH.php │ │ │ │ │ ├── en_SI.php │ │ │ │ │ ├── en_SL.php │ │ │ │ │ ├── en_SS.php │ │ │ │ │ ├── en_SX.php │ │ │ │ │ ├── en_SZ.php │ │ │ │ │ ├── en_TC.php │ │ │ │ │ ├── en_TK.php │ │ │ │ │ ├── en_TO.php │ │ │ │ │ ├── en_TT.php │ │ │ │ │ ├── en_TV.php │ │ │ │ │ ├── en_TZ.php │ │ │ │ │ ├── en_UG.php │ │ │ │ │ ├── en_UM.php │ │ │ │ │ ├── en_US.php │ │ │ │ │ ├── en_US_Posix.php │ │ │ │ │ ├── en_VC.php │ │ │ │ │ ├── en_VG.php │ │ │ │ │ ├── en_VI.php │ │ │ │ │ ├── en_VU.php │ │ │ │ │ ├── en_WS.php │ │ │ │ │ ├── en_ZA.php │ │ │ │ │ ├── en_ZM.php │ │ │ │ │ ├── en_ZW.php │ │ │ │ │ ├── eo.php │ │ │ │ │ ├── es.php │ │ │ │ │ ├── es_419.php │ │ │ │ │ ├── es_AR.php │ │ │ │ │ ├── es_BO.php │ │ │ │ │ ├── es_BR.php │ │ │ │ │ ├── es_BZ.php │ │ │ │ │ ├── es_CL.php │ │ │ │ │ ├── es_CO.php │ │ │ │ │ ├── es_CR.php │ │ │ │ │ ├── es_CU.php │ │ │ │ │ ├── es_DO.php │ │ │ │ │ ├── es_EA.php │ │ │ │ │ ├── es_EC.php │ │ │ │ │ ├── es_ES.php │ │ │ │ │ ├── es_GQ.php │ │ │ │ │ ├── es_GT.php │ │ │ │ │ ├── es_HN.php │ │ │ │ │ ├── es_IC.php │ │ │ │ │ ├── es_MX.php │ │ │ │ │ ├── es_NI.php │ │ │ │ │ ├── es_PA.php │ │ │ │ │ ├── es_PE.php │ │ │ │ │ ├── es_PH.php │ │ │ │ │ ├── es_PR.php │ │ │ │ │ ├── es_PY.php │ │ │ │ │ ├── es_SV.php │ │ │ │ │ ├── es_US.php │ │ │ │ │ ├── es_UY.php │ │ │ │ │ ├── es_VE.php │ │ │ │ │ ├── et.php │ │ │ │ │ ├── et_EE.php │ │ │ │ │ ├── eu.php │ │ │ │ │ ├── eu_ES.php │ │ │ │ │ ├── ewo.php │ │ │ │ │ ├── fa.php │ │ │ │ │ ├── fa_AF.php │ │ │ │ │ ├── fa_IR.php │ │ │ │ │ ├── ff.php │ │ │ │ │ ├── ff_CM.php │ │ │ │ │ ├── ff_GN.php │ │ │ │ │ ├── ff_MR.php │ │ │ │ │ ├── ff_SN.php │ │ │ │ │ ├── fi.php │ │ │ │ │ ├── fi_FI.php │ │ │ │ │ ├── fil.php │ │ │ │ │ ├── fil_PH.php │ │ │ │ │ ├── fo.php │ │ │ │ │ ├── fo_DK.php │ │ │ │ │ ├── fo_FO.php │ │ │ │ │ ├── fr.php │ │ │ │ │ ├── fr_BE.php │ │ │ │ │ ├── fr_BF.php │ │ │ │ │ ├── fr_BI.php │ │ │ │ │ ├── fr_BJ.php │ │ │ │ │ ├── fr_BL.php │ │ │ │ │ ├── fr_CA.php │ │ │ │ │ ├── fr_CD.php │ │ │ │ │ ├── fr_CF.php │ │ │ │ │ ├── fr_CG.php │ │ │ │ │ ├── fr_CH.php │ │ │ │ │ ├── fr_CI.php │ │ │ │ │ ├── fr_CM.php │ │ │ │ │ ├── fr_DJ.php │ │ │ │ │ ├── fr_DZ.php │ │ │ │ │ ├── fr_FR.php │ │ │ │ │ ├── fr_GA.php │ │ │ │ │ ├── fr_GF.php │ │ │ │ │ ├── fr_GN.php │ │ │ │ │ ├── fr_GP.php │ │ │ │ │ ├── fr_GQ.php │ │ │ │ │ ├── fr_HT.php │ │ │ │ │ ├── fr_KM.php │ │ │ │ │ ├── fr_LU.php │ │ │ │ │ ├── fr_MA.php │ │ │ │ │ ├── fr_MC.php │ │ │ │ │ ├── fr_MF.php │ │ │ │ │ ├── fr_MG.php │ │ │ │ │ ├── fr_ML.php │ │ │ │ │ ├── fr_MQ.php │ │ │ │ │ ├── fr_MR.php │ │ │ │ │ ├── fr_MU.php │ │ │ │ │ ├── fr_NC.php │ │ │ │ │ ├── fr_NE.php │ │ │ │ │ ├── fr_PF.php │ │ │ │ │ ├── fr_PM.php │ │ │ │ │ ├── fr_RE.php │ │ │ │ │ ├── fr_RW.php │ │ │ │ │ ├── fr_SC.php │ │ │ │ │ ├── fr_SN.php │ │ │ │ │ ├── fr_SY.php │ │ │ │ │ ├── fr_TD.php │ │ │ │ │ ├── fr_TG.php │ │ │ │ │ ├── fr_TN.php │ │ │ │ │ ├── fr_VU.php │ │ │ │ │ ├── fr_WF.php │ │ │ │ │ ├── fr_YT.php │ │ │ │ │ ├── fur.php │ │ │ │ │ ├── fur_IT.php │ │ │ │ │ ├── fy.php │ │ │ │ │ ├── fy_DE.php │ │ │ │ │ ├── fy_NL.php │ │ │ │ │ ├── ga.php │ │ │ │ │ ├── ga_IE.php │ │ │ │ │ ├── gd.php │ │ │ │ │ ├── gd_GB.php │ │ │ │ │ ├── gez.php │ │ │ │ │ ├── gez_ER.php │ │ │ │ │ ├── gez_ET.php │ │ │ │ │ ├── gl.php │ │ │ │ │ ├── gl_ES.php │ │ │ │ │ ├── gom.php │ │ │ │ │ ├── gom_Latn.php │ │ │ │ │ ├── gsw.php │ │ │ │ │ ├── gsw_CH.php │ │ │ │ │ ├── gsw_FR.php │ │ │ │ │ ├── gsw_LI.php │ │ │ │ │ ├── gu.php │ │ │ │ │ ├── gu_IN.php │ │ │ │ │ ├── guz.php │ │ │ │ │ ├── gv.php │ │ │ │ │ ├── gv_GB.php │ │ │ │ │ ├── ha.php │ │ │ │ │ ├── ha_GH.php │ │ │ │ │ ├── ha_NE.php │ │ │ │ │ ├── ha_NG.php │ │ │ │ │ ├── hak.php │ │ │ │ │ ├── hak_TW.php │ │ │ │ │ ├── haw.php │ │ │ │ │ ├── he.php │ │ │ │ │ ├── he_IL.php │ │ │ │ │ ├── hi.php │ │ │ │ │ ├── hi_IN.php │ │ │ │ │ ├── hif.php │ │ │ │ │ ├── hif_FJ.php │ │ │ │ │ ├── hne.php │ │ │ │ │ ├── hne_IN.php │ │ │ │ │ ├── hr.php │ │ │ │ │ ├── hr_BA.php │ │ │ │ │ ├── hr_HR.php │ │ │ │ │ ├── hsb.php │ │ │ │ │ ├── hsb_DE.php │ │ │ │ │ ├── ht.php │ │ │ │ │ ├── ht_HT.php │ │ │ │ │ ├── hu.php │ │ │ │ │ ├── hu_HU.php │ │ │ │ │ ├── hy.php │ │ │ │ │ ├── hy_AM.php │ │ │ │ │ ├── i18n.php │ │ │ │ │ ├── ia.php │ │ │ │ │ ├── ia_FR.php │ │ │ │ │ ├── id.php │ │ │ │ │ ├── id_ID.php │ │ │ │ │ ├── ig.php │ │ │ │ │ ├── ig_NG.php │ │ │ │ │ ├── ii.php │ │ │ │ │ ├── ik.php │ │ │ │ │ ├── ik_CA.php │ │ │ │ │ ├── in.php │ │ │ │ │ ├── is.php │ │ │ │ │ ├── is_IS.php │ │ │ │ │ ├── it.php │ │ │ │ │ ├── it_CH.php │ │ │ │ │ ├── it_IT.php │ │ │ │ │ ├── it_SM.php │ │ │ │ │ ├── it_VA.php │ │ │ │ │ ├── iu.php │ │ │ │ │ ├── iu_CA.php │ │ │ │ │ ├── iw.php │ │ │ │ │ ├── ja.php │ │ │ │ │ ├── ja_JP.php │ │ │ │ │ ├── jgo.php │ │ │ │ │ ├── jmc.php │ │ │ │ │ ├── jv.php │ │ │ │ │ ├── ka.php │ │ │ │ │ ├── ka_GE.php │ │ │ │ │ ├── kab.php │ │ │ │ │ ├── kab_DZ.php │ │ │ │ │ ├── kam.php │ │ │ │ │ ├── kde.php │ │ │ │ │ ├── kea.php │ │ │ │ │ ├── khq.php │ │ │ │ │ ├── ki.php │ │ │ │ │ ├── kk.php │ │ │ │ │ ├── kk_KZ.php │ │ │ │ │ ├── kkj.php │ │ │ │ │ ├── kl.php │ │ │ │ │ ├── kl_GL.php │ │ │ │ │ ├── kln.php │ │ │ │ │ ├── km.php │ │ │ │ │ ├── km_KH.php │ │ │ │ │ ├── kn.php │ │ │ │ │ ├── kn_IN.php │ │ │ │ │ ├── ko.php │ │ │ │ │ ├── ko_KP.php │ │ │ │ │ ├── ko_KR.php │ │ │ │ │ ├── kok.php │ │ │ │ │ ├── kok_IN.php │ │ │ │ │ ├── ks.php │ │ │ │ │ ├── ks_IN.php │ │ │ │ │ ├── ks_IN@devanagari.php │ │ │ │ │ ├── ksb.php │ │ │ │ │ ├── ksf.php │ │ │ │ │ ├── ksh.php │ │ │ │ │ ├── ku.php │ │ │ │ │ ├── ku_TR.php │ │ │ │ │ ├── kw.php │ │ │ │ │ ├── kw_GB.php │ │ │ │ │ ├── ky.php │ │ │ │ │ ├── ky_KG.php │ │ │ │ │ ├── lag.php │ │ │ │ │ ├── lb.php │ │ │ │ │ ├── lb_LU.php │ │ │ │ │ ├── lg.php │ │ │ │ │ ├── lg_UG.php │ │ │ │ │ ├── li.php │ │ │ │ │ ├── li_NL.php │ │ │ │ │ ├── lij.php │ │ │ │ │ ├── lij_IT.php │ │ │ │ │ ├── lkt.php │ │ │ │ │ ├── ln.php │ │ │ │ │ ├── ln_AO.php │ │ │ │ │ ├── ln_CD.php │ │ │ │ │ ├── ln_CF.php │ │ │ │ │ ├── ln_CG.php │ │ │ │ │ ├── lo.php │ │ │ │ │ ├── lo_LA.php │ │ │ │ │ ├── lrc.php │ │ │ │ │ ├── lrc_IQ.php │ │ │ │ │ ├── lt.php │ │ │ │ │ ├── lt_LT.php │ │ │ │ │ ├── lu.php │ │ │ │ │ ├── luo.php │ │ │ │ │ ├── luy.php │ │ │ │ │ ├── lv.php │ │ │ │ │ ├── lv_LV.php │ │ │ │ │ ├── lzh.php │ │ │ │ │ ├── lzh_TW.php │ │ │ │ │ ├── mag.php │ │ │ │ │ ├── mag_IN.php │ │ │ │ │ ├── mai.php │ │ │ │ │ ├── mai_IN.php │ │ │ │ │ ├── mas.php │ │ │ │ │ ├── mas_TZ.php │ │ │ │ │ ├── mer.php │ │ │ │ │ ├── mfe.php │ │ │ │ │ ├── mfe_MU.php │ │ │ │ │ ├── mg.php │ │ │ │ │ ├── mg_MG.php │ │ │ │ │ ├── mgh.php │ │ │ │ │ ├── mgo.php │ │ │ │ │ ├── mhr.php │ │ │ │ │ ├── mhr_RU.php │ │ │ │ │ ├── mi.php │ │ │ │ │ ├── mi_NZ.php │ │ │ │ │ ├── miq.php │ │ │ │ │ ├── miq_NI.php │ │ │ │ │ ├── mjw.php │ │ │ │ │ ├── mjw_IN.php │ │ │ │ │ ├── mk.php │ │ │ │ │ ├── mk_MK.php │ │ │ │ │ ├── ml.php │ │ │ │ │ ├── ml_IN.php │ │ │ │ │ ├── mn.php │ │ │ │ │ ├── mn_MN.php │ │ │ │ │ ├── mni.php │ │ │ │ │ ├── mni_IN.php │ │ │ │ │ ├── mo.php │ │ │ │ │ ├── mr.php │ │ │ │ │ ├── mr_IN.php │ │ │ │ │ ├── ms.php │ │ │ │ │ ├── ms_BN.php │ │ │ │ │ ├── ms_MY.php │ │ │ │ │ ├── ms_SG.php │ │ │ │ │ ├── mt.php │ │ │ │ │ ├── mt_MT.php │ │ │ │ │ ├── mua.php │ │ │ │ │ ├── my.php │ │ │ │ │ ├── my_MM.php │ │ │ │ │ ├── mzn.php │ │ │ │ │ ├── nan.php │ │ │ │ │ ├── nan_TW.php │ │ │ │ │ ├── nan_TW@latin.php │ │ │ │ │ ├── naq.php │ │ │ │ │ ├── nb.php │ │ │ │ │ ├── nb_NO.php │ │ │ │ │ ├── nb_SJ.php │ │ │ │ │ ├── nd.php │ │ │ │ │ ├── nds.php │ │ │ │ │ ├── nds_DE.php │ │ │ │ │ ├── nds_NL.php │ │ │ │ │ ├── ne.php │ │ │ │ │ ├── ne_IN.php │ │ │ │ │ ├── ne_NP.php │ │ │ │ │ ├── nhn.php │ │ │ │ │ ├── nhn_MX.php │ │ │ │ │ ├── niu.php │ │ │ │ │ ├── niu_NU.php │ │ │ │ │ ├── nl.php │ │ │ │ │ ├── nl_AW.php │ │ │ │ │ ├── nl_BE.php │ │ │ │ │ ├── nl_BQ.php │ │ │ │ │ ├── nl_CW.php │ │ │ │ │ ├── nl_NL.php │ │ │ │ │ ├── nl_SR.php │ │ │ │ │ ├── nl_SX.php │ │ │ │ │ ├── nmg.php │ │ │ │ │ ├── nn.php │ │ │ │ │ ├── nn_NO.php │ │ │ │ │ ├── nnh.php │ │ │ │ │ ├── no.php │ │ │ │ │ ├── nr.php │ │ │ │ │ ├── nr_ZA.php │ │ │ │ │ ├── nso.php │ │ │ │ │ ├── nso_ZA.php │ │ │ │ │ ├── nus.php │ │ │ │ │ ├── nyn.php │ │ │ │ │ ├── oc.php │ │ │ │ │ ├── oc_FR.php │ │ │ │ │ ├── om.php │ │ │ │ │ ├── om_ET.php │ │ │ │ │ ├── om_KE.php │ │ │ │ │ ├── or.php │ │ │ │ │ ├── or_IN.php │ │ │ │ │ ├── os.php │ │ │ │ │ ├── os_RU.php │ │ │ │ │ ├── pa.php │ │ │ │ │ ├── pa_Arab.php │ │ │ │ │ ├── pa_Guru.php │ │ │ │ │ ├── pa_IN.php │ │ │ │ │ ├── pa_PK.php │ │ │ │ │ ├── pap.php │ │ │ │ │ ├── pap_AW.php │ │ │ │ │ ├── pap_CW.php │ │ │ │ │ ├── pl.php │ │ │ │ │ ├── pl_PL.php │ │ │ │ │ ├── prg.php │ │ │ │ │ ├── ps.php │ │ │ │ │ ├── ps_AF.php │ │ │ │ │ ├── pt.php │ │ │ │ │ ├── pt_AO.php │ │ │ │ │ ├── pt_BR.php │ │ │ │ │ ├── pt_CH.php │ │ │ │ │ ├── pt_CV.php │ │ │ │ │ ├── pt_GQ.php │ │ │ │ │ ├── pt_GW.php │ │ │ │ │ ├── pt_LU.php │ │ │ │ │ ├── pt_MO.php │ │ │ │ │ ├── pt_MZ.php │ │ │ │ │ ├── pt_PT.php │ │ │ │ │ ├── pt_ST.php │ │ │ │ │ ├── pt_TL.php │ │ │ │ │ ├── qu.php │ │ │ │ │ ├── qu_BO.php │ │ │ │ │ ├── qu_EC.php │ │ │ │ │ ├── quz.php │ │ │ │ │ ├── quz_PE.php │ │ │ │ │ ├── raj.php │ │ │ │ │ ├── raj_IN.php │ │ │ │ │ ├── rm.php │ │ │ │ │ ├── rn.php │ │ │ │ │ ├── ro.php │ │ │ │ │ ├── ro_MD.php │ │ │ │ │ ├── ro_RO.php │ │ │ │ │ ├── rof.php │ │ │ │ │ ├── ru.php │ │ │ │ │ ├── ru_BY.php │ │ │ │ │ ├── ru_KG.php │ │ │ │ │ ├── ru_KZ.php │ │ │ │ │ ├── ru_MD.php │ │ │ │ │ ├── ru_RU.php │ │ │ │ │ ├── ru_UA.php │ │ │ │ │ ├── rw.php │ │ │ │ │ ├── rw_RW.php │ │ │ │ │ ├── rwk.php │ │ │ │ │ ├── sa.php │ │ │ │ │ ├── sa_IN.php │ │ │ │ │ ├── sah.php │ │ │ │ │ ├── sah_RU.php │ │ │ │ │ ├── saq.php │ │ │ │ │ ├── sat.php │ │ │ │ │ ├── sat_IN.php │ │ │ │ │ ├── sbp.php │ │ │ │ │ ├── sc.php │ │ │ │ │ ├── sc_IT.php │ │ │ │ │ ├── sd.php │ │ │ │ │ ├── sd_IN.php │ │ │ │ │ ├── sd_IN@devanagari.php │ │ │ │ │ ├── se.php │ │ │ │ │ ├── se_FI.php │ │ │ │ │ ├── se_NO.php │ │ │ │ │ ├── se_SE.php │ │ │ │ │ ├── seh.php │ │ │ │ │ ├── ses.php │ │ │ │ │ ├── sg.php │ │ │ │ │ ├── sgs.php │ │ │ │ │ ├── sgs_LT.php │ │ │ │ │ ├── sh.php │ │ │ │ │ ├── shi.php │ │ │ │ │ ├── shi_Latn.php │ │ │ │ │ ├── shi_Tfng.php │ │ │ │ │ ├── shn.php │ │ │ │ │ ├── shn_MM.php │ │ │ │ │ ├── shs.php │ │ │ │ │ ├── shs_CA.php │ │ │ │ │ ├── si.php │ │ │ │ │ ├── si_LK.php │ │ │ │ │ ├── sid.php │ │ │ │ │ ├── sid_ET.php │ │ │ │ │ ├── sk.php │ │ │ │ │ ├── sk_SK.php │ │ │ │ │ ├── sl.php │ │ │ │ │ ├── sl_SI.php │ │ │ │ │ ├── sm.php │ │ │ │ │ ├── sm_WS.php │ │ │ │ │ ├── smn.php │ │ │ │ │ ├── sn.php │ │ │ │ │ ├── so.php │ │ │ │ │ ├── so_DJ.php │ │ │ │ │ ├── so_ET.php │ │ │ │ │ ├── so_KE.php │ │ │ │ │ ├── so_SO.php │ │ │ │ │ ├── sq.php │ │ │ │ │ ├── sq_AL.php │ │ │ │ │ ├── sq_MK.php │ │ │ │ │ ├── sq_XK.php │ │ │ │ │ ├── sr.php │ │ │ │ │ ├── sr_Cyrl.php │ │ │ │ │ ├── sr_Cyrl_BA.php │ │ │ │ │ ├── sr_Cyrl_ME.php │ │ │ │ │ ├── sr_Cyrl_XK.php │ │ │ │ │ ├── sr_Latn.php │ │ │ │ │ ├── sr_Latn_BA.php │ │ │ │ │ ├── sr_Latn_ME.php │ │ │ │ │ ├── sr_Latn_XK.php │ │ │ │ │ ├── sr_ME.php │ │ │ │ │ ├── sr_RS.php │ │ │ │ │ ├── sr_RS@latin.php │ │ │ │ │ ├── ss.php │ │ │ │ │ ├── ss_ZA.php │ │ │ │ │ ├── st.php │ │ │ │ │ ├── st_ZA.php │ │ │ │ │ ├── sv.php │ │ │ │ │ ├── sv_AX.php │ │ │ │ │ ├── sv_FI.php │ │ │ │ │ ├── sv_SE.php │ │ │ │ │ ├── sw.php │ │ │ │ │ ├── sw_CD.php │ │ │ │ │ ├── sw_KE.php │ │ │ │ │ ├── sw_TZ.php │ │ │ │ │ ├── sw_UG.php │ │ │ │ │ ├── szl.php │ │ │ │ │ ├── szl_PL.php │ │ │ │ │ ├── ta.php │ │ │ │ │ ├── ta_IN.php │ │ │ │ │ ├── ta_LK.php │ │ │ │ │ ├── ta_MY.php │ │ │ │ │ ├── ta_SG.php │ │ │ │ │ ├── tcy.php │ │ │ │ │ ├── tcy_IN.php │ │ │ │ │ ├── te.php │ │ │ │ │ ├── te_IN.php │ │ │ │ │ ├── teo.php │ │ │ │ │ ├── teo_KE.php │ │ │ │ │ ├── tet.php │ │ │ │ │ ├── tg.php │ │ │ │ │ ├── tg_TJ.php │ │ │ │ │ ├── th.php │ │ │ │ │ ├── th_TH.php │ │ │ │ │ ├── the.php │ │ │ │ │ ├── the_NP.php │ │ │ │ │ ├── ti.php │ │ │ │ │ ├── ti_ER.php │ │ │ │ │ ├── ti_ET.php │ │ │ │ │ ├── tig.php │ │ │ │ │ ├── tig_ER.php │ │ │ │ │ ├── tk.php │ │ │ │ │ ├── tk_TM.php │ │ │ │ │ ├── tl.php │ │ │ │ │ ├── tl_PH.php │ │ │ │ │ ├── tlh.php │ │ │ │ │ ├── tn.php │ │ │ │ │ ├── tn_ZA.php │ │ │ │ │ ├── to.php │ │ │ │ │ ├── to_TO.php │ │ │ │ │ ├── tpi.php │ │ │ │ │ ├── tpi_PG.php │ │ │ │ │ ├── tr.php │ │ │ │ │ ├── tr_CY.php │ │ │ │ │ ├── tr_TR.php │ │ │ │ │ ├── ts.php │ │ │ │ │ ├── ts_ZA.php │ │ │ │ │ ├── tt.php │ │ │ │ │ ├── tt_RU.php │ │ │ │ │ ├── tt_RU@iqtelif.php │ │ │ │ │ ├── twq.php │ │ │ │ │ ├── tzl.php │ │ │ │ │ ├── tzm.php │ │ │ │ │ ├── tzm_Latn.php │ │ │ │ │ ├── ug.php │ │ │ │ │ ├── ug_CN.php │ │ │ │ │ ├── uk.php │ │ │ │ │ ├── uk_UA.php │ │ │ │ │ ├── unm.php │ │ │ │ │ ├── unm_US.php │ │ │ │ │ ├── ur.php │ │ │ │ │ ├── ur_IN.php │ │ │ │ │ ├── ur_PK.php │ │ │ │ │ ├── uz.php │ │ │ │ │ ├── uz_Arab.php │ │ │ │ │ ├── uz_Cyrl.php │ │ │ │ │ ├── uz_Latn.php │ │ │ │ │ ├── uz_UZ.php │ │ │ │ │ ├── uz_UZ@cyrillic.php │ │ │ │ │ ├── vai.php │ │ │ │ │ ├── vai_Latn.php │ │ │ │ │ ├── vai_Vaii.php │ │ │ │ │ ├── ve.php │ │ │ │ │ ├── ve_ZA.php │ │ │ │ │ ├── vi.php │ │ │ │ │ ├── vi_VN.php │ │ │ │ │ ├── vo.php │ │ │ │ │ ├── vun.php │ │ │ │ │ ├── wa.php │ │ │ │ │ ├── wa_BE.php │ │ │ │ │ ├── wae.php │ │ │ │ │ ├── wae_CH.php │ │ │ │ │ ├── wal.php │ │ │ │ │ ├── wal_ET.php │ │ │ │ │ ├── wo.php │ │ │ │ │ ├── wo_SN.php │ │ │ │ │ ├── xh.php │ │ │ │ │ ├── xh_ZA.php │ │ │ │ │ ├── xog.php │ │ │ │ │ ├── yav.php │ │ │ │ │ ├── yi.php │ │ │ │ │ ├── yi_US.php │ │ │ │ │ ├── yo.php │ │ │ │ │ ├── yo_BJ.php │ │ │ │ │ ├── yo_NG.php │ │ │ │ │ ├── yue.php │ │ │ │ │ ├── yue_HK.php │ │ │ │ │ ├── yue_Hans.php │ │ │ │ │ ├── yue_Hant.php │ │ │ │ │ ├── yuw.php │ │ │ │ │ ├── yuw_PG.php │ │ │ │ │ ├── zgh.php │ │ │ │ │ ├── zh.php │ │ │ │ │ ├── zh_CN.php │ │ │ │ │ ├── zh_HK.php │ │ │ │ │ ├── zh_Hans.php │ │ │ │ │ ├── zh_Hans_HK.php │ │ │ │ │ ├── zh_Hans_MO.php │ │ │ │ │ ├── zh_Hans_SG.php │ │ │ │ │ ├── zh_Hant.php │ │ │ │ │ ├── zh_Hant_HK.php │ │ │ │ │ ├── zh_Hant_MO.php │ │ │ │ │ ├── zh_Hant_TW.php │ │ │ │ │ ├── zh_MO.php │ │ │ │ │ ├── zh_SG.php │ │ │ │ │ ├── zh_TW.php │ │ │ │ │ ├── zh_YUE.php │ │ │ │ │ ├── zu.php │ │ │ │ │ └── zu_ZA.php │ │ │ │ ├── Language.php │ │ │ │ ├── Laravel/ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── List/ │ │ │ │ │ ├── languages.php │ │ │ │ │ └── regions.php │ │ │ │ ├── MessageFormatter/ │ │ │ │ │ └── MessageFormatterMapper.php │ │ │ │ ├── PHPStan/ │ │ │ │ │ ├── AbstractMacro.php │ │ │ │ │ ├── Macro.php │ │ │ │ │ ├── MacroExtension.php │ │ │ │ │ └── MacroScanner.php │ │ │ │ ├── Traits/ │ │ │ │ │ ├── Boundaries.php │ │ │ │ │ ├── Cast.php │ │ │ │ │ ├── Comparison.php │ │ │ │ │ ├── Converter.php │ │ │ │ │ ├── Creator.php │ │ │ │ │ ├── Date.php │ │ │ │ │ ├── DeprecatedProperties.php │ │ │ │ │ ├── Difference.php │ │ │ │ │ ├── IntervalRounding.php │ │ │ │ │ ├── IntervalStep.php │ │ │ │ │ ├── Localization.php │ │ │ │ │ ├── Macro.php │ │ │ │ │ ├── MagicParameter.php │ │ │ │ │ ├── Mixin.php │ │ │ │ │ ├── Modifiers.php │ │ │ │ │ ├── Mutability.php │ │ │ │ │ ├── ObjectInitialisation.php │ │ │ │ │ ├── Options.php │ │ │ │ │ ├── Rounding.php │ │ │ │ │ ├── Serialization.php │ │ │ │ │ ├── Test.php │ │ │ │ │ ├── Timestamp.php │ │ │ │ │ ├── ToStringFormat.php │ │ │ │ │ ├── Units.php │ │ │ │ │ └── Week.php │ │ │ │ ├── Translator.php │ │ │ │ ├── TranslatorImmutable.php │ │ │ │ └── TranslatorStrongTypeInterface.php │ │ │ ├── paragonie/ │ │ │ │ └── random_compat/ │ │ │ │ ├── LICENSE │ │ │ │ ├── build-phar.sh │ │ │ │ ├── composer.json │ │ │ │ ├── dist/ │ │ │ │ │ ├── random_compat.phar.pubkey │ │ │ │ │ └── random_compat.phar.pubkey.asc │ │ │ │ ├── lib/ │ │ │ │ │ └── random.php │ │ │ │ ├── other/ │ │ │ │ │ └── build_phar.php │ │ │ │ ├── psalm-autoload.php │ │ │ │ └── psalm.xml │ │ │ ├── php-mime-mail-parser/ │ │ │ │ └── php-mime-mail-parser/ │ │ │ │ ├── .github/ │ │ │ │ │ └── workflows/ │ │ │ │ │ └── main.yml │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── compile_mailparse.sh │ │ │ │ ├── composer.json │ │ │ │ ├── mailparse-stubs.php │ │ │ │ ├── phpunit.xml.dist │ │ │ │ └── src/ │ │ │ │ ├── Attachment.php │ │ │ │ ├── Charset.php │ │ │ │ ├── Contracts/ │ │ │ │ │ ├── CharsetManager.php │ │ │ │ │ └── Middleware.php │ │ │ │ ├── Exception.php │ │ │ │ ├── Middleware.php │ │ │ │ ├── MiddlewareStack.php │ │ │ │ ├── MimePart.php │ │ │ │ └── Parser.php │ │ │ ├── phpmailer/ │ │ │ │ └── phpmailer/ │ │ │ │ ├── COMMITMENT │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── SECURITY.md │ │ │ │ ├── VERSION │ │ │ │ ├── composer.json │ │ │ │ ├── get_oauth_token.php │ │ │ │ ├── language/ │ │ │ │ │ ├── phpmailer.lang-af.php │ │ │ │ │ ├── phpmailer.lang-ar.php │ │ │ │ │ ├── phpmailer.lang-az.php │ │ │ │ │ ├── phpmailer.lang-ba.php │ │ │ │ │ ├── phpmailer.lang-be.php │ │ │ │ │ ├── phpmailer.lang-bg.php │ │ │ │ │ ├── phpmailer.lang-ca.php │ │ │ │ │ ├── phpmailer.lang-ch.php │ │ │ │ │ ├── phpmailer.lang-cs.php │ │ │ │ │ ├── phpmailer.lang-da.php │ │ │ │ │ ├── phpmailer.lang-de.php │ │ │ │ │ ├── phpmailer.lang-el.php │ │ │ │ │ ├── phpmailer.lang-eo.php │ │ │ │ │ ├── phpmailer.lang-es.php │ │ │ │ │ ├── phpmailer.lang-et.php │ │ │ │ │ ├── phpmailer.lang-fa.php │ │ │ │ │ ├── phpmailer.lang-fi.php │ │ │ │ │ ├── phpmailer.lang-fo.php │ │ │ │ │ ├── phpmailer.lang-fr.php │ │ │ │ │ ├── phpmailer.lang-gl.php │ │ │ │ │ ├── phpmailer.lang-he.php │ │ │ │ │ ├── phpmailer.lang-hi.php │ │ │ │ │ ├── phpmailer.lang-hr.php │ │ │ │ │ ├── phpmailer.lang-hu.php │ │ │ │ │ ├── phpmailer.lang-hy.php │ │ │ │ │ ├── phpmailer.lang-id.php │ │ │ │ │ ├── phpmailer.lang-it.php │ │ │ │ │ ├── phpmailer.lang-ja.php │ │ │ │ │ ├── phpmailer.lang-ka.php │ │ │ │ │ ├── phpmailer.lang-ko.php │ │ │ │ │ ├── phpmailer.lang-lt.php │ │ │ │ │ ├── phpmailer.lang-lv.php │ │ │ │ │ ├── phpmailer.lang-mg.php │ │ │ │ │ ├── phpmailer.lang-ms.php │ │ │ │ │ ├── phpmailer.lang-nb.php │ │ │ │ │ ├── phpmailer.lang-nl.php │ │ │ │ │ ├── phpmailer.lang-pl.php │ │ │ │ │ ├── phpmailer.lang-pt.php │ │ │ │ │ ├── phpmailer.lang-pt_br.php │ │ │ │ │ ├── phpmailer.lang-ro.php │ │ │ │ │ ├── phpmailer.lang-ru.php │ │ │ │ │ ├── phpmailer.lang-sk.php │ │ │ │ │ ├── phpmailer.lang-sl.php │ │ │ │ │ ├── phpmailer.lang-sr.php │ │ │ │ │ ├── phpmailer.lang-sr_latn.php │ │ │ │ │ ├── phpmailer.lang-sv.php │ │ │ │ │ ├── phpmailer.lang-tl.php │ │ │ │ │ ├── phpmailer.lang-tr.php │ │ │ │ │ ├── phpmailer.lang-uk.php │ │ │ │ │ ├── phpmailer.lang-vi.php │ │ │ │ │ ├── phpmailer.lang-zh.php │ │ │ │ │ └── phpmailer.lang-zh_cn.php │ │ │ │ └── src/ │ │ │ │ ├── Exception.php │ │ │ │ ├── OAuth.php │ │ │ │ ├── OAuthTokenProvider.php │ │ │ │ ├── PHPMailer.php │ │ │ │ ├── POP3.php │ │ │ │ └── SMTP.php │ │ │ ├── psr/ │ │ │ │ ├── clock/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ └── ClockInterface.php │ │ │ │ ├── container/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── ContainerExceptionInterface.php │ │ │ │ │ ├── ContainerInterface.php │ │ │ │ │ └── NotFoundExceptionInterface.php │ │ │ │ ├── http-client/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── ClientExceptionInterface.php │ │ │ │ │ ├── ClientInterface.php │ │ │ │ │ ├── NetworkExceptionInterface.php │ │ │ │ │ └── RequestExceptionInterface.php │ │ │ │ ├── http-message/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── MessageInterface.php │ │ │ │ │ ├── RequestInterface.php │ │ │ │ │ ├── ResponseInterface.php │ │ │ │ │ ├── ServerRequestInterface.php │ │ │ │ │ ├── StreamInterface.php │ │ │ │ │ ├── UploadedFileInterface.php │ │ │ │ │ └── UriInterface.php │ │ │ │ ├── log/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── AbstractLogger.php │ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ │ ├── LogLevel.php │ │ │ │ │ ├── LoggerAwareInterface.php │ │ │ │ │ ├── LoggerAwareTrait.php │ │ │ │ │ ├── LoggerInterface.php │ │ │ │ │ ├── LoggerTrait.php │ │ │ │ │ └── NullLogger.php │ │ │ │ └── simple-cache/ │ │ │ │ ├── .editorconfig │ │ │ │ ├── LICENSE.md │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── CacheException.php │ │ │ │ ├── CacheInterface.php │ │ │ │ └── InvalidArgumentException.php │ │ │ ├── ralouphie/ │ │ │ │ └── getallheaders/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ └── getallheaders.php │ │ │ ├── robthree/ │ │ │ │ └── twofactorauth/ │ │ │ │ ├── .github/ │ │ │ │ │ ├── FUNDING.yml │ │ │ │ │ └── workflows/ │ │ │ │ │ └── test.yml │ │ │ │ ├── .gitignore │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── TwoFactorAuth.phpproj │ │ │ │ ├── TwoFactorAuth.sln │ │ │ │ ├── composer.json │ │ │ │ ├── demo/ │ │ │ │ │ └── demo.php │ │ │ │ ├── docs/ │ │ │ │ │ ├── _config.yml │ │ │ │ │ ├── _layouts/ │ │ │ │ │ │ └── post.html │ │ │ │ │ ├── assets/ │ │ │ │ │ │ └── css/ │ │ │ │ │ │ └── style.scss │ │ │ │ │ ├── getting-started.md │ │ │ │ │ ├── improved-code-verification.md │ │ │ │ │ ├── index.md │ │ │ │ │ ├── optional-configuration.md │ │ │ │ │ ├── qr-codes/ │ │ │ │ │ │ ├── bacon.md │ │ │ │ │ │ ├── endroid.md │ │ │ │ │ │ ├── image-charts.md │ │ │ │ │ │ ├── qr-server.md │ │ │ │ │ │ └── qrickit.md │ │ │ │ │ └── qr-codes.md │ │ │ │ ├── lib/ │ │ │ │ │ ├── Providers/ │ │ │ │ │ │ ├── Qr/ │ │ │ │ │ │ │ ├── BaconQrCodeProvider.php │ │ │ │ │ │ │ ├── BaseHTTPQRCodeProvider.php │ │ │ │ │ │ │ ├── EndroidQrCodeProvider.php │ │ │ │ │ │ │ ├── EndroidQrCodeWithLogoProvider.php │ │ │ │ │ │ │ ├── GoogleChartsQrCodeProvider.php │ │ │ │ │ │ │ ├── IQRCodeProvider.php │ │ │ │ │ │ │ ├── ImageChartsQRCodeProvider.php │ │ │ │ │ │ │ ├── QRException.php │ │ │ │ │ │ │ ├── QRServerProvider.php │ │ │ │ │ │ │ └── QRicketProvider.php │ │ │ │ │ │ ├── Rng/ │ │ │ │ │ │ │ ├── CSRNGProvider.php │ │ │ │ │ │ │ ├── HashRNGProvider.php │ │ │ │ │ │ │ ├── IRNGProvider.php │ │ │ │ │ │ │ ├── MCryptRNGProvider.php │ │ │ │ │ │ │ ├── OpenSSLRNGProvider.php │ │ │ │ │ │ │ └── RNGException.php │ │ │ │ │ │ └── Time/ │ │ │ │ │ │ ├── HttpTimeProvider.php │ │ │ │ │ │ ├── ITimeProvider.php │ │ │ │ │ │ ├── LocalMachineTimeProvider.php │ │ │ │ │ │ ├── NTPTimeProvider.php │ │ │ │ │ │ └── TimeException.php │ │ │ │ │ ├── TwoFactorAuth.php │ │ │ │ │ └── TwoFactorAuthException.php │ │ │ │ ├── phpunit.xml │ │ │ │ └── tests/ │ │ │ │ ├── MightNotMakeAssertions.php │ │ │ │ ├── Providers/ │ │ │ │ │ ├── Qr/ │ │ │ │ │ │ ├── IQRCodeProviderTest.php │ │ │ │ │ │ └── TestQrProvider.php │ │ │ │ │ ├── Rng/ │ │ │ │ │ │ ├── CSRNGProviderTest.php │ │ │ │ │ │ ├── HashRNGProviderTest.php │ │ │ │ │ │ ├── IRNGProviderTest.php │ │ │ │ │ │ ├── MCryptRNGProviderTest.php │ │ │ │ │ │ ├── NeedsRngLengths.php │ │ │ │ │ │ ├── OpenSSLRNGProviderTest.php │ │ │ │ │ │ └── TestRNGProvider.php │ │ │ │ │ └── Time/ │ │ │ │ │ ├── ITimeProviderTest.php │ │ │ │ │ └── TestTimeProvider.php │ │ │ │ └── TwoFactorAuthTest.php │ │ │ ├── stevenmaguire/ │ │ │ │ └── oauth2-keycloak/ │ │ │ │ ├── .gitignore │ │ │ │ ├── .scrutinizer.yml │ │ │ │ ├── .travis.yml │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── CONTRIBUTING.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ ├── examples/ │ │ │ │ │ └── index.php │ │ │ │ ├── phpunit.xml.dist │ │ │ │ ├── src/ │ │ │ │ │ └── Provider/ │ │ │ │ │ ├── Exception/ │ │ │ │ │ │ └── EncryptionConfigurationException.php │ │ │ │ │ ├── Keycloak.php │ │ │ │ │ └── KeycloakResourceOwner.php │ │ │ │ └── test/ │ │ │ │ └── src/ │ │ │ │ └── Provider/ │ │ │ │ └── KeycloakTest.php │ │ │ ├── symfony/ │ │ │ │ ├── deprecation-contracts/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── function.php │ │ │ │ ├── polyfill-ctype/ │ │ │ │ │ ├── Ctype.php │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── bootstrap.php │ │ │ │ │ ├── bootstrap80.php │ │ │ │ │ └── composer.json │ │ │ │ ├── polyfill-mbstring/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── Mbstring.php │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Resources/ │ │ │ │ │ │ └── unidata/ │ │ │ │ │ │ ├── caseFolding.php │ │ │ │ │ │ ├── lowerCase.php │ │ │ │ │ │ ├── titleCaseRegexp.php │ │ │ │ │ │ └── upperCase.php │ │ │ │ │ ├── bootstrap.php │ │ │ │ │ ├── bootstrap80.php │ │ │ │ │ └── composer.json │ │ │ │ ├── polyfill-php80/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── Php80.php │ │ │ │ │ ├── PhpToken.php │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Resources/ │ │ │ │ │ │ └── stubs/ │ │ │ │ │ │ ├── Attribute.php │ │ │ │ │ │ ├── PhpToken.php │ │ │ │ │ │ ├── Stringable.php │ │ │ │ │ │ ├── UnhandledMatchError.php │ │ │ │ │ │ └── ValueError.php │ │ │ │ │ ├── bootstrap.php │ │ │ │ │ └── composer.json │ │ │ │ ├── polyfill-php81/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── Php81.php │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Resources/ │ │ │ │ │ │ └── stubs/ │ │ │ │ │ │ ├── CURLStringFile.php │ │ │ │ │ │ └── ReturnTypeWillChange.php │ │ │ │ │ ├── bootstrap.php │ │ │ │ │ └── composer.json │ │ │ │ ├── translation/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── Catalogue/ │ │ │ │ │ │ ├── AbstractOperation.php │ │ │ │ │ │ ├── MergeOperation.php │ │ │ │ │ │ ├── OperationInterface.php │ │ │ │ │ │ └── TargetOperation.php │ │ │ │ │ ├── CatalogueMetadataAwareInterface.php │ │ │ │ │ ├── Command/ │ │ │ │ │ │ ├── TranslationPullCommand.php │ │ │ │ │ │ ├── TranslationPushCommand.php │ │ │ │ │ │ ├── TranslationTrait.php │ │ │ │ │ │ └── XliffLintCommand.php │ │ │ │ │ ├── DataCollector/ │ │ │ │ │ │ └── TranslationDataCollector.php │ │ │ │ │ ├── DataCollectorTranslator.php │ │ │ │ │ ├── DependencyInjection/ │ │ │ │ │ │ ├── DataCollectorTranslatorPass.php │ │ │ │ │ │ ├── LoggingTranslatorPass.php │ │ │ │ │ │ ├── TranslationDumperPass.php │ │ │ │ │ │ ├── TranslationExtractorPass.php │ │ │ │ │ │ ├── TranslatorPass.php │ │ │ │ │ │ └── TranslatorPathsPass.php │ │ │ │ │ ├── Dumper/ │ │ │ │ │ │ ├── CsvFileDumper.php │ │ │ │ │ │ ├── DumperInterface.php │ │ │ │ │ │ ├── FileDumper.php │ │ │ │ │ │ ├── IcuResFileDumper.php │ │ │ │ │ │ ├── IniFileDumper.php │ │ │ │ │ │ ├── JsonFileDumper.php │ │ │ │ │ │ ├── MoFileDumper.php │ │ │ │ │ │ ├── PhpFileDumper.php │ │ │ │ │ │ ├── PoFileDumper.php │ │ │ │ │ │ ├── QtFileDumper.php │ │ │ │ │ │ ├── XliffFileDumper.php │ │ │ │ │ │ └── YamlFileDumper.php │ │ │ │ │ ├── Exception/ │ │ │ │ │ │ ├── ExceptionInterface.php │ │ │ │ │ │ ├── IncompleteDsnException.php │ │ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ │ │ ├── InvalidResourceException.php │ │ │ │ │ │ ├── LogicException.php │ │ │ │ │ │ ├── MissingRequiredOptionException.php │ │ │ │ │ │ ├── NotFoundResourceException.php │ │ │ │ │ │ ├── ProviderException.php │ │ │ │ │ │ ├── ProviderExceptionInterface.php │ │ │ │ │ │ ├── RuntimeException.php │ │ │ │ │ │ └── UnsupportedSchemeException.php │ │ │ │ │ ├── Extractor/ │ │ │ │ │ │ ├── AbstractFileExtractor.php │ │ │ │ │ │ ├── ChainExtractor.php │ │ │ │ │ │ ├── ExtractorInterface.php │ │ │ │ │ │ ├── PhpAstExtractor.php │ │ │ │ │ │ ├── PhpExtractor.php │ │ │ │ │ │ ├── PhpStringTokenParser.php │ │ │ │ │ │ └── Visitor/ │ │ │ │ │ │ ├── AbstractVisitor.php │ │ │ │ │ │ ├── ConstraintVisitor.php │ │ │ │ │ │ ├── TransMethodVisitor.php │ │ │ │ │ │ └── TranslatableMessageVisitor.php │ │ │ │ │ ├── Formatter/ │ │ │ │ │ │ ├── IntlFormatter.php │ │ │ │ │ │ ├── IntlFormatterInterface.php │ │ │ │ │ │ ├── MessageFormatter.php │ │ │ │ │ │ └── MessageFormatterInterface.php │ │ │ │ │ ├── IdentityTranslator.php │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── Loader/ │ │ │ │ │ │ ├── ArrayLoader.php │ │ │ │ │ │ ├── CsvFileLoader.php │ │ │ │ │ │ ├── FileLoader.php │ │ │ │ │ │ ├── IcuDatFileLoader.php │ │ │ │ │ │ ├── IcuResFileLoader.php │ │ │ │ │ │ ├── IniFileLoader.php │ │ │ │ │ │ ├── JsonFileLoader.php │ │ │ │ │ │ ├── LoaderInterface.php │ │ │ │ │ │ ├── MoFileLoader.php │ │ │ │ │ │ ├── PhpFileLoader.php │ │ │ │ │ │ ├── PoFileLoader.php │ │ │ │ │ │ ├── QtFileLoader.php │ │ │ │ │ │ ├── XliffFileLoader.php │ │ │ │ │ │ └── YamlFileLoader.php │ │ │ │ │ ├── LocaleSwitcher.php │ │ │ │ │ ├── LoggingTranslator.php │ │ │ │ │ ├── MessageCatalogue.php │ │ │ │ │ ├── MessageCatalogueInterface.php │ │ │ │ │ ├── MetadataAwareInterface.php │ │ │ │ │ ├── Provider/ │ │ │ │ │ │ ├── AbstractProviderFactory.php │ │ │ │ │ │ ├── Dsn.php │ │ │ │ │ │ ├── FilteringProvider.php │ │ │ │ │ │ ├── NullProvider.php │ │ │ │ │ │ ├── NullProviderFactory.php │ │ │ │ │ │ ├── ProviderFactoryInterface.php │ │ │ │ │ │ ├── ProviderInterface.php │ │ │ │ │ │ ├── TranslationProviderCollection.php │ │ │ │ │ │ └── TranslationProviderCollectionFactory.php │ │ │ │ │ ├── PseudoLocalizationTranslator.php │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Reader/ │ │ │ │ │ │ ├── TranslationReader.php │ │ │ │ │ │ └── TranslationReaderInterface.php │ │ │ │ │ ├── Resources/ │ │ │ │ │ │ ├── bin/ │ │ │ │ │ │ │ └── translation-status.php │ │ │ │ │ │ ├── data/ │ │ │ │ │ │ │ └── parents.json │ │ │ │ │ │ ├── functions.php │ │ │ │ │ │ └── schemas/ │ │ │ │ │ │ ├── xliff-core-1.2-transitional.xsd │ │ │ │ │ │ ├── xliff-core-2.0.xsd │ │ │ │ │ │ └── xml.xsd │ │ │ │ │ ├── Test/ │ │ │ │ │ │ ├── ProviderFactoryTestCase.php │ │ │ │ │ │ └── ProviderTestCase.php │ │ │ │ │ ├── TranslatableMessage.php │ │ │ │ │ ├── Translator.php │ │ │ │ │ ├── TranslatorBag.php │ │ │ │ │ ├── TranslatorBagInterface.php │ │ │ │ │ ├── Util/ │ │ │ │ │ │ ├── ArrayConverter.php │ │ │ │ │ │ └── XliffUtils.php │ │ │ │ │ ├── Writer/ │ │ │ │ │ │ ├── TranslationWriter.php │ │ │ │ │ │ └── TranslationWriterInterface.php │ │ │ │ │ └── composer.json │ │ │ │ └── translation-contracts/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── LocaleAwareInterface.php │ │ │ │ ├── README.md │ │ │ │ ├── Test/ │ │ │ │ │ └── TranslatorTest.php │ │ │ │ ├── TranslatableInterface.php │ │ │ │ ├── TranslatorInterface.php │ │ │ │ ├── TranslatorTrait.php │ │ │ │ └── composer.json │ │ │ └── twig/ │ │ │ └── twig/ │ │ │ ├── CHANGELOG │ │ │ ├── LICENSE │ │ │ ├── README.rst │ │ │ ├── composer.json │ │ │ └── src/ │ │ │ ├── AbstractTwigCallable.php │ │ │ ├── Attribute/ │ │ │ │ ├── FirstClassTwigCallableReady.php │ │ │ │ └── YieldReady.php │ │ │ ├── Cache/ │ │ │ │ ├── CacheInterface.php │ │ │ │ ├── ChainCache.php │ │ │ │ ├── FilesystemCache.php │ │ │ │ ├── NullCache.php │ │ │ │ └── ReadOnlyFilesystemCache.php │ │ │ ├── Compiler.php │ │ │ ├── Environment.php │ │ │ ├── Error/ │ │ │ │ ├── Error.php │ │ │ │ ├── LoaderError.php │ │ │ │ ├── RuntimeError.php │ │ │ │ └── SyntaxError.php │ │ │ ├── ExpressionParser.php │ │ │ ├── Extension/ │ │ │ │ ├── AbstractExtension.php │ │ │ │ ├── CoreExtension.php │ │ │ │ ├── DebugExtension.php │ │ │ │ ├── EscaperExtension.php │ │ │ │ ├── ExtensionInterface.php │ │ │ │ ├── GlobalsInterface.php │ │ │ │ ├── OptimizerExtension.php │ │ │ │ ├── ProfilerExtension.php │ │ │ │ ├── RuntimeExtensionInterface.php │ │ │ │ ├── SandboxExtension.php │ │ │ │ ├── StagingExtension.php │ │ │ │ ├── StringLoaderExtension.php │ │ │ │ └── YieldNotReadyExtension.php │ │ │ ├── ExtensionSet.php │ │ │ ├── FileExtensionEscapingStrategy.php │ │ │ ├── Lexer.php │ │ │ ├── Loader/ │ │ │ │ ├── ArrayLoader.php │ │ │ │ ├── ChainLoader.php │ │ │ │ ├── FilesystemLoader.php │ │ │ │ └── LoaderInterface.php │ │ │ ├── Markup.php │ │ │ ├── Node/ │ │ │ │ ├── AutoEscapeNode.php │ │ │ │ ├── BlockNode.php │ │ │ │ ├── BlockReferenceNode.php │ │ │ │ ├── BodyNode.php │ │ │ │ ├── CaptureNode.php │ │ │ │ ├── CheckSecurityCallNode.php │ │ │ │ ├── CheckSecurityNode.php │ │ │ │ ├── CheckToStringNode.php │ │ │ │ ├── DeprecatedNode.php │ │ │ │ ├── DoNode.php │ │ │ │ ├── EmbedNode.php │ │ │ │ ├── Expression/ │ │ │ │ │ ├── AbstractExpression.php │ │ │ │ │ ├── ArrayExpression.php │ │ │ │ │ ├── ArrowFunctionExpression.php │ │ │ │ │ ├── AssignNameExpression.php │ │ │ │ │ ├── Binary/ │ │ │ │ │ │ ├── AbstractBinary.php │ │ │ │ │ │ ├── AddBinary.php │ │ │ │ │ │ ├── AndBinary.php │ │ │ │ │ │ ├── BitwiseAndBinary.php │ │ │ │ │ │ ├── BitwiseOrBinary.php │ │ │ │ │ │ ├── BitwiseXorBinary.php │ │ │ │ │ │ ├── ConcatBinary.php │ │ │ │ │ │ ├── DivBinary.php │ │ │ │ │ │ ├── EndsWithBinary.php │ │ │ │ │ │ ├── EqualBinary.php │ │ │ │ │ │ ├── FloorDivBinary.php │ │ │ │ │ │ ├── GreaterBinary.php │ │ │ │ │ │ ├── GreaterEqualBinary.php │ │ │ │ │ │ ├── HasEveryBinary.php │ │ │ │ │ │ ├── HasSomeBinary.php │ │ │ │ │ │ ├── InBinary.php │ │ │ │ │ │ ├── LessBinary.php │ │ │ │ │ │ ├── LessEqualBinary.php │ │ │ │ │ │ ├── MatchesBinary.php │ │ │ │ │ │ ├── ModBinary.php │ │ │ │ │ │ ├── MulBinary.php │ │ │ │ │ │ ├── NotEqualBinary.php │ │ │ │ │ │ ├── NotInBinary.php │ │ │ │ │ │ ├── OrBinary.php │ │ │ │ │ │ ├── PowerBinary.php │ │ │ │ │ │ ├── RangeBinary.php │ │ │ │ │ │ ├── SpaceshipBinary.php │ │ │ │ │ │ ├── StartsWithBinary.php │ │ │ │ │ │ └── SubBinary.php │ │ │ │ │ ├── BlockReferenceExpression.php │ │ │ │ │ ├── CallExpression.php │ │ │ │ │ ├── ConditionalExpression.php │ │ │ │ │ ├── ConstantExpression.php │ │ │ │ │ ├── Filter/ │ │ │ │ │ │ ├── DefaultFilter.php │ │ │ │ │ │ └── RawFilter.php │ │ │ │ │ ├── FilterExpression.php │ │ │ │ │ ├── FunctionExpression.php │ │ │ │ │ ├── FunctionNode/ │ │ │ │ │ │ └── EnumCasesFunction.php │ │ │ │ │ ├── GetAttrExpression.php │ │ │ │ │ ├── InlinePrint.php │ │ │ │ │ ├── MethodCallExpression.php │ │ │ │ │ ├── NameExpression.php │ │ │ │ │ ├── NullCoalesceExpression.php │ │ │ │ │ ├── ParentExpression.php │ │ │ │ │ ├── TempNameExpression.php │ │ │ │ │ ├── Test/ │ │ │ │ │ │ ├── ConstantTest.php │ │ │ │ │ │ ├── DefinedTest.php │ │ │ │ │ │ ├── DivisiblebyTest.php │ │ │ │ │ │ ├── EvenTest.php │ │ │ │ │ │ ├── NullTest.php │ │ │ │ │ │ ├── OddTest.php │ │ │ │ │ │ └── SameasTest.php │ │ │ │ │ ├── TestExpression.php │ │ │ │ │ ├── Unary/ │ │ │ │ │ │ ├── AbstractUnary.php │ │ │ │ │ │ ├── NegUnary.php │ │ │ │ │ │ ├── NotUnary.php │ │ │ │ │ │ └── PosUnary.php │ │ │ │ │ └── VariadicExpression.php │ │ │ │ ├── FlushNode.php │ │ │ │ ├── ForLoopNode.php │ │ │ │ ├── ForNode.php │ │ │ │ ├── IfNode.php │ │ │ │ ├── ImportNode.php │ │ │ │ ├── IncludeNode.php │ │ │ │ ├── MacroNode.php │ │ │ │ ├── ModuleNode.php │ │ │ │ ├── NameDeprecation.php │ │ │ │ ├── Node.php │ │ │ │ ├── NodeCaptureInterface.php │ │ │ │ ├── NodeOutputInterface.php │ │ │ │ ├── PrintNode.php │ │ │ │ ├── SandboxNode.php │ │ │ │ ├── SetNode.php │ │ │ │ ├── TextNode.php │ │ │ │ ├── TypesNode.php │ │ │ │ └── WithNode.php │ │ │ ├── NodeTraverser.php │ │ │ ├── NodeVisitor/ │ │ │ │ ├── AbstractNodeVisitor.php │ │ │ │ ├── EscaperNodeVisitor.php │ │ │ │ ├── MacroAutoImportNodeVisitor.php │ │ │ │ ├── NodeVisitorInterface.php │ │ │ │ ├── OptimizerNodeVisitor.php │ │ │ │ ├── SafeAnalysisNodeVisitor.php │ │ │ │ ├── SandboxNodeVisitor.php │ │ │ │ └── YieldNotReadyNodeVisitor.php │ │ │ ├── Parser.php │ │ │ ├── Profiler/ │ │ │ │ ├── Dumper/ │ │ │ │ │ ├── BaseDumper.php │ │ │ │ │ ├── BlackfireDumper.php │ │ │ │ │ ├── HtmlDumper.php │ │ │ │ │ └── TextDumper.php │ │ │ │ ├── Node/ │ │ │ │ │ ├── EnterProfileNode.php │ │ │ │ │ └── LeaveProfileNode.php │ │ │ │ ├── NodeVisitor/ │ │ │ │ │ └── ProfilerNodeVisitor.php │ │ │ │ └── Profile.php │ │ │ ├── Resources/ │ │ │ │ ├── core.php │ │ │ │ ├── debug.php │ │ │ │ ├── escaper.php │ │ │ │ └── string_loader.php │ │ │ ├── Runtime/ │ │ │ │ └── EscaperRuntime.php │ │ │ ├── RuntimeLoader/ │ │ │ │ ├── ContainerRuntimeLoader.php │ │ │ │ ├── FactoryRuntimeLoader.php │ │ │ │ └── RuntimeLoaderInterface.php │ │ │ ├── Sandbox/ │ │ │ │ ├── SecurityError.php │ │ │ │ ├── SecurityNotAllowedFilterError.php │ │ │ │ ├── SecurityNotAllowedFunctionError.php │ │ │ │ ├── SecurityNotAllowedMethodError.php │ │ │ │ ├── SecurityNotAllowedPropertyError.php │ │ │ │ ├── SecurityNotAllowedTagError.php │ │ │ │ ├── SecurityPolicy.php │ │ │ │ ├── SecurityPolicyInterface.php │ │ │ │ └── SourcePolicyInterface.php │ │ │ ├── Source.php │ │ │ ├── Template.php │ │ │ ├── TemplateWrapper.php │ │ │ ├── Test/ │ │ │ │ ├── IntegrationTestCase.php │ │ │ │ └── NodeTestCase.php │ │ │ ├── Token.php │ │ │ ├── TokenParser/ │ │ │ │ ├── AbstractTokenParser.php │ │ │ │ ├── ApplyTokenParser.php │ │ │ │ ├── AutoEscapeTokenParser.php │ │ │ │ ├── BlockTokenParser.php │ │ │ │ ├── DeprecatedTokenParser.php │ │ │ │ ├── DoTokenParser.php │ │ │ │ ├── EmbedTokenParser.php │ │ │ │ ├── ExtendsTokenParser.php │ │ │ │ ├── FlushTokenParser.php │ │ │ │ ├── ForTokenParser.php │ │ │ │ ├── FromTokenParser.php │ │ │ │ ├── IfTokenParser.php │ │ │ │ ├── ImportTokenParser.php │ │ │ │ ├── IncludeTokenParser.php │ │ │ │ ├── MacroTokenParser.php │ │ │ │ ├── SandboxTokenParser.php │ │ │ │ ├── SetTokenParser.php │ │ │ │ ├── TokenParserInterface.php │ │ │ │ ├── TypesTokenParser.php │ │ │ │ ├── UseTokenParser.php │ │ │ │ └── WithTokenParser.php │ │ │ ├── TokenStream.php │ │ │ ├── TwigCallableInterface.php │ │ │ ├── TwigFilter.php │ │ │ ├── TwigFunction.php │ │ │ ├── TwigTest.php │ │ │ └── Util/ │ │ │ ├── CallableArgumentsExtractor.php │ │ │ ├── DeprecationCollector.php │ │ │ ├── ReflectionCallable.php │ │ │ └── TemplateDirIterator.php │ │ ├── prerequisites.inc.php │ │ ├── presets/ │ │ │ ├── rspamd/ │ │ │ │ ├── preset_1.yml │ │ │ │ ├── preset_3.yml │ │ │ │ └── preset_4.yml │ │ │ └── sieve/ │ │ │ ├── sieve_1.yml │ │ │ ├── sieve_2.yml │ │ │ ├── sieve_3.yml │ │ │ ├── sieve_4.yml │ │ │ ├── sieve_5.yml │ │ │ ├── sieve_6.yml │ │ │ ├── sieve_7.yml │ │ │ └── sieve_8.yml │ │ ├── sessions.inc.php │ │ ├── spf.inc.php │ │ ├── triggers.admin.inc.php │ │ ├── triggers.domainadmin.inc.php │ │ ├── triggers.global.inc.php │ │ ├── triggers.user.inc.php │ │ ├── twig.inc.php │ │ └── vars.inc.php │ ├── index.php │ ├── js/ │ │ ├── build/ │ │ │ ├── 003-bootstrap-select.js │ │ │ ├── 004-datatables.js │ │ │ ├── 007-chart.js │ │ │ ├── 008-chartjs-plugin-datalabels.js │ │ │ ├── 011-api.js │ │ │ └── 013-mailcow.js │ │ ├── presets/ │ │ │ ├── rspamd.js │ │ │ └── sieveMailbox.js │ │ └── site/ │ │ ├── admin.js │ │ ├── dashboard.js │ │ ├── edit.js │ │ ├── index.js │ │ ├── mailbox.js │ │ ├── pwgen.js │ │ ├── qhandler.js │ │ ├── quarantine.js │ │ ├── queue.js │ │ └── user.js │ ├── json_api.php │ ├── lang/ │ │ ├── lang.bg-bg.json │ │ ├── lang.ca-es.json │ │ ├── lang.cs-cz.json │ │ ├── lang.da-dk.json │ │ ├── lang.de-de.json │ │ ├── lang.en-gb.json │ │ ├── lang.es-es.json │ │ ├── lang.fi-fi.json │ │ ├── lang.fr-fr.json │ │ ├── lang.gr-gr.json │ │ ├── lang.hu-hu.json │ │ ├── lang.it-it.json │ │ ├── lang.ja-jp.json │ │ ├── lang.ko-kr.json │ │ ├── lang.lt-lt.json │ │ ├── lang.lv-lv.json │ │ ├── lang.nb-no.json │ │ ├── lang.nl-nl.json │ │ ├── lang.pl-pl.json │ │ ├── lang.pt-br.json │ │ ├── lang.pt-pt.json │ │ ├── lang.ro-ro.json │ │ ├── lang.ru-ru.json │ │ ├── lang.si-si.json │ │ ├── lang.sk-sk.json │ │ ├── lang.sv-se.json │ │ ├── lang.tr-tr.json │ │ ├── lang.uk-ua.json │ │ ├── lang.vi-vn.json │ │ ├── lang.zh-cn.json │ │ └── lang.zh-tw.json │ ├── mobileconfig.php │ ├── mta-sts.php │ ├── oauth/ │ │ ├── authorize.php │ │ ├── profile.php │ │ └── token.php │ ├── qhandler.php │ ├── quarantine.php │ ├── reset-password.php │ ├── resource.php │ ├── robots.txt │ ├── sogo-auth.php │ ├── templates/ │ │ ├── admin/ │ │ │ ├── customize/ │ │ │ │ └── logo.twig │ │ │ ├── tab-config-admins.twig │ │ │ ├── tab-config-customize.twig │ │ │ ├── tab-config-dkim.twig │ │ │ ├── tab-config-f2b.twig │ │ │ ├── tab-config-fwdhosts.twig │ │ │ ├── tab-config-identity-provider.twig │ │ │ ├── tab-config-oauth2.twig │ │ │ ├── tab-config-password-settings.twig │ │ │ ├── tab-config-quarantine.twig │ │ │ ├── tab-config-quota.twig │ │ │ ├── tab-config-rsettings.twig │ │ │ ├── tab-config-rspamd.twig │ │ │ ├── tab-globalfilter-regex.twig │ │ │ ├── tab-ldap.twig │ │ │ ├── tab-routing.twig │ │ │ └── tab-sys-mails.twig │ │ ├── admin.twig │ │ ├── admin_index.twig │ │ ├── base.twig │ │ ├── cache/ │ │ │ └── .gitkeep │ │ ├── dashboard.twig │ │ ├── domainadmin.twig │ │ ├── domainadmin_index.twig │ │ ├── edit/ │ │ │ ├── admin.twig │ │ │ ├── alias.twig │ │ │ ├── aliasdomain.twig │ │ │ ├── app-passwd.twig │ │ │ ├── bcc.twig │ │ │ ├── domain-templates.twig │ │ │ ├── domain.twig │ │ │ ├── domainadmin.twig │ │ │ ├── filter.twig │ │ │ ├── mailbox-templates.twig │ │ │ ├── mailbox.twig │ │ │ ├── oauth2client.twig │ │ │ ├── recipient_map.twig │ │ │ ├── relayhost.twig │ │ │ ├── resource.twig │ │ │ ├── syncjob.twig │ │ │ ├── tls_policy_map.twig │ │ │ └── transport.twig │ │ ├── edit.twig │ │ ├── fido2.twig │ │ ├── mailbox/ │ │ │ ├── rl-frame.twig │ │ │ ├── tab-bcc.twig │ │ │ ├── tab-domain-aliases.twig │ │ │ ├── tab-domains.twig │ │ │ ├── tab-filters.twig │ │ │ ├── tab-mailboxes.twig │ │ │ ├── tab-mbox-aliases.twig │ │ │ ├── tab-resources.twig │ │ │ ├── tab-syncjobs.twig │ │ │ ├── tab-templates-domains.twig │ │ │ ├── tab-templates-mbox.twig │ │ │ └── tab-tls-policy.twig │ │ ├── mailbox.twig │ │ ├── modals/ │ │ │ ├── admin.twig │ │ │ ├── footer.twig │ │ │ ├── mailbox.twig │ │ │ ├── quarantine.twig │ │ │ ├── queue.twig │ │ │ └── user.twig │ │ ├── oauth/ │ │ │ └── authorize.twig │ │ ├── qhandler.twig │ │ ├── quarantine.twig │ │ ├── queue.twig │ │ ├── reset-password.twig │ │ ├── tfa_keys.twig │ │ ├── user/ │ │ │ ├── AppPasswds.twig │ │ │ ├── Pushover.twig │ │ │ ├── SpamAliases.twig │ │ │ ├── Spamfilter.twig │ │ │ ├── Syncjobs.twig │ │ │ ├── tab-user-auth.twig │ │ │ ├── tab-user-details.twig │ │ │ └── tab-user-settings.twig │ │ ├── user.twig │ │ ├── user_domainadmin_common.twig │ │ └── user_index.twig │ └── user.php ├── docker-compose.yml ├── generate_config.sh ├── helper-scripts/ │ ├── _cold-standby.sh │ ├── add-new-lang-keys.php │ ├── backup_and_restore.sh │ ├── check_translations.rb │ ├── dev_tests/ │ │ ├── test_backup_and_restore.sh │ │ └── view_autodiscover.sh │ ├── expiry-dates.sh │ ├── generate_caa_record.py │ ├── mailcow-reset-admin.sh │ ├── reset-learns.sh │ ├── update_compose.sh │ └── update_postscreen_whitelist.sh └── update.sh
Showing preview only (2,730K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (16465 symbols across 1100 files)
FILE: data/Dockerfiles/dockerapi/main.py
function lifespan (line 20) | async def lifespan(app: FastAPI):
function get_host_update_stats (line 68) | async def get_host_update_stats():
function get_container (line 84) | async def get_container(container_id : str):
function get_containers (line 113) | async def get_containers(all: bool = False):
function post_containers (line 130) | async def post_containers(container_id : str, post_action : str, request...
function post_container_update_stats (line 179) | async def post_container_update_stats(container_id : str):
function handle_pubsub_messages (line 197) | async def handle_pubsub_messages(channel: aioredis.client.PubSub):
FILE: data/Dockerfiles/dockerapi/modules/DockerApi.py
class DockerApi (line 12) | class DockerApi:
method __init__ (line 13) | def __init__(self, redis_client, sync_docker_client, async_docker_clie...
method container_post__stop (line 23) | def container_post__stop(self, request_json, **kwargs):
method container_post__start (line 35) | def container_post__start(self, request_json, **kwargs):
method container_post__restart (line 47) | def container_post__restart(self, request_json, **kwargs):
method container_post__top (line 59) | def container_post__top(self, request_json, **kwargs):
method container_post__stats (line 69) | def container_post__stats(self, request_json, **kwargs):
method container_post__exec__mailq__delete (line 80) | def container_post__exec__mailq__delete(self, request_json, **kwargs):
method container_post__exec__mailq__hold (line 96) | def container_post__exec__mailq__hold(self, request_json, **kwargs):
method container_post__exec__mailq__cat (line 112) | def container_post__exec__mailq__cat(self, request_json, **kwargs):
method container_post__exec__mailq__unhold (line 130) | def container_post__exec__mailq__unhold(self, request_json, **kwargs):
method container_post__exec__mailq__deliver (line 146) | def container_post__exec__mailq__deliver(self, request_json, **kwargs):
method container_post__exec__mailq__list (line 164) | def container_post__exec__mailq__list(self, request_json, **kwargs):
method container_post__exec__mailq__flush (line 174) | def container_post__exec__mailq__flush(self, request_json, **kwargs):
method container_post__exec__mailq__super_delete (line 184) | def container_post__exec__mailq__super_delete(self, request_json, **kw...
method container_post__exec__system__fts_rescan (line 194) | def container_post__exec__system__fts_rescan(self, request_json, **kwa...
method container_post__exec__system__df (line 219) | def container_post__exec__system__df(self, request_json, **kwargs):
method container_post__exec__system__mysql_upgrade (line 233) | def container_post__exec__system__mysql_upgrade(self, request_json, **...
method container_post__exec__system__mysql_tzinfo_to_sql (line 257) | def container_post__exec__system__mysql_tzinfo_to_sql(self, request_js...
method container_post__exec__reload__dovecot (line 272) | def container_post__exec__reload__dovecot(self, request_json, **kwargs):
method container_post__exec__reload__postfix (line 282) | def container_post__exec__reload__postfix(self, request_json, **kwargs):
method container_post__exec__reload__nginx (line 292) | def container_post__exec__reload__nginx(self, request_json, **kwargs):
method container_post__exec__sieve__list (line 302) | def container_post__exec__sieve__list(self, request_json, **kwargs):
method container_post__exec__sieve__print (line 313) | def container_post__exec__sieve__print(self, request_json, **kwargs):
method container_post__exec__maildir__cleanup (line 325) | def container_post__exec__maildir__cleanup(self, request_json, **kwargs):
method container_post__exec__maildir__move (line 346) | def container_post__exec__maildir__move(self, request_json, **kwargs):
method container_post__exec__rspamd__worker_password (line 370) | def container_post__exec__rspamd__worker_password(self, request_json, ...
method container_post__exec__sogo__rename_user (line 402) | def container_post__exec__sogo__rename_user(self, request_json, **kwar...
method container_post__exec__doveadm__get_acl (line 416) | def container_post__exec__doveadm__get_acl(self, request_json, **kwargs):
method container_post__exec__doveadm__delete_acl (line 467) | def container_post__exec__doveadm__delete_acl(self, request_json, **kw...
method container_post__exec__doveadm__set_acl (line 482) | def container_post__exec__doveadm__set_acl(self, request_json, **kwargs):
method get_host_stats (line 518) | async def get_host_stats(self, wait=5):
method get_container_stats (line 546) | async def get_container_stats(self, container_id, wait=5, stop=False):
method exec_cmd_container (line 580) | def exec_cmd_container(self, container, cmd, user, timeout=2, shell_cm...
method exec_run_handler (line 617) | def exec_run_handler(self, type, output):
FILE: data/Dockerfiles/dovecot/quarantine_notify.py
function query_mysql (line 50) | def query_mysql(query, headers = True, update = False):
function notify_rcpt (line 77) | def notify_rcpt(rcpt, msg_count, quarantine_acl, category):
FILE: data/Dockerfiles/netfilter/main.py
function logdebug (line 25) | def logdebug(msg):
function refreshF2boptions (line 41) | def refreshF2boptions():
function verifyF2boptions (line 67) | def verifyF2boptions(f2boptions):
function verifyF2boption (line 78) | def verifyF2boption(f2boptions, f2boption, f2bdefault):
function refreshF2bregex (line 81) | def refreshF2bregex():
function get_ip (line 106) | def get_ip(address):
function ban (line 115) | def ban(address):
function unban (line 184) | def unban(net):
function permBan (line 208) | def permBan(net, unban=False):
function clear (line 235) | def clear():
function watch (line 252) | def watch():
function snat4 (line 283) | def snat4(snat_target):
function snat6 (line 292) | def snat6(snat_target):
function autopurge (line 301) | def autopurge():
function mailcowChainOrder (line 333) | def mailcowChainOrder():
function calcNetBanTime (line 344) | def calcNetBanTime(ban_counter):
function isIpNetwork (line 354) | def isIpNetwork(address):
function genNetworkList (line 361) | def genNetworkList(list):
function whitelistUpdate (line 388) | def whitelistUpdate():
function blacklistUpdate (line 404) | def blacklistUpdate():
function sigterm_quit (line 426) | def sigterm_quit(signum, frame):
function before_quit (line 432) | def before_quit():
FILE: data/Dockerfiles/netfilter/modules/IPTables.py
class IPTables (line 5) | class IPTables:
method __init__ (line 6) | def __init__(self, chain_name, logger):
method initChainIPv4 (line 10) | def initChainIPv4(self):
method initChainIPv6 (line 23) | def initChainIPv6(self):
method checkIPv4ChainOrder (line 36) | def checkIPv4ChainOrder(self):
method checkIPv6ChainOrder (line 41) | def checkIPv6ChainOrder(self):
method checkChainOrder (line 46) | def checkChainOrder(self, filter_table):
method clearIPv4Table (line 68) | def clearIPv4Table(self):
method clearIPv6Table (line 71) | def clearIPv6Table(self):
method clearTable (line 74) | def clearTable(self, filter_table):
method banIPv4 (line 93) | def banIPv4(self, source):
method banIPv6 (line 104) | def banIPv6(self, source):
method unbanIPv4 (line 115) | def unbanIPv4(self, source):
method unbanIPv6 (line 126) | def unbanIPv6(self, source):
method snat4 (line 137) | def snat4(self, snat_target, source):
method snat6 (line 175) | def snat6(self, snat_target, source):
method getSnat4Rule (line 198) | def getSnat4Rule(self, snat_target, source):
method getSnat6Rule (line 208) | def getSnat6Rule(self, snat_target, source):
method create_mailcow_isolation_rule (line 216) | def create_mailcow_isolation_rule(self, _interface:str, _dports:list, ...
FILE: data/Dockerfiles/netfilter/modules/Logger.py
class Logger (line 5) | class Logger:
method __init__ (line 6) | def __init__(self):
method set_redis (line 9) | def set_redis(self, redis):
method _format_timestamp (line 12) | def _format_timestamp(self):
method log (line 16) | def log(self, priority, message):
method logWarn (line 35) | def logWarn(self, message):
method logCrit (line 38) | def logCrit(self, message):
method logInfo (line 41) | def logInfo(self, message):
FILE: data/Dockerfiles/netfilter/modules/NFTables.py
class NFTables (line 5) | class NFTables:
method __init__ (line 6) | def __init__(self, chain_name, logger):
method initChainIPv4 (line 18) | def initChainIPv4(self):
method initChainIPv6 (line 21) | def initChainIPv6(self):
method checkIPv4ChainOrder (line 24) | def checkIPv4ChainOrder(self):
method checkIPv6ChainOrder (line 27) | def checkIPv6ChainOrder(self):
method checkChainOrder (line 30) | def checkChainOrder(self, filter_table):
method clearIPv4Table (line 51) | def clearIPv4Table(self):
method clearIPv6Table (line 54) | def clearIPv6Table(self):
method clearTable (line 57) | def clearTable(self, _family):
method banIPv4 (line 102) | def banIPv4(self, source):
method banIPv6 (line 106) | def banIPv6(self, source):
method unbanIPv4 (line 110) | def unbanIPv4(self, source):
method unbanIPv6 (line 116) | def unbanIPv6(self, source):
method snat4 (line 122) | def snat4(self, snat_target, source):
method snat6 (line 125) | def snat6(self, snat_target, source):
method nft_exec_dict (line 129) | def nft_exec_dict(self, query: dict):
method get_base_dict (line 143) | def get_base_dict(self):
method search_current_chains (line 146) | def search_current_chains(self):
method search_for_chain (line 179) | def search_for_chain(self, kernel_ruleset: dict, chain_name: str):
method get_chain_dict (line 191) | def get_chain_dict(self, _family: str, _name: str):
method get_mailcow_jump_rule_dict (line 199) | def get_mailcow_jump_rule_dict(self, _family: str, _chain: str):
method insert_mailcow_chains (line 222) | def insert_mailcow_chains(self, _family: str):
method delete_nat_rule (line 260) | def delete_nat_rule(self, _family:str, _chain: str, _handle:str):
method delete_filter_rule (line 271) | def delete_filter_rule(self, _family:str, _chain: str, _handle:str):
method snat_rule (line 282) | def snat_rule(self, _family: str, snat_target: str, source_address: str):
method get_chain_handle (line 380) | def get_chain_handle(self, _family: str, _table: str, chain_name: str):
method get_rules_handle (line 397) | def get_rules_handle(self, _family: str, _table: str, chain_name: str,...
method get_ban_ip_dict (line 417) | def get_ban_ip_dict(self, ipaddr: str, _family: str):
method get_unban_ip_dict (line 440) | def get_unban_ip_dict(self, ipaddr:str, _family: str):
method check_mailcow_chains (line 487) | def check_mailcow_chains(self, family: str, chain: str):
method create_mailcow_isolation_rule (line 512) | def create_mailcow_isolation_rule(self, _interface:str, _dports:list, ...
FILE: data/Dockerfiles/nginx/bootstrap.py
function includes_conf (line 5) | def includes_conf(env, template_vars):
function sites_default_conf (line 27) | def sites_default_conf(env, template_vars):
function nginx_conf (line 35) | def nginx_conf(env, template_vars):
function prepare_template_vars (line 43) | def prepare_template_vars():
function main (line 88) | def main():
FILE: data/Dockerfiles/olefy/olefy.py
function protocol_split (line 92) | def protocol_split( olefy_line ):
function oletools (line 104) | def oletools( stream, tmp_file_name, lid ):
class AIO (line 149) | class AIO(asyncio.Protocol):
method __init__ (line 150) | def __init__(self):
method connection_made (line 153) | def connection_made(self, transport):
method data_received (line 160) | def data_received(self, request, msgid=1):
method eof_received (line 165) | def eof_received(self):
FILE: data/conf/phpfpm/crons/keycloak-sync.php
function logMsg (line 43) | function logMsg($priority, $message, $task = "Keycloak Sync") {
FILE: data/conf/phpfpm/crons/ldap-sync.php
function logMsg (line 43) | function logMsg($priority, $message, $task = "LDAP Sync") {
FILE: data/conf/rspamd/dynmaps/aliasexp.php
function parse_email (line 30) | function parse_email($email) {
function getallheaders (line 36) | function getallheaders() {
FILE: data/conf/rspamd/dynmaps/bcc.php
function parse_email (line 25) | function parse_email($email) {
function getallheaders (line 31) | function getallheaders() {
FILE: data/conf/rspamd/dynmaps/footer.php
function getallheaders (line 26) | function getallheaders() {
FILE: data/conf/rspamd/dynmaps/forwardinghosts.php
function in_net (line 9) | function in_net($addr, $net) {
FILE: data/conf/rspamd/dynmaps/settings.php
function parse_email (line 46) | function parse_email($email) {
function normalize_email (line 52) | function normalize_email($email) {
function wl_by_sogo (line 76) | function wl_by_sogo() {
function ucl_rcpts (line 96) | function ucl_rcpts($object, $type) {
FILE: data/conf/rspamd/meta_exporter/pipe.php
function parse_email (line 30) | function parse_email($email) {
function getallheaders (line 36) | function getallheaders() {
FILE: data/conf/rspamd/meta_exporter/pushover.php
function parse_email (line 30) | function parse_email($email) {
function getallheaders (line 36) | function getallheaders() {
FILE: data/conf/sogo/custom-sogo.js
function mc_logout (line 9) | function mc_logout() {
FILE: data/web/api/swagger-ui-bundle.js
function f (line 2) | function f(e){return f="function"==typeof Symbol&&"symbol"==typeof Symbo...
method constructor (line 2) | constructor(e){super(e),this.state={loaded:!1,error:!1}}
method componentDidMount (line 2) | componentDidMount(){const e=new Image;e.onload=()=>{this.setState({loa...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){if(e.src!==this.props.src){const t...
method render (line 2) | render(){return this.state.error?a.createElement("img",{alt:"Error"}):...
function d (line 2) | function d(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
function m (line 2) | function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
function g (line 2) | function g(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){va...
function y (line 2) | function y(e){return y=Object.setPrototypeOf?Object.getPrototypeOf:funct...
method constructor (line 2) | constructor(){super(...arguments),m(this,g,{writable:!0,value:{...u.de...
method defaults (line 2) | get defaults(){return{...i()(this,g)}}
function v (line 2) | function v(e,t){return v=Object.setPrototypeOf||function(e,t){return e._...
function b (line 2) | function b(e,t){return!t||"object"!=typeof t&&"function"!=typeof t?funct...
method constructor (line 2) | constructor(){super(...arguments),y(this,v,{writable:!0,value:{"7bit":...
method defaults (line 2) | get defaults(){return{...i()(this,v)}}
function E (line 2) | function E(e,t,n){return function(e){return null==e}(e)?n:function(e){re...
method delete (line 2) | delete(e){const t=l()(u()(this).call(this)),n=h()(t).call(t,b(e));retu...
method get (line 2) | get(e){const t=l()(u()(this).call(this)),n=h()(t).call(t,b(e));return ...
method has (line 2) | has(e){const t=l()(u()(this).call(this));return-1!==d()(t).call(t,b(e))}
function x (line 2) | function x(e,t,n){for(var r=0;r!==t.length;)if((e=E(e,t[r++],w))===w)ret...
function S (line 2) | function S(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[...
function t (line 2) | function t(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
class P (line 2) | class P extends _{constructor(){super(...arguments),i()(this,"getModelNa...
method constructor (line 2) | constructor(){super(...arguments),i()(this,"getModelName",(e=>-1!==l()...
method render (line 2) | render(){let{getComponent:e,getConfigs:t,specSelectors:r,schema:s,requ...
class h (line 2) | class h extends a.Component{constructor(e,t){super(e,t),o()(this,"getDef...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"getDefinitionUrl",(()=>{let{spec...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{getConfigs:t}=e,{validatorUrl:...
method render (line 2) | render(){let{getConfigs:e}=this.props,{spec:t}=e(),n=(0,u.Nm)(this.sta...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"onChange",(e=>{let{onChange:t}=t...
method getValue (line 2) | getValue(){let{name:e,authorized:t}=this.props;return t&&t.getIn([e,"v...
method render (line 2) | render(){var e;let{schema:t,getComponent:n,errSelectors:r,name:o}=this...
class f (line 2) | class f extends a.Component{constructor(e){super(e),this.state={loaded:!...
method constructor (line 2) | constructor(e){super(e),this.state={loaded:!1,error:!1}}
method componentDidMount (line 2) | componentDidMount(){const e=new Image;e.onload=()=>{this.setState({loa...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){if(e.src!==this.props.src){const t...
method render (line 2) | render(){return this.state.error?a.createElement("img",{alt:"Error"}):...
function s (line 2) | function s(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var n...
method render (line 2) | render(){return a.createElement(B,{store:t},a.createElement(n,o()({},t...
method constructor (line 2) | constructor(e){this.elements=e||[]}
method toValue (line 2) | toValue(){return this.elements.map((e=>e.toValue()))}
method map (line 2) | map(e,t){return this.elements.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return e=o(e),new s(this.elements.filter(e,t))}
method reject (line 2) | reject(e,t){return e=o(e),new s(this.elements.filter(r(e),t))}
method find (line 2) | find(e,t){return e=o(e),this.elements.find(e,t)}
method forEach (line 2) | forEach(e,t){this.elements.forEach(e,t)}
method reduce (line 2) | reduce(e,t){return this.elements.reduce(e,t)}
method includes (line 2) | includes(e){return this.elements.some((t=>t.equals(e)))}
method shift (line 2) | shift(){return this.elements.shift()}
method unshift (line 2) | unshift(e){this.elements.unshift(this.refract(e))}
method push (line 2) | push(e){return this.elements.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method get (line 2) | get(e){return this.elements[e]}
method getValue (line 2) | getValue(e){const t=this.elements[e];if(t)return t.toValue()}
method length (line 2) | get length(){return this.elements.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.elements.length}
method first (line 2) | get first(){return this.elements[0]}
method map (line 2) | map(e,t){return this.elements.map((n=>e.bind(t)(n.value,n.key,n)))}
method filter (line 2) | filter(e,t){return new s(this.elements.filter((n=>e.bind(t)(n.value,n....
method reject (line 2) | reject(e,t){return this.filter(r(e.bind(t)))}
method forEach (line 2) | forEach(e,t){return this.elements.forEach(((n,r)=>{e.bind(t)(n.value,n...
method keys (line 2) | keys(){return this.map(((e,t)=>t.toValue()))}
method values (line 2) | values(){return this.map((e=>e.toValue()))}
function i (line 2) | function i(e,t){for(var n=e.length-1;n>=0;n--)!0===t(e[n])&&e.splice(n,1)}
method constructor (line 2) | constructor(){super(...arguments),o()(this,"setSelectedServer",(e=>{co...
method render (line 2) | render(){const{operationServers:e,pathServers:t,getComponent:n}=this.p...
method getDerivedStateFromError (line 2) | static getDerivedStateFromError(e){return{hasError:!0,error:e}}
method constructor (line 2) | constructor(){super(...arguments),this.state={hasError:!1,error:null}}
method componentDidCatch (line 2) | componentDidCatch(e,t){this.props.fn.componentDidCatch(e,t)}
method render (line 2) | render(){const{getComponent:e,targetName:t,children:n}=this.props;if(t...
method constructor (line 2) | constructor(e,t,n){super(e||[],t,n),this.element="array"}
method primitive (line 2) | primitive(){return"array"}
method get (line 2) | get(e){return this.content[e]}
method getValue (line 2) | getValue(e){const t=this.get(e);if(t)return t.toValue()}
method getIndex (line 2) | getIndex(e){return this.content[e]}
method set (line 2) | set(e,t){return this.content[e]=this.refract(t),this}
method remove (line 2) | remove(e){const t=this.content.splice(e,1);return t.length?t[0]:null}
method map (line 2) | map(e,t){return this.content.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return new s(this.content.filter(e,t))}
method reject (line 2) | reject(e,t){return this.filter(r(e),t)}
method reduce (line 2) | reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r="object"...
method forEach (line 2) | forEach(e,t){this.content.forEach(((n,r)=>{e.bind(t)(n,this.refract(r)...
method shift (line 2) | shift(){return this.content.shift()}
method unshift (line 2) | unshift(e){this.content.unshift(this.refract(e))}
method push (line 2) | push(e){return this.content.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method findElements (line 2) | findElements(e,t){const n=t||{},r=!!n.recursive,o=void 0===n.results?[...
method find (line 2) | find(e){return new s(this.findElements(e,{recursive:!0}))}
method findByElement (line 2) | findByElement(e){return this.find((t=>t.element===e))}
method findByClass (line 2) | findByClass(e){return this.find((t=>t.classes.includes(e)))}
method getById (line 2) | getById(e){return this.find((t=>t.id.toValue()===e)).first}
method includes (line 2) | includes(e){return this.content.some((t=>t.equals(e)))}
method contains (line 2) | contains(e){return this.includes(e)}
method empty (line 2) | empty(){return new this.constructor([])}
method "fantasy-land/empty" (line 2) | "fantasy-land/empty"(){return this.empty()}
method concat (line 2) | concat(e){return new this.constructor(this.content.concat(e.content))}
method "fantasy-land/concat" (line 2) | "fantasy-land/concat"(e){return this.concat(e)}
method "fantasy-land/map" (line 2) | "fantasy-land/map"(e){return new this.constructor(this.map(e))}
method "fantasy-land/chain" (line 2) | "fantasy-land/chain"(e){return this.map((t=>e(t)),this).reduce(((e,t)=...
method "fantasy-land/filter" (line 2) | "fantasy-land/filter"(e){return new this.constructor(this.content.filt...
method "fantasy-land/reduce" (line 2) | "fantasy-land/reduce"(e,t){return this.content.reduce(e,t)}
method length (line 2) | get length(){return this.content.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.content.length}
method first (line 2) | get first(){return this.getIndex(0)}
method second (line 2) | get second(){return this.getIndex(1)}
method last (line 2) | get last(){return this.getIndex(this.length-1)}
method constructor (line 2) | constructor(e,t,n){t&&(this.meta=t),n&&(this.attributes=n),this.conten...
method freeze (line 2) | freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,th...
method primitive (line 2) | primitive(){}
method clone (line 2) | clone(){const e=new this.constructor;return e.element=this.element,thi...
method toValue (line 2) | toValue(){return this.content instanceof i?this.content.toValue():this...
method toRef (line 2) | toRef(e){if(""===this.id.toValue())throw Error("Cannot create referenc...
method findRecursive (line 2) | findRecursive(...e){if(arguments.length>1&&!this.isFrozen)throw new Er...
method set (line 2) | set(e){return this.content=e,this}
method equals (line 2) | equals(e){return r(this.toValue(),e)}
method getMetaProperty (line 2) | getMetaProperty(e,t){if(!this.meta.hasKey(e)){if(this.isFrozen){const ...
method setMetaProperty (line 2) | setMetaProperty(e,t){this.meta.set(e,t)}
method element (line 2) | get element(){return this._storedElement||"element"}
method element (line 2) | set element(e){this._storedElement=e}
method content (line 2) | get content(){return this._content}
method content (line 2) | set content(e){if(e instanceof i)this._content=e;else if(e instanceof ...
method meta (line 2) | get meta(){if(!this._meta){if(this.isFrozen){const e=new this.ObjectEl...
method meta (line 2) | set meta(e){e instanceof this.ObjectElement?this._meta=e:this.meta.set...
method attributes (line 2) | get attributes(){if(!this._attributes){if(this.isFrozen){const e=new t...
method attributes (line 2) | set attributes(e){e instanceof this.ObjectElement?this._attributes=e:t...
method id (line 2) | get id(){return this.getMetaProperty("id","")}
method id (line 2) | set id(e){this.setMetaProperty("id",e)}
method classes (line 2) | get classes(){return this.getMetaProperty("classes",[])}
method classes (line 2) | set classes(e){this.setMetaProperty("classes",e)}
method title (line 2) | get title(){return this.getMetaProperty("title","")}
method title (line 2) | set title(e){this.setMetaProperty("title",e)}
method description (line 2) | get description(){return this.getMetaProperty("description","")}
method description (line 2) | set description(e){this.setMetaProperty("description",e)}
method links (line 2) | get links(){return this.getMetaProperty("links",[])}
method links (line 2) | set links(e){this.setMetaProperty("links",e)}
method isFrozen (line 2) | get isFrozen(){return Object.isFrozen(this)}
method parents (line 2) | get parents(){let{parent:e}=this;const t=new s;for(;e;)t.push(e),e=e.p...
method children (line 2) | get children(){if(Array.isArray(this.content))return new s(this.conten...
method recursiveChildren (line 2) | get recursiveChildren(){const e=new s;return this.children.forEach((t=...
function a (line 2) | function a(e){throw new Error("Unhandled case for value: '".concat(e,"'"))}
function e (line 2) | function e(e){void 0===e&&(e={}),this.tagName="",this.attrs={},this.inne...
function e (line 2) | function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this...
function e (line 2) | function e(e){this.__jsduckDummyDocProp=null,this.matchedText="",this.of...
function h (line 2) | function h(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("C...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"getDefinitionUrl",(()=>{let{spec...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{getConfigs:t}=e,{validatorUrl:...
method render (line 2) | render(){let{getConfigs:e}=this.props,{spec:t}=e(),n=(0,u.Nm)(this.sta...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"onChange",(e=>{let{onChange:t}=t...
method getValue (line 2) | getValue(){let{name:e,authorized:t}=this.props;return t&&t.getIn([e,"v...
method render (line 2) | render(){var e;let{schema:t,getComponent:n,errSelectors:r,name:o}=this...
function t (line 2) | function t(t){var n=e.call(this,t)||this;return n.email="",n.email=t.ema...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
function t (line 2) | function t(t){var n=e.call(this,t)||this;return n.serviceName="",n.hasht...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
function t (line 2) | function t(t){var n=e.call(this,t)||this;return n.serviceName="twitter",...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
function t (line 2) | function t(t){var n=e.call(this,t)||this;return n.number="",n.plusSign=!...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
function t (line 2) | function t(t){var n=e.call(this,t)||this;return n.url="",n.urlMatchType=...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
function t (line 2) | function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.loca...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
function d (line 2) | function d(e){"m"===e?S(1):n.test(e)&&S()}
function g (line 2) | function g(e,t){":"===e?n.test(t)?(u=2,p=new U(f(f({},p),{hasMailtoPrefi...
function y (line 2) | function y(e){"."===e?u=3:"@"===e?u=4:n.test(e)||_()}
method constructor (line 2) | constructor(){super(...arguments),m(this,g,{writable:!0,value:{...u.de...
method defaults (line 2) | get defaults(){return{...i()(this,g)}}
function v (line 2) | function v(e){"."===e||"@"===e?_():n.test(e)?u=2:_()}
function b (line 2) | function b(e){F.test(e)?u=5:_()}
method constructor (line 2) | constructor(){super(...arguments),y(this,v,{writable:!0,value:{"7bit":...
method defaults (line 2) | get defaults(){return{...i()(this,v)}}
function w (line 2) | function w(e){"."===e?u=7:"-"===e?u=6:F.test(e)||j()}
function E (line 2) | function E(e){"-"===e||"."===e?j():F.test(e)?u=5:j()}
method delete (line 2) | delete(e){const t=l()(u()(this).call(this)),n=h()(t).call(t,b(e));retu...
method get (line 2) | get(e){const t=l()(u()(this).call(this)),n=h()(t).call(t,b(e));return ...
method has (line 2) | has(e){const t=l()(u()(this).call(this));return-1!==d()(t).call(t,b(e))}
function x (line 2) | function x(e){"."===e||"-"===e?j():F.test(e)?(u=5,p=new U(f(f({},p),{has...
function S (line 2) | function S(e){void 0===e&&(e=2),u=e,p=new U({idx:c})}
function _ (line 2) | function _(){u=0,p=i}
function j (line 2) | function j(){if(p.hasDomainDot){var n=e.slice(p.idx,c);/[-.]$/.test(n)&&...
function e (line 2) | function e(){}
function t (line 2) | function t(t){var n=e.call(this,t)||this;return n.stripPrefix={scheme:!0...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
function t (line 2) | function t(t){var n=e.call(this,t)||this;return n.serviceName="twitter",...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
function u (line 2) | function u(e){"#"===e?(l=2,i=s):I.test(e)&&(l=1)}
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"applyDefaultValue",(e=>{const{on...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){this.props.value!==e.value&&e.valu...
method render (line 2) | render(){let{getComponent:e,errors:t}=this.props,{value:n}=this.state,...
method constructor (line 2) | constructor(e){super(),this.options=e}
method addKeyword (line 2) | addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNo...
method addText (line 2) | addText(e){""!==e&&this.add(e)}
method addSublanguage (line 2) | addSublanguage(e,t){const n=e.root;n.kind=t,n.sublanguage=!0,this.add(n)}
method toHTML (line 2) | toHTML(){return new l(this,this.options).value()}
method finalize (line 2) | finalize(){return!0}
method constructor (line 2) | constructor(e){this.elementMap={},this.elementDetection=[],this.Elemen...
method use (line 2) | use(e){return e.namespace&&e.namespace({base:this}),e.load&&e.load({ba...
method useDefault (line 2) | useDefault(){return this.register("null",c.NullElement).register("stri...
method register (line 2) | register(e,t){return this._elements=void 0,this.elementMap[e]=t,this}
method unregister (line 2) | unregister(e){return this._elements=void 0,delete this.elementMap[e],t...
method detect (line 2) | detect(e,t,n){return void 0===n||n?this.elementDetection.unshift([e,t]...
method toElement (line 2) | toElement(e){if(e instanceof this.Element)return e;let t;for(let n=0;n...
method getElementClass (line 2) | getElementClass(e){const t=this.elementMap[e];return void 0===t?this.E...
method fromRefract (line 2) | fromRefract(e){return this.serialiser.deserialise(e)}
method toRefract (line 2) | toRefract(e){return this.serialiser.serialise(e)}
method elements (line 2) | get elements(){return void 0===this._elements&&(this._elements={Elemen...
method serialiser (line 2) | get serialiser(){return new l(this)}
function p (line 2) | function p(e){I.test(e)||(l=0)}
method constructor (line 2) | constructor(){super(...arguments),o()(this,"onServerChange",(e=>{this....
method componentDidMount (line 2) | componentDidMount(){var e;let{servers:t,currentServer:n}=this.props;n|...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{servers:t,setServerVariableVal...
method render (line 2) | render(){var e,t;let{servers:n,currentServer:r,getServerVariable:o,get...
function h (line 2) | function h(e){l=K.test(e)?3:I.test(e)?1:0}
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"getDefinitionUrl",(()=>{let{spec...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{getConfigs:t}=e,{validatorUrl:...
method render (line 2) | render(){let{getConfigs:e}=this.props,{spec:t}=e(),n=(0,u.Nm)(this.sta...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"onChange",(e=>{let{onChange:t}=t...
method getValue (line 2) | getValue(){let{name:e,authorized:t}=this.props;return t&&t.getIn([e,"v...
method render (line 2) | render(){var e;let{schema:t,getComponent:n,errSelectors:r,name:o}=this...
function f (line 2) | function f(e){K.test(e)||(d(),i=-1,l=I.test(e)?1:0)}
method constructor (line 2) | constructor(e){super(e),this.state={loaded:!1,error:!1}}
method componentDidMount (line 2) | componentDidMount(){const e=new Image;e.onload=()=>{this.setState({loa...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){if(e.src!==this.props.src){const t...
method render (line 2) | render(){return this.state.error?a.createElement("img",{alt:"Error"}):...
function d (line 2) | function d(){if(i>-1&&s-i<=140){var o=e.slice(i,s),a=new g({tagBuilder:t...
function t (line 2) | function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.matc...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
function t (line 2) | function t(t){var n=e.call(this,t)||this;return n.serviceName="twitter",...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
function oe (line 2) | function oe(e,t){for(var n,r=t.onOpenTag,o=t.onCloseTag,s=t.onText,i=t.o...
function e (line 2) | function e(t){void 0===t&&(t={}),this.version=e.version,this.urls={},thi...
function le (line 2) | function le(e){return/^<\/a\s*>/i.test(e)}
function ce (line 2) | function ce(){var e=[],t=new ie({stripPrefix:!1,url:!0,email:!0,replaceF...
function ue (line 2) | function ue(e){var t,n,r,o,s,i,a,l,c,u,p,h,f,d,m=e.tokens,g=null;for(n=0...
function pe (line 2) | function pe(e){e.core.ruler.push("linkify",ue)}
function ge (line 2) | function ge(e){let{source:t,className:n="",getConfigs:s}=e;if("string"!=...
method render (line 2) | render(){const{authActions:e,authSelectors:t,specSelectors:n,getCompon...
function ve (line 2) | function ve(e){let{useUnsafeMarkdown:t=!1}=arguments.length>1&&void 0!==...
method constructor (line 2) | constructor(e,t){super(e,t),le()(this,"onAuthChange",(e=>{let{name:t}=...
method render (line 2) | render(){var e;let{definitions:t,getComponent:n,authSelectors:r,errSel...
function b (line 2) | function b(e){return{type:p,payload:e}}
method constructor (line 2) | constructor(){super(...arguments),y(this,v,{writable:!0,value:{"7bit":...
method defaults (line 2) | get defaults(){return{...i()(this,v)}}
function w (line 2) | function w(e){return{type:h,payload:e}}
function x (line 2) | function x(e){return{type:f,payload:e}}
function j (line 2) | function j(e){return{type:m,payload:e}}
function I (line 2) | function I(e){return{type:y,payload:e}}
function T (line 2) | function T(e){return{type:v,payload:e}}
function p (line 2) | function p(){return{afterLoad(e){this.rootInjects=this.rootInjects||{},t...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"onServerChange",(e=>{this....
method componentDidMount (line 2) | componentDidMount(){var e;let{servers:t,currentServer:n}=this.props;n|...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{servers:t,setServerVariableVal...
method render (line 2) | render(){var e,t;let{servers:n,currentServer:r,getServerVariable:o,get...
function h (line 2) | function h(e,t,n,r){const{authActions:{authorize:o},specSelectors:{specJ...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"getDefinitionUrl",(()=>{let{spec...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{getConfigs:t}=e,{validatorUrl:...
method render (line 2) | render(){let{getConfigs:e}=this.props,{spec:t}=e(),n=(0,u.Nm)(this.sta...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"onChange",(e=>{let{onChange:t}=t...
method getValue (line 2) | getValue(){let{name:e,authorized:t}=this.props;return t&&t.getIn([e,"v...
method render (line 2) | render(){var e;let{schema:t,getComponent:n,errSelectors:r,name:o}=this...
function f (line 2) | function f(e,t,n){const{authActions:{authorize:r},specSelectors:{specJso...
method constructor (line 2) | constructor(e){super(e),this.state={loaded:!1,error:!1}}
method componentDidMount (line 2) | componentDidMount(){const e=new Image;e.onload=()=>{this.setState({loa...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){if(e.src!==this.props.src){const t...
method render (line 2) | render(){return this.state.error?a.createElement("img",{alt:"Error"}):...
function s (line 2) | function s(e,t){return{type:r,payload:{[e]:t}}}
method render (line 2) | render(){return a.createElement(B,{store:t},a.createElement(n,o()({},t...
method constructor (line 2) | constructor(e){this.elements=e||[]}
method toValue (line 2) | toValue(){return this.elements.map((e=>e.toValue()))}
method map (line 2) | map(e,t){return this.elements.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return e=o(e),new s(this.elements.filter(e,t))}
method reject (line 2) | reject(e,t){return e=o(e),new s(this.elements.filter(r(e),t))}
method find (line 2) | find(e,t){return e=o(e),this.elements.find(e,t)}
method forEach (line 2) | forEach(e,t){this.elements.forEach(e,t)}
method reduce (line 2) | reduce(e,t){return this.elements.reduce(e,t)}
method includes (line 2) | includes(e){return this.elements.some((t=>t.equals(e)))}
method shift (line 2) | shift(){return this.elements.shift()}
method unshift (line 2) | unshift(e){this.elements.unshift(this.refract(e))}
method push (line 2) | push(e){return this.elements.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method get (line 2) | get(e){return this.elements[e]}
method getValue (line 2) | getValue(e){const t=this.elements[e];if(t)return t.toValue()}
method length (line 2) | get length(){return this.elements.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.elements.length}
method first (line 2) | get first(){return this.elements[0]}
method map (line 2) | map(e,t){return this.elements.map((n=>e.bind(t)(n.value,n.key,n)))}
method filter (line 2) | filter(e,t){return new s(this.elements.filter((n=>e.bind(t)(n.value,n....
method reject (line 2) | reject(e,t){return this.filter(r(e.bind(t)))}
method forEach (line 2) | forEach(e,t){return this.elements.forEach(((n,r)=>{e.bind(t)(n.value,n...
method keys (line 2) | keys(){return this.map(((e,t)=>t.toValue()))}
method values (line 2) | values(){return this.map((e=>e.toValue()))}
function i (line 2) | function i(e){return{type:o,payload:e}}
method constructor (line 2) | constructor(){super(...arguments),o()(this,"setSelectedServer",(e=>{co...
method render (line 2) | render(){const{operationServers:e,pathServers:t,getComponent:n}=this.p...
method getDerivedStateFromError (line 2) | static getDerivedStateFromError(e){return{hasError:!0,error:e}}
method constructor (line 2) | constructor(){super(...arguments),this.state={hasError:!1,error:null}}
method componentDidCatch (line 2) | componentDidCatch(e,t){this.props.fn.componentDidCatch(e,t)}
method render (line 2) | render(){const{getComponent:e,targetName:t,children:n}=this.props;if(t...
method constructor (line 2) | constructor(e,t,n){super(e||[],t,n),this.element="array"}
method primitive (line 2) | primitive(){return"array"}
method get (line 2) | get(e){return this.content[e]}
method getValue (line 2) | getValue(e){const t=this.get(e);if(t)return t.toValue()}
method getIndex (line 2) | getIndex(e){return this.content[e]}
method set (line 2) | set(e,t){return this.content[e]=this.refract(t),this}
method remove (line 2) | remove(e){const t=this.content.splice(e,1);return t.length?t[0]:null}
method map (line 2) | map(e,t){return this.content.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return new s(this.content.filter(e,t))}
method reject (line 2) | reject(e,t){return this.filter(r(e),t)}
method reduce (line 2) | reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r="object"...
method forEach (line 2) | forEach(e,t){this.content.forEach(((n,r)=>{e.bind(t)(n,this.refract(r)...
method shift (line 2) | shift(){return this.content.shift()}
method unshift (line 2) | unshift(e){this.content.unshift(this.refract(e))}
method push (line 2) | push(e){return this.content.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method findElements (line 2) | findElements(e,t){const n=t||{},r=!!n.recursive,o=void 0===n.results?[...
method find (line 2) | find(e){return new s(this.findElements(e,{recursive:!0}))}
method findByElement (line 2) | findByElement(e){return this.find((t=>t.element===e))}
method findByClass (line 2) | findByClass(e){return this.find((t=>t.classes.includes(e)))}
method getById (line 2) | getById(e){return this.find((t=>t.id.toValue()===e)).first}
method includes (line 2) | includes(e){return this.content.some((t=>t.equals(e)))}
method contains (line 2) | contains(e){return this.includes(e)}
method empty (line 2) | empty(){return new this.constructor([])}
method "fantasy-land/empty" (line 2) | "fantasy-land/empty"(){return this.empty()}
method concat (line 2) | concat(e){return new this.constructor(this.content.concat(e.content))}
method "fantasy-land/concat" (line 2) | "fantasy-land/concat"(e){return this.concat(e)}
method "fantasy-land/map" (line 2) | "fantasy-land/map"(e){return new this.constructor(this.map(e))}
method "fantasy-land/chain" (line 2) | "fantasy-land/chain"(e){return this.map((t=>e(t)),this).reduce(((e,t)=...
method "fantasy-land/filter" (line 2) | "fantasy-land/filter"(e){return new this.constructor(this.content.filt...
method "fantasy-land/reduce" (line 2) | "fantasy-land/reduce"(e,t){return this.content.reduce(e,t)}
method length (line 2) | get length(){return this.content.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.content.length}
method first (line 2) | get first(){return this.getIndex(0)}
method second (line 2) | get second(){return this.getIndex(1)}
method last (line 2) | get last(){return this.getIndex(this.length-1)}
method constructor (line 2) | constructor(e,t,n){t&&(this.meta=t),n&&(this.attributes=n),this.conten...
method freeze (line 2) | freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,th...
method primitive (line 2) | primitive(){}
method clone (line 2) | clone(){const e=new this.constructor;return e.element=this.element,thi...
method toValue (line 2) | toValue(){return this.content instanceof i?this.content.toValue():this...
method toRef (line 2) | toRef(e){if(""===this.id.toValue())throw Error("Cannot create referenc...
method findRecursive (line 2) | findRecursive(...e){if(arguments.length>1&&!this.isFrozen)throw new Er...
method set (line 2) | set(e){return this.content=e,this}
method equals (line 2) | equals(e){return r(this.toValue(),e)}
method getMetaProperty (line 2) | getMetaProperty(e,t){if(!this.meta.hasKey(e)){if(this.isFrozen){const ...
method setMetaProperty (line 2) | setMetaProperty(e,t){this.meta.set(e,t)}
method element (line 2) | get element(){return this._storedElement||"element"}
method element (line 2) | set element(e){this._storedElement=e}
method content (line 2) | get content(){return this._content}
method content (line 2) | set content(e){if(e instanceof i)this._content=e;else if(e instanceof ...
method meta (line 2) | get meta(){if(!this._meta){if(this.isFrozen){const e=new this.ObjectEl...
method meta (line 2) | set meta(e){e instanceof this.ObjectElement?this._meta=e:this.meta.set...
method attributes (line 2) | get attributes(){if(!this._attributes){if(this.isFrozen){const e=new t...
method attributes (line 2) | set attributes(e){e instanceof this.ObjectElement?this._attributes=e:t...
method id (line 2) | get id(){return this.getMetaProperty("id","")}
method id (line 2) | set id(e){this.setMetaProperty("id",e)}
method classes (line 2) | get classes(){return this.getMetaProperty("classes",[])}
method classes (line 2) | set classes(e){this.setMetaProperty("classes",e)}
method title (line 2) | get title(){return this.getMetaProperty("title","")}
method title (line 2) | set title(e){this.setMetaProperty("title",e)}
method description (line 2) | get description(){return this.getMetaProperty("description","")}
method description (line 2) | set description(e){this.setMetaProperty("description",e)}
method links (line 2) | get links(){return this.getMetaProperty("links",[])}
method links (line 2) | set links(e){this.setMetaProperty("links",e)}
method isFrozen (line 2) | get isFrozen(){return Object.isFrozen(this)}
method parents (line 2) | get parents(){let{parent:e}=this;const t=new s;for(;e;)t.push(e),e=e.p...
method children (line 2) | get children(){if(Array.isArray(this.content))return new s(this.conten...
method recursiveChildren (line 2) | get recursiveChildren(){const e=new s;return this.children.forEach((t=...
function c (line 2) | function c(){return{statePlugins:{spec:{actions:s,selectors:l},configs:{...
method constructor (line 2) | constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}
method top (line 2) | get top(){return this.stack[this.stack.length-1]}
method root (line 2) | get root(){return this.rootNode}
method add (line 2) | add(e){this.top.children.push(e)}
method openNode (line 2) | openNode(e){const t={kind:e,children:[]};this.add(t),this.stack.push(t)}
method closeNode (line 2) | closeNode(){if(this.stack.length>1)return this.stack.pop()}
method closeAllNodes (line 2) | closeAllNodes(){for(;this.closeNode(););}
method toJSON (line 2) | toJSON(){return JSON.stringify(this.rootNode,null,4)}
method walk (line 2) | walk(e){return this.constructor._walk(e,this.rootNode)}
method _walk (line 2) | static _walk(e,t){return"string"==typeof t?e.addText(t):t.children&&(e...
method _collapse (line 2) | static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(...
function s (line 2) | function s(n){n instanceof Error||n.status>=400?(o.updateLoadingStatus("...
method render (line 2) | render(){return a.createElement(B,{store:t},a.createElement(n,o()({},t...
method constructor (line 2) | constructor(e){this.elements=e||[]}
method toValue (line 2) | toValue(){return this.elements.map((e=>e.toValue()))}
method map (line 2) | map(e,t){return this.elements.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return e=o(e),new s(this.elements.filter(e,t))}
method reject (line 2) | reject(e,t){return e=o(e),new s(this.elements.filter(r(e),t))}
method find (line 2) | find(e,t){return e=o(e),this.elements.find(e,t)}
method forEach (line 2) | forEach(e,t){this.elements.forEach(e,t)}
method reduce (line 2) | reduce(e,t){return this.elements.reduce(e,t)}
method includes (line 2) | includes(e){return this.elements.some((t=>t.equals(e)))}
method shift (line 2) | shift(){return this.elements.shift()}
method unshift (line 2) | unshift(e){this.elements.unshift(this.refract(e))}
method push (line 2) | push(e){return this.elements.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method get (line 2) | get(e){return this.elements[e]}
method getValue (line 2) | getValue(e){const t=this.elements[e];if(t)return t.toValue()}
method length (line 2) | get length(){return this.elements.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.elements.length}
method first (line 2) | get first(){return this.elements[0]}
method map (line 2) | map(e,t){return this.elements.map((n=>e.bind(t)(n.value,n.key,n)))}
method filter (line 2) | filter(e,t){return new s(this.elements.filter((n=>e.bind(t)(n.value,n....
method reject (line 2) | reject(e,t){return this.filter(r(e.bind(t)))}
method forEach (line 2) | forEach(e,t){return this.elements.forEach(((n,r)=>{e.bind(t)(n.value,n...
method keys (line 2) | keys(){return this.map(((e,t)=>t.toValue()))}
method values (line 2) | values(){return this.map((e=>e.toValue()))}
function i (line 2) | function i(){return[r.default,{statePlugins:{configs:{wrapActions:{loade...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"setSelectedServer",(e=>{co...
method render (line 2) | render(){const{operationServers:e,pathServers:t,getComponent:n}=this.p...
method getDerivedStateFromError (line 2) | static getDerivedStateFromError(e){return{hasError:!0,error:e}}
method constructor (line 2) | constructor(){super(...arguments),this.state={hasError:!1,error:null}}
method componentDidCatch (line 2) | componentDidCatch(e,t){this.props.fn.componentDidCatch(e,t)}
method render (line 2) | render(){const{getComponent:e,targetName:t,children:n}=this.props;if(t...
method constructor (line 2) | constructor(e,t,n){super(e||[],t,n),this.element="array"}
method primitive (line 2) | primitive(){return"array"}
method get (line 2) | get(e){return this.content[e]}
method getValue (line 2) | getValue(e){const t=this.get(e);if(t)return t.toValue()}
method getIndex (line 2) | getIndex(e){return this.content[e]}
method set (line 2) | set(e,t){return this.content[e]=this.refract(t),this}
method remove (line 2) | remove(e){const t=this.content.splice(e,1);return t.length?t[0]:null}
method map (line 2) | map(e,t){return this.content.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return new s(this.content.filter(e,t))}
method reject (line 2) | reject(e,t){return this.filter(r(e),t)}
method reduce (line 2) | reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r="object"...
method forEach (line 2) | forEach(e,t){this.content.forEach(((n,r)=>{e.bind(t)(n,this.refract(r)...
method shift (line 2) | shift(){return this.content.shift()}
method unshift (line 2) | unshift(e){this.content.unshift(this.refract(e))}
method push (line 2) | push(e){return this.content.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method findElements (line 2) | findElements(e,t){const n=t||{},r=!!n.recursive,o=void 0===n.results?[...
method find (line 2) | find(e){return new s(this.findElements(e,{recursive:!0}))}
method findByElement (line 2) | findByElement(e){return this.find((t=>t.element===e))}
method findByClass (line 2) | findByClass(e){return this.find((t=>t.classes.includes(e)))}
method getById (line 2) | getById(e){return this.find((t=>t.id.toValue()===e)).first}
method includes (line 2) | includes(e){return this.content.some((t=>t.equals(e)))}
method contains (line 2) | contains(e){return this.includes(e)}
method empty (line 2) | empty(){return new this.constructor([])}
method "fantasy-land/empty" (line 2) | "fantasy-land/empty"(){return this.empty()}
method concat (line 2) | concat(e){return new this.constructor(this.content.concat(e.content))}
method "fantasy-land/concat" (line 2) | "fantasy-land/concat"(e){return this.concat(e)}
method "fantasy-land/map" (line 2) | "fantasy-land/map"(e){return new this.constructor(this.map(e))}
method "fantasy-land/chain" (line 2) | "fantasy-land/chain"(e){return this.map((t=>e(t)),this).reduce(((e,t)=...
method "fantasy-land/filter" (line 2) | "fantasy-land/filter"(e){return new this.constructor(this.content.filt...
method "fantasy-land/reduce" (line 2) | "fantasy-land/reduce"(e,t){return this.content.reduce(e,t)}
method length (line 2) | get length(){return this.content.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.content.length}
method first (line 2) | get first(){return this.getIndex(0)}
method second (line 2) | get second(){return this.getIndex(1)}
method last (line 2) | get last(){return this.getIndex(this.length-1)}
method constructor (line 2) | constructor(e,t,n){t&&(this.meta=t),n&&(this.attributes=n),this.conten...
method freeze (line 2) | freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,th...
method primitive (line 2) | primitive(){}
method clone (line 2) | clone(){const e=new this.constructor;return e.element=this.element,thi...
method toValue (line 2) | toValue(){return this.content instanceof i?this.content.toValue():this...
method toRef (line 2) | toRef(e){if(""===this.id.toValue())throw Error("Cannot create referenc...
method findRecursive (line 2) | findRecursive(...e){if(arguments.length>1&&!this.isFrozen)throw new Er...
method set (line 2) | set(e){return this.content=e,this}
method equals (line 2) | equals(e){return r(this.toValue(),e)}
method getMetaProperty (line 2) | getMetaProperty(e,t){if(!this.meta.hasKey(e)){if(this.isFrozen){const ...
method setMetaProperty (line 2) | setMetaProperty(e,t){this.meta.set(e,t)}
method element (line 2) | get element(){return this._storedElement||"element"}
method element (line 2) | set element(e){this._storedElement=e}
method content (line 2) | get content(){return this._content}
method content (line 2) | set content(e){if(e instanceof i)this._content=e;else if(e instanceof ...
method meta (line 2) | get meta(){if(!this._meta){if(this.isFrozen){const e=new this.ObjectEl...
method meta (line 2) | set meta(e){e instanceof this.ObjectElement?this._meta=e:this.meta.set...
method attributes (line 2) | get attributes(){if(!this._attributes){if(this.isFrozen){const e=new t...
method attributes (line 2) | set attributes(e){e instanceof this.ObjectElement?this._attributes=e:t...
method id (line 2) | get id(){return this.getMetaProperty("id","")}
method id (line 2) | set id(e){this.setMetaProperty("id",e)}
method classes (line 2) | get classes(){return this.getMetaProperty("classes",[])}
method classes (line 2) | set classes(e){this.setMetaProperty("classes",e)}
method title (line 2) | get title(){return this.getMetaProperty("title","")}
method title (line 2) | set title(e){this.setMetaProperty("title",e)}
method description (line 2) | get description(){return this.getMetaProperty("description","")}
method description (line 2) | set description(e){this.setMetaProperty("description",e)}
method links (line 2) | get links(){return this.getMetaProperty("links",[])}
method links (line 2) | set links(e){this.setMetaProperty("links",e)}
method isFrozen (line 2) | get isFrozen(){return Object.isFrozen(this)}
method parents (line 2) | get parents(){let{parent:e}=this;const t=new s;for(;e;)t.push(e),e=e.p...
method children (line 2) | get children(){if(Array.isArray(this.content))return new s(this.conten...
method recursiveChildren (line 2) | get recursiveChildren(){const e=new s;return this.children.forEach((t=...
method isShownKeyFromUrlHashArray (line 2) | isShownKeyFromUrlHashArray(e,t){const[n,r]=t;return r?["operations",n,r]...
method urlHashArrayFromIsShownKey (line 2) | urlHashArrayFromIsShownKey(e,t){let[n,r,o]=t;return"operations"==n?[r,o]...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"onLoad",(e=>{const{tag:n}=th...
method render (line 2) | render(){return s.createElement("span",{ref:this.onLoad},s.createElement...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"onLoad",(e=>{const{operation...
method render (line 2) | render(){return s.createElement("span",{ref:this.onLoad},s.createElement...
function d (line 2) | function d(e){let{fn:t}=e;return{statePlugins:{spec:{actions:{download:e...
function p (line 2) | function p(e){return{type:o,payload:(0,r.serializeError)(e)}}
method constructor (line 2) | constructor(){super(...arguments),o()(this,"onServerChange",(e=>{this....
method componentDidMount (line 2) | componentDidMount(){var e;let{servers:t,currentServer:n}=this.props;n|...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{servers:t,setServerVariableVal...
method render (line 2) | render(){var e,t;let{servers:n,currentServer:r,getServerVariable:o,get...
function h (line 2) | function h(e){return{type:s,payload:e}}
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"getDefinitionUrl",(()=>{let{spec...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{getConfigs:t}=e,{validatorUrl:...
method render (line 2) | render(){let{getConfigs:e}=this.props,{spec:t}=e(),n=(0,u.Nm)(this.sta...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"onChange",(e=>{let{onChange:t}=t...
method getValue (line 2) | getValue(){let{name:e,authorized:t}=this.props;return t&&t.getIn([e,"v...
method render (line 2) | render(){var e;let{schema:t,getComponent:n,errSelectors:r,name:o}=this...
function f (line 2) | function f(e){return{type:i,payload:e}}
method constructor (line 2) | constructor(e){super(e),this.state={loaded:!1,error:!1}}
method componentDidMount (line 2) | componentDidMount(){const e=new Image;e.onload=()=>{this.setState({loa...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){if(e.src!==this.props.src){const t...
method render (line 2) | render(){return this.state.error?a.createElement("img",{alt:"Error"}):...
function d (line 2) | function d(e){return{type:a,payload:e}}
function m (line 2) | function m(e){return{type:l,payload:e}}
function g (line 2) | function g(){return{type:c,payload:arguments.length>0&&void 0!==argument...
function y (line 2) | function y(){return{type:u,payload:arguments.length>0&&void 0!==argument...
method constructor (line 2) | constructor(){super(...arguments),m(this,g,{writable:!0,value:{...u.de...
method defaults (line 2) | get defaults(){return{...i()(this,g)}}
function u (line 2) | function u(e){var t;let n={jsSpec:{}},r=l()(c,((e,t)=>{try{let r=t.trans...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"applyDefaultValue",(e=>{const{on...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){this.props.value!==e.value&&e.valu...
method render (line 2) | render(){let{getComponent:e,errors:t}=this.props,{value:n}=this.state,...
method constructor (line 2) | constructor(e){super(),this.options=e}
method addKeyword (line 2) | addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNo...
method addText (line 2) | addText(e){""!==e&&this.add(e)}
method addSublanguage (line 2) | addSublanguage(e,t){const n=e.root;n.kind=t,n.sublanguage=!0,this.add(n)}
method toHTML (line 2) | toHTML(){return new l(this,this.options).value()}
method finalize (line 2) | finalize(){return!0}
method constructor (line 2) | constructor(e){this.elementMap={},this.elementDetection=[],this.Elemen...
method use (line 2) | use(e){return e.namespace&&e.namespace({base:this}),e.load&&e.load({ba...
method useDefault (line 2) | useDefault(){return this.register("null",c.NullElement).register("stri...
method register (line 2) | register(e,t){return this._elements=void 0,this.elementMap[e]=t,this}
method unregister (line 2) | unregister(e){return this._elements=void 0,delete this.elementMap[e],t...
method detect (line 2) | detect(e,t,n){return void 0===n||n?this.elementDetection.unshift([e,t]...
method toElement (line 2) | toElement(e){if(e instanceof this.Element)return e;let t;for(let n=0;n...
method getElementClass (line 2) | getElementClass(e){const t=this.elementMap[e];return void 0===t?this.E...
method fromRefract (line 2) | fromRefract(e){return this.serialiser.deserialise(e)}
method toRefract (line 2) | toRefract(e){return this.serialiser.serialise(e)}
method elements (line 2) | get elements(){return void 0===this._elements&&(this._elements={Elemen...
method serialiser (line 2) | get serialiser(){return new l(this)}
function p (line 2) | function p(e){return o()(e).call(e,(e=>{var t;let n="is not of a type(s)...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"onServerChange",(e=>{this....
method componentDidMount (line 2) | componentDidMount(){var e;let{servers:t,currentServer:n}=this.props;n|...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{servers:t,setServerVariableVal...
method render (line 2) | render(){var e,t;let{servers:n,currentServer:r,getServerVariable:o,get...
function r (line 2) | function r(e,t){let{jsSpec:n}=t;return e}
method render (line 2) | render(){return a.createElement(t,o()({},e(),this.props,this.context))}
function i (line 2) | function i(e){return{statePlugins:{err:{reducers:(0,r.default)(e),action...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"setSelectedServer",(e=>{co...
method render (line 2) | render(){const{operationServers:e,pathServers:t,getComponent:n}=this.p...
method getDerivedStateFromError (line 2) | static getDerivedStateFromError(e){return{hasError:!0,error:e}}
method constructor (line 2) | constructor(){super(...arguments),this.state={hasError:!1,error:null}}
method componentDidCatch (line 2) | componentDidCatch(e,t){this.props.fn.componentDidCatch(e,t)}
method render (line 2) | render(){const{getComponent:e,targetName:t,children:n}=this.props;if(t...
method constructor (line 2) | constructor(e,t,n){super(e||[],t,n),this.element="array"}
method primitive (line 2) | primitive(){return"array"}
method get (line 2) | get(e){return this.content[e]}
method getValue (line 2) | getValue(e){const t=this.get(e);if(t)return t.toValue()}
method getIndex (line 2) | getIndex(e){return this.content[e]}
method set (line 2) | set(e,t){return this.content[e]=this.refract(t),this}
method remove (line 2) | remove(e){const t=this.content.splice(e,1);return t.length?t[0]:null}
method map (line 2) | map(e,t){return this.content.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return new s(this.content.filter(e,t))}
method reject (line 2) | reject(e,t){return this.filter(r(e),t)}
method reduce (line 2) | reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r="object"...
method forEach (line 2) | forEach(e,t){this.content.forEach(((n,r)=>{e.bind(t)(n,this.refract(r)...
method shift (line 2) | shift(){return this.content.shift()}
method unshift (line 2) | unshift(e){this.content.unshift(this.refract(e))}
method push (line 2) | push(e){return this.content.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method findElements (line 2) | findElements(e,t){const n=t||{},r=!!n.recursive,o=void 0===n.results?[...
method find (line 2) | find(e){return new s(this.findElements(e,{recursive:!0}))}
method findByElement (line 2) | findByElement(e){return this.find((t=>t.element===e))}
method findByClass (line 2) | findByClass(e){return this.find((t=>t.classes.includes(e)))}
method getById (line 2) | getById(e){return this.find((t=>t.id.toValue()===e)).first}
method includes (line 2) | includes(e){return this.content.some((t=>t.equals(e)))}
method contains (line 2) | contains(e){return this.includes(e)}
method empty (line 2) | empty(){return new this.constructor([])}
method "fantasy-land/empty" (line 2) | "fantasy-land/empty"(){return this.empty()}
method concat (line 2) | concat(e){return new this.constructor(this.content.concat(e.content))}
method "fantasy-land/concat" (line 2) | "fantasy-land/concat"(e){return this.concat(e)}
method "fantasy-land/map" (line 2) | "fantasy-land/map"(e){return new this.constructor(this.map(e))}
method "fantasy-land/chain" (line 2) | "fantasy-land/chain"(e){return this.map((t=>e(t)),this).reduce(((e,t)=...
method "fantasy-land/filter" (line 2) | "fantasy-land/filter"(e){return new this.constructor(this.content.filt...
method "fantasy-land/reduce" (line 2) | "fantasy-land/reduce"(e,t){return this.content.reduce(e,t)}
method length (line 2) | get length(){return this.content.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.content.length}
method first (line 2) | get first(){return this.getIndex(0)}
method second (line 2) | get second(){return this.getIndex(1)}
method last (line 2) | get last(){return this.getIndex(this.length-1)}
method constructor (line 2) | constructor(e,t,n){t&&(this.meta=t),n&&(this.attributes=n),this.conten...
method freeze (line 2) | freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,th...
method primitive (line 2) | primitive(){}
method clone (line 2) | clone(){const e=new this.constructor;return e.element=this.element,thi...
method toValue (line 2) | toValue(){return this.content instanceof i?this.content.toValue():this...
method toRef (line 2) | toRef(e){if(""===this.id.toValue())throw Error("Cannot create referenc...
method findRecursive (line 2) | findRecursive(...e){if(arguments.length>1&&!this.isFrozen)throw new Er...
method set (line 2) | set(e){return this.content=e,this}
method equals (line 2) | equals(e){return r(this.toValue(),e)}
method getMetaProperty (line 2) | getMetaProperty(e,t){if(!this.meta.hasKey(e)){if(this.isFrozen){const ...
method setMetaProperty (line 2) | setMetaProperty(e,t){this.meta.set(e,t)}
method element (line 2) | get element(){return this._storedElement||"element"}
method element (line 2) | set element(e){this._storedElement=e}
method content (line 2) | get content(){return this._content}
method content (line 2) | set content(e){if(e instanceof i)this._content=e;else if(e instanceof ...
method meta (line 2) | get meta(){if(!this._meta){if(this.isFrozen){const e=new this.ObjectEl...
method meta (line 2) | set meta(e){e instanceof this.ObjectElement?this._meta=e:this.meta.set...
method attributes (line 2) | get attributes(){if(!this._attributes){if(this.isFrozen){const e=new t...
method attributes (line 2) | set attributes(e){e instanceof this.ObjectElement?this._attributes=e:t...
method id (line 2) | get id(){return this.getMetaProperty("id","")}
method id (line 2) | set id(e){this.setMetaProperty("id",e)}
method classes (line 2) | get classes(){return this.getMetaProperty("classes",[])}
method classes (line 2) | set classes(e){this.setMetaProperty("classes",e)}
method title (line 2) | get title(){return this.getMetaProperty("title","")}
method title (line 2) | set title(e){this.setMetaProperty("title",e)}
method description (line 2) | get description(){return this.getMetaProperty("description","")}
method description (line 2) | set description(e){this.setMetaProperty("description",e)}
method links (line 2) | get links(){return this.getMetaProperty("links",[])}
method links (line 2) | set links(e){this.setMetaProperty("links",e)}
method isFrozen (line 2) | get isFrozen(){return Object.isFrozen(this)}
method parents (line 2) | get parents(){let{parent:e}=this;const t=new s;for(;e;)t.push(e),e=e.p...
method children (line 2) | get children(){if(Array.isArray(this.content))return new s(this.conten...
method recursiveChildren (line 2) | get recursiveChildren(){const e=new s;return this.children.forEach((t=...
function y (line 2) | function y(){return{[f.NEW_THROWN_ERR]:(e,t)=>{let{payload:n}=t,r=o()(g,...
method constructor (line 2) | constructor(){super(...arguments),m(this,g,{writable:!0,value:{...u.de...
method defaults (line 2) | get defaults(){return{...i()(this,g)}}
function o (line 2) | function o(){return{fn:{opsFilter:r.default}}}
method render (line 2) | render(){const{specSelectors:e,oas3Selectors:t,oas3Actions:n,getCompon...
method constructor (line 2) | constructor(e){void 0===e.data&&(e.data={}),this.data=e.data,this.isMa...
method ignoreMatch (line 2) | ignoreMatch(){this.isMatchIgnored=!0}
method constructor (line 2) | constructor(e){super(o._prepareSuperMessage(e)),Object.defineProperty(...
method _prepareSuperMessage (line 2) | static _prepareSuperMessage(e){try{return JSON.stringify(e)}catch{retu...
function a (line 2) | function a(e,t){return o()(e).call(e,((e,n)=>-1!==i()(n).call(n,t)))}
function y (line 2) | function y(e,t,n){!function(e,t){if(t.has(e))throw new TypeError("Cannot...
method constructor (line 2) | constructor(){super(...arguments),m(this,g,{writable:!0,value:{...u.de...
method defaults (line 2) | get defaults(){return{...i()(this,g)}}
class b (line 2) | class b extends c.default{constructor(){super(...arguments),y(this,v,{wr...
method constructor (line 2) | constructor(){super(...arguments),y(this,v,{writable:!0,value:{"7bit":...
method defaults (line 2) | get defaults(){return{...i()(this,v)}}
function m (line 2) | function m(e,t,n){!function(e,t){if(t.has(e))throw new TypeError("Cannot...
class y (line 2) | class y extends c.default{constructor(){super(...arguments),m(this,g,{wr...
method constructor (line 2) | constructor(){super(...arguments),m(this,g,{writable:!0,value:{...u.de...
method defaults (line 2) | get defaults(){return{...i()(this,g)}}
method constructor (line 2) | constructor(){o()(this,"data",{})}
method register (line 2) | register(e,t){this.data[e]=t}
method unregister (line 2) | unregister(e){void 0===e?this.data={}:delete this.data[e]}
method get (line 2) | get(e){return this.data[e]}
function l (line 2) | function l(e){return{type:o,payload:e}}
method render (line 2) | render(){const{link:e,name:t,getComponent:n}=this.props,r=n("Markdown"...
method render (line 2) | render(){let{getConfigs:e,schema:t}=this.props,n=["model-box"],r=null;...
method render (line 2) | render(){return s.createElement(i,{targetName:a,getComponent:n,fn:r},s...
method constructor (line 2) | constructor(t,n){super(t,n),G(e,r,t,{})}
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(t){G(e,r,t,this.props)}
method render (line 2) | render(){const e=z()(this.props,r?i()(r):[]);return a.createElement(s,e)}
method constructor (line 2) | constructor(e,t){this.buffer="",this.classPrefix=t.classPrefix,e.walk(...
method addText (line 2) | addText(e){this.buffer+=s(e)}
method openNode (line 2) | openNode(e){if(!a(e))return;let t=e.kind;e.sublanguage||(t=`${this.cla...
method closeNode (line 2) | closeNode(e){a(e)&&(this.buffer+="</span>")}
method value (line 2) | value(){return this.buffer}
method span (line 2) | span(e){this.buffer+=`<span class="${e}">`}
function c (line 2) | function c(e){return{type:s,payload:e}}
method constructor (line 2) | constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}
method top (line 2) | get top(){return this.stack[this.stack.length-1]}
method root (line 2) | get root(){return this.rootNode}
method add (line 2) | add(e){this.top.children.push(e)}
method openNode (line 2) | openNode(e){const t={kind:e,children:[]};this.add(t),this.stack.push(t)}
method closeNode (line 2) | closeNode(){if(this.stack.length>1)return this.stack.pop()}
method closeAllNodes (line 2) | closeAllNodes(){for(;this.closeNode(););}
method toJSON (line 2) | toJSON(){return JSON.stringify(this.rootNode,null,4)}
method walk (line 2) | walk(e){return this.constructor._walk(e,this.rootNode)}
method _walk (line 2) | static _walk(e,t){return"string"==typeof t?e.addText(t):t.children&&(e...
method _collapse (line 2) | static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(...
function u (line 2) | function u(e){let t=!(arguments.length>1&&void 0!==arguments[1])||argume...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"applyDefaultValue",(e=>{const{on...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){this.props.value!==e.value&&e.valu...
method render (line 2) | render(){let{getComponent:e,errors:t}=this.props,{value:n}=this.state,...
method constructor (line 2) | constructor(e){super(),this.options=e}
method addKeyword (line 2) | addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNo...
method addText (line 2) | addText(e){""!==e&&this.add(e)}
method addSublanguage (line 2) | addSublanguage(e,t){const n=e.root;n.kind=t,n.sublanguage=!0,this.add(n)}
method toHTML (line 2) | toHTML(){return new l(this,this.options).value()}
method finalize (line 2) | finalize(){return!0}
method constructor (line 2) | constructor(e){this.elementMap={},this.elementDetection=[],this.Elemen...
method use (line 2) | use(e){return e.namespace&&e.namespace({base:this}),e.load&&e.load({ba...
method useDefault (line 2) | useDefault(){return this.register("null",c.NullElement).register("stri...
method register (line 2) | register(e,t){return this._elements=void 0,this.elementMap[e]=t,this}
method unregister (line 2) | unregister(e){return this._elements=void 0,delete this.elementMap[e],t...
method detect (line 2) | detect(e,t,n){return void 0===n||n?this.elementDetection.unshift([e,t]...
method toElement (line 2) | toElement(e){if(e instanceof this.Element)return e;let t;for(let n=0;n...
method getElementClass (line 2) | getElementClass(e){const t=this.elementMap[e];return void 0===t?this.E...
method fromRefract (line 2) | fromRefract(e){return this.serialiser.deserialise(e)}
method toRefract (line 2) | toRefract(e){return this.serialiser.serialise(e)}
method elements (line 2) | get elements(){return void 0===this._elements&&(this._elements={Elemen...
method serialiser (line 2) | get serialiser(){return new l(this)}
function p (line 2) | function p(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"onServerChange",(e=>{this....
method componentDidMount (line 2) | componentDidMount(){var e;let{servers:t,currentServer:n}=this.props;n|...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{servers:t,setServerVariableVal...
method render (line 2) | render(){var e,t;let{servers:n,currentServer:r,getServerVariable:o,get...
function a (line 2) | function a(){return{statePlugins:{layout:{reducers:r.default,actions:o,s...
function s (line 2) | function s(e){let{configs:t}=e;const n={debug:0,info:1,log:2,warn:3,erro...
method render (line 2) | render(){return a.createElement(B,{store:t},a.createElement(n,o()({},t...
method constructor (line 2) | constructor(e){this.elements=e||[]}
method toValue (line 2) | toValue(){return this.elements.map((e=>e.toValue()))}
method map (line 2) | map(e,t){return this.elements.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return e=o(e),new s(this.elements.filter(e,t))}
method reject (line 2) | reject(e,t){return e=o(e),new s(this.elements.filter(r(e),t))}
method find (line 2) | find(e,t){return e=o(e),this.elements.find(e,t)}
method forEach (line 2) | forEach(e,t){this.elements.forEach(e,t)}
method reduce (line 2) | reduce(e,t){return this.elements.reduce(e,t)}
method includes (line 2) | includes(e){return this.elements.some((t=>t.equals(e)))}
method shift (line 2) | shift(){return this.elements.shift()}
method unshift (line 2) | unshift(e){this.elements.unshift(this.refract(e))}
method push (line 2) | push(e){return this.elements.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method get (line 2) | get(e){return this.elements[e]}
method getValue (line 2) | getValue(e){const t=this.elements[e];if(t)return t.toValue()}
method length (line 2) | get length(){return this.elements.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.elements.length}
method first (line 2) | get first(){return this.elements[0]}
method map (line 2) | map(e,t){return this.elements.map((n=>e.bind(t)(n.value,n.key,n)))}
method filter (line 2) | filter(e,t){return new s(this.elements.filter((n=>e.bind(t)(n.value,n....
method reject (line 2) | reject(e,t){return this.filter(r(e.bind(t)))}
method forEach (line 2) | forEach(e,t){return this.elements.forEach(((n,r)=>{e.bind(t)(n.value,n...
method keys (line 2) | keys(){return this.map(((e,t)=>t.toValue()))}
method values (line 2) | values(){return this.map((e=>e.toValue()))}
function d (line 2) | function d(e,t){return{type:r,payload:{selectedServerUrl:e,namespace:t}}}
function m (line 2) | function m(e){let{value:t,pathMethod:n}=e;return{type:o,payload:{value:t...
function y (line 2) | function y(e){let{value:t,pathMethod:n,name:r}=e;return{type:i,payload:{...
method constructor (line 2) | constructor(){super(...arguments),m(this,g,{writable:!0,value:{...u.de...
method defaults (line 2) | get defaults(){return{...i()(this,g)}}
function v (line 2) | function v(e){let{name:t,pathMethod:n,contextType:r,contextName:o}=e;ret...
function b (line 2) | function b(e){let{value:t,pathMethod:n}=e;return{type:l,payload:{value:t...
method constructor (line 2) | constructor(){super(...arguments),y(this,v,{writable:!0,value:{"7bit":...
method defaults (line 2) | get defaults(){return{...i()(this,v)}}
function w (line 2) | function w(e){let{value:t,path:n,method:r}=e;return{type:c,payload:{valu...
function E (line 2) | function E(e){let{server:t,namespace:n,key:r,val:o}=e;return{type:u,payl...
method delete (line 2) | delete(e){const t=l()(u()(this).call(this)),n=h()(t).call(t,b(e));retu...
method get (line 2) | get(e){const t=l()(u()(this).call(this)),n=h()(t).call(t,b(e));return ...
method has (line 2) | has(e){const t=l()(u()(this).call(this));return-1!==d()(t).call(t,b(e))}
class h (line 2) | class h extends p.Component{constructor(e,t){super(e,t),o()(this,"onChan...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"getDefinitionUrl",(()=>{let{spec...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{getConfigs:t}=e,{validatorUrl:...
method render (line 2) | render(){let{getConfigs:e}=this.props,{spec:t}=e(),n=(0,u.Nm)(this.sta...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"onChange",(e=>{let{onChange:t}=t...
method getValue (line 2) | getValue(){let{name:e,authorized:t}=this.props;return t&&t.getIn([e,"v...
method render (line 2) | render(){var e;let{schema:t,getComponent:n,errSelectors:r,name:o}=this...
class l (line 2) | class l extends a.Component{render(){const{link:e,name:t,getComponent:n}...
method render (line 2) | render(){const{link:e,name:t,getComponent:n}=this.props,r=n("Markdown"...
method render (line 2) | render(){let{getConfigs:e,schema:t}=this.props,n=["model-box"],r=null;...
method render (line 2) | render(){return s.createElement(i,{targetName:a,getComponent:n,fn:r},s...
method constructor (line 2) | constructor(t,n){super(t,n),G(e,r,t,{})}
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(t){G(e,r,t,this.props)}
method render (line 2) | render(){const e=z()(this.props,r?i()(r):[]);return a.createElement(s,e)}
method constructor (line 2) | constructor(e,t){this.buffer="",this.classPrefix=t.classPrefix,e.walk(...
method addText (line 2) | addText(e){this.buffer+=s(e)}
method openNode (line 2) | openNode(e){if(!a(e))return;let t=e.kind;e.sublanguage||(t=`${this.cla...
method closeNode (line 2) | closeNode(e){a(e)&&(this.buffer+="</span>")}
method value (line 2) | value(){return this.buffer}
method span (line 2) | span(e){this.buffer+=`<span class="${e}">`}
class i (line 2) | class i extends s.Component{constructor(){super(...arguments),o()(this,"...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"setSelectedServer",(e=>{co...
method render (line 2) | render(){const{operationServers:e,pathServers:t,getComponent:n}=this.p...
method getDerivedStateFromError (line 2) | static getDerivedStateFromError(e){return{hasError:!0,error:e}}
method constructor (line 2) | constructor(){super(...arguments),this.state={hasError:!1,error:null}}
method componentDidCatch (line 2) | componentDidCatch(e,t){this.props.fn.componentDidCatch(e,t)}
method render (line 2) | render(){const{getComponent:e,targetName:t,children:n}=this.props;if(t...
method constructor (line 2) | constructor(e,t,n){super(e||[],t,n),this.element="array"}
method primitive (line 2) | primitive(){return"array"}
method get (line 2) | get(e){return this.content[e]}
method getValue (line 2) | getValue(e){const t=this.get(e);if(t)return t.toValue()}
method getIndex (line 2) | getIndex(e){return this.content[e]}
method set (line 2) | set(e,t){return this.content[e]=this.refract(t),this}
method remove (line 2) | remove(e){const t=this.content.splice(e,1);return t.length?t[0]:null}
method map (line 2) | map(e,t){return this.content.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return new s(this.content.filter(e,t))}
method reject (line 2) | reject(e,t){return this.filter(r(e),t)}
method reduce (line 2) | reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r="object"...
method forEach (line 2) | forEach(e,t){this.content.forEach(((n,r)=>{e.bind(t)(n,this.refract(r)...
method shift (line 2) | shift(){return this.content.shift()}
method unshift (line 2) | unshift(e){this.content.unshift(this.refract(e))}
method push (line 2) | push(e){return this.content.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method findElements (line 2) | findElements(e,t){const n=t||{},r=!!n.recursive,o=void 0===n.results?[...
method find (line 2) | find(e){return new s(this.findElements(e,{recursive:!0}))}
method findByElement (line 2) | findByElement(e){return this.find((t=>t.element===e))}
method findByClass (line 2) | findByClass(e){return this.find((t=>t.classes.includes(e)))}
method getById (line 2) | getById(e){return this.find((t=>t.id.toValue()===e)).first}
method includes (line 2) | includes(e){return this.content.some((t=>t.equals(e)))}
method contains (line 2) | contains(e){return this.includes(e)}
method empty (line 2) | empty(){return new this.constructor([])}
method "fantasy-land/empty" (line 2) | "fantasy-land/empty"(){return this.empty()}
method concat (line 2) | concat(e){return new this.constructor(this.content.concat(e.content))}
method "fantasy-land/concat" (line 2) | "fantasy-land/concat"(e){return this.concat(e)}
method "fantasy-land/map" (line 2) | "fantasy-land/map"(e){return new this.constructor(this.map(e))}
method "fantasy-land/chain" (line 2) | "fantasy-land/chain"(e){return this.map((t=>e(t)),this).reduce(((e,t)=...
method "fantasy-land/filter" (line 2) | "fantasy-land/filter"(e){return new this.constructor(this.content.filt...
method "fantasy-land/reduce" (line 2) | "fantasy-land/reduce"(e,t){return this.content.reduce(e,t)}
method length (line 2) | get length(){return this.content.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.content.length}
method first (line 2) | get first(){return this.getIndex(0)}
method second (line 2) | get second(){return this.getIndex(1)}
method last (line 2) | get last(){return this.getIndex(this.length-1)}
method constructor (line 2) | constructor(e,t,n){t&&(this.meta=t),n&&(this.attributes=n),this.conten...
method freeze (line 2) | freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,th...
method primitive (line 2) | primitive(){}
method clone (line 2) | clone(){const e=new this.constructor;return e.element=this.element,thi...
method toValue (line 2) | toValue(){return this.content instanceof i?this.content.toValue():this...
method toRef (line 2) | toRef(e){if(""===this.id.toValue())throw Error("Cannot create referenc...
method findRecursive (line 2) | findRecursive(...e){if(arguments.length>1&&!this.isFrozen)throw new Er...
method set (line 2) | set(e){return this.content=e,this}
method equals (line 2) | equals(e){return r(this.toValue(),e)}
method getMetaProperty (line 2) | getMetaProperty(e,t){if(!this.meta.hasKey(e)){if(this.isFrozen){const ...
method setMetaProperty (line 2) | setMetaProperty(e,t){this.meta.set(e,t)}
method element (line 2) | get element(){return this._storedElement||"element"}
method element (line 2) | set element(e){this._storedElement=e}
method content (line 2) | get content(){return this._content}
method content (line 2) | set content(e){if(e instanceof i)this._content=e;else if(e instanceof ...
method meta (line 2) | get meta(){if(!this._meta){if(this.isFrozen){const e=new this.ObjectEl...
method meta (line 2) | set meta(e){e instanceof this.ObjectElement?this._meta=e:this.meta.set...
method attributes (line 2) | get attributes(){if(!this._attributes){if(this.isFrozen){const e=new t...
method attributes (line 2) | set attributes(e){e instanceof this.ObjectElement?this._attributes=e:t...
method id (line 2) | get id(){return this.getMetaProperty("id","")}
method id (line 2) | set id(e){this.setMetaProperty("id",e)}
method classes (line 2) | get classes(){return this.getMetaProperty("classes",[])}
method classes (line 2) | set classes(e){this.setMetaProperty("classes",e)}
method title (line 2) | get title(){return this.getMetaProperty("title","")}
method title (line 2) | set title(e){this.setMetaProperty("title",e)}
method description (line 2) | get description(){return this.getMetaProperty("description","")}
method description (line 2) | set description(e){this.setMetaProperty("description",e)}
method links (line 2) | get links(){return this.getMetaProperty("links",[])}
method links (line 2) | set links(e){this.setMetaProperty("links",e)}
method isFrozen (line 2) | get isFrozen(){return Object.isFrozen(this)}
method parents (line 2) | get parents(){let{parent:e}=this;const t=new s;for(;e;)t.push(e),e=e.p...
method children (line 2) | get children(){if(Array.isArray(this.content))return new s(this.conten...
method recursiveChildren (line 2) | get recursiveChildren(){const e=new s;return this.children.forEach((t=...
class u (line 2) | class u extends s.PureComponent{constructor(e,t){super(e,t),o()(this,"ap...
method constructor (line 2) | constructor(e,t){super(e,t),o()(this,"applyDefaultValue",(e=>{const{on...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){this.props.value!==e.value&&e.valu...
method render (line 2) | render(){let{getComponent:e,errors:t}=this.props,{value:n}=this.state,...
method constructor (line 2) | constructor(e){super(),this.options=e}
method addKeyword (line 2) | addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNo...
method addText (line 2) | addText(e){""!==e&&this.add(e)}
method addSublanguage (line 2) | addSublanguage(e,t){const n=e.root;n.kind=t,n.sublanguage=!0,this.add(n)}
method toHTML (line 2) | toHTML(){return new l(this,this.options).value()}
method finalize (line 2) | finalize(){return!0}
method constructor (line 2) | constructor(e){this.elementMap={},this.elementDetection=[],this.Elemen...
method use (line 2) | use(e){return e.namespace&&e.namespace({base:this}),e.load&&e.load({ba...
method useDefault (line 2) | useDefault(){return this.register("null",c.NullElement).register("stri...
method register (line 2) | register(e,t){return this._elements=void 0,this.elementMap[e]=t,this}
method unregister (line 2) | unregister(e){return this._elements=void 0,delete this.elementMap[e],t...
method detect (line 2) | detect(e,t,n){return void 0===n||n?this.elementDetection.unshift([e,t]...
method toElement (line 2) | toElement(e){if(e instanceof this.Element)return e;let t;for(let n=0;n...
method getElementClass (line 2) | getElementClass(e){const t=this.elementMap[e];return void 0===t?this.E...
method fromRefract (line 2) | fromRefract(e){return this.serialiser.deserialise(e)}
method toRefract (line 2) | toRefract(e){return this.serialiser.serialise(e)}
method elements (line 2) | get elements(){return void 0===this._elements&&(this._elements={Elemen...
method serialiser (line 2) | get serialiser(){return new l(this)}
class o (line 2) | class o extends r.Component{render(){const{specSelectors:e,oas3Selectors...
method render (line 2) | render(){const{specSelectors:e,oas3Selectors:t,oas3Actions:n,getCompon...
method constructor (line 2) | constructor(e){void 0===e.data&&(e.data={}),this.data=e.data,this.isMa...
method ignoreMatch (line 2) | ignoreMatch(){this.isMatchIgnored=!0}
method constructor (line 2) | constructor(e){super(o._prepareSuperMessage(e)),Object.defineProperty(...
method _prepareSuperMessage (line 2) | static _prepareSuperMessage(e){try{return JSON.stringify(e)}catch{retu...
class p (line 2) | class p extends c.Component{constructor(){super(...arguments),o()(this,"...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"onServerChange",(e=>{this....
method componentDidMount (line 2) | componentDidMount(){var e;let{servers:t,currentServer:n}=this.props;n|...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{servers:t,setServerVariableVal...
method render (line 2) | render(){var e,t;let{servers:n,currentServer:r,getServerVariable:o,get...
function i (line 2) | function i(e){const t=e.get("openapi");return"string"==typeof t&&/^3\.0\...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"setSelectedServer",(e=>{co...
method render (line 2) | render(){const{operationServers:e,pathServers:t,getComponent:n}=this.p...
method getDerivedStateFromError (line 2) | static getDerivedStateFromError(e){return{hasError:!0,error:e}}
method constructor (line 2) | constructor(){super(...arguments),this.state={hasError:!1,error:null}}
method componentDidCatch (line 2) | componentDidCatch(e,t){this.props.fn.componentDidCatch(e,t)}
method render (line 2) | render(){const{getComponent:e,targetName:t,children:n}=this.props;if(t...
method constructor (line 2) | constructor(e,t,n){super(e||[],t,n),this.element="array"}
method primitive (line 2) | primitive(){return"array"}
method get (line 2) | get(e){return this.content[e]}
method getValue (line 2) | getValue(e){const t=this.get(e);if(t)return t.toValue()}
method getIndex (line 2) | getIndex(e){return this.content[e]}
method set (line 2) | set(e,t){return this.content[e]=this.refract(t),this}
method remove (line 2) | remove(e){const t=this.content.splice(e,1);return t.length?t[0]:null}
method map (line 2) | map(e,t){return this.content.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return new s(this.content.filter(e,t))}
method reject (line 2) | reject(e,t){return this.filter(r(e),t)}
method reduce (line 2) | reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r="object"...
method forEach (line 2) | forEach(e,t){this.content.forEach(((n,r)=>{e.bind(t)(n,this.refract(r)...
method shift (line 2) | shift(){return this.content.shift()}
method unshift (line 2) | unshift(e){this.content.unshift(this.refract(e))}
method push (line 2) | push(e){return this.content.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method findElements (line 2) | findElements(e,t){const n=t||{},r=!!n.recursive,o=void 0===n.results?[...
method find (line 2) | find(e){return new s(this.findElements(e,{recursive:!0}))}
method findByElement (line 2) | findByElement(e){return this.find((t=>t.element===e))}
method findByClass (line 2) | findByClass(e){return this.find((t=>t.classes.includes(e)))}
method getById (line 2) | getById(e){return this.find((t=>t.id.toValue()===e)).first}
method includes (line 2) | includes(e){return this.content.some((t=>t.equals(e)))}
method contains (line 2) | contains(e){return this.includes(e)}
method empty (line 2) | empty(){return new this.constructor([])}
method "fantasy-land/empty" (line 2) | "fantasy-land/empty"(){return this.empty()}
method concat (line 2) | concat(e){return new this.constructor(this.content.concat(e.content))}
method "fantasy-land/concat" (line 2) | "fantasy-land/concat"(e){return this.concat(e)}
method "fantasy-land/map" (line 2) | "fantasy-land/map"(e){return new this.constructor(this.map(e))}
method "fantasy-land/chain" (line 2) | "fantasy-land/chain"(e){return this.map((t=>e(t)),this).reduce(((e,t)=...
method "fantasy-land/filter" (line 2) | "fantasy-land/filter"(e){return new this.constructor(this.content.filt...
method "fantasy-land/reduce" (line 2) | "fantasy-land/reduce"(e,t){return this.content.reduce(e,t)}
method length (line 2) | get length(){return this.content.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.content.length}
method first (line 2) | get first(){return this.getIndex(0)}
method second (line 2) | get second(){return this.getIndex(1)}
method last (line 2) | get last(){return this.getIndex(this.length-1)}
method constructor (line 2) | constructor(e,t,n){t&&(this.meta=t),n&&(this.attributes=n),this.conten...
method freeze (line 2) | freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,th...
method primitive (line 2) | primitive(){}
method clone (line 2) | clone(){const e=new this.constructor;return e.element=this.element,thi...
method toValue (line 2) | toValue(){return this.content instanceof i?this.content.toValue():this...
method toRef (line 2) | toRef(e){if(""===this.id.toValue())throw Error("Cannot create referenc...
method findRecursive (line 2) | findRecursive(...e){if(arguments.length>1&&!this.isFrozen)throw new Er...
method set (line 2) | set(e){return this.content=e,this}
method equals (line 2) | equals(e){return r(this.toValue(),e)}
method getMetaProperty (line 2) | getMetaProperty(e,t){if(!this.meta.hasKey(e)){if(this.isFrozen){const ...
method setMetaProperty (line 2) | setMetaProperty(e,t){this.meta.set(e,t)}
method element (line 2) | get element(){return this._storedElement||"element"}
method element (line 2) | set element(e){this._storedElement=e}
method content (line 2) | get content(){return this._content}
method content (line 2) | set content(e){if(e instanceof i)this._content=e;else if(e instanceof ...
method meta (line 2) | get meta(){if(!this._meta){if(this.isFrozen){const e=new this.ObjectEl...
method meta (line 2) | set meta(e){e instanceof this.ObjectElement?this._meta=e:this.meta.set...
method attributes (line 2) | get attributes(){if(!this._attributes){if(this.isFrozen){const e=new t...
method attributes (line 2) | set attributes(e){e instanceof this.ObjectElement?this._attributes=e:t...
method id (line 2) | get id(){return this.getMetaProperty("id","")}
method id (line 2) | set id(e){this.setMetaProperty("id",e)}
method classes (line 2) | get classes(){return this.getMetaProperty("classes",[])}
method classes (line 2) | set classes(e){this.setMetaProperty("classes",e)}
method title (line 2) | get title(){return this.getMetaProperty("title","")}
method title (line 2) | set title(e){this.setMetaProperty("title",e)}
method description (line 2) | get description(){return this.getMetaProperty("description","")}
method description (line 2) | set description(e){this.setMetaProperty("description",e)}
method links (line 2) | get links(){return this.getMetaProperty("links",[])}
method links (line 2) | set links(e){this.setMetaProperty("links",e)}
method isFrozen (line 2) | get isFrozen(){return Object.isFrozen(this)}
method parents (line 2) | get parents(){let{parent:e}=this;const t=new s;for(;e;)t.push(e),e=e.p...
method children (line 2) | get children(){if(Array.isArray(this.content))return new s(this.conten...
method recursiveChildren (line 2) | get recursiveChildren(){const e=new s;return this.children.forEach((t=...
function a (line 2) | function a(e){const t=e.get("swagger");return"string"==typeof t&&"2.0"===t}
function l (line 2) | function l(e){return(t,n)=>r=>{var i;return"function"==typeof(null===(i=...
method render (line 2) | render(){const{link:e,name:t,getComponent:n}=this.props,r=n("Markdown"...
method render (line 2) | render(){let{getConfigs:e,schema:t}=this.props,n=["model-box"],r=null;...
method render (line 2) | render(){return s.createElement(i,{targetName:a,getComponent:n,fn:r},s...
method constructor (line 2) | constructor(t,n){super(t,n),G(e,r,t,{})}
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(t){G(e,r,t,this.props)}
method render (line 2) | render(){const e=z()(this.props,r?i()(r):[]);return a.createElement(s,e)}
method constructor (line 2) | constructor(e,t){this.buffer="",this.classPrefix=t.classPrefix,e.walk(...
method addText (line 2) | addText(e){this.buffer+=s(e)}
method openNode (line 2) | openNode(e){if(!a(e))return;let t=e.kind;e.sublanguage||(t=`${this.cla...
method closeNode (line 2) | closeNode(e){a(e)&&(this.buffer+="</span>")}
method value (line 2) | value(){return this.buffer}
method span (line 2) | span(e){this.buffer+=`<span class="${e}">`}
function c (line 2) | function c(e){return(t,n)=>r=>{var i;return"function"==typeof(null===(i=...
method constructor (line 2) | constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}
method top (line 2) | get top(){return this.stack[this.stack.length-1]}
method root (line 2) | get root(){return this.rootNode}
method add (line 2) | add(e){this.top.children.push(e)}
method openNode (line 2) | openNode(e){const t={kind:e,children:[]};this.add(t),this.stack.push(t)}
method closeNode (line 2) | closeNode(){if(this.stack.length>1)return this.stack.pop()}
method closeAllNodes (line 2) | closeAllNodes(){for(;this.closeNode(););}
method toJSON (line 2) | toJSON(){return JSON.stringify(this.rootNode,null,4)}
method walk (line 2) | walk(e){return this.constructor._walk(e,this.rootNode)}
method _walk (line 2) | static _walk(e,t){return"string"==typeof t?e.addText(t):t.children&&(e...
method _collapse (line 2) | static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(...
function p (line 2) | function p(){return{components:i.default,wrapComponents:a.default,stateP...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"onServerChange",(e=>{this....
method componentDidMount (line 2) | componentDidMount(){var e;let{servers:t,currentServer:n}=this.props;n|...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){let{servers:t,setServerVariableVal...
method render (line 2) | render(){var e,t;let{servers:n,currentServer:r,getServerVariable:o,get...
function b (line 2) | function b(e){return function(t){for(var n=arguments.length,r=new Array(...
method constructor (line 2) | constructor(){super(...arguments),y(this,v,{writable:!0,value:{"7bit":...
method defaults (line 2) | get defaults(){return{...i()(this,v)}}
function a (line 2) | function a(e){return(t,n)=>function(){if(n.getSystem().specSelectors.isO...
class l (line 2) | class l extends s.Component{render(){let{getConfigs:e,schema:t}=this.pro...
method render (line 2) | render(){const{link:e,name:t,getComponent:n}=this.props,r=n("Markdown"...
method render (line 2) | render(){let{getConfigs:e,schema:t}=this.props,n=["model-box"],r=null;...
method render (line 2) | render(){return s.createElement(i,{targetName:a,getComponent:n,fn:r},s...
method constructor (line 2) | constructor(t,n){super(t,n),G(e,r,t,{})}
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(t){G(e,r,t,this.props)}
method render (line 2) | render(){const e=z()(this.props,r?i()(r):[]);return a.createElement(s,e)}
method constructor (line 2) | constructor(e,t){this.buffer="",this.classPrefix=t.classPrefix,e.walk(...
method addText (line 2) | addText(e){this.buffer+=s(e)}
method openNode (line 2) | openNode(e){if(!a(e))return;let t=e.kind;e.sublanguage||(t=`${this.cla...
method closeNode (line 2) | closeNode(e){a(e)&&(this.buffer+="</span>")}
method value (line 2) | value(){return this.buffer}
method span (line 2) | span(e){this.buffer+=`<span class="${e}">`}
function i (line 2) | function i(){return{statePlugins:{spec:{wrapActions:{updateSpec:e=>funct...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"setSelectedServer",(e=>{co...
method render (line 2) | render(){const{operationServers:e,pathServers:t,getComponent:n}=this.p...
method getDerivedStateFromError (line 2) | static getDerivedStateFromError(e){return{hasError:!0,error:e}}
method constructor (line 2) | constructor(){super(...arguments),this.state={hasError:!1,error:null}}
method componentDidCatch (line 2) | componentDidCatch(e,t){this.props.fn.componentDidCatch(e,t)}
method render (line 2) | render(){const{getComponent:e,targetName:t,children:n}=this.props;if(t...
method constructor (line 2) | constructor(e,t,n){super(e||[],t,n),this.element="array"}
method primitive (line 2) | primitive(){return"array"}
method get (line 2) | get(e){return this.content[e]}
method getValue (line 2) | getValue(e){const t=this.get(e);if(t)return t.toValue()}
method getIndex (line 2) | getIndex(e){return this.content[e]}
method set (line 2) | set(e,t){return this.content[e]=this.refract(t),this}
method remove (line 2) | remove(e){const t=this.content.splice(e,1);return t.length?t[0]:null}
method map (line 2) | map(e,t){return this.content.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return new s(this.content.filter(e,t))}
method reject (line 2) | reject(e,t){return this.filter(r(e),t)}
method reduce (line 2) | reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r="object"...
method forEach (line 2) | forEach(e,t){this.content.forEach(((n,r)=>{e.bind(t)(n,this.refract(r)...
method shift (line 2) | shift(){return this.content.shift()}
method unshift (line 2) | unshift(e){this.content.unshift(this.refract(e))}
method push (line 2) | push(e){return this.content.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method findElements (line 2) | findElements(e,t){const n=t||{},r=!!n.recursive,o=void 0===n.results?[...
method find (line 2) | find(e){return new s(this.findElements(e,{recursive:!0}))}
method findByElement (line 2) | findByElement(e){return this.find((t=>t.element===e))}
method findByClass (line 2) | findByClass(e){return this.find((t=>t.classes.includes(e)))}
method getById (line 2) | getById(e){return this.find((t=>t.id.toValue()===e)).first}
method includes (line 2) | includes(e){return this.content.some((t=>t.equals(e)))}
method contains (line 2) | contains(e){return this.includes(e)}
method empty (line 2) | empty(){return new this.constructor([])}
method "fantasy-land/empty" (line 2) | "fantasy-land/empty"(){return this.empty()}
method concat (line 2) | concat(e){return new this.constructor(this.content.concat(e.content))}
method "fantasy-land/concat" (line 2) | "fantasy-land/concat"(e){return this.concat(e)}
method "fantasy-land/map" (line 2) | "fantasy-land/map"(e){return new this.constructor(this.map(e))}
method "fantasy-land/chain" (line 2) | "fantasy-land/chain"(e){return this.map((t=>e(t)),this).reduce(((e,t)=...
method "fantasy-land/filter" (line 2) | "fantasy-land/filter"(e){return new this.constructor(this.content.filt...
method "fantasy-land/reduce" (line 2) | "fantasy-land/reduce"(e,t){return this.content.reduce(e,t)}
method length (line 2) | get length(){return this.content.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.content.length}
method first (line 2) | get first(){return this.getIndex(0)}
method second (line 2) | get second(){return this.getIndex(1)}
method last (line 2) | get last(){return this.getIndex(this.length-1)}
method constructor (line 2) | constructor(e,t,n){t&&(this.meta=t),n&&(this.attributes=n),this.conten...
method freeze (line 2) | freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,th...
method primitive (line 2) | primitive(){}
method clone (line 2) | clone(){const e=new this.constructor;return e.element=this.element,thi...
method toValue (line 2) | toValue(){return this.content instanceof i?this.content.toValue():this...
method toRef (line 2) | toRef(e){if(""===this.id.toValue())throw Error("Cannot create referenc...
method findRecursive (line 2) | findRecursive(...e){if(arguments.length>1&&!this.isFrozen)throw new Er...
method set (line 2) | set(e){return this.content=e,this}
method equals (line 2) | equals(e){return r(this.toValue(),e)}
method getMetaProperty (line 2) | getMetaProperty(e,t){if(!this.meta.hasKey(e)){if(this.isFrozen){const ...
method setMetaProperty (line 2) | setMetaProperty(e,t){this.meta.set(e,t)}
method element (line 2) | get element(){return this._storedElement||"element"}
method element (line 2) | set element(e){this._storedElement=e}
method content (line 2) | get content(){return this._content}
method content (line 2) | set content(e){if(e instanceof i)this._content=e;else if(e instanceof ...
method meta (line 2) | get meta(){if(!this._meta){if(this.isFrozen){const e=new this.ObjectEl...
method meta (line 2) | set meta(e){e instanceof this.ObjectElement?this._meta=e:this.meta.set...
method attributes (line 2) | get attributes(){if(!this._attributes){if(this.isFrozen){const e=new t...
method attributes (line 2) | set attributes(e){e instanceof this.ObjectElement?this._attributes=e:t...
method id (line 2) | get id(){return this.getMetaProperty("id","")}
method id (line 2) | set id(e){this.setMetaProperty("id",e)}
method classes (line 2) | get classes(){return this.getMetaProperty("classes",[])}
method classes (line 2) | set classes(e){this.setMetaProperty("classes",e)}
method title (line 2) | get title(){return this.getMetaProperty("title","")}
method title (line 2) | set title(e){this.setMetaProperty("title",e)}
method description (line 2) | get description(){return this.getMetaProperty("description","")}
method description (line 2) | set description(e){this.setMetaProperty("description",e)}
method links (line 2) | get links(){return this.getMetaProperty("links",[])}
method links (line 2) | set links(e){this.setMetaProperty("links",e)}
method isFrozen (line 2) | get isFrozen(){return Object.isFrozen(this)}
method parents (line 2) | get parents(){let{parent:e}=this;const t=new s;for(;e;)t.push(e),e=e.p...
method children (line 2) | get children(){if(Array.isArray(this.content))return new s(this.conten...
method recursiveChildren (line 2) | get recursiveChildren(){const e=new s;return this.children.forEach((t=...
class i (line 2) | class i extends r.Component{static getDerivedStateFromError(e){return{ha...
method constructor (line 2) | constructor(){super(...arguments),o()(this,"setSelectedServer",(e=>{co...
method render (line 2) | render(){const{operationServers:e,pathServers:t,getComponent:n}=this.p...
method getDerivedStateFromError (line 2) | static getDerivedStateFromError(e){return{hasError:!0,error:e}}
method constructor (line 2) | constructor(){super(...arguments),this.state={hasError:!1,error:null}}
method componentDidCatch (line 2) | componentDidCatch(e,t){this.props.fn.componentDidCatch(e,t)}
method render (line 2) | render(){const{getComponent:e,targetName:t,children:n}=this.props;if(t...
method constructor (line 2) | constructor(e,t,n){super(e||[],t,n),this.element="array"}
method primitive (line 2) | primitive(){return"array"}
method get (line 2) | get(e){return this.content[e]}
method getValue (line 2) | getValue(e){const t=this.get(e);if(t)return t.toValue()}
method getIndex (line 2) | getIndex(e){return this.content[e]}
method set (line 2) | set(e,t){return this.content[e]=this.refract(t),this}
method remove (line 2) | remove(e){const t=this.content.splice(e,1);return t.length?t[0]:null}
method map (line 2) | map(e,t){return this.content.map(e,t)}
method flatMap (line 2) | flatMap(e,t){return this.map(e,t).reduce(((e,t)=>e.concat(t)),[])}
method compactMap (line 2) | compactMap(e,t){const n=[];return this.forEach((r=>{const o=e.bind(t)(...
method filter (line 2) | filter(e,t){return new s(this.content.filter(e,t))}
method reject (line 2) | reject(e,t){return this.filter(r(e),t)}
method reduce (line 2) | reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r="object"...
method forEach (line 2) | forEach(e,t){this.content.forEach(((n,r)=>{e.bind(t)(n,this.refract(r)...
method shift (line 2) | shift(){return this.content.shift()}
method unshift (line 2) | unshift(e){this.content.unshift(this.refract(e))}
method push (line 2) | push(e){return this.content.push(this.refract(e)),this}
method add (line 2) | add(e){this.push(e)}
method findElements (line 2) | findElements(e,t){const n=t||{},r=!!n.recursive,o=void 0===n.results?[...
method find (line 2) | find(e){return new s(this.findElements(e,{recursive:!0}))}
method findByElement (line 2) | findByElement(e){return this.find((t=>t.element===e))}
method findByClass (line 2) | findByClass(e){return this.find((t=>t.classes.includes(e)))}
method getById (line 2) | getById(e){return this.find((t=>t.id.toValue()===e)).first}
method includes (line 2) | includes(e){return this.content.some((t=>t.equals(e)))}
method contains (line 2) | contains(e){return this.includes(e)}
method empty (line 2) | empty(){return new this.constructor([])}
method "fantasy-land/empty" (line 2) | "fantasy-land/empty"(){return this.empty()}
method concat (line 2) | concat(e){return new this.constructor(this.content.concat(e.content))}
method "fantasy-land/concat" (line 2) | "fantasy-land/concat"(e){return this.concat(e)}
method "fantasy-land/map" (line 2) | "fantasy-land/map"(e){return new this.constructor(this.map(e))}
method "fantasy-land/chain" (line 2) | "fantasy-land/chain"(e){return this.map((t=>e(t)),this).reduce(((e,t)=...
method "fantasy-land/filter" (line 2) | "fantasy-land/filter"(e){return new this.constructor(this.content.filt...
method "fantasy-land/reduce" (line 2) | "fantasy-land/reduce"(e,t){return this.content.reduce(e,t)}
method length (line 2) | get length(){return this.content.length}
method isEmpty (line 2) | get isEmpty(){return 0===this.content.length}
method first (line 2) | get first(){return this.getIndex(0)}
method second (line 2) | get second(){return this.getIndex(1)}
method last (line 2) | get last(){return this.getIndex(this.length-1)}
method constructor (line 2) | constructor(e,t,n){t&&(this.meta=t),n&&(this.attributes=n),this.conten...
method freeze (line 2) | freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,th...
method primitive (line 2) | primitive(){}
method clone (line 2) | clone(){const e=new this.constructor;return e.element=this.element,thi...
method toValue (line 2) | toValue(){return this.content instanceof i?this.content.toValue():this...
method toRef (line 2) | toRef(e){if(""===this.id.toValue())throw Error("Cannot create referenc...
method findRecursive (line 2) | findRecursive(...e){if(arguments.length>1&&!this.isFrozen)throw new Er...
method set (line 2) | set(e){return this.content=e,this}
method equals (line 2) | equals(e){return r(this.toValue(),e)}
method getMetaProperty (line 2) | getMetaProperty(e,t){if(!this.meta.hasKey(e)){if(this.isFrozen){const ...
method setMetaProperty (line 2) | setMetaProperty(e,t){this.meta.set(e,t)}
method element (line 2) | get element(){return this._storedElement||"element"}
method element (line 2) | set element(e){this._storedElement=e}
method content (line 2) | get content(){return this._content}
method content (line 2) | set content(e){if(e instanceof i)this._content=e;else if(e instanceof ...
method meta (line 2) | get meta(){if(!this._meta){if(this.isFrozen){const e=new this.ObjectEl...
method meta (line 2) | set meta(e){e instanceof this.ObjectElement?this._meta=e:this.meta.set...
method attributes (line 2) | get attributes(){if(!this._attributes){if(this.isFrozen){const e=new t...
method attributes (line 2) | set attributes(e){e instanceof this.ObjectElement?this._attributes=e:t...
method id (line 2) | get id(){return this.getMetaProperty("id","")}
method id (line 2) | set id(e){this.setMetaProperty("id",e)}
method classes (line 2) | get classes(){return this.getMetaProperty("classes",[])}
method classes (line 2) | set classes(e){this.setMetaProperty("classes",e)}
method title (line 2) | get title(){return this.getMetaProperty("title","")}
method title (line 2) | set title(e){this.setMetaProperty("title",e)}
method description (line 2) | get description(){return this.getMetaProperty("description","")}
method description (line 2) | set description(e){this.setMetaProperty("description",e)}
method links (line 2) | get links(){return this.getMetaProperty("links",[])}
method links (line 2) | set links(e){this.setMetaProperty("links",e)}
method isFrozen (line 2) | get isFrozen(){return Object.isFrozen(this)}
method parents (line 2) | get parents(){let{parent:e}=this;const t=new s;for(;e;)t.push(e),e=e.p...
method children (line 2) | get children(){if(Array.isArray(this.content))return new s(this.conten...
method recursiveChildren (line 2) | get recursiveChildren(){const e=new s;return this.children.forEach((t=...
class l (line 2) | class l extends s.Component{render(){return s.createElement(i,{targetNam...
method render (line 2) | render(){const{link:e,name:t,getComponent:n}=this.props,r=n("Markdown"...
method render (line 2) | render(){let{getConfigs:e,schema:t}=this.props,n=["model-box"],r=null;...
method render (line 2) | render(){return s.createElement(i,{targetName:a,getComponent:n,fn:r},s...
method constructor (line 2) | constructor(t,n){super(t,n),G(e,r,t,{})}
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(t){G(e,r,t,this.props)}
method render (line 2) | render(){const e=z()(this.props,r?i()(r):[]);return a.createElement(s,e)}
method constructor (line 2) | constructor(e,t){this.buffer="",this.classPrefix=t.classPrefix,e.walk(...
method addText (line 2) | addText(e){this.buffer+=s(e)}
method openNode (line 2) | openNode(e){if(!a(e))return;let t=e.kind;e.sublanguage||(t=`${this.cla...
method closeNode (line 2) | closeNode(e){a(e)&&(this.buffer+="</span>")}
method value (line 2) | value(){return this.buffer}
method span (line 2) | span(e){this.buffer+=`<span class="${e}">`}
function ae (line 2) | function ae(e){const t=ie(e).replace(/\t/g," ");if("string"==typeof e)r...
function le (line 2) | function le(e){return{type:re,payload:e}}
function ce (line 2) | function ce(e){return{type:V,payload:e}}
function ue (line 2) | function ue(e){return{type:W,payload:e}}
function ye (line 2) | function ye(e,t,n,r,o){return{type:J,payload:{path:e,value:r,paramName:t...
method constructor (line 2) | constructor(){super(...arguments),le()(this,"onClick",(e=>{e.stopPropa...
method render (line 2) | render(){let{isAuthorized:e}=this.props;return A.createElement("button...
function ve (line 2) | function ve(e,t,n,r){return{type:J,payload:{path:e,param:t,value:n,isXml...
method constructor (line 2) | constructor(e,t){super(e,t),le()(this,"onAuthChange",(e=>{let{name:t}=...
method render (line 2) | render(){var e;let{definitions:t,getComponent:n,authSelectors:r,errSel...
function Se (line 2) | function Se(e){return{type:te,payload:{pathMethod:e}}}
function _e (line 2) | function _e(e,t){return{type:ne,payload:{path:e,value:t,key:"consumes_va...
function je (line 2) | function je(e,t){return{type:ne,payload:{path:e,value:t,key:"produces_va...
function Ie (line 2) | function Ie(e,t){return{type:Q,payload:{path:e,method:t}}}
function Te (line 2) | function Te(e,t){return{type:ee,payload:{path:e,method:t}}}
function Re (line 2) | function Re(e,t,n){return{type:se,payload:{scheme:e,path:t,method:n}}}
function a (line 2) | function a(){return{statePlugins:{spec:{wrapActions:i,reducers:r.default...
function ve (line 2) | function ve(e,t,n,r){t=t||[];let o=e.getIn(["meta","paths",...t,"paramet...
method constructor (line 2) | constructor(e,t){super(e,t),le()(this,"onAuthChange",(e=>{let{name:t}=...
method render (line 2) | render(){var e;let{definitions:t,getComponent:n,authSelectors:r,errSel...
function we (line 2) | function we(e,t,n){t=t||[];let r=ye(e,...t).get("parameters",(0,j.List)(...
method render (line 2) | render(){let{error:e}=this.props,t=e.get("level"),n=e.get("message"),r...
function Ee (line 2) | function Ee(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments...
method constructor (line 2) | constructor(e,t){super(e,t),le()(this,"onChange",(e=>{let{onChange:t}=...
method getValue (line 2) | getValue(){let{name:e,authorized:t}=this.props;return t&&t.getIn([e,"v...
method render (line 2) | render(){var e,t;let{schema:n,getComponent:r,errSelectors:o,name:s}=th...
function xe (line 2) | function xe(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments...
method constructor (line 2) | constructor(e,t){super(e,t),le()(this,"onChange",(e=>{let{onChange:t}=...
method getValue (line 2) | getValue(){let{authorized:e,name:t}=this.props;return e&&e.getIn([t,"v...
method render (line 2) | render(){var e,t;let{schema:n,getComponent:r,name:o,errSelectors:s}=th...
function Se (line 2) | function Se(e,t){t=t||[];let n=F(e).getIn(["paths",...t],(0,j.fromJS)({}...
function _e (line 2) | function _e(e,t){t=t||[];const n=F(e).getIn(["paths",...t],null);if(null...
function je (line 2) | function je(e,t){t=t||[];const n=F(e),r=n.getIn(["paths",...t],null);if(...
function Oe (line 2) | function Oe(e,t){t=t||[];const n=F(e),r=n.getIn(["paths",...t],null);if(...
method constructor (line 2) | constructor(){var e;super(...arguments),e=this,le()(this,"_onSelect",(...
method componentDidMount (line 2) | componentDidMount(){const{onSelect:e,examples:t}=this.props;if("functi...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){const{currentExampleKey:t,examples...
method render (line 2) | render(){const{examples:e,currentExampleKey:t,isValueModified:n,isModi...
function Te (line 2) | function Te(e){return j.Map.isMap(e)?e:new j.Map}
function n (line 2) | function n(){this.constructor=e}
method constructor (line 2) | constructor(e,t){this.ranges=[],this.length=0,null!=e&&this.add(e,t)}
method _update_length (line 2) | _update_length(){this.length=this.ranges.reduce(((e,t)=>e+t.length),0)}
method add (line 2) | add(e,r){var o=e=>{for(var t=0;t<this.ranges.length&&!e.touches(this.r...
method subtract (line 2) | subtract(e,r){var o=e=>{for(var t=0;t<this.ranges.length&&!e.overlaps(...
method intersect (line 2) | intersect(e,r){var o=[],s=e=>{for(var n=0;n<this.ranges.length&&!e.ove...
method index (line 2) | index(e){for(var t=0;t<this.ranges.length&&this.ranges[t].length<=e;)e...
method toString (line 2) | toString(){return"[ "+this.ranges.join(", ")+" ]"}
method clone (line 2) | clone(){return new n(this)}
method numbers (line 2) | numbers(){return this.ranges.reduce(((e,t)=>{for(var n=t.low;n<=t.high...
method subranges (line 2) | subranges(){return this.ranges.map((e=>({low:e.low,high:e.high,length:...
function g (line 2) | function g(e,t){return m.call(e,t)}
function y (line 2) | function y(e){if(Array.isArray(e)){for(var t=new Array(e.length),n=0;n<t...
method constructor (line 2) | constructor(){super(...arguments),m(this,g,{writable:!0,value:{...u.de...
method defaults (line 2) | get defaults(){return{...i()(this,g)}}
function v (line 2) | function v(e){switch(typeof e){case"object":return JSON.parse(JSON.strin...
function b (line 2) | function b(e){for(var t,n=0,r=e.length;n<r;){if(!((t=e.charCodeAt(n))>=4...
method constructor (line 2) | constructor(){super(...arguments),y(this,v,{writable:!0,value:{"7bit":...
method defaults (line 2) | get defaults(){return{...i()(this,v)}}
function w (line 2) | function w(e){return-1===e.indexOf("/")&&-1===e.indexOf("~")?e:e.replace...
function E (line 2) | function E(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")}
method delete (line 2) | delete(e){const t=l()(u()(this).call(this)),n=h()(t).call(t,b(e));retu...
method get (line 2) | get(e){const t=l()(u()(this).call(this)),n=h()(t).call(t,b(e));return ...
method has (line 2) | has(e){const t=l()(u()(this).call(this));return-1!==d()(t).call(t,b(e))}
function x (line 2) | function x(e){if(void 0===e)return!0;if(e)if(Array.isArray(e)){for(var t...
function S (line 2) | function S(e,t){var n=[e];for(var r in t){var o="object"==typeof t[r]?JS...
function t (line 2) | function t(t,n,r,o,s){var i=this.constructor,a=e.call(this,S(t,{name:n,i...
method constructor (line 2) | constructor(e,t){this.low=e,this.high=t,this.length=1+t-e}
method overlaps (line 2) | overlaps(e){return!(this.high<e.low||this.low>e.high)}
method touches (line 2) | touches(e){return!(this.high+1<e.low||this.low-1>e.high)}
method add (line 2) | add(e){return new t(Math.min(this.low,e.low),Math.max(this.high,e.high))}
method subtract (line 2) | subtract(e){return e.low<=this.low&&e.high>=this.high?[]:e.low>this.lo...
method toString (line 2) | toString(){return this.low==this.high?this.low.toString():this.low+"-"...
method constructor (line 2) | constructor(e,t){this.key=e,this.value=t}
method clone (line 2) | clone(){const e=new t;return this.key&&(e.key=this.key.clone()),this.v...
function C (line 2) | function C(e,t){if(""==t)return e;var n={op:"_get",path:t};return P(e,n)...
function P (line 2) | function P(e,t,n,r,o,s){if(void 0===n&&(n=!1),void 0===r&&(r=!0),void 0=...
method constructor (line 2) | constructor(){super(...arguments),i()(this,"getModelName",(e=>-1!==l()...
method render (line 2) | render(){let{getComponent:e,getConfigs:t,specSelectors:r,schema:s,requ...
function N (line 2) | function N(e,t,n,r,o){if(void 0===r&&(r=!0),void 0===o&&(o=!0),n&&!Array...
function I (line 2) | function I(e,t,n){var r=P(e,t);if(!1===r.test)throw new j("Test operatio...
function T (line 2) | function T(e,t,n,r){if("object"!=typeof e||null===e||Array.isArray(e))th...
function R (line 2) | function R(e,t,n){try{if(!Array.isArray(e))throw new j("Patch sequence m...
function M (line 2) | function M(e,t){if(e===t)return!0;if(e&&t&&"object"==typeof e&&"object"=...
function B (line 2) | function B(e,t){t.unobserve()}
function $ (line 2) | function $(e,t){var n,r=function(e){return D.get(e)}(e);if(r){var o=func...
method constructor (line 2) | constructor(){var e;let t=arguments.length>0&&void 0!==arguments[0]?ar...
method getStore (line 2) | getStore(){return this.store}
method register (line 2) | register(e){let t=!(arguments.length>1&&void 0!==arguments[1])||argume...
method buildSystem (line 2) | buildSystem(){let e=!(arguments.length>0&&void 0!==arguments[0])||argu...
method _getSystem (line 2) | _getSystem(){return this.boundSystem}
method getRootInjects (line 2) | getRootInjects(){var e,t,n;return y()({getSystem:this.getSystem,getSto...
method _getConfigs (line 2) | _getConfigs(){return this.system.configs}
method getConfigs (line 2) | getConfigs(){return{configs:this.system.configs}}
method setConfigs (line 2) | setConfigs(e){this.system.configs=e}
method rebuildReducer (line 2) | rebuildReducer(){var e;this.store.replaceReducer((e=this.system.stateP...
method getType (line 2) | getType(e){let t=e[0].toUpperCase()+b()(e).call(e,1);return(0,L.Q2)(th...
method getSelectors (line 2) | getSelectors(){return this.getType("selectors")}
method getActions (line 2) | getActions(){let e=this.getType("actions");return(0,L.Ay)(e,(e=>(0,L.Q...
method getWrappedAndBoundActions (line 2) | getWrappedAndBoundActions(e){var t=this;let n=this.getBoundActions(e);...
method getWrappedAndBoundSelectors (line 2) | getWrappedAndBoundSelectors(e,t){var n=this;let r=this.getBoundSelecto...
method getStates (line 2) | getStates(e){var t;return S()(t=c()(this.system.statePlugins)).call(t,...
method getStateThunks (line 2) | getStateThunks(e){var t;return S()(t=c()(this.system.statePlugins)).ca...
method getFn (line 2) | getFn(){return{fn:this.system.fn}}
method getComponents (line 2) | getComponents(e){const t=this.system.components[e];return E()(t)?S()(t...
method getBoundSelectors (line 2) | getBoundSelectors(e,t){return(0,L.Ay)(this.getSelectors(),((n,r)=>{let...
method getBoundActions (line 2) | getBoundActions(e){e=e||this.getStore().dispatch;const t=this.getActio...
method getMapStateToProps (line 2) | getMapStateToProps(){return()=>y()({},this.getSystem())}
method getMapDispatchToProps (line 2) | getMapDispatchToProps(e){return t=>f()({},this.getWrappedAndBoundActio...
function q (line 2) | function q(e,t){void 0===t&&(t=!1);var n=D.get(e.object);U(n.value,e.obj...
function U (line 2) | function U(e,t,n,r,o){if(t!==e){"function"==typeof t.toJSON&&(t=t.toJSON...
function z (line 2) | function z(e,t,n){void 0===n&&(n=!1);var r=[];return U(e,t,r,"",n),r}
function K (line 2) | function K(e){return Array.isArray(e)?e.length<1?"":`/${e.map((e=>(e+"")...
function H (line 2) | function H(e,t,n){return{op:"replace",path:e,value:t,meta:n}}
function G (line 2) | function G(e,t,n){return ee(Q(e.filter(se).map((e=>t(e.value,n,e.path)))...
function Z (line 2) | function Z(e,t,n){return n=n||[],Array.isArray(e)?e.map(((e,r)=>Z(e,t,n....
function Y (line 2) | function Y(e,t,n){let r=[];if((n=n||[]).length>0){const o=t(e,n[n.length...
function X (line 2) | function X(e){return Array.isArray(e)?e:[e]}
function Q (line 2) | function Q(e){return[].concat(...e.map((e=>Array.isArray(e)?Q(e):e)))}
function ee (line 2) | function ee(e){return e.filter((e=>void 0!==e))}
function te (line 2) | function te(e){return e&&"object"==typeof e}
function ne (line 2) | function ne(e){return e&&"function"==typeof e}
function re (line 2) | function re(e){if(ie(e)){const{op:t}=e;return"add"===t||"remove"===t||"r...
function oe (line 2) | function oe(e){return re(e)||ie(e)&&"mutation"===e.type}
function se (line 2) | function se(e){return oe(e)&&("add"===e.op||"replace"===e.op||"merge"===...
function ie (line 2) | function ie(e){return e&&"object"==typeof e}
function ae (line 2) | function ae(e,t){try{return C(e,t)}catch(e){return console.error(e),{}}}
function ue (line 2) | function ue(e,t){function n(){Error.captureStackTrace?Error.captureStack...
function ye (line 2) | function ye(e){const t=e[e.length-1],n=e[e.length-2],r=e.join("/");retur...
method constructor (line 2) | constructor(){super(...arguments),le()(this,"onClick",(e=>{e.stopPropa...
method render (line 2) | render(){let{isAuthorized:e}=this.props;return A.createElement("button...
function ve (line 2) | function ve(e,t){const[n,r]=e.split("#"),o=ce.resolve(n||"",t||"");retur...
method constructor (line 2) | constructor(e,t){super(e,t),le()(this,"onAuthChange",(e=>{let{name:t}=...
method render (line 2) | render(){var e;let{definitions:t,getComponent:n,authSelectors:r,errSel...
function r (line 2) | function r(e){return J.isObject(e)&&(n.indexOf(e)>=0||Object.keys(e).som...
method render (line 2) | render(){return a.createElement(t,o()({},e(),this.props,this.context))}
function Ae (line 2) | function Ae(e,t){if(!we.test(e)){if(!t)throw new Ee(`Tried to resolve a ...
method constructor (line 2) | constructor(e){var t;super(e),t=this,le()(this,"_getStateForCurrentNam...
method componentWillUnmount (line 2) | componentWillUnmount(){this.props.setRetainRequestBodyValueFlag(!1)}
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){const{currentUserInputValue:t,exam...
method render (line 2) | render(){const{currentUserInputValue:e,examples:t,currentKey:n,getComp...
function Ce (line 2) | function Ce(e,t){let n;return n=e&&e.response&&e.response.body?`${e.resp...
function Pe (line 2) | function Pe(e){return(e+"").split("#")}
function Ne (line 2) | function Ne(e,t){const n=xe[e];if(n&&!J.isPromise(n))try{const e=Te(t,n)...
function Ie (line 2) | function Ie(e){const t=xe[e];return t?J.isPromise(t)?t:Promise.resolve(t...
function Te (line 2) | function Te(e,t){const n=Re(e);if(n.length<1)return t;const r=J.getIn(t,...
function Re (line 2) | function Re(e){if("string"!=typeof e)throw new TypeError("Expected a str...
function Me (line 2) | function Me(e){if("string"!=typeof e)return e;return new URLSearchParams...
function De (line 2) | function De(e){return new URLSearchParams([["",e.replace(/~/g,"~0").repl...
function Le (line 2) | function Le(e,t){if(Fe(t))return!0;const n=e.charAt(t.length),r=t.slice(...
method constructor (line 2) | constructor(){super(...arguments),le()(this,"onClick",(()=>{let{specAc...
method render (line 2) | render(){return A.createElement("button",{className:"btn btn-clear opb...
class Ue (line 2) | class Ue{constructor(e){this.root=ze(e||{})}set(e,t){const n=this.getPar...
method constructor (line 2) | constructor(e){this.root=ze(e||{})}
method set (line 2) | set(e,t){const n=this.getParent(e,!0);if(!n)return void Ve(this.root,t...
method get (line 2) | get(e){if((e=e||[]).length<1)return this.root.value;let t,n,r=this.roo...
method getParent (line 2) | getParent(e,t){return!e||e.length<1?null:e.length<2?this.root:e.slice(...
function ze (line 2) | function ze(e,t){return Ve({children:{}},e,t)}
method constructor (line 2) | constructor(){super(...arguments),le()(this,"renderOperationTag",((e,t...
method render (line 2) | render(){let{specSelectors:e}=this.props;const t=e.taggedOperations();...
function Ve (line 2) | function Ve(e,t,n){return e.value=t||{},e.protoValue=n?f()(f()({},n.prot...
class Je (line 2) | class Je{static getPluginName(e){return e.pluginName}static getPatchesOf...
method getPluginName (line 2) | static getPluginName(e){return e.pluginName}
method getPatchesOfType (line 2) | static getPatchesOfType(e,t){return e.filter(t)}
method constructor (line 2) | constructor(e){Object.assign(this,{spec:"",debugLevel:"info",plugins:[...
method debug (line 2) | debug(e){if(this.debugLevel===e){for(var t=arguments.length,n=new Arra...
method verbose (line 2) | verbose(e){if("verbose"===this.debugLevel){for(var t=arguments.length,...
method wrapPlugin (line 2) | wrapPlugin(e,t){const{pathDiscriminator:n}=this;let r,o=null;return e[...
method nextPlugin (line 2) | nextPlugin(){return this.wrappedPlugins.find((e=>this.getMutationsForP...
method nextPromisedPatch (line 2) | nextPromisedPatch(){if(this.promisedPatches.length>0)return Promise.ra...
method getPluginHistory (line 2) | getPluginHistory(e){const t=this.constructor.getPluginName(e);return t...
method getPluginRunCount (line 2) | getPluginRunCount(e){return this.getPluginHistory(e).length}
method getPluginHistoryTip (line 2) | getPluginHistoryTip(e){const t=this.getPluginHistory(e);return t&&t[t....
method getPluginMutationIndex (line 2) | getPluginMutationIndex(e){const t=this.getPluginHistoryTip(e).mutation...
method updatePluginHistory (line 2) | updatePluginHistory(e,t){const n=this.constructor.getPluginName(e);thi...
method updatePatches (line 2) | updatePatches(e){J.normalizeArray(e).forEach((e=>{if(e instanceof Erro...
method updateMutations (line 2) | updateMutations(e){"object"==typeof e.value&&!Array.isArray(e.value)&&...
method removePromisedPatch (line 2) | removePromisedPatch(e){const t=this.promisedPatches.indexOf(e);t<0?thi...
method promisedPatchThen (line 2) | promisedPatchThen(e){return e.value=e.value.then((t=>{const n=f()(f()(...
method getMutations (line 2) | getMutations(e,t){return e=e||0,"number"!=typeof t&&(t=this.mutations....
method getCurrentMutations (line 2) | getCurrentMutations(){return this.getMutationsForPlugin(this.getCurren...
method getMutationsForPlugin (line 2) | getMutationsForPlugin(e){const t=this.getPluginMutationIndex(e);return...
method getCurrentPlugin (line 2) | getCurrentPlugin(){return this.currentPlugin}
method getLib (line 2) | getLib(){return this.libMethods}
method _get (line 2) | _get(e){return J.getIn(this.state,e)}
method _getContext (line 2) | _getContext(e){return this.contextTree.get(e)}
method setContext (line 2) | setContext(e,t){return this.contextTree.set(e,t)}
method _hasRun (line 2) | _hasRun(e){return this.getPluginRunCount(this.getCurrentPlugin())>(e||0)}
method dispatch (line 2) | dispatch(){const e=this,t=this.nextPlugin();if(!t){const e=this.nextPr...
method render (line 2) | render(){let{specPath:e,response:t,request:r,toggleShown:o,onTryoutCli...
function Ge (line 2) | function Ge(e){const{spec:t}=e,{paths:n}=t,r={};if(!n||t.$$normalized)re...
method render (line 2) | render(){let{isShown:e,toggleShown:t,getComponent:n,authActions:r,auth...
function Ze (line 2) | function Ze(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments...
method render (line 2) | render(){let{method:e}=this.props;return A.createElement("span",{class...
function st (line 2) | function st(e){let{escape:t}=arguments.length>1&&void 0!==arguments[1]?a...
function it (line 2) | function it(e){const{value:t}=e;return Array.isArray(t)?function(e){let{...
function ct (line 2) | async function ct(e){let t=arguments.length>1&&void 0!==arguments[1]?arg...
function pt (line 2) | function pt(e,t){let{loadSpec:n=!1}=arguments.length>2&&void 0!==argumen...
function ht (line 2) | function ht(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[...
function ft (line 2) | function ft(e,t){return t||"undefined"==typeof navigator||(t=navigator),...
function dt (line 2) | function dt(e,t){return Array.isArray(e)&&e.some((e=>ft(e,t)))}
function yt (line 2) | function yt(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&argume...
function vt (line 2) | function vt(e,t,n,r){const o=r.style||"form",s=void 0===r.explode?"form"...
function bt (line 2) | function bt(e){const t=Object.keys(e).reduce(((t,n)=>{for(const[r,o]of y...
function wt (line 2) | function wt(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[...
method constructor (line 2) | constructor(e,t){super(e,t),le()(this,"_onContentTypeChange",(e=>{cons...
method render (line 2) | render(){var e,t;let{path:n,method:r,code:o,response:s,className:i,spe...
function St (line 2) | async function St(e){const{spec:t,mode:n,allowMetaPatches:r=!0,pathDiscr...
method normalize (line 2) | normalize(e){let{spec:t}=e;const{spec:n}=Ge({spec:t});return n}
method match (line 2) | match(e){let{spec:t}=e;return(e=>{try{const{swagger:t}=e;return"2.0"===t...
method normalize (line 2) | normalize(e){let{spec:t}=e;const{spec:n}=Ge({spec:t});return n}
method match (line 2) | match(e){let{spec:t}=e;return jt(t)}
method normalize (line 2) | normalize(e){let{spec:t}=e;const{spec:n}=Ge({spec:t});return n}
class Nt (line 2) | class Nt extends Pt.RP{constructor(e,t,n){super(e,t,n),this.element="ann...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="annotation"}
method code (line 2) | get code(){return this.attributes.get("code")}
method code (line 2) | set code(e){this.attributes.set("code",e)}
method constructor (line 2) | constructor(e){super(e),le()(this,"onChange",((e,t,n)=>{let{specAction...
method render (line 2) | render(){var e;let{onTryoutClick:t,onResetClick:n,parameters:r,allowTr...
class Tt (line 2) | class Tt extends Pt.RP{constructor(e,t,n){super(e,t,n),this.element="com...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="comment"}
function Ft (line 2) | function Ft(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/...
function Lt (line 2) | function Lt(e){return function t(n){return 0===arguments.length||Ft(n)?t...
function Bt (line 2) | function Bt(e){return function t(n,r){switch(arguments.length){case 0:re...
method constructor (line 2) | constructor(){super(...arguments),le()(this,"handleValidateParameters"...
method render (line 2) | render(){const{disabled:e}=this.props;return A.createElement("button",...
function qt (line 2) | function qt(e,t,n){return function(){if(0===arguments.length)return n();...
method render (line 2) | render(){let{editorActions:e,errSelectors:t,layoutSelectors:n,layoutAc...
function Ut (line 2) | function Ut(e){return e&&e["@@transducer/reduced"]?e:{"@@transducer/valu...
function e (line 2) | function e(e,t){this.xf=t,this.f=e,this.all=!0}
function Jt (line 2) | function Jt(e){return function(t){return new Wt(e,t)}}
function Ht (line 2) | function Ht(e,t){switch(e){case 0:return function(){return t.apply(this,...
function Gt (line 2) | function Gt(e,t,n){return function(){for(var r=[],o=0,s=e,i=0;i<t.length...
function Yt (line 2) | function Yt(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}
method render (line 2) | render(){let{fullscreen:e,full:t,...n}=this.props;if(e)return A.create...
function Xt (line 2) | function Xt(e,t,n){for(var r=0,o=n.length;r<o;){if(e(t,n[r]))return!0;r+...
function Qt (line 2) | function Qt(e,t){return Object.prototype.hasOwnProperty.call(t,e)}
method render (line 2) | render(){const{hide:e,keepContents:t,mobile:n,tablet:r,desktop:o,large...
function un (line 2) | function un(e,t,n,r){var o=Yt(e);function s(e,t){return pn(e,t,n.slice()...
method constructor (line 2) | constructor(e){var t;super(e),this.onClick=m()(t=this._onClick).call(t...
method _onClick (line 2) | _onClick(){let{showOpId:e,showOpIdPrefix:t,onClick:n,shown:r}=this.pro...
method render (line 2) | render(){let{id:e,method:t,shown:n,href:r}=this.props;return A.createE...
function pn (line 2) | function pn(e,t,n,r){if(en(e,t))return!0;var o,s,i=cn(e);if(i!==cn(t))re...
method componentDidMount (line 2) | componentDidMount(){this.props.initialValue&&(this.inputRef.value=this...
method render (line 2) | render(){const{value:e,defaultValue:t,initialValue:n,...r}=this.props;...
function fn (line 2) | function fn(e,t){return function(e,t,n){var r,o;if("function"==typeof e....
method render (line 2) | render(){const{url:e,getComponent:t}=this.props,n=t("Link");return A.c...
function dn (line 2) | function dn(e,t){for(var n=0,r=t.length,o=Array(r);n<r;)o[n]=e(t[n]),n+=...
method render (line 2) | render(){const{info:e,url:t,host:n,basePath:r,getComponent:o,externalD...
function mn (line 2) | function mn(e){return'"'+e.replace(/\\/g,"\\\\").replace(/[\b]/g,"\\b")....
function vn (line 2) | function vn(e){return function(){return!e.apply(this,arguments)}}
function bn (line 2) | function bn(e,t,n){for(var r=0,o=n.length;r<o;)t=e(t,n[r]),r+=1;return t}
method render (line 2) | render(){const{license:e,getComponent:t,selectedServer:n,url:r}=this.p...
function wn (line 2) | function wn(e){return"[object Object]"===Object.prototype.toString.call(e)}
function e (line 2) | function e(e,t){this.xf=t,this.f=e}
function xn (line 2) | function xn(e){return function(t){return new En(e,t)}}
method render (line 2) | render(){return A.createElement("div",{className:"view-line-link copy-...
function jn (line 2) | function jn(e,t){var n=function(n){var r=t.concat([e]);return fn(n,r)?"<...
function n (line 2) | function n(e,t){if(e>t!=t>e)return t>e?t:e}
method constructor (line 2) | constructor(e,t){this.ranges=[],this.length=0,null!=e&&this.add(e,t)}
method _update_length (line 2) | _update_length(){this.length=this.ranges.reduce(((e,t)=>e+t.length),0)}
method add (line 2) | add(e,r){var o=e=>{for(var t=0;t<this.ranges.length&&!e.touches(this.r...
method subtract (line 2) | subtract(e,r){var o=e=>{for(var t=0;t<this.ranges.length&&!e.overlaps(...
method intersect (line 2) | intersect(e,r){var o=[],s=e=>{for(var n=0;n<this.ranges.length&&!e.ove...
method index (line 2) | index(e){for(var t=0;t<this.ranges.length&&this.ranges[t].length<=e;)e...
method toString (line 2) | toString(){return"[ "+this.ranges.join(", ")+" ]"}
method clone (line 2) | clone(){return new n(this)}
method numbers (line 2) | numbers(){return this.ranges.reduce(((e,t)=>{for(var n=t.low;n<=t.high...
method subranges (line 2) | subranges(){return this.ranges.map((e=>({low:e.low,high:e.high,length:...
function e (line 2) | function e(e,t){this.xf=t,this.f=e}
function Nn (line 2) | function Nn(e){return"[object String]"===Object.prototype.toString.call(e)}
method constructor (line 2) | constructor(e,t){super(e,t),le()(this,"toggleCollapsed",(()=>{this.pro...
method componentDidMount (line 2) | componentDidMount(){const{hideSelfOnExpand:e,expanded:t,modelName:n}=t...
method UNSAFE_componentWillReceiveProps (line 2) | UNSAFE_componentWillReceiveProps(e){this.props.expanded!==e.expanded&&...
method render (line 2) | render(){const{title:e,classes:t}=this.props;return this.state.expande...
function Mn (line 2) | function Mn(e){return function t(n,r,o){switch(arguments.length){case 0:...
method constructor (line 2) | constructor(){super(...arguments),le()(this,"onToggle",((e,t)=>{this.p...
method render (line 2) | render(){let{getComponent:e,getConfigs:t}=this.props;const n=e("Model"...
function Ln (line 2) | function Ln(e,t,n){return function(r,o,s){if(Dn(s))return e(r,o,s);if(nu...
function Bn (line 2) | function Bn(e,t,n){for(var r=0,o=n.length;r<o;){if((t=e["@@transducer/st...
method render (line 2) | render(){var e,t,n,r;let{schema:o,name:s,displayName:i,isRef:l,getComp...
function qn (line 2) | function qn(e,t,n){for(var r=n.next();!r.done;){if((t=e["@@transducer/st...
function Un (line 2) | function Un(e,t,n,r){return e["@@transducer/result"](n[r]($n(e["@@transd...
method render (line 2) | render(){var e,t,n;let{schema:r,getComponent:o,getConfigs:s,name:i,dis...
function e (line 2) | function e(e){this.f=e}
function Wn (line 2) | function Wn(e){return new Vn(e)}
method render (line 2) | render(){const{bypass:e,isSwagger2:t,isOAS3:n,alsoShow:r}=this.props;r...
function Zn (line 2) | function Zn(e,t,n){for(var r=n.next();!r.done;)t=e(t,r.value),r=n.next()...
method render (line 2) | render(){const{errSelectors:e,specSelectors:t,getComponent:n}=this.pro...
function Yn (line 2) | function Yn(e,t,n,r){return n[r](e,t)}
function sr (line 2) | function sr(e){var t=Object.prototype.toString.call(e);return"[object Fu...
method constructor (line 2) | constructor(){super(...arguments),le()(this,"onEnumChange",(e=>this.pr...
method render (line 2) | render(){let{getComponent:e,value:t,errors:n,schema:r,required:o,disab...
function hr (line 2) | function hr(e,t){return function(){return t.call(this,e.apply(this,argum...
function fr (line 2) | function fr(e,t){return function(){var n=arguments.length;if(0===n)retur...
function gr (line 2) | function gr(){if(0===arguments.length)throw new Error("pipe requires at ...
function br (line 2) | function br(e){return new RegExp(e.source,e.flags?e.flags:(e.global?"g":...
function wr (line 2) | function wr(e,t,n){if(n||(n=new Er),function(e){var t=typeof e;return nu...
function e (line 2) | function e(){this.map={},this.length=0}
function e (line 2) | function e(e,t,n,r){this.valueFn=e,this.valueAcc=t,this.keyFn=n,this.xf=...
function Sr (line 2) | function Sr(e,t,n){return function(r){return new xr(e,t,n,r)}}
function Ar (line 2) | function Ar(e,t,n){var r,o=typeof e;switch(o){case"string":case"number":...
function e (line 2) | function e(){this._nativeSet="function"==typeof Set?new Set:null,this._i...
function e (line 2) | function e(e,t){this.xf=t,this.n=e,this.i=0}
function Ir (line 2) | function Ir(e){return function(t){return new Nr(e,t)}}
function Rr (line 2) | function Rr(e,t){for(var n=t.length-1;n>=0&&e(t[n]);)n-=1;return dr(0,n+...
function e (line 2) | function e(e,t){this.f=e,this.retained=[],this.xf=t}
function Dr (line 2) | function Dr(e){return function(t){return new Mr(e,t)}}
function e (line 2) | function e(e,t){this.xf=t,this.f=e}
function Br (line 2) | function Br(e){return function(t){return new Lr(e,t)}}
function Qr (line 2) | function Qr(e){return e}
function jo (line 2) | function jo(e){return"[object Number]"===Object.prototype.toString.call(e)}
function e (line 2) | function e(e,t){this.xf=t,this.pred=e,this.items=[]}
function Fo (line 2) | function Fo(e){return function(t){return new Do(e,t)}}
class Uo (line 2) | class Uo extends Pt.ON{constructor(e,t,n){super(e,t,n),this.element="par...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="parseResult"}
method api (line 2) | get api(){return this.children.filter((e=>e.classes.contains("api")))....
method results (line 2) | get results(){return this.children.filter((e=>e.classes.contains("resu...
method result (line 2) | get result(){return this.results.first}
method annotations (line 2) | get annotations(){return this.children.filter((e=>"annotation"===e.ele...
method warnings (line 2) | get warnings(){return this.children.filter((e=>"annotation"===e.elemen...
method errors (line 2) | get errors(){return this.children.filter((e=>"annotation"===e.element&...
method isEmpty (line 2) | get isEmpty(){return this.children.reject((e=>"annotation"===e.element...
method replaceResult (line 2) | replaceResult(e){const{result:t}=this;if(qo(t))return!1;const n=this.c...
class Vo (line 2) | class Vo extends Pt.ON{constructor(e,t,n){super(e,t,n),this.element="sou...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="sourceMap"}
method positionStart (line 2) | get positionStart(){return this.children.filter((e=>e.classes.contains...
method positionEnd (line 2) | get positionEnd(){return this.children.filter((e=>e.classes.contains("...
method position (line 2) | set position(e){if(null===e)return;const t=new Pt.ON([e.start.row,e.st...
function Go (line 2) | function Go(e){return Go="function"==typeof Ko&&"symbol"==typeof Ho?func...
function Yo (line 2) | function Yo(e){var t=function(e,t){if("object"!==Go(e)||null===e)return ...
function Xo (line 2) | function Xo(e,t,n){return(t=Yo(t))in e?Jo(e,t,{value:n,enumerable:!0,con...
function Rs (line 2) | function Rs(e){return Rs="function"==typeof Symbol&&"symbol"==typeof Sym...
class qs (line 2) | class qs extends Pt.lS{constructor(){super(),this.register("annotation",...
method constructor (line 2) | constructor(){super(),this.register("annotation",It),this.register("co...
function Ws (line 2) | function Ws(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function Zs (line 2) | function Zs(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)...
method enter (line 2) | enter(o,...s){for(let i=0;i<e.length;i+=1)if(null==r[i]){const a=t(e[i],...
method leave (line 2) | leave(o,...s){for(let i=0;i<e.length;i+=1)if(null==r[i]){const a=t(e[i],...
function ai (line 2) | function ai(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function li (line 2) | function li(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments...
method init (line 2) | init({predicate:e=this.predicate,returnOnTrue:t=this.returnOnTrue,return...
method enter (line 2) | enter(e){return this.predicate(e)?(this.result.push(e),this.returnOnTrue...
function mi (line 2) | function mi(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function gi (line 2) | function gi(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments...
function _i (line 2) | function _i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function ji (line 2) | function ji(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments...
method constructor (line 2) | constructor(e){Xo(this,"type","EphemeralArray"),Xo(this,"content",[]),Xo...
method toReference (line 2) | toReference(){return this.reference}
method toArray (line 2) | toArray(){return this.reference.push(...this.content),this.reference}
method constructor (line 2) | constructor(e){Xo(this,"type","EphemeralObject"),Xo(this,"content",[]),X...
method toReference (line 2) | toReference(){return this.reference}
method toObject (line 2) | toObject(){return Object.assign(this.reference,Object.fromEntries(this.c...
method enter (line 2) | enter(t){if(e.has(t))return e.get(t).toReference();const n=new Pi(t.cont...
method enter (line 2) | enter(t){if(e.has(t))return e.get(t).toReference();const n=new Ci(t.cont...
class Ui (line 2) | class Ui extends Error{constructor(e){super(`Invalid $ref pointer "${e}"...
method constructor (line 2) | constructor(e){super(`Invalid $ref pointer "${e}". Pointers must begin...
class zi (line 2) | class zi extends Error{constructor(e){super(e),this.name=this.constructo...
method constructor (line 2) | constructor(e){super(e),this.name=this.constructor.name,this.message=e...
class Hi (line 2) | class Hi extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="cal...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="callback"}
class Zi (line 2) | class Zi extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="com...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="components"}
method schemas (line 2) | get schemas(){return this.get("schemas")}
method schemas (line 2) | set schemas(e){this.set("schemas",e)}
method responses (line 2) | get responses(){return this.get("responses")}
method responses (line 2) | set responses(e){this.set("responses",e)}
method parameters (line 2) | get parameters(){return this.get("parameters")}
method parameters (line 2) | set parameters(e){this.set("parameters",e)}
method examples (line 2) | get examples(){return this.get("examples")}
method examples (line 2) | set examples(e){this.set("examples",e)}
method requestBodies (line 2) | get requestBodies(){return this.get("requestBodies")}
method requestBodies (line 2) | set requestBodies(e){this.set("requestBodies",e)}
method headers (line 2) | get headers(){return this.get("headers")}
method headers (line 2) | set headers(e){this.set("headers",e)}
method securitySchemes (line 2) | get securitySchemes(){return this.get("securitySchemes")}
method securitySchemes (line 2) | set securitySchemes(e){this.set("securitySchemes",e)}
method links (line 2) | get links(){return this.get("links")}
method links (line 2) | set links(e){this.set("links",e)}
method callbacks (line 2) | get callbacks(){return this.get("callbacks")}
method callbacks (line 2) | set callbacks(e){this.set("callbacks",e)}
class Xi (line 2) | class Xi extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="con...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="contact"}
method name (line 2) | get name(){return this.get("name")}
method name (line 2) | set name(e){this.set("name",e)}
method url (line 2) | get url(){return this.get("url")}
method url (line 2) | set url(e){this.set("url",e)}
method email (line 2) | get email(){return this.get("email")}
method email (line 2) | set email(e){this.set("email",e)}
class ea (line 2) | class ea extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="dis...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="discriminator"}
method propertyName (line 2) | get propertyName(){return this.get("propertyName")}
method propertyName (line 2) | set propertyName(e){this.set("propertyName",e)}
method mapping (line 2) | get mapping(){return this.get("mapping")}
method mapping (line 2) | set mapping(e){this.set("mapping",e)}
class na (line 2) | class na extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="enc...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="encoding"}
method contentType (line 2) | get contentType(){return this.get("contentType")}
method contentType (line 2) | set contentType(e){this.set("contentType",e)}
method headers (line 2) | get headers(){return this.get("headers")}
method headers (line 2) | set headers(e){this.set("headers",e)}
method style (line 2) | get style(){return this.get("style")}
method style (line 2) | set style(e){this.set("style",e)}
method explode (line 2) | get explode(){return this.get("explode")}
method explode (line 2) | set explode(e){this.set("explode",e)}
method allowedReserved (line 2) | get allowedReserved(){return this.get("allowedReserved")}
method allowedReserved (line 2) | set allowedReserved(e){this.set("allowedReserved",e)}
class oa (line 2) | class oa extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="exa...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="example"}
method summary (line 2) | get summary(){return this.get("summary")}
method summary (line 2) | set summary(e){this.set("summary",e)}
method description (line 2) | get description(){return this.get("description")}
method description (line 2) | set description(e){this.set("description",e)}
method value (line 2) | get value(){return this.get("value")}
method value (line 2) | set value(e){this.set("value",e)}
method externalValue (line 2) | get externalValue(){return this.get("externalValue")}
method externalValue (line 2) | set externalValue(e){this.set("externalValue",e)}
class ia (line 2) | class ia extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="ext...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="externalDocumentation"}
method description (line 2) | get description(){return this.get("description")}
method description (line 2) | set description(e){this.set("description",e)}
method url (line 2) | get url(){return this.get("url")}
method url (line 2) | set url(e){this.set("url",e)}
class la (line 2) | class la extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="hea...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="header"}
method required (line 2) | get required(){return this.hasKey("required")?this.get("required"):new...
method required (line 2) | set required(e){this.set("required",e)}
method deprecated (line 2) | get deprecated(){return this.hasKey("deprecated")?this.get("deprecated...
method deprecated (line 2) | set deprecated(e){this.set("deprecated",e)}
method allowEmptyValue (line 2) | get allowEmptyValue(){return this.get("allowEmptyValue")}
method allowEmptyValue (line 2) | set allowEmptyValue(e){this.set("allowEmptyValue",e)}
method style (line 2) | get style(){return this.get("style")}
method style (line 2) | set style(e){this.set("style",e)}
method explode (line 2) | get explode(){return this.get("explode")}
method explode (line 2) | set explode(e){this.set("explode",e)}
method allowReserved (line 2) | get allowReserved(){return this.get("allowReserved")}
method allowReserved (line 2) | set allowReserved(e){this.set("allowReserved",e)}
method schema (line 2) | get schema(){return this.get("schema")}
method schema (line 2) | set schema(e){this.set("schema",e)}
method example (line 2) | get example(){return this.get("example")}
method example (line 2) | set example(e){this.set("example",e)}
method examples (line 2) | get examples(){return this.get("examples")}
method examples (line 2) | set examples(e){this.set("examples",e)}
method contentProp (line 2) | get contentProp(){return this.get("content")}
method contentProp (line 2) | set contentProp(e){this.set("content",e)}
method get (line 2) | get(){return this.get("description")}
method set (line 2) | set(e){this.set("description",e)}
class ua (line 2) | class ua extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="inf...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="info",this.classes.push(...
method title (line 2) | get title(){return this.get("title")}
method title (line 2) | set title(e){this.set("title",e)}
method description (line 2) | get description(){return this.get("description")}
method description (line 2) | set description(e){this.set("description",e)}
method termsOfService (line 2) | get termsOfService(){return this.get("termsOfService")}
method termsOfService (line 2) | set termsOfService(e){this.set("termsOfService",e)}
method contact (line 2) | get contact(){return this.get("contact")}
method contact (line 2) | set contact(e){this.set("contact",e)}
method license (line 2) | get license(){return this.get("license")}
method license (line 2) | set license(e){this.set("license",e)}
method version (line 2) | get version(){return this.get("version")}
method version (line 2) | set version(e){this.set("version",e)}
class ha (line 2) | class ha extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="lic...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="license"}
method name (line 2) | get name(){return this.get("name")}
method name (line 2) | set name(e){this.set("name",e)}
method url (line 2) | get url(){return this.get("url")}
method url (line 2) | set url(e){this.set("url",e)}
class da (line 2) | class da extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="lin...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="link"}
method operationRef (line 2) | get operationRef(){return this.get("operationRef")}
method operationRef (line 2) | set operationRef(e){this.set("operationRef",e)}
method operationId (line 2) | get operationId(){return this.get("operationId")}
method operationId (line 2) | set operationId(e){this.set("operationId",e)}
method operation (line 2) | get operation(){var e,t;return ms(this.operationRef)?null===(e=this.op...
method operation (line 2) | set operation(e){this.set("operation",e)}
method parameters (line 2) | get parameters(){return this.get("parameters")}
method parameters (line 2) | set parameters(e){this.set("parameters",e)}
method requestBody (line 2) | get requestBody(){return this.get("requestBody")}
method requestBody (line 2) | set requestBody(e){this.set("requestBody",e)}
method description (line 2) | get description(){return this.get("description")}
method description (line 2) | set description(e){this.set("description",e)}
method server (line 2) | get server(){return this.get("server")}
method server (line 2) | set server(e){this.set("server",e)}
class ga (line 2) | class ga extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="med...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="mediaType"}
method schema (line 2) | get schema(){return this.get("schema")}
method schema (line 2) | set schema(e){this.set("schema",e)}
method example (line 2) | get example(){return this.get("example")}
method example (line 2) | set example(e){this.set("example",e)}
method examples (line 2) | get examples(){return this.get("examples")}
method examples (line 2) | set examples(e){this.set("examples",e)}
method encoding (line 2) | get encoding(){return this.get("encoding")}
method encoding (line 2) | set encoding(e){this.set("encoding",e)}
class va (line 2) | class va extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="oAu...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="oAuthFlow"}
method authorizationUrl (line 2) | get authorizationUrl(){return this.get("authorizationUrl")}
method authorizationUrl (line 2) | set authorizationUrl(e){this.set("authorizationUrl",e)}
method tokenUrl (line 2) | get tokenUrl(){return this.get("tokenUrl")}
method tokenUrl (line 2) | set tokenUrl(e){this.set("tokenUrl",e)}
method refreshUrl (line 2) | get refreshUrl(){return this.get("refreshUrl")}
method refreshUrl (line 2) | set refreshUrl(e){this.set("refreshUrl",e)}
method scopes (line 2) | get scopes(){return this.get("scopes")}
method scopes (line 2) | set scopes(e){this.set("scopes",e)}
class wa (line 2) | class wa extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="oAu...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="oAuthFlows"}
method implicit (line 2) | get implicit(){return this.get("implicit")}
method implicit (line 2) | set implicit(e){this.set("implicit",e)}
method password (line 2) | get password(){return this.get("password")}
method password (line 2) | set password(e){this.set("password",e)}
method clientCredentials (line 2) | get clientCredentials(){return this.get("clientCredentials")}
method clientCredentials (line 2) | set clientCredentials(e){this.set("clientCredentials",e)}
method authorizationCode (line 2) | get authorizationCode(){return this.get("authorizationCode")}
method authorizationCode (line 2) | set authorizationCode(e){this.set("authorizationCode",e)}
class xa (line 2) | class xa extends Pt.RP{constructor(e,t,n){super(e,t,n),this.element="ope...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="openapi",this.classes.pu...
class _a (line 2) | class _a extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="ope...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="openApi3_0",this.classes...
method openapi (line 2) | get openapi(){return this.get("openapi")}
method openapi (line 2) | set openapi(e){this.set("openapi",e)}
method info (line 2) | get info(){return this.get("info")}
method info (line 2) | set info(e){this.set("info",e)}
method servers (line 2) | get servers(){return this.get("servers")}
method servers (line 2) | set servers(e){this.set("servers",e)}
method paths (line 2) | get paths(){return this.get("paths")}
method paths (line 2) | set paths(e){this.set("paths",e)}
method components (line 2) | get components(){return this.get("components")}
method components (line 2) | set components(e){this.set("components",e)}
method security (line 2) | get security(){return this.get("security")}
method security (line 2) | set security(e){this.set("security",e)}
method tags (line 2) | get tags(){return this.get("tags")}
method tags (line 2) | set tags(e){this.set("tags",e)}
method externalDocs (line 2) | get externalDocs(){return this.get("externalDocs")}
method externalDocs (line 2) | set externalDocs(e){this.set("externalDocs",e)}
class Oa (line 2) | class Oa extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="ope...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="operation"}
method tags (line 2) | get tags(){return this.get("tags")}
method tags (line 2) | set tags(e){this.set("tags",e)}
method summary (line 2) | get summary(){return this.get("summary")}
method summary (line 2) | set summary(e){this.set("summary",e)}
method description (line 2) | get description(){return this.get("description")}
method description (line 2) | set description(e){this.set("description",e)}
method externalDocs (line 2) | set externalDocs(e){this.set("externalDocs",e)}
method externalDocs (line 2) | get externalDocs(){return this.get("externalDocs")}
method operationId (line 2) | get operationId(){return this.get("operationId")}
method operationId (line 2) | set operationId(e){this.set("operationId",e)}
method parameters (line 2) | get parameters(){return this.get("parameters")}
method parameters (line 2) | set parameters(e){this.set("parameters",e)}
method requestBody (line 2) | get requestBody(){return this.get("requestBody")}
method requestBody (line 2) | set requestBody(e){this.set("requestBody",e)}
method responses (line 2) | get responses(){return this.get("responses")}
method responses (line 2) | set responses(e){this.set("responses",e)}
method callbacks (line 2) | get callbacks(){return this.get("callbacks")}
method callbacks (line 2) | set callbacks(e){this.set("callbacks",e)}
method deprecated (line 2) | get deprecated(){return this.hasKey("deprecated")?this.get("deprecated...
method deprecated (line 2) | set deprecated(e){this.set("deprecated",e)}
method security (line 2) | get security(){return this.get("security")}
method security (line 2) | set security(e){this.set("security",e)}
method servers (line 2) | get servers(){return this.get("severs")}
method servers (line 2) | set servers(e){this.set("servers",e)}
class Aa (line 2) | class Aa extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="par...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="parameter"}
method name (line 2) | get name(){return this.get("name")}
method name (line 2) | set name(e){this.set("name",e)}
method in (line 2) | get in(){return this.get("in")}
method in (line 2) | set in(e){this.set("in",e)}
method required (line 2) | get required(){return this.hasKey("required")?this.get("required"):new...
method required (line 2) | set required(e){this.set("required",e)}
method deprecated (line 2) | get deprecated(){return this.hasKey("deprecated")?this.get("deprecated...
method deprecated (line 2) | set deprecated(e){this.set("deprecated",e)}
method allowEmptyValue (line 2) | get allowEmptyValue(){return this.get("allowEmptyValue")}
method allowEmptyValue (line 2) | set allowEmptyValue(e){this.set("allowEmptyValue",e)}
method style (line 2) | get style(){return this.get("style")}
method style (line 2) | set style(e){this.set("style",e)}
method explode (line 2) | get explode(){return this.get("explode")}
method explode (line 2) | set explode(e){this.set("explode",e)}
method allowReserved (line 2) | get allowReserved(){return this.get("allowReserved")}
method allowReserved (line 2) | set allowReserved(e){this.set("allowReserved",e)}
method schema (line 2) | get schema(){return this.get("schema")}
method schema (line 2) | set schema(e){this.set("schema",e)}
method example (line 2) | get example(){return this.get("example")}
method example (line 2) | set example(e){this.set("example",e)}
method examples (line 2) | get examples(){return this.get("examples")}
method examples (line 2) | set examples(e){this.set("examples",e)}
method contentProp (line 2) | get contentProp(){return this.get("content")}
method contentProp (line 2) | set contentProp(e){this.set("content",e)}
method get (line 2) | get(){return this.get("description")}
method set (line 2) | set(e){this.set("description",e)}
class Pa (line 2) | class Pa extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="pat...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="pathItem"}
method $ref (line 2) | get $ref(){return this.get("$ref")}
method $ref (line 2) | set $ref(e){this.set("$ref",e)}
method summary (line 2) | get summary(){return this.get("summary")}
method summary (line 2) | set summary(e){this.set("summary",e)}
method description (line 2) | get description(){return this.get("description")}
method description (line 2) | set description(e){this.set("description",e)}
method GET (line 2) | get GET(){return this.get("get")}
method GET (line 2) | set GET(e){this.set("GET",e)}
method PUT (line 2) | get PUT(){return this.get("put")}
method PUT (line 2) | set PUT(e){this.set("PUT",e)}
method POST (line 2) | get POST(){return this.get("post")}
method POST (line 2) | set POST(e){this.set("POST",e)}
method DELETE (line 2) | get DELETE(){return this.get("delete")}
method DELETE (line 2) | set DELETE(e){this.set("DELETE",e)}
method OPTIONS (line 2) | get OPTIONS(){return this.get("options")}
method OPTIONS (line 2) | set OPTIONS(e){this.set("OPTIONS",e)}
method HEAD (line 2) | get HEAD(){return this.get("head")}
method HEAD (line 2) | set HEAD(e){this.set("HEAD",e)}
method PATCH (line 2) | get PATCH(){return this.get("patch")}
method PATCH (line 2) | set PATCH(e){this.set("PATCH",e)}
method TRACE (line 2) | get TRACE(){return this.get("trace")}
method TRACE (line 2) | set TRACE(e){this.set("TRACE",e)}
method servers (line 2) | get servers(){return this.get("servers")}
method servers (line 2) | set servers(e){this.set("servers",e)}
method parameters (line 2) | get parameters(){return this.get("parameters")}
method parameters (line 2) | set parameters(e){this.set("parameters",e)}
class Ia (line 2) | class Ia extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="pat...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="paths"}
class Ra (line 2) | class Ra extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="ref...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="reference",this.classes....
method $ref (line 2) | get $ref(){return this.get("$ref")}
method $ref (line 2) | set $ref(e){this.set("$ref",e)}
class Da (line 2) | class Da extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="req...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="requestBody"}
method description (line 2) | get description(){return this.get("description")}
method description (line 2) | set description(e){this.set("description",e)}
method contentProp (line 2) | get contentProp(){return this.get("content")}
method contentProp (line 2) | set contentProp(e){this.set("content",e)}
method required (line 2) | get required(){return this.hasKey("required")?this.get("required"):new...
method required (line 2) | set required(e){this.set("required",e)}
class La (line 2) | class La extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="res...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="response"}
method description (line 2) | get description(){return this.get("description")}
method description (line 2) | set description(e){this.set("description",e)}
method headers (line 2) | get headers(){return this.get("headers")}
method headers (line 2) | set headers(e){this.set("headers",e)}
method contentProp (line 2) | get contentProp(){return this.get("content")}
method contentProp (line 2) | set contentProp(e){this.set("content",e)}
method links (line 2) | get links(){return this.get("links")}
method links (line 2) | set links(e){this.set("links",e)}
class $a (line 2) | class $a extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="res...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="responses"}
method default (line 2) | get default(){return this.get("default")}
method default (line 2) | set default(e){this.set("default",e)}
class Ua (line 2) | class Ua extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="JSO...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="JSONSchemaDraft4"}
method idProp (line 2) | get idProp(){return this.get("id")}
method idProp (line 2) | set idProp(e){this.set("id",e)}
method $schema (line 2) | get $schema(){return this.get("$schema")}
method $schema (line 2) | set $schema(e){this.set("idProp",e)}
method multipleOf (line 2) | get multipleOf(){return this.get("multipleOf")}
method multipleOf (line 2) | set multipleOf(e){this.set("multipleOf",e)}
method maximum (line 2) | get maximum(){return this.get("maximum")}
method maximum (line 2) | set maximum(e){this.set("maximum",e)}
method exclusiveMaximum (line 2) | get exclusiveMaximum(){return this.get("exclusiveMaximum")}
method exclusiveMaximum (line 2) | set exclusiveMaximum(e){this.set("exclusiveMaximum",e)}
method minimum (line 2) | get minimum(){return this.get("minimum")}
method minimum (line 2) | set minimum(e){this.set("minimum",e)}
method exclusiveMinimum (line 2) | get exclusiveMinimum(){return this.get("exclusiveMinimum")}
method exclusiveMinimum (line 2) | set exclusiveMinimum(e){this.set("exclusiveMinimum",e)}
method maxLength (line 2) | get maxLength(){return this.get("maxLength")}
method maxLength (line 2) | set maxLength(e){this.set("maxLength",e)}
method minLength (line 2) | get minLength(){return this.get("minLength")}
method minLength (line 2) | set minLength(e){this.set("minLength",e)}
method pattern (line 2) | get pattern(){return this.get("pattern")}
method pattern (line 2) | set pattern(e){this.set("pattern",e)}
method additionalItems (line 2) | get additionalItems(){return this.get("additionalItems")}
method additionalItems (line 2) | set additionalItems(e){this.set("additionalItems",e)}
method items (line 2) | get items(){return this.get("items")}
method items (line 2) | set items(e){this.set("items",e)}
method maxItems (line 2) | get maxItems(){return this.get("maxItems")}
method maxItems (line 2) | set maxItems(e){this.set("maxItems",e)}
method minItems (line 2) | get minItems(){return this.get("minItems")}
method minItems (line 2) | set minItems(e){this.set("minItems",e)}
method uniqueItems (line 2) | get uniqueItems(){return this.get("uniqueItems")}
method uniqueItems (line 2) | set uniqueItems(e){this.set("uniqueItems",e)}
method maxProperties (line 2) | get maxProperties(){return this.get("maxProperties")}
method maxProperties (line 2) | set maxProperties(e){this.set("maxProperties",e)}
method minProperties (line 2) | get minProperties(){return this.get("minProperties")}
method minProperties (line 2) | set minProperties(e){this.set("minProperties",e)}
method required (line 2) | get required(){return this.get("required")}
method required (line 2) | set required(e){this.set("required",e)}
method properties (line 2) | get properties(){return this.get("properties")}
method properties (line 2) | set properties(e){this.set("properties",e)}
method additionalProperties (line 2) | get additionalProperties(){return this.get("additionalProperties")}
method additionalProperties (line 2) | set additionalProperties(e){this.set("additionalProperties",e)}
method patternProperties (line 2) | get patternProperties(){return this.get("patternProperties")}
method patternProperties (line 2) | set patternProperties(e){this.set("patternProperties",e)}
method dependencies (line 2) | get dependencies(){return this.get("dependencies")}
method dependencies (line 2) | set dependencies(e){this.set("dependencies",e)}
method enum (line 2) | get enum(){return this.get("enum")}
method enum (line 2) | set enum(e){this.set("enum",e)}
method type (line 2) | get type(){return this.get("type")}
method type (line 2) | set type(e){this.set("type",e)}
method allOf (line 2) | get allOf(){return this.get("allOf")}
method allOf (line 2) | set allOf(e){this.set("allOf",e)}
method anyOf (line 2) | get anyOf(){return this.get("anyOf")}
method anyOf (line 2) | set anyOf(e){this.set("anyOf",e)}
method oneOf (line 2) | get oneOf(){return this.get("oneOf")}
method oneOf (line 2) | set oneOf(e){this.set("oneOf",e)}
method not (line 2) | get not(){return this.get("not")}
method not (line 2) | set not(e){this.set("not",e)}
method definitions (line 2) | get definitions(){return this.get("definitions")}
method definitions (line 2) | set definitions(e){this.set("definitions",e)}
method title (line 2) | get title(){return this.get("title")}
method title (line 2) | set title(e){this.set("title",e)}
method description (line 2) | get description(){return this.get("description")}
method description (line 2) | set description(e){this.set("description",e)}
method default (line 2) | get default(){return this.get("default")}
method default (line 2) | set default(e){this.set("default",e)}
method format (line 2) | get format(){return this.get("format")}
method format (line 2) | set format(e){this.set("format",e)}
method base (line 2) | get base(){return this.get("base")}
method base (line 2) | set base(e){this.set("base",e)}
method links (line 2) | get links(){return this.get("links")}
method links (line 2) | set links(e){this.set("links",e)}
method media (line 2) | get media(){return this.get("media")}
method media (line 2) | set media(e){this.set("media",e)}
method readOnly (line 2) | get readOnly(){return this.get("readOnly")}
method readOnly (line 2) | set readOnly(e){this.set("readOnly",e)}
class Va (line 2) | class Va extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="JSO...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="JSONReference",this.clas...
method $ref (line 2) | get $ref(){return this.get("$ref")}
method $ref (line 2) | set $ref(e){this.set("$ref",e)}
class Ja (line 2) | class Ja extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="med...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="media"}
method binaryEncoding (line 2) | get binaryEncoding(){return this.get("binaryEncoding")}
method binaryEncoding (line 2) | set binaryEncoding(e){this.set("binaryEncoding",e)}
method type (line 2) | get type(){return this.get("type")}
method type (line 2) | set type(e){this.set("type",e)}
class Ha (line 2) | class Ha extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="lin...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="linkDescription"}
method href (line 2) | get href(){return this.get("href")}
method href (line 2) | set href(e){this.set("href",e)}
method rel (line 2) | get rel(){return this.get("rel")}
method rel (line 2) | set rel(e){this.set("rel",e)}
method title (line 2) | get title(){return this.get("title")}
method title (line 2) | set title(e){this.set("title",e)}
method targetSchema (line 2) | get targetSchema(){return this.get("targetSchema")}
method targetSchema (line 2) | set targetSchema(e){this.set("targetSchema",e)}
method mediaType (line 2) | get mediaType(){return this.get("mediaType")}
method mediaType (line 2) | set mediaType(e){this.set("mediaType",e)}
method method (line 2) | get method(){return this.get("method")}
method method (line 2) | set method(e){this.set("method",e)}
method encType (line 2) | get encType(){return this.get("encType")}
method encType (line 2) | set encType(e){this.set("encType",e)}
method schema (line 2) | get schema(){return this.get("schema")}
method schema (line 2) | set schema(e){this.set("schema",e)}
method copyMetaAndAttributes (line 2) | copyMetaAndAttributes(e,t){Cs(e)&&t.meta.set("sourceMap",e.meta.get("sou...
method enter (line 2) | enter(e){return this.element=e.clone(),ei}
function tl (line 2) | function tl(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function ol (line 2) | function ol(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function sl (line 2) | function sl(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments...
method init (line 2) | init({specObj:e=this.specObj}){this.specObj=e}
method retrievePassingOptions (line 2) | retrievePassingOptions(){return Eo(this.passingOptionsNames,this)}
method retrieveFixedFields (line 2) | retrieveFixedFields(e){return gr(uo(["visitors",...e,"fixedFields"]),ln)...
method retrieveVisitor (line 2) | retrieveVisitor(e){return wo(ts,["visitors",...e],this.specObj)?uo(["vis...
method retrieveVisitorInstance (line 2) | retrieveVisitorInstance(e,t={}){const n=this.retrievePassingOptions();re...
method toRefractedElement (line 2) | toRefractedElement(e,t,n={}){const r=this.retrieveVisitorInstance(e,n),o...
method init (line 2) | init({specPath:e=this.specPath,ignoredFields:t=this.ignoredFields}={}){t...
method ObjectElement (line 2) | ObjectElement(e){const t=this.specPath(e),n=this.retrieveFixedFields(t);...
method init (line 2) | init(){this.element=new za}
method init (line 2) | init({parent:e=this.parent}){this.parent=e,this.passingOptionsNames=[......
method ObjectElement (line 2) | ObjectElement(e){const t=El(e)?["document","objects","JSONReference"]:["...
method ArrayElement (line 2) | ArrayElement(e){return this.element=new Pt.ON,this.element.classes.push(...
method ArrayElement (line 2) | ArrayElement(e){return this.element=e.clone(),this.element.classes.push(...
method init (line 2) | init({specPath:e=this.specPath,ignoredFields:t=this.ignoredFields}={}){t...
method ObjectElement (line 2) | ObjectElement(e){return e.forEach(((e,t,n)=>{if(!this.ignoredFields.incl...
method init (line 2) | init(){this.element=new Pt.Sb,this.element.classes.push("json-schema-pro...
method init (line 2) | init(){this.element=new Pt.Sb,this.element.classes.push("json-schema-pat...
method init (line 2) | init(){this.element=new Pt.Sb,this.element.classes.push("json-schema-dep...
method ArrayElement (line 2) | ArrayElement(e){return this.element=e.clone(),this.element.classes.push(...
method StringElement (line 2) | StringElement(e){return this.element=e.clone(),this.element.classes.push...
method ArrayElement (line 2) | ArrayElement(e){return this.element=e.clone(),this.element.classes.push(...
method init (line 2) | init(){this.element=new Pt.ON,this.element.classes.push("json-schema-all...
method ArrayElement (line 2) | ArrayElement(e){return e.forEach((e=>{const t=El(e)?["document","objects...
method init (line 2) | init(){this.element=new Pt.ON,this.element.classes.push("json-schema-any...
method ArrayElement (line 2) | ArrayElement(e){return e.forEach((e=>{const t=El(e)?["document","objects...
method init (line 2) | init(){this.element=new Pt.ON,this.element.classes.push("json-schema-one...
method ArrayElement (line 2) | ArrayElement(e){return e.forEach((e=>{const t=El(e)?["document","objects...
method init (line 2) | init(){this.element=new Pt.Sb,this.element.classes.push("json-schema-def...
method init (line 2) | init(){this.element=new Pt.ON,this.element.classes.push("json-schema-lin...
method ArrayElement (line 2) | ArrayElement(e){return e.forEach((e=>{const t=this.toRefractedElement(["...
method init (line 2) | init(){this.element=new Wa}
method ObjectElement (line 2) | ObjectElement(e){const t=ll.compose.methods.ObjectElement.call(this,e);r...
method StringElement (line 2) | StringElement(e){return this.element=e.clone(),this.element.classes.push...
function ec (line 2) | function ec(e){return function(e){if(Array.isArray(e))return tc(e)}(e)||...
function tc (line 2) | function tc(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new A...
method enter (line 2) | enter(e){const t=this.alternator.map((({predicate:e,specPath:t})=>to(e,H...
method init (line 2) | init(){this.element=new Ka}
method init (line 2) | init(){this.element=new Ga}
function fc (line 2) | function fc(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function dc (line 2) | function dc(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments...
function gc (line 2) | function gc(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="schema",this.classes.push(...
method additionalItems (line 2) | get additionalItems(){return this.get("additionalItems")}
method additionalItems (line 2) | set additionalItems(e){this.set("additionalItems",e)}
method items (line 2) | get items(){return this.get("items")}
method items (line 2) | set items(e){this.set("items",e)}
method additionalProperties (line 2) | get additionalProperties(){return this.get("additionalProperties")}
method additionalProperties (line 2) | set additionalProperties(e){this.set("additionalProperties",e)}
method type (line 2) | get type(){return this.get("type")}
method type (line 2) | set type(e){this.set("type",e)}
method not (line 2) | get not(){return this.get("not")}
method not (line 2) | set not(e){this.set("not",e)}
method nullable (line 2) | get nullable(){return this.get("nullable")}
method nullable (line 2) | set nullable(e){this.set("nullable",e)}
method discriminator (line 2) | get discriminator(){return this.get("discriminator")}
method discriminator (line 2) | set discriminator(e){this.set("discriminator",e)}
method writeOnly (line 2) | get writeOnly(){return this.get("writeOnly")}
method writeOnly (line 2) | set writeOnly(e){this.set("writeOnly",e)}
method xml (line 2) | get xml(){return this.get("xml")}
method xml (line 2) | set xml(e){this.set("xml",e)}
method externalDocs (line 2) | get externalDocs(){return this.get("externalDocs")}
method externalDocs (line 2) | set externalDocs(e){this.set("externalDocs",e)}
method example (line 2) | get example(){return this.get("example")}
method example (line 2) | set example(e){this.set("example",e)}
method deprecated (line 2) | get deprecated(){return this.get("deprecated")}
method deprecated (line 2) | set deprecated(e){this.set("deprecated",e)}
class wc (line 2) | class wc extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="sec...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="securityRequirement"}
class xc (line 2) | class xc extends Pt.Sb{constructor(e,t,n){super(e,t,n),this.element="sec...
method constructor (line 2) | constructor(e,t,n){super(e,t,n),this.element="securityScheme"}
method type (line 2) | get type(){return this.get("type")}
method type (line 2) | set type(e){this.set("type",e)}
method description (line 2) | get description(){return this.get("description")}
method description (line 2) | set description(e){this.set("description",e)}
method name (line 2) | get name(){return this.get("name")}
method name (line 2) | set name(e){this.set("name",e)}
method in (line 2) | get in(){return this.get("in")}
method in (line 2) | set in(e){this.set("in",e)}
method scheme (line 2) | get scheme(){return this.get("scheme")}
method scheme (line 2) | set scheme(e){this.set("scheme",e)}
method bearerFormat (line 2) | get bearerFormat(){return this.get("bearerFormat")}
method bearerFormat (line 2) | set bearerFormat(e){this.set("bearerFormat",e)}
method flows (line 2) | get flows(){return this.get("flows")}
method flows (line 2) | set flows(e){this.set("flows",e)}
method openIdConnectUrl (line 2) | get openIdConnectUrl(){return this.get("openIdConnectUrl"
Copy disabled (too large)
Download .json
Condensed preview — 2768 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,487K chars).
[
{
"path": ".editorconfig",
"chars": 414,
"preview": "# EditorConfig helps developers define and maintain consistent\n# coding styles between different editors and IDEs\n# edit"
},
{
"path": ".github/FUNDING.yml",
"chars": 73,
"preview": "github: mailcow\ncustom: [\"https://www.servercow.de/mailcow?lang=en#sal\"]\n"
},
{
"path": ".github/ISSUE_TEMPLATE/Bug_report.yml",
"chars": 6197,
"preview": "name: 🐞 Bug Report\ndescription: Report a reproducible bug for mailcow. (NOT to be used for support questions.)\nlabels: ["
},
{
"path": ".github/ISSUE_TEMPLATE/Feature_request.yml",
"chars": 600,
"preview": "name: 💡 Feature Request\ndescription: Suggest an idea for mailcow.\nlabels: [\"enhancement\"]\nbody:\n - type: textarea\n a"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 650,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: ❓ Community-driven support (Free)\n url: https://docs.mailcow.ema"
},
{
"path": ".github/ISSUE_TEMPLATE/pr_to_nighty_template.yml",
"chars": 86,
"preview": "## :file_folder: Modified files\n<!-- Diff files - START -->\n<!-- Diff files - END -->"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 987,
"preview": "<!-- _Please make sure to review and check all of these items, otherwise we might refuse your PR:_ -->\n\n## Contribution "
},
{
"path": ".github/renovate.json",
"chars": 769,
"preview": "{\n \"enabled\": true,\n \"timezone\": \"Europe/Berlin\",\n \"dependencyDashboard\": true,\n \"dependencyDashboardTitle\": \"Renova"
},
{
"path": ".github/workflows/check_if_support_labeled.yml",
"chars": 1541,
"preview": "name: Check if labeled support, if so send message and close issue\non:\n issues:\n types:\n - labeled\njobs:\n add-"
},
{
"path": ".github/workflows/check_prs_if_on_staging.yml",
"chars": 1248,
"preview": "name: Check PRs if on staging\non:\n pull_request_target:\n types: [opened, edited]\npermissions: {}\n\njobs:\n is_not"
},
{
"path": ".github/workflows/close_old_issues_and_prs.yml",
"chars": 1381,
"preview": "name: 'Close stale issues and PRs'\non:\n schedule:\n # Once every day at midnight UTC\n - cron: \"0 0 * * *\"\n workfl"
},
{
"path": ".github/workflows/image_builds.yml",
"chars": 1135,
"preview": "name: Build mailcow Docker Images\n\non:\n push:\n branches: [ \"master\", \"staging\" ]\n workflow_dispatch:\n\npermissions:\n"
},
{
"path": ".github/workflows/pr_to_nightly.yml",
"chars": 759,
"preview": "name: Create PR to merge to nightly from staging\non:\n push:\n branches:\n - staging\njobs:\n action-pull-request:\n"
},
{
"path": ".github/workflows/rebuild_backup_image.yml",
"chars": 989,
"preview": "name: Build mailcow backup image\n\non:\n schedule:\n # At 00:00 on Sunday\n - cron: \"0 0 * * 0\"\n workflow_dispatch: "
},
{
"path": ".github/workflows/update_postscreen_access_list.yml",
"chars": 1284,
"preview": "name: Update postscreen_access.cidr\n\non:\n schedule:\n # Monthly\n - cron: \"0 0 1 * *\"\n workflow_dispatch: # Allow "
},
{
"path": ".gitignore",
"chars": 2140,
"preview": "!data/conf/nginx/dynmaps.conf\n!data/conf/nginx/meta_exporter.conf\n!data/conf/nginx/site.conf\n!/**/.gitkeep\n*.iml\n.idea\n."
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3223,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "CONTRIBUTING.md",
"chars": 7314,
"preview": "# Contribution Guidelines\n**_Last modified on 12th November 2025_**\n\nFirst of all, thank you for wanting to provide a bu"
},
{
"path": "LICENSE",
"chars": 35141,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 2801,
"preview": "# mailcow: dockerized - 🐮 + 🐋 = 💕\n\n[ 2017 "
},
{
"path": "data/Dockerfiles/acme/functions.sh",
"chars": 5746,
"preview": "#!/bin/bash\n\nlog_f() {\n if [[ ${2} == \"no_nl\" ]]; then\n echo -n \"$(date) - ${1}\"\n elif [[ ${2} == \"no_date\" ]]; the"
},
{
"path": "data/Dockerfiles/acme/load-dns-config.sh",
"chars": 1514,
"preview": "#!/bin/bash\n\nSCRIPT_SOURCE=\"${BASH_SOURCE[0]:-${0}}\"\nif [[ \"${SCRIPT_SOURCE}\" == \"${0}\" ]]; then\n __dns_loader_standalo"
},
{
"path": "data/Dockerfiles/acme/obtain-certificate-dns.sh",
"chars": 6180,
"preview": "#!/bin/bash\n\n# Return values / exit codes\n# 0 = cert created successfully\n# 1 = cert renewed successfully\n# 2 = cert not"
},
{
"path": "data/Dockerfiles/acme/obtain-certificate.sh",
"chars": 4786,
"preview": "#!/bin/bash\n\n# Return values / exit codes\n# 0 = cert created successfully\n# 1 = cert renewed successfully\n# 2 = cert not"
},
{
"path": "data/Dockerfiles/acme/reload-configurations.sh",
"chars": 3123,
"preview": "#!/bin/bash\n\n# Reading container IDs\n# Wrapping as array to ensure trimmed content when calling $NGINX etc.\nNGINX=($(cur"
},
{
"path": "data/Dockerfiles/backup/Dockerfile",
"chars": 91,
"preview": "FROM debian:trixie-slim\n\nRUN apt update && apt install pigz zstd -y --no-install-recommends"
},
{
"path": "data/Dockerfiles/clamd/Dockerfile",
"chars": 3779,
"preview": "FROM alpine:3.21 AS builder\n\nWORKDIR /src\nENV CLAMD_VERSION=1.4.2\n\nRUN apk upgrade --no-cache \\\n && apk add --update --"
},
{
"path": "data/Dockerfiles/clamd/clamd.sh",
"chars": 2613,
"preview": "#!/bin/bash\n\nif [[ \"${SKIP_CLAMD}\" =~ ^([yY][eE][sS]|[yY])+$ ]]; then\n echo \"SKIP_CLAMD=y, skipping ClamAV...\"\n sleep "
},
{
"path": "data/Dockerfiles/clamd/clamdcheck.sh",
"chars": 214,
"preview": "#!/bin/sh\n\nset -eu\n\nif [ \"${CLAMAV_NO_CLAMD:-}\" != \"false\" ]; then\n\tif [ \"$(echo \"PING\" | nc localhost 3310)\" != \"PONG\" "
},
{
"path": "data/Dockerfiles/clamd/healthcheck.sh",
"chars": 178,
"preview": "#!/bin/bash\n\nif [[ \"${SKIP_CLAMD}\" =~ ^([yY][eE][sS]|[yY])+$ ]]; then\n echo \"SKIP_CLAMD=y, skipping ClamAV...\"\n exit 0"
},
{
"path": "data/Dockerfiles/dockerapi/Dockerfile",
"chars": 533,
"preview": "FROM alpine:3.23\n\nLABEL maintainer = \"The Infrastructure Company GmbH <info@servercow.de>\"\n\nARG PIP_BREAK_SYSTEM_PACKAGE"
},
{
"path": "data/Dockerfiles/dockerapi/docker-entrypoint.sh",
"chars": 230,
"preview": "#!/bin/bash\n\n`openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \\\n -keyout /app/dockerapi_key.pem \\\n -out /"
},
{
"path": "data/Dockerfiles/dockerapi/main.py",
"chars": 9639,
"preview": "import os\nimport sys\nimport uvicorn\nimport json\nimport uuid\nimport async_timeout\nimport asyncio\nimport aiodocker\nimport "
},
{
"path": "data/Dockerfiles/dockerapi/modules/DockerApi.py",
"chars": 31410,
"preview": "import psutil\nimport sys\nimport os\nimport re\nimport time\nimport json\nimport asyncio\nimport platform\nfrom datetime import"
},
{
"path": "data/Dockerfiles/dockerapi/modules/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "data/Dockerfiles/dovecot/Dockerfile",
"chars": 3808,
"preview": "FROM alpine:3.21\n\nLABEL maintainer=\"The Infrastructure Company GmbH <info@servercow.de>\"\n\n# renovate: datasource=github-"
},
{
"path": "data/Dockerfiles/dovecot/clean_q_aged.sh",
"chars": 821,
"preview": "#!/bin/bash\n\nsource /source_env.sh\n\nMAX_AGE=$(redis-cli --raw -h redis-mailcow -a ${REDISPASS} --no-auth-warning GET Q_M"
},
{
"path": "data/Dockerfiles/dovecot/docker-entrypoint.sh",
"chars": 13365,
"preview": "#!/bin/bash\nset -e\n\n# Wait for MySQL to warm-up\nwhile ! mariadb-admin status --ssl=false --socket=/var/run/mysqld/mysqld"
},
{
"path": "data/Dockerfiles/dovecot/imapsync",
"chars": 773938,
"preview": "#!/usr/bin/env perl\n\n# $Id: imapsync,v 2.178 2022/01/12 21:28:37 gilles Exp gilles $\n# structure\n# pod documentation\n# u"
},
{
"path": "data/Dockerfiles/dovecot/imapsync_runner.pl",
"chars": 5763,
"preview": "#!/usr/bin/perl\n\nuse DBI;\nuse LockFile::Simple qw(lock trylock unlock);\nuse Proc::ProcessTable;\nuse Data::Dumper qw(Dump"
},
{
"path": "data/Dockerfiles/dovecot/maildir_gc.sh",
"chars": 154,
"preview": "#!/bin/bash\n[ -d /var/vmail/_garbage/ ] && /usr/bin/find /var/vmail/_garbage/ -mindepth 1 -maxdepth 1 -type d -cmin +${M"
},
{
"path": "data/Dockerfiles/dovecot/optimize-fts.sh",
"chars": 115,
"preview": "#!/bin/bash\n\nif [[ \"${SKIP_FTS}\" =~ ^([yY][eE][sS]|[yY])+$ ]]; then\n exit 0\nelse\n doveadm fts optimize -A\nfi\n"
},
{
"path": "data/Dockerfiles/dovecot/quarantine_notify.py",
"chars": 6392,
"preview": "#!/usr/bin/python3\n\nimport smtplib\nimport os\nimport sys\nimport MySQLdb\nfrom email.mime.multipart import MIMEMultipart\nfr"
},
{
"path": "data/Dockerfiles/dovecot/quota_notify.py",
"chars": 3054,
"preview": "#!/usr/bin/python3\n\nimport smtplib\nimport os\nfrom email.mime.multipart import MIMEMultipart\nfrom email.mime.text import "
},
{
"path": "data/Dockerfiles/dovecot/repl_health.sh",
"chars": 970,
"preview": "#!/bin/bash\n\nsource /source_env.sh\n\n# Do not attempt to write to slave\nif [[ ! -z ${REDIS_SLAVEOF_IP} ]]; then\n REDIS_C"
},
{
"path": "data/Dockerfiles/dovecot/report-ham.sieve",
"chars": 226,
"preview": "require [\"vnd.dovecot.pipe\", \"copy\", \"imapsieve\", \"environment\", \"variables\"];\n\nif environment :matches \"imap.mailbox\" \""
},
{
"path": "data/Dockerfiles/dovecot/report-spam.sieve",
"chars": 70,
"preview": "require [\"vnd.dovecot.pipe\", \"copy\"];\n\npipe :copy \"rspamd-pipe-spam\";\n"
},
{
"path": "data/Dockerfiles/dovecot/rspamd-pipe-ham",
"chars": 575,
"preview": "#!/bin/bash\nFILE=/tmp/mail$$\ncat > $FILE\ntrap \"/bin/rm -f $FILE\" 0 1 2 3 13 15\n\ncat ${FILE} | /usr/bin/curl -H \"Flag: 11"
},
{
"path": "data/Dockerfiles/dovecot/rspamd-pipe-spam",
"chars": 576,
"preview": "#!/bin/bash\nFILE=/tmp/mail$$\ncat > $FILE\ntrap \"/bin/rm -f $FILE\" 0 1 2 3 13 15\n\ncat ${FILE} | /usr/bin/curl -H \"Flag: 13"
},
{
"path": "data/Dockerfiles/dovecot/sa-rules.sh",
"chars": 1736,
"preview": "#!/bin/bash\n\n# Create temp directories\n[[ ! -d /tmp/sa-rules-heinlein ]] && mkdir -p /tmp/sa-rules-heinlein\n\n# Hash curr"
},
{
"path": "data/Dockerfiles/dovecot/stop-supervisor.sh",
"chars": 152,
"preview": "#!/bin/bash\n\nprintf \"READY\\n\";\n\nwhile read line; do\n echo \"Processing Event: $line\" >&2;\n kill -3 $(cat \"/var/run/supe"
},
{
"path": "data/Dockerfiles/dovecot/supervisord.conf",
"chars": 601,
"preview": "[supervisord]\r\nnodaemon=true\r\nuser=root\r\npidfile=/var/run/supervisord.pid\r\n\r\n[program:syslog-ng]\r\ncommand=/usr/sbin/sysl"
},
{
"path": "data/Dockerfiles/dovecot/syslog-ng-redis_slave.conf",
"chars": 1398,
"preview": "@version: 4.5\n@include \"scl.conf\"\noptions {\n chain_hostnames(off);\n flush_lines(0);\n use_dns(no);\n use_fqdn(no);\n o"
},
{
"path": "data/Dockerfiles/dovecot/syslog-ng.conf",
"chars": 1356,
"preview": "@version: 4.5\n@include \"scl.conf\"\noptions {\n chain_hostnames(off);\n flush_lines(0);\n use_dns(no);\n use_fqdn(no);\n o"
},
{
"path": "data/Dockerfiles/dovecot/trim_logs.sh",
"chars": 1132,
"preview": "#!/bin/bash\ncatch_non_zero() {\n CMD=${1}\n ${CMD} > /dev/null\n EC=$?\n if [ ${EC} -ne 0 ]; then\n echo \"Command ${CM"
},
{
"path": "data/Dockerfiles/netfilter/Dockerfile",
"chars": 892,
"preview": "FROM alpine:3.23\n\nLABEL maintainer = \"The Infrastructure Company GmbH <info@servercow.de>\"\n\nWORKDIR /app\n\nARG PIP_BREAK_"
},
{
"path": "data/Dockerfiles/netfilter/docker-entrypoint.sh",
"chars": 586,
"preview": "#!/bin/sh\n\nbackend=nftables\n\nnft list table ip filter &>/dev/null\nnftables_found=$?\n\niptables -L -n &>/dev/null\niptables"
},
{
"path": "data/Dockerfiles/netfilter/main.py",
"chars": 18444,
"preview": "#!/usr/bin/env python3\r\n\r\nDEBUG = False\r\n\r\nimport re\r\nimport os\r\nimport sys\r\nimport time\r\nimport atexit\r\nimport signal\r\n"
},
{
"path": "data/Dockerfiles/netfilter/modules/IPTables.py",
"chars": 8455,
"preview": "import iptc\nimport time\nimport os\n\nclass IPTables:\n def __init__(self, chain_name, logger):\n self.chain_name = chain"
},
{
"path": "data/Dockerfiles/netfilter/modules/Logger.py",
"chars": 1078,
"preview": "import time\nimport json\nimport datetime\n\nclass Logger:\n def __init__(self):\n self.r = None\n\n def set_redis(self, re"
},
{
"path": "data/Dockerfiles/netfilter/modules/NFTables.py",
"chars": 22216,
"preview": "import nftables\nimport ipaddress\nimport os\n\nclass NFTables:\n def __init__(self, chain_name, logger):\n self.chain_nam"
},
{
"path": "data/Dockerfiles/netfilter/modules/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "data/Dockerfiles/nginx/Dockerfile",
"chars": 395,
"preview": "FROM nginx:alpine\nLABEL maintainer \"The Infrastructure Company GmbH <info@servercow.de>\"\n\nENV PIP_BREAK_SYSTEM_PACKAGES="
},
{
"path": "data/Dockerfiles/nginx/bootstrap.py",
"chars": 3832,
"preview": "import os\nimport subprocess\nfrom jinja2 import Environment, FileSystemLoader\n\ndef includes_conf(env, template_vars):\n s"
},
{
"path": "data/Dockerfiles/nginx/docker-entrypoint.sh",
"chars": 637,
"preview": "#!/bin/sh\n\nPHPFPMHOST=${PHPFPMHOST:-\"php-fpm-mailcow\"}\nSOGOHOST=${SOGOHOST:-\"$IPV4_NETWORK.248\"}\nRSPAMDHOST=${RSPAMDHOST"
},
{
"path": "data/Dockerfiles/olefy/Dockerfile",
"chars": 807,
"preview": "FROM alpine:3.21\n\nLABEL maintainer = \"The Infrastructure Company GmbH <info@servercow.de>\"\n\nARG PIP_BREAK_SYSTEM_PACKAGE"
},
{
"path": "data/Dockerfiles/olefy/olefy.py",
"chars": 9454,
"preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n# Copyright (c) 2020, Dennis Kalbhen <d.kalbhen@heinlein-support.de>\n# C"
},
{
"path": "data/Dockerfiles/phpfpm/Dockerfile",
"chars": 3206,
"preview": "FROM php:8.2-fpm-alpine3.21\n\nLABEL maintainer = \"The Infrastructure Company GmbH <info@servercow.de>\"\n\n# renovate: datas"
},
{
"path": "data/Dockerfiles/phpfpm/docker-entrypoint.sh",
"chars": 9192,
"preview": "#!/bin/bash\n\nfunction array_by_comma { local IFS=\",\"; echo \"$*\"; }\n\n# Wait for containers\nwhile ! mariadb-admin status -"
},
{
"path": "data/Dockerfiles/postfix/Dockerfile",
"chars": 1946,
"preview": "FROM debian:bookworm-slim\n\nLABEL maintainer=\"The Infrastructure Company GmbH <info@servercow.de>\"\n\nARG DEBIAN_FRONTEND=n"
},
{
"path": "data/Dockerfiles/postfix/docker-entrypoint.sh",
"chars": 859,
"preview": "#!/bin/bash\n\n# Run hooks\nfor file in /hooks/*; do\n if [ -x \"${file}\" ]; then\n echo \"Running hook ${file}\"\n \"${fil"
},
{
"path": "data/Dockerfiles/postfix/postfix.sh",
"chars": 17183,
"preview": "#!/bin/bash\n\ntrap \"postfix stop\" EXIT\n\n[[ ! -d /opt/postfix/conf/sql/ ]] && mkdir -p /opt/postfix/conf/sql/\n\n# Wait for "
},
{
"path": "data/Dockerfiles/postfix/rspamd-pipe-ham",
"chars": 328,
"preview": "#!/bin/bash\nFILE=/tmp/mail$$\ncat > $FILE\ntrap \"/bin/rm -f $FILE\" 0 1 2 3 13 15\n\ncat ${FILE} | /usr/bin/curl -s --data-bi"
},
{
"path": "data/Dockerfiles/postfix/rspamd-pipe-spam",
"chars": 329,
"preview": "#!/bin/bash\nFILE=/tmp/mail$$\ncat > $FILE\ntrap \"/bin/rm -f $FILE\" 0 1 2 3 13 15\n\ncat ${FILE} | /usr/bin/curl -s --data-bi"
},
{
"path": "data/Dockerfiles/postfix/stop-supervisor.sh",
"chars": 152,
"preview": "#!/bin/bash\n\nprintf \"READY\\n\";\n\nwhile read line; do\n echo \"Processing Event: $line\" >&2;\n kill -3 $(cat \"/var/run/supe"
},
{
"path": "data/Dockerfiles/postfix/supervisord.conf",
"chars": 586,
"preview": "[supervisord]\npidfile=/var/run/supervisord.pid\nnodaemon=true\nuser=root\n\n[program:syslog-ng]\ncommand=/usr/sbin/syslog-ng "
},
{
"path": "data/Dockerfiles/postfix/syslog-ng-redis_slave.conf",
"chars": 1542,
"preview": "@version: 3.38\n@include \"scl.conf\"\noptions {\n chain_hostnames(off);\n flush_lines(0);\n use_dns(no);\n dns_cache(no);\n "
},
{
"path": "data/Dockerfiles/postfix/syslog-ng.conf",
"chars": 1500,
"preview": "@version: 3.38\n@include \"scl.conf\"\noptions {\n chain_hostnames(off);\n flush_lines(0);\n use_dns(no);\n dns_cache(no);\n "
},
{
"path": "data/Dockerfiles/postfix/whitelist_forwardinghosts.sh",
"chars": 317,
"preview": "#!/bin/bash\n\nwhile read QUERY; do\n\tQUERY=($QUERY)\n\tif [ \"${QUERY[0]}\" != \"get\" ]; then\n\t\techo \"500 dunno\"\n\t\tcontinue\n\tfi"
},
{
"path": "data/Dockerfiles/postfix-tlspol/Dockerfile",
"chars": 1375,
"preview": "FROM golang:1.25-bookworm AS builder\nWORKDIR /src\n\nENV CGO_ENABLED=0 \\\n GO111MODULE=on \\\n\t\tNOOPT=1 \\\n VERSION=1.8."
},
{
"path": "data/Dockerfiles/postfix-tlspol/docker-entrypoint.sh",
"chars": 143,
"preview": "#!/bin/bash\n\nif [[ ! -z ${REDIS_SLAVEOF_IP} ]]; then\n cp /etc/syslog-ng/syslog-ng-redis_slave.conf /etc/syslog-ng/syslo"
},
{
"path": "data/Dockerfiles/postfix-tlspol/postfix-tlspol.sh",
"chars": 1137,
"preview": "#!/bin/bash\n\nLOGLVL=info\n\nif [ ${DEV_MODE} != \"n\" ]; then\n echo -e \"\\e[31mEnabling debug mode\\e[0m\"\n set -x\n LOGLVL=d"
},
{
"path": "data/Dockerfiles/postfix-tlspol/stop-supervisor.sh",
"chars": 152,
"preview": "#!/bin/bash\n\nprintf \"READY\\n\";\n\nwhile read line; do\n echo \"Processing Event: $line\" >&2;\n kill -3 $(cat \"/var/run/supe"
},
{
"path": "data/Dockerfiles/postfix-tlspol/supervisord.conf",
"chars": 599,
"preview": "[supervisord]\npidfile=/var/run/supervisord.pid\nnodaemon=true\nuser=root\n\n[program:syslog-ng]\ncommand=/usr/sbin/syslog-ng "
},
{
"path": "data/Dockerfiles/postfix-tlspol/syslog-ng-redis_slave.conf",
"chars": 1282,
"preview": "@version: 3.38\n@include \"scl.conf\"\noptions {\n chain_hostnames(off);\n flush_lines(0);\n use_dns(no);\n dns_cache(no);\n "
},
{
"path": "data/Dockerfiles/postfix-tlspol/syslog-ng.conf",
"chars": 1261,
"preview": "@version: 3.38\n@include \"scl.conf\"\noptions {\n chain_hostnames(off);\n flush_lines(0);\n use_dns(no);\n dns_cache(no);\n "
},
{
"path": "data/Dockerfiles/rspamd/Dockerfile",
"chars": 1290,
"preview": "FROM debian:trixie-slim\nLABEL maintainer=\"The Infrastructure Company GmbH <info@servercow.de>\"\n\nARG DEBIAN_FRONTEND=noni"
},
{
"path": "data/Dockerfiles/rspamd/docker-entrypoint.sh",
"chars": 11046,
"preview": "#!/bin/bash\n\nuntil nc phpfpm 9001 -z; do\n echo \"Waiting for PHP on port 9001...\"\n sleep 3\ndone\n\nuntil nc phpfpm 9002 -"
},
{
"path": "data/Dockerfiles/rspamd/sa_trivial_convert.lua",
"chars": 12087,
"preview": "local fun = require \"fun\"\nlocal rspamd_logger = require \"rspamd_logger\"\nlocal util = require \"rspamd_util\"\nlocal lua_uti"
},
{
"path": "data/Dockerfiles/rspamd/set_worker_password.sh",
"chars": 282,
"preview": "#!/bin/bash\n\npassword_file='/etc/rspamd/override.d/worker-controller-password.inc'\npassword_hash=`/usr/bin/rspamadm pw -"
},
{
"path": "data/Dockerfiles/rspamd/settings.conf",
"chars": 45,
"preview": "settings = \"http://nginx:8081/settings.php\";\n"
},
{
"path": "data/Dockerfiles/sogo/Dockerfile",
"chars": 5736,
"preview": "# SOGo built from source to enable security patch application\n# Repository: https://github.com/Alinto/sogo\n# Version: SO"
},
{
"path": "data/Dockerfiles/sogo/acl.diff",
"chars": 650,
"preview": "--- /usr/local/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox 2018-08-17 18:29:57.987504204 +0200\n+++ /usr/local/lib/GNU"
},
{
"path": "data/Dockerfiles/sogo/bootstrap-sogo.sh",
"chars": 7208,
"preview": "#!/bin/bash\n\n# Wait for MySQL to warm-up\nwhile ! mariadb-admin status --ssl=false --socket=/var/run/mysqld/mysqld.sock -"
},
{
"path": "data/Dockerfiles/sogo/docker-entrypoint.sh",
"chars": 415,
"preview": "#!/bin/bash\n\nif [[ \"${SKIP_SOGO}\" =~ ^([yY][eE][sS]|[yY])+$ ]]; then\n echo \"SKIP_SOGO=y, skipping SOGo...\"\n sleep 365d"
},
{
"path": "data/Dockerfiles/sogo/navMailcowBtns.diff",
"chars": 469,
"preview": "60,65d58\n< var:ng-click=\"navButtonClick\"\n< ng-href=\"/user\">\n< <md-icon>build</md-ico"
},
{
"path": "data/Dockerfiles/sogo/stop-supervisor.sh",
"chars": 152,
"preview": "#!/bin/bash\n\nprintf \"READY\\n\";\n\nwhile read line; do\n echo \"Processing Event: $line\" >&2;\n kill -3 $(cat \"/var/run/supe"
},
{
"path": "data/Dockerfiles/sogo/supervisord.conf",
"chars": 605,
"preview": "[supervisord]\nnodaemon=true\nuser=root\n\n[program:syslog-ng]\ncommand=/usr/sbin/syslog-ng --foreground --no-caps\nstdout_lo"
},
{
"path": "data/Dockerfiles/sogo/syslog-ng-redis_slave.conf",
"chars": 1066,
"preview": "@version: 3.38\n@include \"scl.conf\"\noptions {\n chain_hostnames(off);\n flush_lines(0);\n use_dns(no);\n use_fqdn(no);\n "
},
{
"path": "data/Dockerfiles/sogo/syslog-ng.conf",
"chars": 1024,
"preview": "@version: 3.38\n@include \"scl.conf\"\noptions {\n chain_hostnames(off);\n flush_lines(0);\n use_dns(no);\n use_fqdn(no);\n "
},
{
"path": "data/Dockerfiles/unbound/Dockerfile",
"chars": 994,
"preview": "FROM alpine:3.23\n\nLABEL maintainer = \"The Infrastructure Company GmbH <info@servercow.de>\"\n\nRUN apk add --update --no-ca"
},
{
"path": "data/Dockerfiles/unbound/docker-entrypoint.sh",
"chars": 464,
"preview": "#!/bin/bash\n\necho \"Setting console permissions...\"\nchown root:tty /dev/console\nchmod g+rw /dev/console\necho \"Receiving a"
},
{
"path": "data/Dockerfiles/unbound/healthcheck.sh",
"chars": 2678,
"preview": "#!/bin/bash\n\nSTATUS_FILE=\"/tmp/healthcheck_status\"\nRUNS=0\n\n# Declare log function for logfile to stdout\nfunction log_to_"
},
{
"path": "data/Dockerfiles/unbound/stop-supervisor.sh",
"chars": 183,
"preview": "#!/bin/bash\n\nprintf \"READY\\n\";\n\nwhile read line; do\n echo \"Processing Event: $line\" >&2;\n kill -3 $(cat \"/var/run/supe"
},
{
"path": "data/Dockerfiles/unbound/supervisord.conf",
"chars": 794,
"preview": "[supervisord]\r\nnodaemon=true\r\nuser=root\r\npidfile=/var/run/supervisord.pid\r\n\r\n[program:syslog-ng]\r\ncommand=/usr/sbin/sysl"
},
{
"path": "data/Dockerfiles/unbound/syslog-ng.conf",
"chars": 391,
"preview": "@version: 4.5\n@include \"scl.conf\"\noptions {\n chain_hostnames(off);\n flush_lines(0);\n use_dns(no);\n use_fqdn(no);\n o"
},
{
"path": "data/Dockerfiles/watchdog/Dockerfile",
"chars": 947,
"preview": "FROM alpine:3.23\n\nLABEL maintainer = \"The Infrastructure Company GmbH <info@servercow.de>\"\n\n# Installation\nRUN apk add -"
},
{
"path": "data/Dockerfiles/watchdog/check_dns.sh",
"chars": 1052,
"preview": "#!/bin/sh\n\nwhile getopts \"H:s:\" opt; do\n case \"$opt\" in\n H) HOST=\"$OPTARG\" ;;\n s) SERVER=\"$OPTARG\" ;;\n *) echo"
},
{
"path": "data/Dockerfiles/watchdog/check_mysql_slavestatus.sh",
"chars": 13210,
"preview": "#!/bin/bash\n#########################################################################\n# Script: check_mysql_slaves"
},
{
"path": "data/Dockerfiles/watchdog/client.cnf",
"chars": 52,
"preview": "[client]\nssl = false\nssl-verify-server-cert = false\n"
},
{
"path": "data/Dockerfiles/watchdog/watchdog.sh",
"chars": 42886,
"preview": "#!/bin/bash\n\nif [ \"${DEV_MODE}\" != \"n\" ]; then\n echo -e \"\\e[31mEnabled Debug Mode\\e[0m\"\n set -x\nfi\n\ntrap \"exit\" INT TE"
},
{
"path": "data/assets/mysql/docker-entrypoint.sh",
"chars": 5792,
"preview": "#!/bin/bash\nset -eo pipefail\nshopt -s nullglob\n\nopenssl req -x509 -sha256 -newkey rsa:2048 -keyout /var/lib/mysql/sql.ke"
},
{
"path": "data/assets/passwd/generate_passwords.sh",
"chars": 135,
"preview": "#!/bin/bash\n\necho DBPASS=$(openssl rand -base64 32 | tr -dc _A-Z-a-z-0-9)\necho DBROOT=$(openssl rand -base64 32 | tr -dc"
},
{
"path": "data/assets/templates/pw_reset_html.tpl",
"chars": 735,
"preview": "<html>\n <head>\n <meta name=\"x-apple-disable-message-reformatting\" />\n <style>\n body {\n font-family: Helvetica, Ar"
},
{
"path": "data/assets/templates/pw_reset_text.tpl",
"chars": 357,
"preview": "Hello {{username2}},\n\nSomebody requested a new password for the {{hostname}} account associated with {{username}}.\nDate "
},
{
"path": "data/assets/templates/quarantine.tpl",
"chars": 1975,
"preview": "<html>\n <head>\n <meta name=\"x-apple-disable-message-reformatting\" />\n <style>\n body {\n font-family: Helvetica, Ar"
},
{
"path": "data/assets/templates/quota.tpl",
"chars": 2069,
"preview": "<html>\n <head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <style>\n "
},
{
"path": "data/conf/acme/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "data/conf/clamav/clamd.conf",
"chars": 889,
"preview": "#Debug true\n#LogFile /dev/null\nLogTime yes\nLogClean yes\nExtendedDetectionInfo yes\nPidFile /run/clamav/clamd.pid\nOfficial"
},
{
"path": "data/conf/clamav/freshclam.conf",
"chars": 423,
"preview": "#UpdateLogFile /dev/console\nLogTime yes\nPidFile /run/clamav/freshclam.pid\nDatabaseOwner clamav\nDNSDatabaseInfo current.c"
},
{
"path": "data/conf/dovecot/auth/mailcowauth.php",
"chars": 3746,
"preview": "<?php\nini_set('error_reporting', 0);\nheader('Content-Type: application/json');\n\n$post = trim(file_get_contents('php://in"
},
{
"path": "data/conf/dovecot/auth/passwd-verify.lua",
"chars": 1790,
"preview": "function auth_password_verify(request, password)\n if request.domain == nil then\n return dovecot.auth.PASSDB_RESULT_U"
},
{
"path": "data/conf/dovecot/dovecot.conf",
"chars": 8272,
"preview": "# --------------------------------------------------------------------------\n# Please create a file \"extra.conf\" for per"
},
{
"path": "data/conf/dovecot/dovecot.folders.conf",
"chars": 5842,
"preview": "namespace inbox {\r\n inbox = yes\r\n location =\r\n separator = /\r\n mailbox \"Trash\" {\r\n auto = subscribe\r\n special_"
},
{
"path": "data/conf/dovecot/ldap/passdb.conf",
"chars": 271,
"preview": "#hosts = 1.2.3.4\n#dn = cn=admin,dc=example,dc=local\n#dnpass = password\n#ldap_version = 3\n#base = ou=People,dc=example,dc"
},
{
"path": "data/conf/mysql/my.cnf",
"chars": 1061,
"preview": "[mysqld]\ncharacter-set-client-handshake = FALSE\ncharacter-set-server = utf8mb4\ncollation-server "
},
{
"path": "data/conf/nginx/templates/nginx.conf.j2",
"chars": 6755,
"preview": "user nginx;\nworker_processes auto;\n\nerror_log /var/log/nginx/error.log notice;\npid /var/run/nginx.pid;\n\n\nevent"
},
{
"path": "data/conf/nginx/templates/sites-default.conf.j2",
"chars": 9756,
"preview": "include /etc/nginx/mime.types;\ncharset utf-8;\noverride_charset on;\n\nserver_tokens off;\n\nssl_protocols TLSv1.2 TLSv1.3;\ns"
},
{
"path": "data/conf/phpfpm/crons/keycloak-sync.php",
"chars": 7448,
"preview": "<?php\n\nrequire_once(__DIR__ . '/../web/inc/vars.inc.php');\nif (file_exists(__DIR__ . '/../web/inc/vars.local.inc.php')) "
},
{
"path": "data/conf/phpfpm/crons/ldap-sync.php",
"chars": 6783,
"preview": "<?php\n\nrequire_once(__DIR__ . '/../web/inc/vars.inc.php');\nif (file_exists(__DIR__ . '/../web/inc/vars.local.inc.php')) "
},
{
"path": "data/conf/phpfpm/php-conf.d/opcache-recommended.ini",
"chars": 448,
"preview": "; NOTE: Restart phpfpm on ANY manual changes to PHP files!\n\n; opcache\nopcache.enable=1\nopcache.enable_cli=1\nopcache.inte"
},
{
"path": "data/conf/phpfpm/php-conf.d/other.ini",
"chars": 68,
"preview": "max_execution_time = 3600\nmax_input_time = 3600\nmemory_limit = 512M\n"
},
{
"path": "data/conf/phpfpm/php-conf.d/upload.ini",
"chars": 64,
"preview": "file_uploads = On\nupload_max_filesize = 64M\npost_max_size = 64M\n"
},
{
"path": "data/conf/phpfpm/php-fpm.d/pools.conf",
"chars": 1471,
"preview": "[system-worker]\nuser = www-data\ngroup = www-data\npm = dynamic\npm.max_children = 15\npm.start_servers = 2\npm.min_spare_ser"
},
{
"path": "data/conf/phpfpm/sogo-sso/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "data/conf/postfix/anonymize_headers.pcre",
"chars": 1108,
"preview": "if /^\\s*Received:.*Authenticated sender.*\\(Postcow\\)/\n#/^Received: from .*? \\([\\w-.]* \\[.*?\\]\\)\\s+\\(Authenticated sender"
},
{
"path": "data/conf/postfix/local_transport",
"chars": 63,
"preview": "/watchdog@localhost$/ watchdog_discard:\n/localhost$/ local:\n"
},
{
"path": "data/conf/postfix/main.cf",
"chars": 7537,
"preview": "# --------------------------------------------------------------------------\n# Please create a file \"extra.cf\" for persi"
},
{
"path": "data/conf/postfix/master.cf",
"chars": 7010,
"preview": "# inter-mx with postscreen on 25/tcp\nsmtp inet n - n - 1 postscreen\n10025 inet"
},
{
"path": "data/conf/postfix/postscreen_access.cidr",
"chars": 49719,
"preview": "# Whitelist generated by Postwhite v3.4 on Sun Mar 1 00:29:01 UTC 2026\n# https://github.com/stevejenkins/postwhite/\n# 2"
},
{
"path": "data/conf/postfix/smtp_dsn_filter",
"chars": 190,
"preview": "/^4(\\.\\d+\\.\\d+ TLS is required, but host \\S+ refused to start TLS: .+)/\n 5$1\n/^4(\\.\\d+\\.\\d+ TLS is required, but "
},
{
"path": "data/conf/redis/redis-conf.sh",
"chars": 241,
"preview": "#!/bin/sh\n\ncat <<EOF > /redis.conf\nrequirepass $REDISPASS\nuser quota_notify on nopass ~QW_* -@all +get +hget +ping\nEOF\n\n"
},
{
"path": "data/conf/rspamd/dynmaps/aliasexp.php",
"chars": 6639,
"preview": "<?php\r\n// File size is limited by Nginx site to 10M\r\n// To speed things up, we do not include prerequisites\r\nheader('Con"
},
{
"path": "data/conf/rspamd/dynmaps/bcc.php",
"chars": 2926,
"preview": "<?php\r\n// File size is limited by Nginx site to 10M\r\n// To speed things up, we do not include prerequisites\r\nheader('Con"
},
{
"path": "data/conf/rspamd/dynmaps/footer.php",
"chars": 3275,
"preview": "<?php\n// File size is limited by Nginx site to 10M\n// To speed things up, we do not include prerequisites\nheader('Conten"
},
{
"path": "data/conf/rspamd/dynmaps/forwardinghosts.php",
"chars": 1379,
"preview": "<?php\nheader('Content-Type: text/plain');\nini_set('error_reporting', 0);\n\n$redis = new Redis();\n$redis->connect('redis-m"
},
{
"path": "data/conf/rspamd/dynmaps/index.html",
"chars": 15,
"preview": "<html>\n</html>\n"
},
{
"path": "data/conf/rspamd/dynmaps/sasl_logs.php",
"chars": 13,
"preview": "<?php\n// PoC\n"
},
{
"path": "data/conf/rspamd/dynmaps/settings.php",
"chars": 14982,
"preview": "<?php\r\n/*\r\nThe match section performs AND operation on different matches: for example, if you have from and rcpt in the "
},
{
"path": "data/conf/rspamd/dynmaps/vars.inc.php",
"chars": 171,
"preview": "<?php\nrequire_once('../../../web/inc/vars.inc.php');\nif (file_exists('../../../web/inc/vars.local.inc.php')) {\n include"
},
{
"path": "data/conf/rspamd/lua/ratelimit.lua",
"chars": 564,
"preview": "local custom_keywords = {}\n\ncustom_keywords.mailcow = function(task)\n local rspamd_logger = require \"rspamd_logger\"\n l"
},
{
"path": "data/conf/rspamd/lua/rspamd.local.lua",
"chars": 31493,
"preview": "rspamd_config.MAILCOW_AUTH = {\n\tcallback = function(task)\n\t\tlocal uname = task:get_user()\n\t\tif uname then\n\t\t\treturn 1\n\t\t"
},
{
"path": "data/conf/rspamd/meta_exporter/pipe.php",
"chars": 9770,
"preview": "<?php\r\n// File size is limited by Nginx site to 10M\r\n// To speed things up, we do not include prerequisites\r\nheader('Con"
},
{
"path": "data/conf/rspamd/meta_exporter/pipe_rl.php",
"chars": 1659,
"preview": "<?php\r\n// File size is limited by Nginx site to 10M\r\n// To speed things up, we do not include prerequisites\r\nheader('Con"
},
{
"path": "data/conf/rspamd/meta_exporter/pushover.php",
"chars": 10598,
"preview": "<?php\r\n// File size is limited by Nginx site to 10M\r\n// To speed things up, we do not include prerequisites\r\nheader('Con"
},
{
"path": "data/conf/rspamd/meta_exporter/vars.inc.php",
"chars": 171,
"preview": "<?php\nrequire_once('../../../web/inc/vars.inc.php');\nif (file_exists('../../../web/inc/vars.local.inc.php')) {\n include"
},
{
"path": "data/conf/rspamd/plugins.d/README.md",
"chars": 55,
"preview": "This is where you should copy any rspamd custom module\n"
},
{
"path": "data/conf/rspamd/rspamd.conf.local",
"chars": 20,
"preview": "# rspamd.conf.local\n"
},
{
"path": "data/conf/rspamd/rspamd.conf.override",
"chars": 24,
"preview": "# rspamd.conf.override\n\n"
},
{
"path": "data/conf/sogo/custom-sogo.js",
"chars": 726,
"preview": "// redirect to mailcow login form\ndocument.addEventListener('DOMContentLoaded', function () {\n var loginForm = docume"
},
{
"path": "data/conf/sogo/sogo.conf",
"chars": 3359,
"preview": "{\n SOGoCalendarDefaultRoles = (\n PublicViewer,\n ConfidentialDAndTViewer,\n PrivateDAndTViewer\n "
},
{
"path": "data/conf/unbound/unbound.conf",
"chars": 1300,
"preview": "server:\n verbosity: 1\n interface: 0.0.0.0\n interface: ::0\n logfile: /dev/console\n do-ip4: yes\n do-ip6: yes\n do-ud"
},
{
"path": "data/hooks/README.md",
"chars": 153,
"preview": "Place executable scripts in each directory to run a hook at the end of a docker-entrypoint.sh script.\n\nOnly images with "
},
{
"path": "data/web/_rspamderror.php",
"chars": 530,
"preview": "<?php\n$redis = new Redis();\ntry {\n if (!empty(getenv('REDIS_SLAVEOF_IP'))) {\n $redis->connect(getenv('REDIS_SLAVEOF_"
},
{
"path": "data/web/_status.502.html",
"chars": 2015,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>Preparing</title>\n <meta name=\"viewport\" content=\"width=device-width, init"
},
{
"path": "data/web/admin/dashboard.php",
"chars": 2755,
"preview": "<?php\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/inc/prerequisites.inc.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/"
},
{
"path": "data/web/admin/index.php",
"chars": 1155,
"preview": "<?php\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/inc/prerequisites.inc.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/"
},
{
"path": "data/web/admin/mailbox.php",
"chars": 1478,
"preview": "<?php\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/inc/prerequisites.inc.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/"
},
{
"path": "data/web/admin/queue.php",
"chars": 712,
"preview": "<?php\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/inc/prerequisites.inc.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/"
},
{
"path": "data/web/admin/system.php",
"chars": 4664,
"preview": "<?php\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/inc/prerequisites.inc.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/"
},
{
"path": "data/web/api/index.css",
"chars": 202,
"preview": "html {\n box-sizing: border-box;\n overflow: -moz-scrollbars-vertical;\n overflow-y: scroll;\n}\n\n*,\n*:before,\n*:aft"
},
{
"path": "data/web/api/index.html",
"chars": 734,
"preview": "<!-- HTML for static distribution bundle build -->\n<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n"
},
{
"path": "data/web/api/oauth2-redirect.html",
"chars": 2715,
"preview": "<!doctype html>\n<html lang=\"en-US\">\n<head>\n <title>Swagger UI: OAuth2 Redirect</title>\n</head>\n<body>\n<script>\n 'u"
},
{
"path": "data/web/api/openapi.yaml",
"chars": 204827,
"preview": "openapi: 3.1.0\ninfo:\n description: >-\n mailcow is complete e-mailing solution with advanced antispam, antivirus,\n "
},
{
"path": "data/web/api/swagger-initializer.js",
"chars": 433,
"preview": "window.onload = function() {\n // Begin Swagger UI call region\n window.ui = SwaggerUIBundle({\n urls: [{url: \"/api/op"
},
{
"path": "data/web/api/swagger-ui-bundle.js",
"chars": 1434551,
"preview": "/*! For license information please see swagger-ui-bundle.js.LICENSE.txt */\n!function(e,t){\"object\"==typeof exports&&\"obj"
},
{
"path": "data/web/api/swagger-ui-es-bundle-core.js",
"chars": 498179,
"preview": "/*! For license information please see swagger-ui-es-bundle-core.js.LICENSE.txt */\nimport*as e from\"react-immutable-pure"
},
{
"path": "data/web/api/swagger-ui-es-bundle.js",
"chars": 1434341,
"preview": "/*! For license information please see swagger-ui-es-bundle.js.LICENSE.txt */\n(()=>{var e={17967:(e,t)=>{\"use strict\";t."
},
{
"path": "data/web/api/swagger-ui-standalone-preset.js",
"chars": 246193,
"preview": "/*! For license information please see swagger-ui-standalone-preset.js.LICENSE.txt */\n!function(t,e){\"object\"==typeof ex"
},
{
"path": "data/web/api/swagger-ui.css",
"chars": 150945,
"preview": ".swagger-ui{color:#3b4151;font-family:sans-serif/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.cs"
},
{
"path": "data/web/api/swagger-ui.js",
"chars": 383256,
"preview": "!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.am"
},
{
"path": "data/web/autoconfig.php",
"chars": 4303,
"preview": "<?php\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/inc/vars.inc.php';\n$default_autodiscover_config = $autodiscover_config;"
},
{
"path": "data/web/autodiscover-json.php",
"chars": 1029,
"preview": "<?php\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/inc/vars.inc.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/inc/funct"
},
{
"path": "data/web/autodiscover.php",
"chars": 9834,
"preview": "<?php\nrequire_once $_SERVER['DOCUMENT_ROOT'] . '/inc/lib/vendor/autoload.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'] . "
},
{
"path": "data/web/css/build/003-bootstrap-select.css",
"chars": 13670,
"preview": "/*!\r\n * Bootstrap-select v1.14.0-beta2 (https://developer.snapappointments.com/bootstrap-select)\r\n *\r\n * Copyright 2012-"
},
{
"path": "data/web/css/build/011-datatables.css",
"chars": 20488,
"preview": "/*\n * This combined file was created by the DataTables downloader builder:\n * https://datatables.net/download\n *\n * To"
},
{
"path": "data/web/css/build/012-bootstrap-icons.css",
"chars": 80508,
"preview": "@font-face {\n font-family: \"bootstrap-icons\";\n src: url(\"/fonts/bootstrap-icons.woff2?524846017b983fc8ded9325d94ed40f3"
},
{
"path": "data/web/css/build/013-datatables.css",
"chars": 2217,
"preview": ".dataTables_info {\n margin: 15px 0 !important;\n padding: 0px !important;\n}\n.dataTables_paginate, .dataTables_lengt"
},
{
"path": "data/web/css/build/014-mailcow.css",
"chars": 9538,
"preview": "@font-face {\r\n font-family: 'Noto Sans';\r\n font-style: normal;\r\n font-weight: 400;\r\n src: local(''),\r\n url('/f"
},
{
"path": "data/web/css/build/015-responsive.css",
"chars": 4024,
"preview": ".btn-xs-lg>.lang-sm:after {\n margin-left: 4px;\n}\n\n.bootstrap-select {\n max-width: 350px;\n}\n\n.card .apps {\n display: f"
},
{
"path": "data/web/css/site/admin.css",
"chars": 1729,
"preview": ".pagination a {\r\n text-decoration: none !important;\r\n}\r\n.panel.panel-default {\r\n overflow: visible !important;\r\n}\r\n.ta"
},
{
"path": "data/web/css/site/debug.css",
"chars": 630,
"preview": ".pagination a {\r\n text-decoration: none !important;\r\n}\r\n.panel.panel-default {\r\n overflow: visible !important;\r\n}\r\n.ta"
}
]
// ... and 2568 more files (download for full content)
About this extraction
This page contains the full source code of the mailcow/mailcow-dockerized GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2768 files (20.0 MB), approximately 4.1M tokens, and a symbol index with 16465 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.