Warning: Permanently added '3.87.12.49' (ED25519) to the list of known hosts.

You can reproduce this build on your computer by running:

  sudo dnf install copr-rpmbuild
  /usr/bin/copr-rpmbuild --verbose --drop-resultdir --task-url https://copr.fedorainfracloud.org/backend/get-build-task/8333551-fedora-39-x86_64 --chroot fedora-39-x86_64


Version: 1.2
PID: 19644
Logging PID: 19645
Task:
{'allow_user_ssh': False,
 'appstream': True,
 'background': True,
 'bootstrap': 'on',
 'build_id': 8333551,
 'buildroot_pkgs': [],
 'chroot': 'fedora-39-x86_64',
 'enable_net': True,
 'fedora_review': False,
 'git_hash': '9fc1659cbe3188794a4376b8f03370978b1634c3',
 'git_repo': 'https://copr-dist-git.fedorainfracloud.org/git/phracek/PyCharm/pycharm-community',
 'isolation': 'default',
 'memory_reqs': 2048,
 'package_name': 'pycharm-community',
 'package_version': '2024.3-2',
 'project_dirname': 'PyCharm',
 'project_name': 'PyCharm',
 'project_owner': 'phracek',
 'repo_priority': None,
 'repos': [{'baseurl': 'https://download.copr.fedorainfracloud.org/results/phracek/PyCharm/fedora-39-x86_64/',
            'id': 'copr_base',
            'name': 'Copr repository',
            'priority': None}],
 'sandbox': 'phracek/PyCharm--https://api.github.com/users/phracek',
 'source_json': {},
 'source_type': None,
 'ssh_public_keys': None,
 'storage': None,
 'submitter': 'https://api.github.com/users/phracek',
 'tags': [],
 'task_id': '8333551-fedora-39-x86_64',
 'timeout': 18000,
 'uses_devel_repo': False,
 'with_opts': [],
 'without_opts': []}

Running: git clone https://copr-dist-git.fedorainfracloud.org/git/phracek/PyCharm/pycharm-community /var/lib/copr-rpmbuild/workspace/workdir-3_23ausb/pycharm-community --depth 500 --no-single-branch --recursive

cmd: ['git', 'clone', 'https://copr-dist-git.fedorainfracloud.org/git/phracek/PyCharm/pycharm-community', '/var/lib/copr-rpmbuild/workspace/workdir-3_23ausb/pycharm-community', '--depth', '500', '--no-single-branch', '--recursive']
cwd: .
rc: 0
stdout: 
stderr: Cloning into '/var/lib/copr-rpmbuild/workspace/workdir-3_23ausb/pycharm-community'...

Running: git checkout 9fc1659cbe3188794a4376b8f03370978b1634c3 --

cmd: ['git', 'checkout', '9fc1659cbe3188794a4376b8f03370978b1634c3', '--']
cwd: /var/lib/copr-rpmbuild/workspace/workdir-3_23ausb/pycharm-community
rc: 0
stdout: 
stderr: Note: switching to '9fc1659cbe3188794a4376b8f03370978b1634c3'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 9fc1659 automatic import of pycharm-community

Running: dist-git-client sources

cmd: ['dist-git-client', 'sources']
cwd: /var/lib/copr-rpmbuild/workspace/workdir-3_23ausb/pycharm-community
rc: 0
stdout: 
stderr: INFO: Reading stdout from command: git rev-parse --abbrev-ref HEAD
INFO: Reading stdout from command: git rev-parse HEAD
INFO: Reading sources specification file: sources
INFO: Downloading pycharm-community-2024.3.tar.gz
INFO: Reading stdout from command: curl --help all
INFO: Calling: curl -H Pragma: -o pycharm-community-2024.3.tar.gz --location --connect-timeout 60 --retry 3 --retry-delay 10 --remote-time --show-error --fail --retry-all-errors https://copr-dist-git.fedorainfracloud.org/repo/pkgs/phracek/PyCharm/pycharm-community/pycharm-community-2024.3.tar.gz/md5/d53e084703a3f068163574a54fd36a2f/pycharm-community-2024.3.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  682M  100  682M    0     0   315M      0  0:00:02  0:00:02 --:--:--  315M
INFO: Reading stdout from command: md5sum pycharm-community-2024.3.tar.gz

/usr/bin/tail: /var/lib/copr-rpmbuild/main.log: file truncated
Running (timeout=18000): unbuffer mock --spec /var/lib/copr-rpmbuild/workspace/workdir-3_23ausb/pycharm-community/pycharm-community.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-3_23ausb/pycharm-community --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1733142171.782165 -r /var/lib/copr-rpmbuild/results/configs/child.cfg
INFO: mock.py version 5.9 starting (python version = 3.13.0, NVR = mock-5.9-1.fc41), args: /usr/libexec/mock/mock --spec /var/lib/copr-rpmbuild/workspace/workdir-3_23ausb/pycharm-community/pycharm-community.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-3_23ausb/pycharm-community --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1733142171.782165 -r /var/lib/copr-rpmbuild/results/configs/child.cfg
Start(bootstrap): init plugins
INFO: tmpfs initialized
INFO: selinux enabled
INFO: chroot_scan: initialized
INFO: compress_logs: initialized
Finish(bootstrap): init plugins
Start: init plugins
INFO: tmpfs initialized
INFO: selinux enabled
INFO: chroot_scan: initialized
INFO: compress_logs: initialized
Finish: init plugins
INFO: Signal handler active
Start: run
INFO: Start(/var/lib/copr-rpmbuild/workspace/workdir-3_23ausb/pycharm-community/pycharm-community.spec)  Config(fedora-39-x86_64)
Start: clean chroot
Finish: clean chroot
Mock Version: 5.9
INFO: Mock Version: 5.9
Start(bootstrap): chroot init
INFO: mounting tmpfs at /var/lib/mock/fedora-39-x86_64-bootstrap-1733142171.782165/root.
INFO: calling preinit hooks
INFO: enabled root cache
INFO: enabled package manager cache
Start(bootstrap): cleaning package manager metadata
Finish(bootstrap): cleaning package manager metadata
INFO: Package manager dnf4 detected and used (fallback)
Start(bootstrap): installing dnf tooling
No matches found for the following disable plugin patterns: local, spacewalk, versionlock
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

Copr repository                                 170 kB/s | 5.0 kB     00:00    
fedora                                           49 MB/s |  34 MB     00:00    
updates                                          29 MB/s |  12 MB     00:00    
Dependencies resolved.
================================================================================
 Package                       Arch   Version                     Repo     Size
================================================================================
Installing:
 python3-dnf                   noarch 4.21.1-1.fc39               updates 620 k
 python3-dnf-plugins-core      noarch 4.9.0-1.fc39                updates 320 k
Installing dependencies:
 alternatives                  x86_64 1.26-1.fc39                 updates  39 k
 audit-libs                    x86_64 3.1.5-1.fc39                updates 123 k
 basesystem                    noarch 11-18.fc39                  fedora  7.2 k
 bash                          x86_64 5.2.26-1.fc39               updates 1.8 M
 bzip2-libs                    x86_64 1.0.8-16.fc39               fedora   41 k
 ca-certificates               noarch 2024.2.69_v8.0.401-1.0.fc39 updates 871 k
 coreutils                     x86_64 9.3-7.fc39                  updates 1.1 M
 coreutils-common              x86_64 9.3-7.fc39                  updates 2.1 M
 crypto-policies               noarch 20231204-1.git1e3a2e4.fc39  updates 100 k
 curl                          x86_64 8.2.1-5.fc39                updates 344 k
 cyrus-sasl-lib                x86_64 2.1.28-11.fc39              fedora  793 k
 dbus-libs                     x86_64 1:1.14.10-1.fc39            fedora  156 k
 dnf-data                      noarch 4.21.1-1.fc39               updates  39 k
 elfutils-default-yama-scope   noarch 0.192-4.fc39                updates  12 k
 elfutils-libelf               x86_64 0.192-4.fc39                updates 208 k
 elfutils-libs                 x86_64 0.192-4.fc39                updates 267 k
 expat                         x86_64 2.6.3-1.fc39                updates 114 k
 fedora-gpg-keys               noarch 39-2                        updates 130 k
 fedora-release                noarch 39-36                       updates 8.6 k
 fedora-release-common         noarch 39-36                       updates  19 k
 fedora-release-identity-basic noarch 39-36                       updates 9.4 k
 fedora-repos                  noarch 39-2                        updates 9.3 k
 file-libs                     x86_64 5.44-5.fc39                 fedora  729 k
 filesystem                    x86_64 3.18-6.fc39                 fedora  1.1 M
 findutils                     x86_64 1:4.9.0-6.fc39              updates 490 k
 gawk                          x86_64 5.2.2-2.fc39                fedora  1.1 M
 gdbm-libs                     x86_64 1:1.23-4.fc39               fedora   56 k
 glib2                         x86_64 2.78.6-1.fc39               updates 2.8 M
 glibc                         x86_64 2.38-19.fc39                updates 2.1 M
 glibc-common                  x86_64 2.38-19.fc39                updates 344 k
 glibc-minimal-langpack        x86_64 2.38-19.fc39                updates  65 k
 gmp                           x86_64 1:6.2.1-5.fc39              fedora  313 k
 gnupg2                        x86_64 2.4.4-1.fc39                updates 2.7 M
 gnutls                        x86_64 3.8.6-1.fc39                updates 1.1 M
 grep                          x86_64 3.11-3.fc39                 fedora  298 k
 ima-evm-utils                 x86_64 1.5-2.fc39                  fedora   63 k
 json-c                        x86_64 0.17-1.fc39                 fedora   43 k
 keyutils-libs                 x86_64 1.6.3-1.fc39                updates  31 k
 krb5-libs                     x86_64 1.21.3-2.fc39               updates 766 k
 libacl                        x86_64 2.3.1-9.fc39                updates  23 k
 libarchive                    x86_64 3.7.1-3.fc39                updates 407 k
 libassuan                     x86_64 2.5.6-2.fc39                fedora   67 k
 libattr                       x86_64 2.5.1-8.fc39                fedora   18 k
 libb2                         x86_64 0.98.1-9.fc39               fedora   25 k
 libblkid                      x86_64 2.39.4-1.fc39               updates 116 k
 libbrotli                     x86_64 1.1.0-1.fc39                fedora  336 k
 libcap                        x86_64 2.48-9.fc39                 updates  68 k
 libcap-ng                     x86_64 0.8.3-8.fc39                fedora   32 k
 libcom_err                    x86_64 1.47.0-2.fc39               fedora   26 k
 libcomps                      x86_64 0.1.20-1.fc39               updates  78 k
 libcurl                       x86_64 8.2.1-5.fc39                updates 322 k
 libdnf                        x86_64 0.73.3-1.fc39               updates 681 k
 libeconf                      x86_64 0.5.2-2.fc39                updates  30 k
 libevent                      x86_64 2.1.12-9.fc39               fedora  258 k
 libffi                        x86_64 3.4.4-4.fc39                fedora   40 k
 libfsverity                   x86_64 1.4-10.fc39                 fedora   19 k
 libgcc                        x86_64 13.3.1-3.fc39               updates 120 k
 libgcrypt                     x86_64 1.10.2-2.fc39               fedora  507 k
 libgomp                       x86_64 13.3.1-3.fc39               updates 329 k
 libgpg-error                  x86_64 1.47-2.fc39                 fedora  230 k
 libidn2                       x86_64 2.3.7-1.fc39                updates 119 k
 libksba                       x86_64 1.6.4-2.fc39                fedora  159 k
 libmodulemd                   x86_64 2.15.0-5.fc39               fedora  232 k
 libmount                      x86_64 2.39.4-1.fc39               updates 154 k
 libnghttp2                    x86_64 1.55.1-5.fc39               updates  75 k
 libnsl2                       x86_64 2.0.0-6.fc39                fedora   30 k
 libpsl                        x86_64 0.21.2-4.fc39               fedora   63 k
 librepo                       x86_64 1.19.0-1.fc39               updates  99 k
 libselinux                    x86_64 3.5-5.fc39                  fedora   87 k
 libsemanage                   x86_64 3.5-4.fc39                  fedora  120 k
 libsepol                      x86_64 3.5-2.fc39                  fedora  324 k
 libsigsegv                    x86_64 2.14-5.fc39                 fedora   27 k
 libsmartcols                  x86_64 2.39.4-1.fc39               updates  67 k
 libsolv                       x86_64 0.7.30-1.fc39               updates 426 k
 libssh                        x86_64 0.10.6-2.fc39               updates 212 k
 libssh-config                 noarch 0.10.6-2.fc39               updates 9.0 k
 libstdc++                     x86_64 13.3.1-3.fc39               updates 870 k
 libtasn1                      x86_64 4.19.0-3.fc39               fedora   74 k
 libtirpc                      x86_64 1.3.6-0.fc39                updates  94 k
 libtool-ltdl                  x86_64 2.4.7-7.fc39                fedora   36 k
 libunistring                  x86_64 1.1-5.fc39                  fedora  543 k
 libuuid                       x86_64 2.39.4-1.fc39               updates  28 k
 libverto                      x86_64 0.3.2-6.fc39                fedora   20 k
 libxcrypt                     x86_64 4.4.36-2.fc39               fedora  119 k
 libxml2                       x86_64 2.10.4-3.fc39               fedora  701 k
 libyaml                       x86_64 0.2.5-12.fc39               fedora   59 k
 libzstd                       x86_64 1.5.6-1.fc39                updates 312 k
 lua-libs                      x86_64 5.4.6-3.fc39                fedora  133 k
 lz4-libs                      x86_64 1.9.4-4.fc39                fedora   67 k
 mpdecimal                     x86_64 2.5.1-7.fc39                fedora   89 k
 mpfr                          x86_64 4.2.0-3.fc39                fedora  344 k
 ncurses-base                  noarch 6.4-7.20230520.fc39.1       updates  88 k
 ncurses-libs                  x86_64 6.4-7.20230520.fc39.1       updates 336 k
 nettle                        x86_64 3.9.1-2.fc39                fedora  425 k
 npth                          x86_64 1.6-14.fc39                 fedora   25 k
 openldap                      x86_64 2.6.7-1.fc39                updates 254 k
 openssl-libs                  x86_64 1:3.1.4-4.fc39              updates 2.2 M
 p11-kit                       x86_64 0.25.5-1.fc39               updates 515 k
 p11-kit-trust                 x86_64 0.25.5-1.fc39               updates 138 k
 pcre2                         x86_64 10.42-1.fc39.2              fedora  233 k
 pcre2-syntax                  noarch 10.42-1.fc39.2              fedora  143 k
 popt                          x86_64 1.19-3.fc39                 fedora   66 k
 publicsuffix-list-dafsa       noarch 20240107-1.fc39             updates  58 k
 python-pip-wheel              noarch 23.2.1-2.fc39               updates 1.5 M
 python3                       x86_64 3.12.7-1.fc39               updates  28 k
 python3-dateutil              noarch 1:2.8.2-10.fc39             fedora  355 k
 python3-dbus                  x86_64 1.3.2-4.fc39                fedora  157 k
 python3-distro                noarch 1.8.0-6.fc39                fedora   49 k
 python3-hawkey                x86_64 0.73.3-1.fc39               updates 107 k
 python3-libcomps              x86_64 0.1.20-1.fc39               updates  48 k
 python3-libdnf                x86_64 0.73.3-1.fc39               updates 860 k
 python3-libs                  x86_64 3.12.7-1.fc39               updates 9.2 M
 python3-rpm                   x86_64 4.19.1.1-1.fc39             updates  68 k
 python3-six                   noarch 1.16.0-12.fc39              fedora   41 k
 python3-systemd               x86_64 235-5.fc39                  fedora  107 k
 readline                      x86_64 8.2-6.fc39                  updates 212 k
 rpm                           x86_64 4.19.1.1-1.fc39             updates 538 k
 rpm-build-libs                x86_64 4.19.1.1-1.fc39             updates  95 k
 rpm-libs                      x86_64 4.19.1.1-1.fc39             updates 312 k
 rpm-sequoia                   x86_64 1.7.0-1.fc39                updates 904 k
 rpm-sign-libs                 x86_64 4.19.1.1-1.fc39             updates  26 k
 sed                           x86_64 4.8-14.fc39                 fedora  306 k
 setup                         noarch 2.14.4-1.fc39               fedora  154 k
 shadow-utils                  x86_64 2:4.14.0-2.fc39             updates 1.3 M
 sqlite-libs                   x86_64 3.42.0-7.fc39               fedora  678 k
 systemd-libs                  x86_64 254.20-1.fc39               updates 681 k
 tpm2-tss                      x86_64 4.0.2-1.fc39                updates 391 k
 tzdata                        noarch 2024a-2.fc39                updates 715 k
 xz-libs                       x86_64 5.4.4-1.fc39                fedora  108 k
 zchunk-libs                   x86_64 1.5.1-1.fc39                updates  52 k
 zlib                          x86_64 1.2.13-4.fc39               fedora   94 k

Transaction Summary
================================================================================
Install  133 Packages

Total download size: 56 M
Installed size: 197 M
Downloading Packages:
(1/133): bzip2-libs-1.0.8-16.fc39.x86_64.rpm    3.4 MB/s |  41 kB     00:00    
(2/133): basesystem-11-18.fc39.noarch.rpm       575 kB/s | 7.2 kB     00:00    
(3/133): dbus-libs-1.14.10-1.fc39.x86_64.rpm     83 MB/s | 156 kB     00:00    
(4/133): file-libs-5.44-5.fc39.x86_64.rpm       166 MB/s | 729 kB     00:00    
(5/133): cyrus-sasl-lib-2.1.28-11.fc39.x86_64.r  39 MB/s | 793 kB     00:00    
(6/133): filesystem-3.18-6.fc39.x86_64.rpm      155 MB/s | 1.1 MB     00:00    
(7/133): gdbm-libs-1.23-4.fc39.x86_64.rpm        17 MB/s |  56 kB     00:00    
(8/133): gawk-5.2.2-2.fc39.x86_64.rpm           144 MB/s | 1.1 MB     00:00    
(9/133): gmp-6.2.1-5.fc39.x86_64.rpm             60 MB/s | 313 kB     00:00    
(10/133): grep-3.11-3.fc39.x86_64.rpm            70 MB/s | 298 kB     00:00    
(11/133): ima-evm-utils-1.5-2.fc39.x86_64.rpm    11 MB/s |  63 kB     00:00    
(12/133): json-c-0.17-1.fc39.x86_64.rpm          10 MB/s |  43 kB     00:00    
(13/133): libassuan-2.5.6-2.fc39.x86_64.rpm      14 MB/s |  67 kB     00:00    
(14/133): libattr-2.5.1-8.fc39.x86_64.rpm       2.3 MB/s |  18 kB     00:00    
(15/133): libbrotli-1.1.0-1.fc39.x86_64.rpm      42 MB/s | 336 kB     00:00    
(16/133): libb2-0.98.1-9.fc39.x86_64.rpm        1.8 MB/s |  25 kB     00:00    
(17/133): libcap-ng-0.8.3-8.fc39.x86_64.rpm     4.5 MB/s |  32 kB     00:00    
(18/133): libcom_err-1.47.0-2.fc39.x86_64.rpm   3.9 MB/s |  26 kB     00:00    
(19/133): libevent-2.1.12-9.fc39.x86_64.rpm      96 MB/s | 258 kB     00:00    
(20/133): libffi-3.4.4-4.fc39.x86_64.rpm         17 MB/s |  40 kB     00:00    
(21/133): libfsverity-1.4-10.fc39.x86_64.rpm     12 MB/s |  19 kB     00:00    
(22/133): libksba-1.6.4-2.fc39.x86_64.rpm        95 MB/s | 159 kB     00:00    
(23/133): libmodulemd-2.15.0-5.fc39.x86_64.rpm  105 MB/s | 232 kB     00:00    
(24/133): libnsl2-2.0.0-6.fc39.x86_64.rpm        18 MB/s |  30 kB     00:00    
(25/133): libpsl-0.21.2-4.fc39.x86_64.rpm        39 MB/s |  63 kB     00:00    
(26/133): libselinux-3.5-5.fc39.x86_64.rpm       50 MB/s |  87 kB     00:00    
(27/133): libsemanage-3.5-4.fc39.x86_64.rpm      60 MB/s | 120 kB     00:00    
(28/133): libgpg-error-1.47-2.fc39.x86_64.rpm    15 MB/s | 230 kB     00:00    
(29/133): libgcrypt-1.10.2-2.fc39.x86_64.rpm     30 MB/s | 507 kB     00:00    
(30/133): libsepol-3.5-2.fc39.x86_64.rpm         63 MB/s | 324 kB     00:00    
(31/133): libsigsegv-2.14-5.fc39.x86_64.rpm     3.8 MB/s |  27 kB     00:00    
(32/133): libtasn1-4.19.0-3.fc39.x86_64.rpm     8.3 MB/s |  74 kB     00:00    
(33/133): libtool-ltdl-2.4.7-7.fc39.x86_64.rpm  3.8 MB/s |  36 kB     00:00    
(34/133): libverto-0.3.2-6.fc39.x86_64.rpm      4.9 MB/s |  20 kB     00:00    
(35/133): libunistring-1.1-5.fc39.x86_64.rpm     61 MB/s | 543 kB     00:00    
(36/133): libxcrypt-4.4.36-2.fc39.x86_64.rpm     28 MB/s | 119 kB     00:00    
(37/133): libyaml-0.2.5-12.fc39.x86_64.rpm       30 MB/s |  59 kB     00:00    
(38/133): libxml2-2.10.4-3.fc39.x86_64.rpm      164 MB/s | 701 kB     00:00    
(39/133): lua-libs-5.4.6-3.fc39.x86_64.rpm       37 MB/s | 133 kB     00:00    
(40/133): lz4-libs-1.9.4-4.fc39.x86_64.rpm       29 MB/s |  67 kB     00:00    
(41/133): mpdecimal-2.5.1-7.fc39.x86_64.rpm      39 MB/s |  89 kB     00:00    
(42/133): mpfr-4.2.0-3.fc39.x86_64.rpm           96 MB/s | 344 kB     00:00    
(43/133): nettle-3.9.1-2.fc39.x86_64.rpm         93 MB/s | 425 kB     00:00    
(44/133): npth-1.6-14.fc39.x86_64.rpm           6.9 MB/s |  25 kB     00:00    
(45/133): pcre2-10.42-1.fc39.2.x86_64.rpm       100 MB/s | 233 kB     00:00    
(46/133): pcre2-syntax-10.42-1.fc39.2.noarch.rp  55 MB/s | 143 kB     00:00    
(47/133): popt-1.19-3.fc39.x86_64.rpm            27 MB/s |  66 kB     00:00    
(48/133): python3-dateutil-2.8.2-10.fc39.noarch 122 MB/s | 355 kB     00:00    
(49/133): python3-distro-1.8.0-6.fc39.noarch.rp  23 MB/s |  49 kB     00:00    
(50/133): python3-six-1.16.0-12.fc39.noarch.rpm  27 MB/s |  41 kB     00:00    
(51/133): python3-dbus-1.3.2-4.fc39.x86_64.rpm   41 MB/s | 157 kB     00:00    
(52/133): python3-systemd-235-5.fc39.x86_64.rpm  62 MB/s | 107 kB     00:00    
(53/133): sed-4.8-14.fc39.x86_64.rpm             76 MB/s | 306 kB     00:00    
(54/133): setup-2.14.4-1.fc39.noarch.rpm         37 MB/s | 154 kB     00:00    
(55/133): sqlite-libs-3.42.0-7.fc39.x86_64.rpm  116 MB/s | 678 kB     00:00    
(56/133): xz-libs-5.4.4-1.fc39.x86_64.rpm        25 MB/s | 108 kB     00:00    
(57/133): zlib-1.2.13-4.fc39.x86_64.rpm          23 MB/s |  94 kB     00:00    
(58/133): alternatives-1.26-1.fc39.x86_64.rpm    13 MB/s |  39 kB     00:00    
(59/133): audit-libs-3.1.5-1.fc39.x86_64.rpm     59 MB/s | 123 kB     00:00    
(60/133): ca-certificates-2024.2.69_v8.0.401-1. 118 MB/s | 871 kB     00:00    
(61/133): bash-5.2.26-1.fc39.x86_64.rpm         154 MB/s | 1.8 MB     00:00    
(62/133): coreutils-9.3-7.fc39.x86_64.rpm        93 MB/s | 1.1 MB     00:00    
(63/133): crypto-policies-20231204-1.git1e3a2e4  19 MB/s | 100 kB     00:00    
(64/133): curl-8.2.1-5.fc39.x86_64.rpm           82 MB/s | 344 kB     00:00    
(65/133): coreutils-common-9.3-7.fc39.x86_64.rp 169 MB/s | 2.1 MB     00:00    
(66/133): dnf-data-4.21.1-1.fc39.noarch.rpm     8.0 MB/s |  39 kB     00:00    
(67/133): elfutils-default-yama-scope-0.192-4.f 3.4 MB/s |  12 kB     00:00    
(68/133): elfutils-libelf-0.192-4.fc39.x86_64.r  72 MB/s | 208 kB     00:00    
(69/133): elfutils-libs-0.192-4.fc39.x86_64.rpm  78 MB/s | 267 kB     00:00    
(70/133): expat-2.6.3-1.fc39.x86_64.rpm          30 MB/s | 114 kB     00:00    
(71/133): fedora-gpg-keys-39-2.noarch.rpm        68 MB/s | 130 kB     00:00    
(72/133): fedora-release-39-36.noarch.rpm       4.0 MB/s | 8.6 kB     00:00    
(73/133): fedora-release-common-39-36.noarch.rp 7.3 MB/s |  19 kB     00:00    
(74/133): fedora-release-identity-basic-39-36.n 4.0 MB/s | 9.4 kB     00:00    
(75/133): fedora-repos-39-2.noarch.rpm          4.7 MB/s | 9.3 kB     00:00    
(76/133): findutils-4.9.0-6.fc39.x86_64.rpm     145 MB/s | 490 kB     00:00    
(77/133): glibc-common-2.38-19.fc39.x86_64.rpm   41 MB/s | 344 kB     00:00    
(78/133): glibc-2.38-19.fc39.x86_64.rpm         155 MB/s | 2.1 MB     00:00    
(79/133): glib2-2.78.6-1.fc39.x86_64.rpm        154 MB/s | 2.8 MB     00:00    
(80/133): glibc-minimal-langpack-2.38-19.fc39.x 9.2 MB/s |  65 kB     00:00    
(81/133): gnupg2-2.4.4-1.fc39.x86_64.rpm        224 MB/s | 2.7 MB     00:00    
(82/133): keyutils-libs-1.6.3-1.fc39.x86_64.rpm 3.6 MB/s |  31 kB     00:00    
(83/133): gnutls-3.8.6-1.fc39.x86_64.rpm        106 MB/s | 1.1 MB     00:00    
(84/133): libacl-2.3.1-9.fc39.x86_64.rpm         13 MB/s |  23 kB     00:00    
(85/133): krb5-libs-1.21.3-2.fc39.x86_64.rpm    132 MB/s | 766 kB     00:00    
(86/133): libarchive-3.7.1-3.fc39.x86_64.rpm     79 MB/s | 407 kB     00:00    
(87/133): libblkid-2.39.4-1.fc39.x86_64.rpm      22 MB/s | 116 kB     00:00    
(88/133): libcap-2.48-9.fc39.x86_64.rpm          24 MB/s |  68 kB     00:00    
(89/133): libcomps-0.1.20-1.fc39.x86_64.rpm      29 MB/s |  78 kB     00:00    
(90/133): libcurl-8.2.1-5.fc39.x86_64.rpm       103 MB/s | 322 kB     00:00    
(91/133): libdnf-0.73.3-1.fc39.x86_64.rpm       141 MB/s | 681 kB     00:00    
(92/133): libeconf-0.5.2-2.fc39.x86_64.rpm      6.5 MB/s |  30 kB     00:00    
(93/133): libgcc-13.3.1-3.fc39.x86_64.rpm        28 MB/s | 120 kB     00:00    
(94/133): libgomp-13.3.1-3.fc39.x86_64.rpm       98 MB/s | 329 kB     00:00    
(95/133): libidn2-2.3.7-1.fc39.x86_64.rpm        37 MB/s | 119 kB     00:00    
(96/133): libmount-2.39.4-1.fc39.x86_64.rpm      40 MB/s | 154 kB     00:00    
(97/133): libnghttp2-1.55.1-5.fc39.x86_64.rpm    21 MB/s |  75 kB     00:00    
(98/133): librepo-1.19.0-1.fc39.x86_64.rpm       23 MB/s |  99 kB     00:00    
(99/133): libsmartcols-2.39.4-1.fc39.x86_64.rpm  18 MB/s |  67 kB     00:00    
(100/133): libsolv-0.7.30-1.fc39.x86_64.rpm     128 MB/s | 426 kB     00:00    
(101/133): libssh-config-0.10.6-2.fc39.noarch.r 4.8 MB/s | 9.0 kB     00:00    
(102/133): libssh-0.10.6-2.fc39.x86_64.rpm       72 MB/s | 212 kB     00:00    
(103/133): libtirpc-1.3.6-0.fc39.x86_64.rpm      50 MB/s |  94 kB     00:00    
(104/133): libstdc++-13.3.1-3.fc39.x86_64.rpm   200 MB/s | 870 kB     00:00    
(105/133): libuuid-2.39.4-1.fc39.x86_64.rpm     7.3 MB/s |  28 kB     00:00    
(106/133): libzstd-1.5.6-1.fc39.x86_64.rpm       93 MB/s | 312 kB     00:00    
(107/133): ncurses-base-6.4-7.20230520.fc39.1.n  36 MB/s |  88 kB     00:00    
(108/133): ncurses-libs-6.4-7.20230520.fc39.1.x  66 MB/s | 336 kB     00:00    
(109/133): openldap-2.6.7-1.fc39.x86_64.rpm      50 MB/s | 254 kB     00:00    
(110/133): openssl-libs-3.1.4-4.fc39.x86_64.rpm 202 MB/s | 2.2 MB     00:00    
(111/133): p11-kit-0.25.5-1.fc39.x86_64.rpm      58 MB/s | 515 kB     00:00    
(112/133): p11-kit-trust-0.25.5-1.fc39.x86_64.r  17 MB/s | 138 kB     00:00    
(113/133): publicsuffix-list-dafsa-20240107-1.f  37 MB/s |  58 kB     00:00    
(114/133): python3-dnf-4.21.1-1.fc39.noarch.rpm 174 MB/s | 620 kB     00:00    
(115/133): python3-3.12.7-1.fc39.x86_64.rpm     5.7 MB/s |  28 kB     00:00    
(116/133): python3-dnf-plugins-core-4.9.0-1.fc3 147 MB/s | 320 kB     00:00    
(117/133): python-pip-wheel-23.2.1-2.fc39.noarc 162 MB/s | 1.5 MB     00:00    
(118/133): python3-hawkey-0.73.3-1.fc39.x86_64.  24 MB/s | 107 kB     00:00    
(119/133): python3-libcomps-0.1.20-1.fc39.x86_6  11 MB/s |  48 kB     00:00    
(120/133): python3-libdnf-0.73.3-1.fc39.x86_64. 210 MB/s | 860 kB     00:00    
(121/133): python3-rpm-4.19.1.1-1.fc39.x86_64.r  24 MB/s |  68 kB     00:00    
(122/133): readline-8.2-6.fc39.x86_64.rpm        61 MB/s | 212 kB     00:00    
(123/133): rpm-4.19.1.1-1.fc39.x86_64.rpm       120 MB/s | 538 kB     00:00    
(124/133): rpm-build-libs-4.19.1.1-1.fc39.x86_6  20 MB/s |  95 kB     00:00    
(125/133): rpm-libs-4.19.1.1-1.fc39.x86_64.rpm   71 MB/s | 312 kB     00:00    
(126/133): rpm-sequoia-1.7.0-1.fc39.x86_64.rpm  169 MB/s | 904 kB     00:00    
(127/133): rpm-sign-libs-4.19.1.1-1.fc39.x86_64 6.0 MB/s |  26 kB     00:00    
(128/133): shadow-utils-4.14.0-2.fc39.x86_64.rp 166 MB/s | 1.3 MB     00:00    
(129/133): systemd-libs-254.20-1.fc39.x86_64.rp  77 MB/s | 681 kB     00:00    
(130/133): tpm2-tss-4.0.2-1.fc39.x86_64.rpm      92 MB/s | 391 kB     00:00    
(131/133): tzdata-2024a-2.fc39.noarch.rpm        97 MB/s | 715 kB     00:00    
(132/133): zchunk-libs-1.5.1-1.fc39.x86_64.rpm   12 MB/s |  52 kB     00:00    
(133/133): python3-libs-3.12.7-1.fc39.x86_64.rp 211 MB/s | 9.2 MB     00:00    
--------------------------------------------------------------------------------
Total                                           112 MB/s |  56 MB     00:00     
fedora                                          1.6 MB/s | 1.6 kB     00:00    
Importing GPG key 0x18B8E74C:
 Userid     : "Fedora (39) <fedora-39-primary@fedoraproject.org>"
 Fingerprint: E8F2 3996 F232 1864 0CB4 4CBE 75CF 5AC4 18B8 E74C
 From       : /usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-39-primary
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Running scriptlet: filesystem-3.18-6.fc39.x86_64                          1/1 
  Preparing        :                                                        1/1 
  Installing       : libgcc-13.3.1-3.fc39.x86_64                          1/133 
  Running scriptlet: libgcc-13.3.1-3.fc39.x86_64                          1/133 
  Installing       : crypto-policies-20231204-1.git1e3a2e4.fc39.noarc     2/133 
  Running scriptlet: crypto-policies-20231204-1.git1e3a2e4.fc39.noarc     2/133 
  Installing       : tzdata-2024a-2.fc39.noarch                           3/133 
  Installing       : publicsuffix-list-dafsa-20240107-1.fc39.noarch       4/133 
  Installing       : ncurses-base-6.4-7.20230520.fc39.1.noarch            5/133 
  Installing       : libssh-config-0.10.6-2.fc39.noarch                   6/133 
  Installing       : fedora-release-identity-basic-39-36.noarch           7/133 
  Installing       : fedora-gpg-keys-39-2.noarch                          8/133 
  Installing       : fedora-repos-39-2.noarch                             9/133 
  Installing       : fedora-release-common-39-36.noarch                  10/133 
  Installing       : fedora-release-39-36.noarch                         11/133 
  Installing       : setup-2.14.4-1.fc39.noarch                          12/133 
warning: /etc/hosts created as /etc/hosts.rpmnew

  Running scriptlet: setup-2.14.4-1.fc39.noarch                          12/133 
  Installing       : filesystem-3.18-6.fc39.x86_64                       13/133 
  Installing       : basesystem-11-18.fc39.noarch                        14/133 
  Installing       : glibc-minimal-langpack-2.38-19.fc39.x86_64          15/133 
  Installing       : glibc-common-2.38-19.fc39.x86_64                    16/133 
  Running scriptlet: glibc-2.38-19.fc39.x86_64                           17/133 
  Installing       : glibc-2.38-19.fc39.x86_64                           17/133 
  Running scriptlet: glibc-2.38-19.fc39.x86_64                           17/133 
  Installing       : ncurses-libs-6.4-7.20230520.fc39.1.x86_64           18/133 
  Installing       : bash-5.2.26-1.fc39.x86_64                           19/133 
  Running scriptlet: bash-5.2.26-1.fc39.x86_64                           19/133 
  Installing       : zlib-1.2.13-4.fc39.x86_64                           20/133 
  Installing       : bzip2-libs-1.0.8-16.fc39.x86_64                     21/133 
  Installing       : xz-libs-5.4.4-1.fc39.x86_64                         22/133 
  Installing       : libzstd-1.5.6-1.fc39.x86_64                         23/133 
  Installing       : gmp-1:6.2.1-5.fc39.x86_64                           24/133 
  Installing       : libxml2-2.10.4-3.fc39.x86_64                        25/133 
  Installing       : sqlite-libs-3.42.0-7.fc39.x86_64                    26/133 
  Installing       : libgpg-error-1.47-2.fc39.x86_64                     27/133 
  Installing       : popt-1.19-3.fc39.x86_64                             28/133 
  Installing       : libcap-2.48-9.fc39.x86_64                           29/133 
  Installing       : libuuid-2.39.4-1.fc39.x86_64                        30/133 
  Installing       : readline-8.2-6.fc39.x86_64                          31/133 
  Installing       : libattr-2.5.1-8.fc39.x86_64                         32/133 
  Installing       : libacl-2.3.1-9.fc39.x86_64                          33/133 
  Installing       : libffi-3.4.4-4.fc39.x86_64                          34/133 
  Installing       : libtasn1-4.19.0-3.fc39.x86_64                       35/133 
  Installing       : p11-kit-0.25.5-1.fc39.x86_64                        36/133 
  Installing       : libunistring-1.1-5.fc39.x86_64                      37/133 
  Installing       : libidn2-2.3.7-1.fc39.x86_64                         38/133 
  Installing       : libxcrypt-4.4.36-2.fc39.x86_64                      39/133 
  Installing       : libstdc++-13.3.1-3.fc39.x86_64                      40/133 
  Installing       : elfutils-libelf-0.192-4.fc39.x86_64                 41/133 
  Installing       : gdbm-libs-1:1.23-4.fc39.x86_64                      42/133 
  Installing       : json-c-0.17-1.fc39.x86_64                           43/133 
  Installing       : libcom_err-1.47.0-2.fc39.x86_64                     44/133 
  Installing       : libsepol-3.5-2.fc39.x86_64                          45/133 
  Installing       : lua-libs-5.4.6-3.fc39.x86_64                        46/133 
  Installing       : lz4-libs-1.9.4-4.fc39.x86_64                        47/133 
  Installing       : systemd-libs-254.20-1.fc39.x86_64                   48/133 
  Installing       : expat-2.6.3-1.fc39.x86_64                           49/133 
  Installing       : keyutils-libs-1.6.3-1.fc39.x86_64                   50/133 
  Installing       : libgomp-13.3.1-3.fc39.x86_64                        51/133 
  Installing       : libsmartcols-2.39.4-1.fc39.x86_64                   52/133 
  Installing       : libb2-0.98.1-9.fc39.x86_64                          53/133 
  Installing       : libcomps-0.1.20-1.fc39.x86_64                       54/133 
  Installing       : dbus-libs-1:1.14.10-1.fc39.x86_64                   55/133 
  Installing       : cyrus-sasl-lib-2.1.28-11.fc39.x86_64                56/133 
  Installing       : libpsl-0.21.2-4.fc39.x86_64                         57/133 
  Installing       : libblkid-2.39.4-1.fc39.x86_64                       58/133 
  Installing       : libassuan-2.5.6-2.fc39.x86_64                       59/133 
  Installing       : libgcrypt-1.10.2-2.fc39.x86_64                      60/133 
  Installing       : libksba-1.6.4-2.fc39.x86_64                         61/133 
  Installing       : mpfr-4.2.0-3.fc39.x86_64                            62/133 
  Installing       : nettle-3.9.1-2.fc39.x86_64                          63/133 
  Installing       : file-libs-5.44-5.fc39.x86_64                        64/133 
  Installing       : elfutils-default-yama-scope-0.192-4.fc39.noarch     65/133 
  Running scriptlet: elfutils-default-yama-scope-0.192-4.fc39.noarch     65/133 
  Installing       : elfutils-libs-0.192-4.fc39.x86_64                   66/133 
  Installing       : libbrotli-1.1.0-1.fc39.x86_64                       67/133 
  Installing       : libcap-ng-0.8.3-8.fc39.x86_64                       68/133 
  Installing       : audit-libs-3.1.5-1.fc39.x86_64                      69/133 
  Installing       : libsigsegv-2.14-5.fc39.x86_64                       70/133 
  Installing       : gawk-5.2.2-2.fc39.x86_64                            71/133 
  Installing       : libtool-ltdl-2.4.7-7.fc39.x86_64                    72/133 
  Installing       : libverto-0.3.2-6.fc39.x86_64                        73/133 
  Installing       : libyaml-0.2.5-12.fc39.x86_64                        74/133 
  Installing       : mpdecimal-2.5.1-7.fc39.x86_64                       75/133 
  Installing       : npth-1.6-14.fc39.x86_64                             76/133 
  Installing       : alternatives-1.26-1.fc39.x86_64                     77/133 
  Installing       : p11-kit-trust-0.25.5-1.fc39.x86_64                  78/133 
  Running scriptlet: p11-kit-trust-0.25.5-1.fc39.x86_64                  78/133 
  Installing       : gnutls-3.8.6-1.fc39.x86_64                          79/133 
  Installing       : libeconf-0.5.2-2.fc39.x86_64                        80/133 
  Installing       : libnghttp2-1.55.1-5.fc39.x86_64                     81/133 
  Installing       : dnf-data-4.21.1-1.fc39.noarch                       82/133 
warning: /etc/dnf/dnf.conf created as /etc/dnf/dnf.conf.rpmnew

  Installing       : coreutils-common-9.3-7.fc39.x86_64                  83/133 
  Installing       : pcre2-syntax-10.42-1.fc39.2.noarch                  84/133 
  Installing       : pcre2-10.42-1.fc39.2.x86_64                         85/133 
  Installing       : libselinux-3.5-5.fc39.x86_64                        86/133 
  Installing       : sed-4.8-14.fc39.x86_64                              87/133 
  Installing       : libsemanage-3.5-4.fc39.x86_64                       88/133 
  Installing       : shadow-utils-2:4.14.0-2.fc39.x86_64                 89/133 
  Installing       : findutils-1:4.9.0-6.fc39.x86_64                     90/133 
  Installing       : libmount-2.39.4-1.fc39.x86_64                       91/133 
  Installing       : glib2-2.78.6-1.fc39.x86_64                          92/133 
  Installing       : grep-3.11-3.fc39.x86_64                             93/133 
  Installing       : openssl-libs-1:3.1.4-4.fc39.x86_64                  94/133 
  Installing       : coreutils-9.3-7.fc39.x86_64                         95/133 
  Running scriptlet: ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noar    96/133 
  Installing       : ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noar    96/133 
  Running scriptlet: ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noar    96/133 
  Installing       : krb5-libs-1.21.3-2.fc39.x86_64                      97/133 
  Installing       : libtirpc-1.3.6-0.fc39.x86_64                        98/133 
  Running scriptlet: tpm2-tss-4.0.2-1.fc39.x86_64                        99/133 
useradd: Warning: missing or non-executable shell '/usr/sbin/nologin'

  Installing       : tpm2-tss-4.0.2-1.fc39.x86_64                        99/133 
  Installing       : zchunk-libs-1.5.1-1.fc39.x86_64                    100/133 
  Installing       : ima-evm-utils-1.5-2.fc39.x86_64                    101/133 
  Installing       : libnsl2-2.0.0-6.fc39.x86_64                        102/133 
  Installing       : libssh-0.10.6-2.fc39.x86_64                        103/133 
  Installing       : python-pip-wheel-23.2.1-2.fc39.noarch              104/133 
  Installing       : python3-libs-3.12.7-1.fc39.x86_64                  105/133 
  Installing       : python3-3.12.7-1.fc39.x86_64                       106/133 
  Installing       : python3-dbus-1.3.2-4.fc39.x86_64                   107/133 
  Installing       : python3-distro-1.8.0-6.fc39.noarch                 108/133 
  Installing       : python3-six-1.16.0-12.fc39.noarch                  109/133 
  Installing       : python3-dateutil-1:2.8.2-10.fc39.noarch            110/133 
  Installing       : python3-systemd-235-5.fc39.x86_64                  111/133 
  Installing       : python3-libcomps-0.1.20-1.fc39.x86_64              112/133 
  Installing       : libevent-2.1.12-9.fc39.x86_64                      113/133 
  Installing       : openldap-2.6.7-1.fc39.x86_64                       114/133 
  Installing       : libcurl-8.2.1-5.fc39.x86_64                        115/133 
  Installing       : curl-8.2.1-5.fc39.x86_64                           116/133 
  Installing       : gnupg2-2.4.4-1.fc39.x86_64                         117/133 
  Installing       : libfsverity-1.4-10.fc39.x86_64                     118/133 
  Installing       : libarchive-3.7.1-3.fc39.x86_64                     119/133 
  Installing       : rpm-sequoia-1.7.0-1.fc39.x86_64                    120/133 
  Installing       : rpm-libs-4.19.1.1-1.fc39.x86_64                    121/133 
  Installing       : libmodulemd-2.15.0-5.fc39.x86_64                   122/133 
  Installing       : libsolv-0.7.30-1.fc39.x86_64                       123/133 
  Installing       : librepo-1.19.0-1.fc39.x86_64                       124/133 
  Installing       : libdnf-0.73.3-1.fc39.x86_64                        125/133 
  Installing       : python3-libdnf-0.73.3-1.fc39.x86_64                126/133 
  Installing       : python3-hawkey-0.73.3-1.fc39.x86_64                127/133 
  Installing       : rpm-build-libs-4.19.1.1-1.fc39.x86_64              128/133 
  Installing       : rpm-sign-libs-4.19.1.1-1.fc39.x86_64               129/133 
  Installing       : python3-rpm-4.19.1.1-1.fc39.x86_64                 130/133 
  Installing       : python3-dnf-4.21.1-1.fc39.noarch                   131/133 
  Installing       : python3-dnf-plugins-core-4.9.0-1.fc39.noarch       132/133 
  Running scriptlet: rpm-4.19.1.1-1.fc39.x86_64                         133/133 
  Installing       : rpm-4.19.1.1-1.fc39.x86_64                         133/133 
  Running scriptlet: filesystem-3.18-6.fc39.x86_64                      133/133 
  Running scriptlet: ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noar   133/133 
  Running scriptlet: rpm-4.19.1.1-1.fc39.x86_64                         133/133 
Installed products updated.

Installed:
  alternatives-1.26-1.fc39.x86_64                                               
  audit-libs-3.1.5-1.fc39.x86_64                                                
  basesystem-11-18.fc39.noarch                                                  
  bash-5.2.26-1.fc39.x86_64                                                     
  bzip2-libs-1.0.8-16.fc39.x86_64                                               
  ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noarch                            
  coreutils-9.3-7.fc39.x86_64                                                   
  coreutils-common-9.3-7.fc39.x86_64                                            
  crypto-policies-20231204-1.git1e3a2e4.fc39.noarch                             
  curl-8.2.1-5.fc39.x86_64                                                      
  cyrus-sasl-lib-2.1.28-11.fc39.x86_64                                          
  dbus-libs-1:1.14.10-1.fc39.x86_64                                             
  dnf-data-4.21.1-1.fc39.noarch                                                 
  elfutils-default-yama-scope-0.192-4.fc39.noarch                               
  elfutils-libelf-0.192-4.fc39.x86_64                                           
  elfutils-libs-0.192-4.fc39.x86_64                                             
  expat-2.6.3-1.fc39.x86_64                                                     
  fedora-gpg-keys-39-2.noarch                                                   
  fedora-release-39-36.noarch                                                   
  fedora-release-common-39-36.noarch                                            
  fedora-release-identity-basic-39-36.noarch                                    
  fedora-repos-39-2.noarch                                                      
  file-libs-5.44-5.fc39.x86_64                                                  
  filesystem-3.18-6.fc39.x86_64                                                 
  findutils-1:4.9.0-6.fc39.x86_64                                               
  gawk-5.2.2-2.fc39.x86_64                                                      
  gdbm-libs-1:1.23-4.fc39.x86_64                                                
  glib2-2.78.6-1.fc39.x86_64                                                    
  glibc-2.38-19.fc39.x86_64                                                     
  glibc-common-2.38-19.fc39.x86_64                                              
  glibc-minimal-langpack-2.38-19.fc39.x86_64                                    
  gmp-1:6.2.1-5.fc39.x86_64                                                     
  gnupg2-2.4.4-1.fc39.x86_64                                                    
  gnutls-3.8.6-1.fc39.x86_64                                                    
  grep-3.11-3.fc39.x86_64                                                       
  ima-evm-utils-1.5-2.fc39.x86_64                                               
  json-c-0.17-1.fc39.x86_64                                                     
  keyutils-libs-1.6.3-1.fc39.x86_64                                             
  krb5-libs-1.21.3-2.fc39.x86_64                                                
  libacl-2.3.1-9.fc39.x86_64                                                    
  libarchive-3.7.1-3.fc39.x86_64                                                
  libassuan-2.5.6-2.fc39.x86_64                                                 
  libattr-2.5.1-8.fc39.x86_64                                                   
  libb2-0.98.1-9.fc39.x86_64                                                    
  libblkid-2.39.4-1.fc39.x86_64                                                 
  libbrotli-1.1.0-1.fc39.x86_64                                                 
  libcap-2.48-9.fc39.x86_64                                                     
  libcap-ng-0.8.3-8.fc39.x86_64                                                 
  libcom_err-1.47.0-2.fc39.x86_64                                               
  libcomps-0.1.20-1.fc39.x86_64                                                 
  libcurl-8.2.1-5.fc39.x86_64                                                   
  libdnf-0.73.3-1.fc39.x86_64                                                   
  libeconf-0.5.2-2.fc39.x86_64                                                  
  libevent-2.1.12-9.fc39.x86_64                                                 
  libffi-3.4.4-4.fc39.x86_64                                                    
  libfsverity-1.4-10.fc39.x86_64                                                
  libgcc-13.3.1-3.fc39.x86_64                                                   
  libgcrypt-1.10.2-2.fc39.x86_64                                                
  libgomp-13.3.1-3.fc39.x86_64                                                  
  libgpg-error-1.47-2.fc39.x86_64                                               
  libidn2-2.3.7-1.fc39.x86_64                                                   
  libksba-1.6.4-2.fc39.x86_64                                                   
  libmodulemd-2.15.0-5.fc39.x86_64                                              
  libmount-2.39.4-1.fc39.x86_64                                                 
  libnghttp2-1.55.1-5.fc39.x86_64                                               
  libnsl2-2.0.0-6.fc39.x86_64                                                   
  libpsl-0.21.2-4.fc39.x86_64                                                   
  librepo-1.19.0-1.fc39.x86_64                                                  
  libselinux-3.5-5.fc39.x86_64                                                  
  libsemanage-3.5-4.fc39.x86_64                                                 
  libsepol-3.5-2.fc39.x86_64                                                    
  libsigsegv-2.14-5.fc39.x86_64                                                 
  libsmartcols-2.39.4-1.fc39.x86_64                                             
  libsolv-0.7.30-1.fc39.x86_64                                                  
  libssh-0.10.6-2.fc39.x86_64                                                   
  libssh-config-0.10.6-2.fc39.noarch                                            
  libstdc++-13.3.1-3.fc39.x86_64                                                
  libtasn1-4.19.0-3.fc39.x86_64                                                 
  libtirpc-1.3.6-0.fc39.x86_64                                                  
  libtool-ltdl-2.4.7-7.fc39.x86_64                                              
  libunistring-1.1-5.fc39.x86_64                                                
  libuuid-2.39.4-1.fc39.x86_64                                                  
  libverto-0.3.2-6.fc39.x86_64                                                  
  libxcrypt-4.4.36-2.fc39.x86_64                                                
  libxml2-2.10.4-3.fc39.x86_64                                                  
  libyaml-0.2.5-12.fc39.x86_64                                                  
  libzstd-1.5.6-1.fc39.x86_64                                                   
  lua-libs-5.4.6-3.fc39.x86_64                                                  
  lz4-libs-1.9.4-4.fc39.x86_64                                                  
  mpdecimal-2.5.1-7.fc39.x86_64                                                 
  mpfr-4.2.0-3.fc39.x86_64                                                      
  ncurses-base-6.4-7.20230520.fc39.1.noarch                                     
  ncurses-libs-6.4-7.20230520.fc39.1.x86_64                                     
  nettle-3.9.1-2.fc39.x86_64                                                    
  npth-1.6-14.fc39.x86_64                                                       
  openldap-2.6.7-1.fc39.x86_64                                                  
  openssl-libs-1:3.1.4-4.fc39.x86_64                                            
  p11-kit-0.25.5-1.fc39.x86_64                                                  
  p11-kit-trust-0.25.5-1.fc39.x86_64                                            
  pcre2-10.42-1.fc39.2.x86_64                                                   
  pcre2-syntax-10.42-1.fc39.2.noarch                                            
  popt-1.19-3.fc39.x86_64                                                       
  publicsuffix-list-dafsa-20240107-1.fc39.noarch                                
  python-pip-wheel-23.2.1-2.fc39.noarch                                         
  python3-3.12.7-1.fc39.x86_64                                                  
  python3-dateutil-1:2.8.2-10.fc39.noarch                                       
  python3-dbus-1.3.2-4.fc39.x86_64                                              
  python3-distro-1.8.0-6.fc39.noarch                                            
  python3-dnf-4.21.1-1.fc39.noarch                                              
  python3-dnf-plugins-core-4.9.0-1.fc39.noarch                                  
  python3-hawkey-0.73.3-1.fc39.x86_64                                           
  python3-libcomps-0.1.20-1.fc39.x86_64                                         
  python3-libdnf-0.73.3-1.fc39.x86_64                                           
  python3-libs-3.12.7-1.fc39.x86_64                                             
  python3-rpm-4.19.1.1-1.fc39.x86_64                                            
  python3-six-1.16.0-12.fc39.noarch                                             
  python3-systemd-235-5.fc39.x86_64                                             
  readline-8.2-6.fc39.x86_64                                                    
  rpm-4.19.1.1-1.fc39.x86_64                                                    
  rpm-build-libs-4.19.1.1-1.fc39.x86_64                                         
  rpm-libs-4.19.1.1-1.fc39.x86_64                                               
  rpm-sequoia-1.7.0-1.fc39.x86_64                                               
  rpm-sign-libs-4.19.1.1-1.fc39.x86_64                                          
  sed-4.8-14.fc39.x86_64                                                        
  setup-2.14.4-1.fc39.noarch                                                    
  shadow-utils-2:4.14.0-2.fc39.x86_64                                           
  sqlite-libs-3.42.0-7.fc39.x86_64                                              
  systemd-libs-254.20-1.fc39.x86_64                                             
  tpm2-tss-4.0.2-1.fc39.x86_64                                                  
  tzdata-2024a-2.fc39.noarch                                                    
  xz-libs-5.4.4-1.fc39.x86_64                                                   
  zchunk-libs-1.5.1-1.fc39.x86_64                                               
  zlib-1.2.13-4.fc39.x86_64                                                     

Complete!
Finish(bootstrap): installing dnf tooling
Start(bootstrap): creating root cache
Finish(bootstrap): creating root cache
Finish(bootstrap): chroot init
Start: chroot init
INFO: mounting tmpfs at /var/lib/mock/fedora-39-x86_64-1733142171.782165/root.
INFO: calling preinit hooks
INFO: enabled root cache
INFO: enabled package manager cache
Start: cleaning package manager metadata
Finish: cleaning package manager metadata
INFO: enabled HW Info plugin
INFO: Package manager dnf4 detected and used (direct choice)
INFO: Buildroot is handled by package management installed into bootstrap:
  rpm-4.19.1.1-1.fc39.x86_64
  rpm-sequoia-1.7.0-1.fc39.x86_64
  python3-dnf-4.21.1-1.fc39.noarch
  python3-dnf-plugins-core-4.9.0-1.fc39.noarch
Start: installing minimal buildroot with dnf
No matches found for the following disable plugin patterns: local, spacewalk, versionlock
Copr repository                                 5.8 MB/s | 347 kB     00:00    
fedora                                           60 MB/s |  89 MB     00:01    
updates                                          58 MB/s |  42 MB     00:00    
Dependencies resolved.
================================================================================
 Package                       Arch   Version                     Repo     Size
================================================================================
Installing group/module packages:
 bash                          x86_64 5.2.26-1.fc39               updates 1.8 M
 bzip2                         x86_64 1.0.8-16.fc39               fedora   52 k
 coreutils                     x86_64 9.3-7.fc39                  updates 1.1 M
 cpio                          x86_64 2.14-4.fc39                 fedora  279 k
 diffutils                     x86_64 3.10-3.fc39                 fedora  398 k
 fedora-release-common         noarch 39-36                       updates  19 k
 findutils                     x86_64 1:4.9.0-6.fc39              updates 490 k
 gawk                          x86_64 5.2.2-2.fc39                fedora  1.1 M
 glibc-minimal-langpack        x86_64 2.38-19.fc39                updates  65 k
 grep                          x86_64 3.11-3.fc39                 fedora  298 k
 gzip                          x86_64 1.12-6.fc39                 fedora  166 k
 info                          x86_64 7.0.3-3.fc39                fedora  182 k
 patch                         x86_64 2.7.6-22.fc39               fedora  125 k
 redhat-rpm-config             noarch 266-1.fc39                  updates  78 k
 rpm-build                     x86_64 4.19.1.1-1.fc39             updates  78 k
 sed                           x86_64 4.8-14.fc39                 fedora  306 k
 shadow-utils                  x86_64 2:4.14.0-2.fc39             updates 1.3 M
 tar                           x86_64 2:1.35-2.fc39               fedora  864 k
 unzip                         x86_64 6.0-62.fc39                 fedora  184 k
 util-linux                    x86_64 2.39.4-1.fc39               updates 1.2 M
 which                         x86_64 2.21-40.fc39                fedora   42 k
 xz                            x86_64 5.4.4-1.fc39                fedora  556 k
Installing dependencies:
 alternatives                  x86_64 1.26-1.fc39                 updates  39 k
 ansible-srpm-macros           noarch 1-12.fc39                   updates  21 k
 audit-libs                    x86_64 3.1.5-1.fc39                updates 123 k
 authselect                    x86_64 1.4.3-1.fc39                fedora  149 k
 authselect-libs               x86_64 1.4.3-1.fc39                fedora  249 k
 basesystem                    noarch 11-18.fc39                  fedora  7.2 k
 binutils                      x86_64 2.40-14.fc39                updates 5.6 M
 binutils-gold                 x86_64 2.40-14.fc39                updates 795 k
 bzip2-libs                    x86_64 1.0.8-16.fc39               fedora   41 k
 ca-certificates               noarch 2024.2.69_v8.0.401-1.0.fc39 updates 871 k
 coreutils-common              x86_64 9.3-7.fc39                  updates 2.1 M
 cracklib                      x86_64 2.9.11-2.fc39               fedora   94 k
 crypto-policies               noarch 20231204-1.git1e3a2e4.fc39  updates 100 k
 curl                          x86_64 8.2.1-5.fc39                updates 344 k
 cyrus-sasl-lib                x86_64 2.1.28-11.fc39              fedora  793 k
 debugedit                     x86_64 5.0-12.fc39                 updates  79 k
 dwz                           x86_64 0.15-3.fc39                 fedora  134 k
 ed                            x86_64 1.19-4.fc39                 fedora   79 k
 efi-srpm-macros               noarch 5-9.fc39                    fedora   22 k
 elfutils                      x86_64 0.192-4.fc39                updates 574 k
 elfutils-debuginfod-client    x86_64 0.192-4.fc39                updates  43 k
 elfutils-default-yama-scope   noarch 0.192-4.fc39                updates  12 k
 elfutils-libelf               x86_64 0.192-4.fc39                updates 208 k
 elfutils-libs                 x86_64 0.192-4.fc39                updates 267 k
 fedora-gpg-keys               noarch 39-2                        updates 130 k
 fedora-release                noarch 39-36                       updates 8.6 k
 fedora-release-identity-basic noarch 39-36                       updates 9.4 k
 fedora-repos                  noarch 39-2                        updates 9.3 k
 file                          x86_64 5.44-5.fc39                 fedora   49 k
 file-libs                     x86_64 5.44-5.fc39                 fedora  729 k
 filesystem                    x86_64 3.18-6.fc39                 fedora  1.1 M
 fonts-srpm-macros             noarch 1:2.0.5-12.fc39             fedora   26 k
 forge-srpm-macros             noarch 0.3.1-1.fc39                updates  19 k
 fpc-srpm-macros               noarch 1.3-8.fc39                  fedora  7.4 k
 gdb-minimal                   x86_64 15.1-1.fc39                 updates 4.3 M
 gdbm-libs                     x86_64 1:1.23-4.fc39               fedora   56 k
 ghc-srpm-macros               noarch 1.6.1-2.fc39                fedora  7.8 k
 glibc                         x86_64 2.38-19.fc39                updates 2.1 M
 glibc-common                  x86_64 2.38-19.fc39                updates 344 k
 glibc-gconv-extra             x86_64 2.38-19.fc39                updates 1.6 M
 gmp                           x86_64 1:6.2.1-5.fc39              fedora  313 k
 gnat-srpm-macros              noarch 6-3.fc39                    fedora  8.8 k
 go-srpm-macros                noarch 3.5.0-1.fc39                updates  28 k
 jansson                       x86_64 2.13.1-7.fc39               fedora   44 k
 json-c                        x86_64 0.17-1.fc39                 fedora   43 k
 kernel-srpm-macros            noarch 1.0-20.fc39                 fedora   10 k
 keyutils-libs                 x86_64 1.6.3-1.fc39                updates  31 k
 krb5-libs                     x86_64 1.21.3-2.fc39               updates 766 k
 libacl                        x86_64 2.3.1-9.fc39                updates  23 k
 libarchive                    x86_64 3.7.1-3.fc39                updates 407 k
 libattr                       x86_64 2.5.1-8.fc39                fedora   18 k
 libblkid                      x86_64 2.39.4-1.fc39               updates 116 k
 libbrotli                     x86_64 1.1.0-1.fc39                fedora  336 k
 libcap                        x86_64 2.48-9.fc39                 updates  68 k
 libcap-ng                     x86_64 0.8.3-8.fc39                fedora   32 k
 libcom_err                    x86_64 1.47.0-2.fc39               fedora   26 k
 libcurl                       x86_64 8.2.1-5.fc39                updates 322 k
 libdb                         x86_64 5.3.28-56.fc39              fedora  760 k
 libeconf                      x86_64 0.5.2-2.fc39                updates  30 k
 libevent                      x86_64 2.1.12-9.fc39               fedora  258 k
 libfdisk                      x86_64 2.39.4-1.fc39               updates 161 k
 libffi                        x86_64 3.4.4-4.fc39                fedora   40 k
 libgcc                        x86_64 13.3.1-3.fc39               updates 120 k
 libgomp                       x86_64 13.3.1-3.fc39               updates 329 k
 libidn2                       x86_64 2.3.7-1.fc39                updates 119 k
 libmount                      x86_64 2.39.4-1.fc39               updates 154 k
 libnghttp2                    x86_64 1.55.1-5.fc39               updates  75 k
 libnsl2                       x86_64 2.0.0-6.fc39                fedora   30 k
 libpkgconf                    x86_64 1.9.5-2.fc39                fedora   38 k
 libpsl                        x86_64 0.21.2-4.fc39               fedora   63 k
 libpwquality                  x86_64 1.4.5-6.fc39                fedora  120 k
 libselinux                    x86_64 3.5-5.fc39                  fedora   87 k
 libsemanage                   x86_64 3.5-4.fc39                  fedora  120 k
 libsepol                      x86_64 3.5-2.fc39                  fedora  324 k
 libsigsegv                    x86_64 2.14-5.fc39                 fedora   27 k
 libsmartcols                  x86_64 2.39.4-1.fc39               updates  67 k
 libssh                        x86_64 0.10.6-2.fc39               updates 212 k
 libssh-config                 noarch 0.10.6-2.fc39               updates 9.0 k
 libstdc++                     x86_64 13.3.1-3.fc39               updates 870 k
 libtasn1                      x86_64 4.19.0-3.fc39               fedora   74 k
 libtirpc                      x86_64 1.3.6-0.fc39                updates  94 k
 libtool-ltdl                  x86_64 2.4.7-7.fc39                fedora   36 k
 libunistring                  x86_64 1.1-5.fc39                  fedora  543 k
 libutempter                   x86_64 1.2.1-10.fc39               fedora   26 k
 libuuid                       x86_64 2.39.4-1.fc39               updates  28 k
 libverto                      x86_64 0.3.2-6.fc39                fedora   20 k
 libxcrypt                     x86_64 4.4.36-2.fc39               fedora  119 k
 libxml2                       x86_64 2.10.4-3.fc39               fedora  701 k
 libzstd                       x86_64 1.5.6-1.fc39                updates 312 k
 lua-libs                      x86_64 5.4.6-3.fc39                fedora  133 k
 lua-srpm-macros               noarch 1-13.fc39                   updates 8.7 k
 lz4-libs                      x86_64 1.9.4-4.fc39                fedora   67 k
 mpfr                          x86_64 4.2.0-3.fc39                fedora  344 k
 ncurses-base                  noarch 6.4-7.20230520.fc39.1       updates  88 k
 ncurses-libs                  x86_64 6.4-7.20230520.fc39.1       updates 336 k
 ocaml-srpm-macros             noarch 8-2.fc39                    fedora   14 k
 openblas-srpm-macros          noarch 2-14.fc39                   fedora  7.5 k
 openldap                      x86_64 2.6.7-1.fc39                updates 254 k
 openssl-libs                  x86_64 1:3.1.4-4.fc39              updates 2.2 M
 p11-kit                       x86_64 0.25.5-1.fc39               updates 515 k
 p11-kit-trust                 x86_64 0.25.5-1.fc39               updates 138 k
 package-notes-srpm-macros     noarch 0.5-9.fc39                  fedora   11 k
 pam                           x86_64 1.5.3-3.fc39                updates 542 k
 pam-libs                      x86_64 1.5.3-3.fc39                updates  56 k
 pcre2                         x86_64 10.42-1.fc39.2              fedora  233 k
 pcre2-syntax                  noarch 10.42-1.fc39.2              fedora  143 k
 perl-srpm-macros              noarch 1-51.fc39                   fedora  8.0 k
 pkgconf                       x86_64 1.9.5-2.fc39                fedora   42 k
 pkgconf-m4                    noarch 1.9.5-2.fc39                fedora   14 k
 pkgconf-pkg-config            x86_64 1.9.5-2.fc39                fedora  9.6 k
 popt                          x86_64 1.19-3.fc39                 fedora   66 k
 publicsuffix-list-dafsa       noarch 20240107-1.fc39             updates  58 k
 pyproject-srpm-macros         noarch 1.16.0-1.fc39               updates  14 k
 python-srpm-macros            noarch 3.12-8.fc39                 updates  23 k
 qt5-srpm-macros               noarch 5.15.14-2.fc39              updates 8.9 k
 qt6-srpm-macros               noarch 6.6.2-1.fc39                updates 8.9 k
 readline                      x86_64 8.2-6.fc39                  updates 212 k
 rpm                           x86_64 4.19.1.1-1.fc39             updates 538 k
 rpm-build-libs                x86_64 4.19.1.1-1.fc39             updates  95 k
 rpm-libs                      x86_64 4.19.1.1-1.fc39             updates 312 k
 rpm-sequoia                   x86_64 1.7.0-1.fc39                updates 904 k
 rpmautospec-rpm-macros        noarch 0.7.3-1.fc39                updates  11 k
 rust-srpm-macros              noarch 26.3-1.fc39                 updates  13 k
 setup                         noarch 2.14.4-1.fc39               fedora  154 k
 sqlite-libs                   x86_64 3.42.0-7.fc39               fedora  678 k
 systemd-libs                  x86_64 254.20-1.fc39               updates 681 k
 util-linux-core               x86_64 2.39.4-1.fc39               updates 507 k
 xxhash-libs                   x86_64 0.8.2-4.fc39                updates  37 k
 xz-libs                       x86_64 5.4.4-1.fc39                fedora  108 k
 zip                           x86_64 3.0-39.fc39                 fedora  266 k
 zlib                          x86_64 1.2.13-4.fc39               fedora   94 k
 zstd                          x86_64 1.5.6-1.fc39                updates 479 k
Installing Groups:
 Buildsystem building group                                                    

Transaction Summary
================================================================================
Install  154 Packages

Total download size: 52 M
Installed size: 180 M
Downloading Packages:
(1/154): basesystem-11-18.fc39.noarch.rpm       485 kB/s | 7.2 kB     00:00    
(2/154): authselect-1.4.3-1.fc39.x86_64.rpm     8.2 MB/s | 149 kB     00:00    
(3/154): authselect-libs-1.4.3-1.fc39.x86_64.rp  13 MB/s | 249 kB     00:00    
(4/154): bzip2-1.0.8-16.fc39.x86_64.rpm          15 MB/s |  52 kB     00:00    
(5/154): bzip2-libs-1.0.8-16.fc39.x86_64.rpm     21 MB/s |  41 kB     00:00    
(6/154): cracklib-2.9.11-2.fc39.x86_64.rpm       40 MB/s |  94 kB     00:00    
(7/154): cpio-2.14-4.fc39.x86_64.rpm             69 MB/s | 279 kB     00:00    
(8/154): cyrus-sasl-lib-2.1.28-11.fc39.x86_64.r 178 MB/s | 793 kB     00:00    
(9/154): diffutils-3.10-3.fc39.x86_64.rpm        87 MB/s | 398 kB     00:00    
(10/154): dwz-0.15-3.fc39.x86_64.rpm             37 MB/s | 134 kB     00:00    
(11/154): ed-1.19-4.fc39.x86_64.rpm              47 MB/s |  79 kB     00:00    
(12/154): efi-srpm-macros-5-9.fc39.noarch.rpm    13 MB/s |  22 kB     00:00    
(13/154): file-5.44-5.fc39.x86_64.rpm            28 MB/s |  49 kB     00:00    
(14/154): file-libs-5.44-5.fc39.x86_64.rpm      120 MB/s | 729 kB     00:00    
(15/154): filesystem-3.18-6.fc39.x86_64.rpm     158 MB/s | 1.1 MB     00:00    
(16/154): fonts-srpm-macros-2.0.5-12.fc39.noarc 4.1 MB/s |  26 kB     00:00    
(17/154): fpc-srpm-macros-1.3-8.fc39.noarch.rpm 4.2 MB/s | 7.4 kB     00:00    
(18/154): gdbm-libs-1.23-4.fc39.x86_64.rpm       21 MB/s |  56 kB     00:00    
(19/154): ghc-srpm-macros-1.6.1-2.fc39.noarch.r 2.0 MB/s | 7.8 kB     00:00    
(20/154): gmp-6.2.1-5.fc39.x86_64.rpm           107 MB/s | 313 kB     00:00    
(21/154): gawk-5.2.2-2.fc39.x86_64.rpm          142 MB/s | 1.1 MB     00:00    
(22/154): gnat-srpm-macros-6-3.fc39.noarch.rpm  2.3 MB/s | 8.8 kB     00:00    
(23/154): grep-3.11-3.fc39.x86_64.rpm           130 MB/s | 298 kB     00:00    
(24/154): gzip-1.12-6.fc39.x86_64.rpm            71 MB/s | 166 kB     00:00    
(25/154): info-7.0.3-3.fc39.x86_64.rpm           57 MB/s | 182 kB     00:00    
(26/154): jansson-2.13.1-7.fc39.x86_64.rpm       14 MB/s |  44 kB     00:00    
(27/154): json-c-0.17-1.fc39.x86_64.rpm          22 MB/s |  43 kB     00:00    
(28/154): kernel-srpm-macros-1.0-20.fc39.noarch 4.4 MB/s |  10 kB     00:00    
(29/154): libattr-2.5.1-8.fc39.x86_64.rpm       7.4 MB/s |  18 kB     00:00    
(30/154): libbrotli-1.1.0-1.fc39.x86_64.rpm     105 MB/s | 336 kB     00:00    
(31/154): libcap-ng-0.8.3-8.fc39.x86_64.rpm      21 MB/s |  32 kB     00:00    
(32/154): libcom_err-1.47.0-2.fc39.x86_64.rpm    12 MB/s |  26 kB     00:00    
(33/154): libdb-5.3.28-56.fc39.x86_64.rpm       159 MB/s | 760 kB     00:00    
(34/154): libevent-2.1.12-9.fc39.x86_64.rpm      57 MB/s | 258 kB     00:00    
(35/154): libffi-3.4.4-4.fc39.x86_64.rpm        9.3 MB/s |  40 kB     00:00    
(36/154): libnsl2-2.0.0-6.fc39.x86_64.rpm        13 MB/s |  30 kB     00:00    
(37/154): libpkgconf-1.9.5-2.fc39.x86_64.rpm     17 MB/s |  38 kB     00:00    
(38/154): libpsl-0.21.2-4.fc39.x86_64.rpm        26 MB/s |  63 kB     00:00    
(39/154): libpwquality-1.4.5-6.fc39.x86_64.rpm   35 MB/s | 120 kB     00:00    
(40/154): libselinux-3.5-5.fc39.x86_64.rpm       24 MB/s |  87 kB     00:00    
(41/154): libsemanage-3.5-4.fc39.x86_64.rpm      33 MB/s | 120 kB     00:00    
(42/154): libsigsegv-2.14-5.fc39.x86_64.rpm      13 MB/s |  27 kB     00:00    
(43/154): libtasn1-4.19.0-3.fc39.x86_64.rpm      31 MB/s |  74 kB     00:00    
(44/154): libsepol-3.5-2.fc39.x86_64.rpm         75 MB/s | 324 kB     00:00    
(45/154): libtool-ltdl-2.4.7-7.fc39.x86_64.rpm   18 MB/s |  36 kB     00:00    
(46/154): libunistring-1.1-5.fc39.x86_64.rpm     74 MB/s | 543 kB     00:00    
(47/154): libverto-0.3.2-6.fc39.x86_64.rpm      3.0 MB/s |  20 kB     00:00    
(48/154): libutempter-1.2.1-10.fc39.x86_64.rpm  3.1 MB/s |  26 kB     00:00    
(49/154): libxcrypt-4.4.36-2.fc39.x86_64.rpm     52 MB/s | 119 kB     00:00    
(50/154): libxml2-2.10.4-3.fc39.x86_64.rpm      136 MB/s | 701 kB     00:00    
(51/154): lua-libs-5.4.6-3.fc39.x86_64.rpm       27 MB/s | 133 kB     00:00    
(52/154): lz4-libs-1.9.4-4.fc39.x86_64.rpm       15 MB/s |  67 kB     00:00    
(53/154): mpfr-4.2.0-3.fc39.x86_64.rpm          135 MB/s | 344 kB     00:00    
(54/154): ocaml-srpm-macros-8-2.fc39.noarch.rpm 5.7 MB/s |  14 kB     00:00    
(55/154): openblas-srpm-macros-2-14.fc39.noarch 2.8 MB/s | 7.5 kB     00:00    
(56/154): package-notes-srpm-macros-0.5-9.fc39. 6.7 MB/s |  11 kB     00:00    
(57/154): patch-2.7.6-22.fc39.x86_64.rpm         55 MB/s | 125 kB     00:00    
(58/154): pcre2-10.42-1.fc39.2.x86_64.rpm        80 MB/s | 233 kB     00:00    
(59/154): pcre2-syntax-10.42-1.fc39.2.noarch.rp  55 MB/s | 143 kB     00:00    
(60/154): perl-srpm-macros-1-51.fc39.noarch.rpm 3.9 MB/s | 8.0 kB     00:00    
(61/154): pkgconf-1.9.5-2.fc39.x86_64.rpm        20 MB/s |  42 kB     00:00    
(62/154): pkgconf-m4-1.9.5-2.fc39.noarch.rpm    8.3 MB/s |  14 kB     00:00    
(63/154): pkgconf-pkg-config-1.9.5-2.fc39.x86_6 5.1 MB/s | 9.6 kB     00:00    
(64/154): popt-1.19-3.fc39.x86_64.rpm            24 MB/s |  66 kB     00:00    
(65/154): sed-4.8-14.fc39.x86_64.rpm            103 MB/s | 306 kB     00:00    
(66/154): setup-2.14.4-1.fc39.noarch.rpm         71 MB/s | 154 kB     00:00    
(67/154): tar-1.35-2.fc39.x86_64.rpm            176 MB/s | 864 kB     00:00    
(68/154): sqlite-libs-3.42.0-7.fc39.x86_64.rpm  107 MB/s | 678 kB     00:00    
(69/154): unzip-6.0-62.fc39.x86_64.rpm           30 MB/s | 184 kB     00:00    
(70/154): which-2.21-40.fc39.x86_64.rpm          26 MB/s |  42 kB     00:00    
(71/154): xz-libs-5.4.4-1.fc39.x86_64.rpm        37 MB/s | 108 kB     00:00    
(72/154): xz-5.4.4-1.fc39.x86_64.rpm            131 MB/s | 556 kB     00:00    
(73/154): zip-3.0-39.fc39.x86_64.rpm             62 MB/s | 266 kB     00:00    
(74/154): zlib-1.2.13-4.fc39.x86_64.rpm          46 MB/s |  94 kB     00:00    
(75/154): alternatives-1.26-1.fc39.x86_64.rpm    17 MB/s |  39 kB     00:00    
(76/154): ansible-srpm-macros-1-12.fc39.noarch. 7.2 MB/s |  21 kB     00:00    
(77/154): audit-libs-3.1.5-1.fc39.x86_64.rpm     43 MB/s | 123 kB     00:00    
(78/154): binutils-gold-2.40-14.fc39.x86_64.rpm 100 MB/s | 795 kB     00:00    
(79/154): bash-5.2.26-1.fc39.x86_64.rpm         139 MB/s | 1.8 MB     00:00    
(80/154): ca-certificates-2024.2.69_v8.0.401-1. 178 MB/s | 871 kB     00:00    
(81/154): coreutils-9.3-7.fc39.x86_64.rpm       129 MB/s | 1.1 MB     00:00    
(82/154): coreutils-common-9.3-7.fc39.x86_64.rp 185 MB/s | 2.1 MB     00:00    
(83/154): crypto-policies-20231204-1.git1e3a2e4  27 MB/s | 100 kB     00:00    
(84/154): curl-8.2.1-5.fc39.x86_64.rpm          112 MB/s | 344 kB     00:00    
(85/154): debugedit-5.0-12.fc39.x86_64.rpm       24 MB/s |  79 kB     00:00    
(86/154): elfutils-0.192-4.fc39.x86_64.rpm      179 MB/s | 574 kB     00:00    
(87/154): elfutils-debuginfod-client-0.192-4.fc  12 MB/s |  43 kB     00:00    
(88/154): elfutils-default-yama-scope-0.192-4.f 8.6 MB/s |  12 kB     00:00    
(89/154): elfutils-libelf-0.192-4.fc39.x86_64.r  78 MB/s | 208 kB     00:00    
(90/154): elfutils-libs-0.192-4.fc39.x86_64.rpm  58 MB/s | 267 kB     00:00    
(91/154): fedora-gpg-keys-39-2.noarch.rpm        38 MB/s | 130 kB     00:00    
(92/154): binutils-2.40-14.fc39.x86_64.rpm      116 MB/s | 5.6 MB     00:00    
(93/154): fedora-release-39-36.noarch.rpm       1.3 MB/s | 8.6 kB     00:00    
(94/154): fedora-release-common-39-36.noarch.rp 3.0 MB/s |  19 kB     00:00    
(95/154): fedora-release-identity-basic-39-36.n 4.8 MB/s | 9.4 kB     00:00    
(96/154): fedora-repos-39-2.noarch.rpm          4.9 MB/s | 9.3 kB     00:00    
(97/154): findutils-4.9.0-6.fc39.x86_64.rpm     151 MB/s | 490 kB     00:00    
(98/154): forge-srpm-macros-0.3.1-1.fc39.noarch 6.5 MB/s |  19 kB     00:00    
(99/154): glibc-common-2.38-19.fc39.x86_64.rpm   36 MB/s | 344 kB     00:00    
(100/154): glibc-2.38-19.fc39.x86_64.rpm        138 MB/s | 2.1 MB     00:00    
(101/154): gdb-minimal-15.1-1.fc39.x86_64.rpm   193 MB/s | 4.3 MB     00:00    
(102/154): glibc-minimal-langpack-2.38-19.fc39. 9.4 MB/s |  65 kB     00:00    
(103/154): glibc-gconv-extra-2.38-19.fc39.x86_6 144 MB/s | 1.6 MB     00:00    
(104/154): go-srpm-macros-3.5.0-1.fc39.noarch.r  10 MB/s |  28 kB     00:00    
(105/154): keyutils-libs-1.6.3-1.fc39.x86_64.rp  13 MB/s |  31 kB     00:00    
(106/154): libacl-2.3.1-9.fc39.x86_64.rpm        13 MB/s |  23 kB     00:00    
(107/154): libarchive-3.7.1-3.fc39.x86_64.rpm   136 MB/s | 407 kB     00:00    
(108/154): libblkid-2.39.4-1.fc39.x86_64.rpm     50 MB/s | 116 kB     00:00    
(109/154): krb5-libs-1.21.3-2.fc39.x86_64.rpm    90 MB/s | 766 kB     00:00    
(110/154): libcap-2.48-9.fc39.x86_64.rpm         15 MB/s |  68 kB     00:00    
(111/154): libcurl-8.2.1-5.fc39.x86_64.rpm       86 MB/s | 322 kB     00:00    
(112/154): libeconf-0.5.2-2.fc39.x86_64.rpm      13 MB/s |  30 kB     00:00    
(113/154): libfdisk-2.39.4-1.fc39.x86_64.rpm     53 MB/s | 161 kB     00:00    
(114/154): libgcc-13.3.1-3.fc39.x86_64.rpm       39 MB/s | 120 kB     00:00    
(115/154): libgomp-13.3.1-3.fc39.x86_64.rpm     111 MB/s | 329 kB     00:00    
(116/154): libidn2-2.3.7-1.fc39.x86_64.rpm       47 MB/s | 119 kB     00:00    
(117/154): libmount-2.39.4-1.fc39.x86_64.rpm     53 MB/s | 154 kB     00:00    
(118/154): libnghttp2-1.55.1-5.fc39.x86_64.rpm   31 MB/s |  75 kB     00:00    
(119/154): libsmartcols-2.39.4-1.fc39.x86_64.rp  29 MB/s |  67 kB     00:00    
(120/154): libssh-0.10.6-2.fc39.x86_64.rpm       78 MB/s | 212 kB     00:00    
(121/154): libssh-config-0.10.6-2.fc39.noarch.r 3.5 MB/s | 9.0 kB     00:00    
(122/154): libstdc++-13.3.1-3.fc39.x86_64.rpm   159 MB/s | 870 kB     00:00    
(123/154): libtirpc-1.3.6-0.fc39.x86_64.rpm      18 MB/s |  94 kB     00:00    
(124/154): libuuid-2.39.4-1.fc39.x86_64.rpm     8.2 MB/s |  28 kB     00:00    
(125/154): libzstd-1.5.6-1.fc39.x86_64.rpm       95 MB/s | 312 kB     00:00    
(126/154): lua-srpm-macros-1-13.fc39.noarch.rpm 2.7 MB/s | 8.7 kB     00:00    
(127/154): ncurses-base-6.4-7.20230520.fc39.1.n  24 MB/s |  88 kB     00:00    
(128/154): ncurses-libs-6.4-7.20230520.fc39.1.x 108 MB/s | 336 kB     00:00    
(129/154): openldap-2.6.7-1.fc39.x86_64.rpm      47 MB/s | 254 kB     00:00    
(130/154): openssl-libs-3.1.4-4.fc39.x86_64.rpm 226 MB/s | 2.2 MB     00:00    
(131/154): p11-kit-0.25.5-1.fc39.x86_64.rpm      71 MB/s | 515 kB     00:00    
(132/154): p11-kit-trust-0.25.5-1.fc39.x86_64.r  22 MB/s | 138 kB     00:00    
(133/154): pam-1.5.3-3.fc39.x86_64.rpm          184 MB/s | 542 kB     00:00    
(134/154): pam-libs-1.5.3-3.fc39.x86_64.rpm      20 MB/s |  56 kB     00:00    
(135/154): publicsuffix-list-dafsa-20240107-1.f  18 MB/s |  58 kB     00:00    
(136/154): pyproject-srpm-macros-1.16.0-1.fc39. 5.4 MB/s |  14 kB     00:00    
(137/154): python-srpm-macros-3.12-8.fc39.noarc  11 MB/s |  23 kB     00:00    
(138/154): qt5-srpm-macros-5.15.14-2.fc39.noarc 3.7 MB/s | 8.9 kB     00:00    
(139/154): qt6-srpm-macros-6.6.2-1.fc39.noarch. 3.6 MB/s | 8.9 kB     00:00    
(140/154): readline-8.2-6.fc39.x86_64.rpm        82 MB/s | 212 kB     00:00    
(141/154): redhat-rpm-config-266-1.fc39.noarch.  30 MB/s |  78 kB     00:00    
(142/154): rpm-4.19.1.1-1.fc39.x86_64.rpm       135 MB/s | 538 kB     00:00    
(143/154): rpm-build-4.19.1.1-1.fc39.x86_64.rpm  22 MB/s |  78 kB     00:00    
(144/154): rpm-build-libs-4.19.1.1-1.fc39.x86_6  27 MB/s |  95 kB     00:00    
(145/154): rpm-libs-4.19.1.1-1.fc39.x86_64.rpm  104 MB/s | 312 kB     00:00    
(146/154): rpmautospec-rpm-macros-0.7.3-1.fc39. 3.0 MB/s |  11 kB     00:00    
(147/154): rpm-sequoia-1.7.0-1.fc39.x86_64.rpm  181 MB/s | 904 kB     00:00    
(148/154): rust-srpm-macros-26.3-1.fc39.noarch. 5.7 MB/s |  13 kB     00:00    
(149/154): shadow-utils-4.14.0-2.fc39.x86_64.rp 199 MB/s | 1.3 MB     00:00    
(150/154): systemd-libs-254.20-1.fc39.x86_64.rp  82 MB/s | 681 kB     00:00    
(151/154): util-linux-2.39.4-1.fc39.x86_64.rpm  119 MB/s | 1.2 MB     00:00    
(152/154): util-linux-core-2.39.4-1.fc39.x86_64  94 MB/s | 507 kB     00:00    
(153/154): xxhash-libs-0.8.2-4.fc39.x86_64.rpm   11 MB/s |  37 kB     00:00    
(154/154): zstd-1.5.6-1.fc39.x86_64.rpm         175 MB/s | 479 kB     00:00    
--------------------------------------------------------------------------------
Total                                           130 MB/s |  52 MB     00:00     
fedora                                          1.6 MB/s | 1.6 kB     00:00    
Importing GPG key 0x18B8E74C:
 Userid     : "Fedora (39) <fedora-39-primary@fedoraproject.org>"
 Fingerprint: E8F2 3996 F232 1864 0CB4 4CBE 75CF 5AC4 18B8 E74C
 From       : /usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-39-primary
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Running scriptlet: filesystem-3.18-6.fc39.x86_64                          1/1 
  Preparing        :                                                        1/1 
  Installing       : libgcc-13.3.1-3.fc39.x86_64                          1/154 
  Running scriptlet: libgcc-13.3.1-3.fc39.x86_64                          1/154 
  Installing       : crypto-policies-20231204-1.git1e3a2e4.fc39.noarc     2/154 
  Running scriptlet: crypto-policies-20231204-1.git1e3a2e4.fc39.noarc     2/154 
  Installing       : fedora-release-identity-basic-39-36.noarch           3/154 
  Installing       : fedora-gpg-keys-39-2.noarch                          4/154 
  Installing       : fedora-repos-39-2.noarch                             5/154 
  Installing       : fedora-release-common-39-36.noarch                   6/154 
  Installing       : fedora-release-39-36.noarch                          7/154 
  Installing       : setup-2.14.4-1.fc39.noarch                           8/154 
warning: /etc/hosts created as /etc/hosts.rpmnew

  Running scriptlet: setup-2.14.4-1.fc39.noarch                           8/154 
  Installing       : filesystem-3.18-6.fc39.x86_64                        9/154 
  Installing       : basesystem-11-18.fc39.noarch                        10/154 
  Installing       : rust-srpm-macros-26.3-1.fc39.noarch                 11/154 
  Installing       : qt6-srpm-macros-6.6.2-1.fc39.noarch                 12/154 
  Installing       : qt5-srpm-macros-5.15.14-2.fc39.noarch               13/154 
  Installing       : publicsuffix-list-dafsa-20240107-1.fc39.noarch      14/154 
  Installing       : ncurses-base-6.4-7.20230520.fc39.1.noarch           15/154 
  Installing       : glibc-gconv-extra-2.38-19.fc39.x86_64               16/154 
  Running scriptlet: glibc-gconv-extra-2.38-19.fc39.x86_64               16/154 
  Installing       : glibc-minimal-langpack-2.38-19.fc39.x86_64          17/154 
  Installing       : glibc-common-2.38-19.fc39.x86_64                    18/154 
  Running scriptlet: glibc-2.38-19.fc39.x86_64                           19/154 
  Installing       : glibc-2.38-19.fc39.x86_64                           19/154 
  Running scriptlet: glibc-2.38-19.fc39.x86_64                           19/154 
  Installing       : ncurses-libs-6.4-7.20230520.fc39.1.x86_64           20/154 
  Installing       : bash-5.2.26-1.fc39.x86_64                           21/154 
  Running scriptlet: bash-5.2.26-1.fc39.x86_64                           21/154 
  Installing       : zlib-1.2.13-4.fc39.x86_64                           22/154 
  Installing       : xz-libs-5.4.4-1.fc39.x86_64                         23/154 
  Installing       : bzip2-libs-1.0.8-16.fc39.x86_64                     24/154 
  Installing       : popt-1.19-3.fc39.x86_64                             25/154 
  Installing       : libstdc++-13.3.1-3.fc39.x86_64                      26/154 
  Installing       : libuuid-2.39.4-1.fc39.x86_64                        27/154 
  Installing       : libzstd-1.5.6-1.fc39.x86_64                         28/154 
  Installing       : elfutils-libelf-0.192-4.fc39.x86_64                 29/154 
  Installing       : libblkid-2.39.4-1.fc39.x86_64                       30/154 
  Installing       : readline-8.2-6.fc39.x86_64                          31/154 
  Installing       : gmp-1:6.2.1-5.fc39.x86_64                           32/154 
  Installing       : libattr-2.5.1-8.fc39.x86_64                         33/154 
  Installing       : libacl-2.3.1-9.fc39.x86_64                          34/154 
  Installing       : libxcrypt-4.4.36-2.fc39.x86_64                      35/154 
  Installing       : libcap-2.48-9.fc39.x86_64                           36/154 
  Installing       : lz4-libs-1.9.4-4.fc39.x86_64                        37/154 
  Installing       : libeconf-0.5.2-2.fc39.x86_64                        38/154 
  Installing       : systemd-libs-254.20-1.fc39.x86_64                   39/154 
  Installing       : mpfr-4.2.0-3.fc39.x86_64                            40/154 
  Installing       : dwz-0.15-3.fc39.x86_64                              41/154 
  Installing       : unzip-6.0-62.fc39.x86_64                            42/154 
  Installing       : file-libs-5.44-5.fc39.x86_64                        43/154 
  Installing       : file-5.44-5.fc39.x86_64                             44/154 
  Installing       : jansson-2.13.1-7.fc39.x86_64                        45/154 
  Installing       : libcap-ng-0.8.3-8.fc39.x86_64                       46/154 
  Installing       : audit-libs-3.1.5-1.fc39.x86_64                      47/154 
  Installing       : pam-libs-1.5.3-3.fc39.x86_64                        48/154 
  Installing       : libcom_err-1.47.0-2.fc39.x86_64                     49/154 
  Installing       : libsepol-3.5-2.fc39.x86_64                          50/154 
  Installing       : libtasn1-4.19.0-3.fc39.x86_64                       51/154 
  Installing       : libunistring-1.1-5.fc39.x86_64                      52/154 
  Installing       : libidn2-2.3.7-1.fc39.x86_64                         53/154 
  Installing       : lua-libs-5.4.6-3.fc39.x86_64                        54/154 
  Installing       : alternatives-1.26-1.fc39.x86_64                     55/154 
  Installing       : libsmartcols-2.39.4-1.fc39.x86_64                   56/154 
  Installing       : libpsl-0.21.2-4.fc39.x86_64                         57/154 
  Installing       : zip-3.0-39.fc39.x86_64                              58/154 
  Installing       : zstd-1.5.6-1.fc39.x86_64                            59/154 
  Installing       : libfdisk-2.39.4-1.fc39.x86_64                       60/154 
  Installing       : bzip2-1.0.8-16.fc39.x86_64                          61/154 
  Installing       : libxml2-2.10.4-3.fc39.x86_64                        62/154 
  Installing       : sqlite-libs-3.42.0-7.fc39.x86_64                    63/154 
  Installing       : ed-1.19-4.fc39.x86_64                               64/154 
  Installing       : elfutils-default-yama-scope-0.192-4.fc39.noarch     65/154 
  Running scriptlet: elfutils-default-yama-scope-0.192-4.fc39.noarch     65/154 
  Installing       : cpio-2.14-4.fc39.x86_64                             66/154 
  Installing       : diffutils-3.10-3.fc39.x86_64                        67/154 
  Installing       : gdbm-libs-1:1.23-4.fc39.x86_64                      68/154 
  Installing       : cyrus-sasl-lib-2.1.28-11.fc39.x86_64                69/154 
  Installing       : json-c-0.17-1.fc39.x86_64                           70/154 
  Installing       : libbrotli-1.1.0-1.fc39.x86_64                       71/154 
  Installing       : libdb-5.3.28-56.fc39.x86_64                         72/154 
  Installing       : libffi-3.4.4-4.fc39.x86_64                          73/154 
  Installing       : p11-kit-0.25.5-1.fc39.x86_64                        74/154 
  Installing       : p11-kit-trust-0.25.5-1.fc39.x86_64                  75/154 
  Running scriptlet: p11-kit-trust-0.25.5-1.fc39.x86_64                  75/154 
  Installing       : libpkgconf-1.9.5-2.fc39.x86_64                      76/154 
  Installing       : pkgconf-1.9.5-2.fc39.x86_64                         77/154 
  Installing       : libsigsegv-2.14-5.fc39.x86_64                       78/154 
  Installing       : gawk-5.2.2-2.fc39.x86_64                            79/154 
  Installing       : libtool-ltdl-2.4.7-7.fc39.x86_64                    80/154 
  Installing       : libverto-0.3.2-6.fc39.x86_64                        81/154 
  Installing       : keyutils-libs-1.6.3-1.fc39.x86_64                   82/154 
  Installing       : libgomp-13.3.1-3.fc39.x86_64                        83/154 
  Installing       : libnghttp2-1.55.1-5.fc39.x86_64                     84/154 
  Installing       : xxhash-libs-0.8.2-4.fc39.x86_64                     85/154 
  Installing       : libssh-config-0.10.6-2.fc39.noarch                  86/154 
  Installing       : coreutils-common-9.3-7.fc39.x86_64                  87/154 
  Installing       : ansible-srpm-macros-1-12.fc39.noarch                88/154 
  Installing       : pkgconf-m4-1.9.5-2.fc39.noarch                      89/154 
  Installing       : pkgconf-pkg-config-1.9.5-2.fc39.x86_64              90/154 
  Installing       : perl-srpm-macros-1-51.fc39.noarch                   91/154 
  Installing       : pcre2-syntax-10.42-1.fc39.2.noarch                  92/154 
  Installing       : pcre2-10.42-1.fc39.2.x86_64                         93/154 
  Installing       : libselinux-3.5-5.fc39.x86_64                        94/154 
  Installing       : sed-4.8-14.fc39.x86_64                              95/154 
  Installing       : grep-3.11-3.fc39.x86_64                             96/154 
  Installing       : findutils-1:4.9.0-6.fc39.x86_64                     97/154 
  Installing       : xz-5.4.4-1.fc39.x86_64                              98/154 
  Installing       : libmount-2.39.4-1.fc39.x86_64                       99/154 
  Installing       : util-linux-core-2.39.4-1.fc39.x86_64               100/154 
  Installing       : openssl-libs-1:3.1.4-4.fc39.x86_64                 101/154 
  Installing       : coreutils-9.3-7.fc39.x86_64                        102/154 
  Running scriptlet: ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noar   103/154 
  Installing       : ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noar   103/154 
  Running scriptlet: ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noar   103/154 
  Installing       : krb5-libs-1.21.3-2.fc39.x86_64                     104/154 
  Installing       : libtirpc-1.3.6-0.fc39.x86_64                       105/154 
  Running scriptlet: authselect-libs-1.4.3-1.fc39.x86_64                106/154 
  Installing       : authselect-libs-1.4.3-1.fc39.x86_64                106/154 
  Installing       : gzip-1.12-6.fc39.x86_64                            107/154 
  Installing       : libarchive-3.7.1-3.fc39.x86_64                     108/154 
  Installing       : cracklib-2.9.11-2.fc39.x86_64                      109/154 
  Installing       : libpwquality-1.4.5-6.fc39.x86_64                   110/154 
  Installing       : authselect-1.4.3-1.fc39.x86_64                     111/154 
  Installing       : libnsl2-2.0.0-6.fc39.x86_64                        112/154 
  Installing       : pam-1.5.3-3.fc39.x86_64                            113/154 
  Installing       : libssh-0.10.6-2.fc39.x86_64                        114/154 
  Installing       : libevent-2.1.12-9.fc39.x86_64                      115/154 
  Installing       : openldap-2.6.7-1.fc39.x86_64                       116/154 
  Installing       : libcurl-8.2.1-5.fc39.x86_64                        117/154 
  Installing       : elfutils-libs-0.192-4.fc39.x86_64                  118/154 
  Installing       : elfutils-debuginfod-client-0.192-4.fc39.x86_64     119/154 
  Installing       : binutils-gold-2.40-14.fc39.x86_64                  120/154 
  Running scriptlet: binutils-gold-2.40-14.fc39.x86_64                  120/154 
  Installing       : binutils-2.40-14.fc39.x86_64                       121/154 
  Running scriptlet: binutils-2.40-14.fc39.x86_64                       121/154 
  Installing       : elfutils-0.192-4.fc39.x86_64                       122/154 
  Installing       : gdb-minimal-15.1-1.fc39.x86_64                     123/154 
  Installing       : debugedit-5.0-12.fc39.x86_64                       124/154 
  Installing       : curl-8.2.1-5.fc39.x86_64                           125/154 
  Installing       : rpm-sequoia-1.7.0-1.fc39.x86_64                    126/154 
  Installing       : rpm-libs-4.19.1.1-1.fc39.x86_64                    127/154 
  Running scriptlet: rpm-4.19.1.1-1.fc39.x86_64                         128/154 
  Installing       : rpm-4.19.1.1-1.fc39.x86_64                         128/154 
  Installing       : efi-srpm-macros-5-9.fc39.noarch                    129/154 
  Installing       : lua-srpm-macros-1-13.fc39.noarch                   130/154 
  Installing       : rpmautospec-rpm-macros-0.7.3-1.fc39.noarch         131/154 
  Installing       : rpm-build-libs-4.19.1.1-1.fc39.x86_64              132/154 
  Installing       : libsemanage-3.5-4.fc39.x86_64                      133/154 
  Installing       : shadow-utils-2:4.14.0-2.fc39.x86_64                134/154 
  Running scriptlet: libutempter-1.2.1-10.fc39.x86_64                   135/154 
  Installing       : libutempter-1.2.1-10.fc39.x86_64                   135/154 
  Installing       : patch-2.7.6-22.fc39.x86_64                         136/154 
  Installing       : tar-2:1.35-2.fc39.x86_64                           137/154 
  Installing       : package-notes-srpm-macros-0.5-9.fc39.noarch        138/154 
  Installing       : openblas-srpm-macros-2-14.fc39.noarch              139/154 
  Installing       : ocaml-srpm-macros-8-2.fc39.noarch                  140/154 
  Installing       : kernel-srpm-macros-1.0-20.fc39.noarch              141/154 
  Installing       : gnat-srpm-macros-6-3.fc39.noarch                   142/154 
  Installing       : ghc-srpm-macros-1.6.1-2.fc39.noarch                143/154 
  Installing       : fpc-srpm-macros-1.3-8.fc39.noarch                  144/154 
  Installing       : fonts-srpm-macros-1:2.0.5-12.fc39.noarch           145/154 
  Installing       : forge-srpm-macros-0.3.1-1.fc39.noarch              146/154 
  Installing       : go-srpm-macros-3.5.0-1.fc39.noarch                 147/154 
  Installing       : python-srpm-macros-3.12-8.fc39.noarch              148/154 
  Installing       : redhat-rpm-config-266-1.fc39.noarch                149/154 
  Installing       : rpm-build-4.19.1.1-1.fc39.x86_64                   150/154 
  Installing       : pyproject-srpm-macros-1.16.0-1.fc39.noarch         151/154 
  Installing       : util-linux-2.39.4-1.fc39.x86_64                    152/154 
  Running scriptlet: util-linux-2.39.4-1.fc39.x86_64                    152/154 
  Installing       : which-2.21-40.fc39.x86_64                          153/154 
  Installing       : info-7.0.3-3.fc39.x86_64                           154/154 
  Running scriptlet: filesystem-3.18-6.fc39.x86_64                      154/154 
  Running scriptlet: ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noar   154/154 
  Running scriptlet: authselect-libs-1.4.3-1.fc39.x86_64                154/154 
  Running scriptlet: rpm-4.19.1.1-1.fc39.x86_64                         154/154 
  Running scriptlet: info-7.0.3-3.fc39.x86_64                           154/154 
  Verifying        : authselect-1.4.3-1.fc39.x86_64                       1/154 
  Verifying        : authselect-libs-1.4.3-1.fc39.x86_64                  2/154 
  Verifying        : basesystem-11-18.fc39.noarch                         3/154 
  Verifying        : bzip2-1.0.8-16.fc39.x86_64                           4/154 
  Verifying        : bzip2-libs-1.0.8-16.fc39.x86_64                      5/154 
  Verifying        : cpio-2.14-4.fc39.x86_64                              6/154 
  Verifying        : cracklib-2.9.11-2.fc39.x86_64                        7/154 
  Verifying        : cyrus-sasl-lib-2.1.28-11.fc39.x86_64                 8/154 
  Verifying        : diffutils-3.10-3.fc39.x86_64                         9/154 
  Verifying        : dwz-0.15-3.fc39.x86_64                              10/154 
  Verifying        : ed-1.19-4.fc39.x86_64                               11/154 
  Verifying        : efi-srpm-macros-5-9.fc39.noarch                     12/154 
  Verifying        : file-5.44-5.fc39.x86_64                             13/154 
  Verifying        : file-libs-5.44-5.fc39.x86_64                        14/154 
  Verifying        : filesystem-3.18-6.fc39.x86_64                       15/154 
  Verifying        : fonts-srpm-macros-1:2.0.5-12.fc39.noarch            16/154 
  Verifying        : fpc-srpm-macros-1.3-8.fc39.noarch                   17/154 
  Verifying        : gawk-5.2.2-2.fc39.x86_64                            18/154 
  Verifying        : gdbm-libs-1:1.23-4.fc39.x86_64                      19/154 
  Verifying        : ghc-srpm-macros-1.6.1-2.fc39.noarch                 20/154 
  Verifying        : gmp-1:6.2.1-5.fc39.x86_64                           21/154 
  Verifying        : gnat-srpm-macros-6-3.fc39.noarch                    22/154 
  Verifying        : grep-3.11-3.fc39.x86_64                             23/154 
  Verifying        : gzip-1.12-6.fc39.x86_64                             24/154 
  Verifying        : info-7.0.3-3.fc39.x86_64                            25/154 
  Verifying        : jansson-2.13.1-7.fc39.x86_64                        26/154 
  Verifying        : json-c-0.17-1.fc39.x86_64                           27/154 
  Verifying        : kernel-srpm-macros-1.0-20.fc39.noarch               28/154 
  Verifying        : libattr-2.5.1-8.fc39.x86_64                         29/154 
  Verifying        : libbrotli-1.1.0-1.fc39.x86_64                       30/154 
  Verifying        : libcap-ng-0.8.3-8.fc39.x86_64                       31/154 
  Verifying        : libcom_err-1.47.0-2.fc39.x86_64                     32/154 
  Verifying        : libdb-5.3.28-56.fc39.x86_64                         33/154 
  Verifying        : libevent-2.1.12-9.fc39.x86_64                       34/154 
  Verifying        : libffi-3.4.4-4.fc39.x86_64                          35/154 
  Verifying        : libnsl2-2.0.0-6.fc39.x86_64                         36/154 
  Verifying        : libpkgconf-1.9.5-2.fc39.x86_64                      37/154 
  Verifying        : libpsl-0.21.2-4.fc39.x86_64                         38/154 
  Verifying        : libpwquality-1.4.5-6.fc39.x86_64                    39/154 
  Verifying        : libselinux-3.5-5.fc39.x86_64                        40/154 
  Verifying        : libsemanage-3.5-4.fc39.x86_64                       41/154 
  Verifying        : libsepol-3.5-2.fc39.x86_64                          42/154 
  Verifying        : libsigsegv-2.14-5.fc39.x86_64                       43/154 
  Verifying        : libtasn1-4.19.0-3.fc39.x86_64                       44/154 
  Verifying        : libtool-ltdl-2.4.7-7.fc39.x86_64                    45/154 
  Verifying        : libunistring-1.1-5.fc39.x86_64                      46/154 
  Verifying        : libutempter-1.2.1-10.fc39.x86_64                    47/154 
  Verifying        : libverto-0.3.2-6.fc39.x86_64                        48/154 
  Verifying        : libxcrypt-4.4.36-2.fc39.x86_64                      49/154 
  Verifying        : libxml2-2.10.4-3.fc39.x86_64                        50/154 
  Verifying        : lua-libs-5.4.6-3.fc39.x86_64                        51/154 
  Verifying        : lz4-libs-1.9.4-4.fc39.x86_64                        52/154 
  Verifying        : mpfr-4.2.0-3.fc39.x86_64                            53/154 
  Verifying        : ocaml-srpm-macros-8-2.fc39.noarch                   54/154 
  Verifying        : openblas-srpm-macros-2-14.fc39.noarch               55/154 
  Verifying        : package-notes-srpm-macros-0.5-9.fc39.noarch         56/154 
  Verifying        : patch-2.7.6-22.fc39.x86_64                          57/154 
  Verifying        : pcre2-10.42-1.fc39.2.x86_64                         58/154 
  Verifying        : pcre2-syntax-10.42-1.fc39.2.noarch                  59/154 
  Verifying        : perl-srpm-macros-1-51.fc39.noarch                   60/154 
  Verifying        : pkgconf-1.9.5-2.fc39.x86_64                         61/154 
  Verifying        : pkgconf-m4-1.9.5-2.fc39.noarch                      62/154 
  Verifying        : pkgconf-pkg-config-1.9.5-2.fc39.x86_64              63/154 
  Verifying        : popt-1.19-3.fc39.x86_64                             64/154 
  Verifying        : sed-4.8-14.fc39.x86_64                              65/154 
  Verifying        : setup-2.14.4-1.fc39.noarch                          66/154 
  Verifying        : sqlite-libs-3.42.0-7.fc39.x86_64                    67/154 
  Verifying        : tar-2:1.35-2.fc39.x86_64                            68/154 
  Verifying        : unzip-6.0-62.fc39.x86_64                            69/154 
  Verifying        : which-2.21-40.fc39.x86_64                           70/154 
  Verifying        : xz-5.4.4-1.fc39.x86_64                              71/154 
  Verifying        : xz-libs-5.4.4-1.fc39.x86_64                         72/154 
  Verifying        : zip-3.0-39.fc39.x86_64                              73/154 
  Verifying        : zlib-1.2.13-4.fc39.x86_64                           74/154 
  Verifying        : alternatives-1.26-1.fc39.x86_64                     75/154 
  Verifying        : ansible-srpm-macros-1-12.fc39.noarch                76/154 
  Verifying        : audit-libs-3.1.5-1.fc39.x86_64                      77/154 
  Verifying        : bash-5.2.26-1.fc39.x86_64                           78/154 
  Verifying        : binutils-2.40-14.fc39.x86_64                        79/154 
  Verifying        : binutils-gold-2.40-14.fc39.x86_64                   80/154 
  Verifying        : ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noar    81/154 
  Verifying        : coreutils-9.3-7.fc39.x86_64                         82/154 
  Verifying        : coreutils-common-9.3-7.fc39.x86_64                  83/154 
  Verifying        : crypto-policies-20231204-1.git1e3a2e4.fc39.noarc    84/154 
  Verifying        : curl-8.2.1-5.fc39.x86_64                            85/154 
  Verifying        : debugedit-5.0-12.fc39.x86_64                        86/154 
  Verifying        : elfutils-0.192-4.fc39.x86_64                        87/154 
  Verifying        : elfutils-debuginfod-client-0.192-4.fc39.x86_64      88/154 
  Verifying        : elfutils-default-yama-scope-0.192-4.fc39.noarch     89/154 
  Verifying        : elfutils-libelf-0.192-4.fc39.x86_64                 90/154 
  Verifying        : elfutils-libs-0.192-4.fc39.x86_64                   91/154 
  Verifying        : fedora-gpg-keys-39-2.noarch                         92/154 
  Verifying        : fedora-release-39-36.noarch                         93/154 
  Verifying        : fedora-release-common-39-36.noarch                  94/154 
  Verifying        : fedora-release-identity-basic-39-36.noarch          95/154 
  Verifying        : fedora-repos-39-2.noarch                            96/154 
  Verifying        : findutils-1:4.9.0-6.fc39.x86_64                     97/154 
  Verifying        : forge-srpm-macros-0.3.1-1.fc39.noarch               98/154 
  Verifying        : gdb-minimal-15.1-1.fc39.x86_64                      99/154 
  Verifying        : glibc-2.38-19.fc39.x86_64                          100/154 
  Verifying        : glibc-common-2.38-19.fc39.x86_64                   101/154 
  Verifying        : glibc-gconv-extra-2.38-19.fc39.x86_64              102/154 
  Verifying        : glibc-minimal-langpack-2.38-19.fc39.x86_64         103/154 
  Verifying        : go-srpm-macros-3.5.0-1.fc39.noarch                 104/154 
  Verifying        : keyutils-libs-1.6.3-1.fc39.x86_64                  105/154 
  Verifying        : krb5-libs-1.21.3-2.fc39.x86_64                     106/154 
  Verifying        : libacl-2.3.1-9.fc39.x86_64                         107/154 
  Verifying        : libarchive-3.7.1-3.fc39.x86_64                     108/154 
  Verifying        : libblkid-2.39.4-1.fc39.x86_64                      109/154 
  Verifying        : libcap-2.48-9.fc39.x86_64                          110/154 
  Verifying        : libcurl-8.2.1-5.fc39.x86_64                        111/154 
  Verifying        : libeconf-0.5.2-2.fc39.x86_64                       112/154 
  Verifying        : libfdisk-2.39.4-1.fc39.x86_64                      113/154 
  Verifying        : libgcc-13.3.1-3.fc39.x86_64                        114/154 
  Verifying        : libgomp-13.3.1-3.fc39.x86_64                       115/154 
  Verifying        : libidn2-2.3.7-1.fc39.x86_64                        116/154 
  Verifying        : libmount-2.39.4-1.fc39.x86_64                      117/154 
  Verifying        : libnghttp2-1.55.1-5.fc39.x86_64                    118/154 
  Verifying        : libsmartcols-2.39.4-1.fc39.x86_64                  119/154 
  Verifying        : libssh-0.10.6-2.fc39.x86_64                        120/154 
  Verifying        : libssh-config-0.10.6-2.fc39.noarch                 121/154 
  Verifying        : libstdc++-13.3.1-3.fc39.x86_64                     122/154 
  Verifying        : libtirpc-1.3.6-0.fc39.x86_64                       123/154 
  Verifying        : libuuid-2.39.4-1.fc39.x86_64                       124/154 
  Verifying        : libzstd-1.5.6-1.fc39.x86_64                        125/154 
  Verifying        : lua-srpm-macros-1-13.fc39.noarch                   126/154 
  Verifying        : ncurses-base-6.4-7.20230520.fc39.1.noarch          127/154 
  Verifying        : ncurses-libs-6.4-7.20230520.fc39.1.x86_64          128/154 
  Verifying        : openldap-2.6.7-1.fc39.x86_64                       129/154 
  Verifying        : openssl-libs-1:3.1.4-4.fc39.x86_64                 130/154 
  Verifying        : p11-kit-0.25.5-1.fc39.x86_64                       131/154 
  Verifying        : p11-kit-trust-0.25.5-1.fc39.x86_64                 132/154 
  Verifying        : pam-1.5.3-3.fc39.x86_64                            133/154 
  Verifying        : pam-libs-1.5.3-3.fc39.x86_64                       134/154 
  Verifying        : publicsuffix-list-dafsa-20240107-1.fc39.noarch     135/154 
  Verifying        : pyproject-srpm-macros-1.16.0-1.fc39.noarch         136/154 
  Verifying        : python-srpm-macros-3.12-8.fc39.noarch              137/154 
  Verifying        : qt5-srpm-macros-5.15.14-2.fc39.noarch              138/154 
  Verifying        : qt6-srpm-macros-6.6.2-1.fc39.noarch                139/154 
  Verifying        : readline-8.2-6.fc39.x86_64                         140/154 
  Verifying        : redhat-rpm-config-266-1.fc39.noarch                141/154 
  Verifying        : rpm-4.19.1.1-1.fc39.x86_64                         142/154 
  Verifying        : rpm-build-4.19.1.1-1.fc39.x86_64                   143/154 
  Verifying        : rpm-build-libs-4.19.1.1-1.fc39.x86_64              144/154 
  Verifying        : rpm-libs-4.19.1.1-1.fc39.x86_64                    145/154 
  Verifying        : rpm-sequoia-1.7.0-1.fc39.x86_64                    146/154 
  Verifying        : rpmautospec-rpm-macros-0.7.3-1.fc39.noarch         147/154 
  Verifying        : rust-srpm-macros-26.3-1.fc39.noarch                148/154 
  Verifying        : shadow-utils-2:4.14.0-2.fc39.x86_64                149/154 
  Verifying        : systemd-libs-254.20-1.fc39.x86_64                  150/154 
  Verifying        : util-linux-2.39.4-1.fc39.x86_64                    151/154 
  Verifying        : util-linux-core-2.39.4-1.fc39.x86_64               152/154 
  Verifying        : xxhash-libs-0.8.2-4.fc39.x86_64                    153/154 
  Verifying        : zstd-1.5.6-1.fc39.x86_64                           154/154 

Installed:
  alternatives-1.26-1.fc39.x86_64                                               
  ansible-srpm-macros-1-12.fc39.noarch                                          
  audit-libs-3.1.5-1.fc39.x86_64                                                
  authselect-1.4.3-1.fc39.x86_64                                                
  authselect-libs-1.4.3-1.fc39.x86_64                                           
  basesystem-11-18.fc39.noarch                                                  
  bash-5.2.26-1.fc39.x86_64                                                     
  binutils-2.40-14.fc39.x86_64                                                  
  binutils-gold-2.40-14.fc39.x86_64                                             
  bzip2-1.0.8-16.fc39.x86_64                                                    
  bzip2-libs-1.0.8-16.fc39.x86_64                                               
  ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noarch                            
  coreutils-9.3-7.fc39.x86_64                                                   
  coreutils-common-9.3-7.fc39.x86_64                                            
  cpio-2.14-4.fc39.x86_64                                                       
  cracklib-2.9.11-2.fc39.x86_64                                                 
  crypto-policies-20231204-1.git1e3a2e4.fc39.noarch                             
  curl-8.2.1-5.fc39.x86_64                                                      
  cyrus-sasl-lib-2.1.28-11.fc39.x86_64                                          
  debugedit-5.0-12.fc39.x86_64                                                  
  diffutils-3.10-3.fc39.x86_64                                                  
  dwz-0.15-3.fc39.x86_64                                                        
  ed-1.19-4.fc39.x86_64                                                         
  efi-srpm-macros-5-9.fc39.noarch                                               
  elfutils-0.192-4.fc39.x86_64                                                  
  elfutils-debuginfod-client-0.192-4.fc39.x86_64                                
  elfutils-default-yama-scope-0.192-4.fc39.noarch                               
  elfutils-libelf-0.192-4.fc39.x86_64                                           
  elfutils-libs-0.192-4.fc39.x86_64                                             
  fedora-gpg-keys-39-2.noarch                                                   
  fedora-release-39-36.noarch                                                   
  fedora-release-common-39-36.noarch                                            
  fedora-release-identity-basic-39-36.noarch                                    
  fedora-repos-39-2.noarch                                                      
  file-5.44-5.fc39.x86_64                                                       
  file-libs-5.44-5.fc39.x86_64                                                  
  filesystem-3.18-6.fc39.x86_64                                                 
  findutils-1:4.9.0-6.fc39.x86_64                                               
  fonts-srpm-macros-1:2.0.5-12.fc39.noarch                                      
  forge-srpm-macros-0.3.1-1.fc39.noarch                                         
  fpc-srpm-macros-1.3-8.fc39.noarch                                             
  gawk-5.2.2-2.fc39.x86_64                                                      
  gdb-minimal-15.1-1.fc39.x86_64                                                
  gdbm-libs-1:1.23-4.fc39.x86_64                                                
  ghc-srpm-macros-1.6.1-2.fc39.noarch                                           
  glibc-2.38-19.fc39.x86_64                                                     
  glibc-common-2.38-19.fc39.x86_64                                              
  glibc-gconv-extra-2.38-19.fc39.x86_64                                         
  glibc-minimal-langpack-2.38-19.fc39.x86_64                                    
  gmp-1:6.2.1-5.fc39.x86_64                                                     
  gnat-srpm-macros-6-3.fc39.noarch                                              
  go-srpm-macros-3.5.0-1.fc39.noarch                                            
  grep-3.11-3.fc39.x86_64                                                       
  gzip-1.12-6.fc39.x86_64                                                       
  info-7.0.3-3.fc39.x86_64                                                      
  jansson-2.13.1-7.fc39.x86_64                                                  
  json-c-0.17-1.fc39.x86_64                                                     
  kernel-srpm-macros-1.0-20.fc39.noarch                                         
  keyutils-libs-1.6.3-1.fc39.x86_64                                             
  krb5-libs-1.21.3-2.fc39.x86_64                                                
  libacl-2.3.1-9.fc39.x86_64                                                    
  libarchive-3.7.1-3.fc39.x86_64                                                
  libattr-2.5.1-8.fc39.x86_64                                                   
  libblkid-2.39.4-1.fc39.x86_64                                                 
  libbrotli-1.1.0-1.fc39.x86_64                                                 
  libcap-2.48-9.fc39.x86_64                                                     
  libcap-ng-0.8.3-8.fc39.x86_64                                                 
  libcom_err-1.47.0-2.fc39.x86_64                                               
  libcurl-8.2.1-5.fc39.x86_64                                                   
  libdb-5.3.28-56.fc39.x86_64                                                   
  libeconf-0.5.2-2.fc39.x86_64                                                  
  libevent-2.1.12-9.fc39.x86_64                                                 
  libfdisk-2.39.4-1.fc39.x86_64                                                 
  libffi-3.4.4-4.fc39.x86_64                                                    
  libgcc-13.3.1-3.fc39.x86_64                                                   
  libgomp-13.3.1-3.fc39.x86_64                                                  
  libidn2-2.3.7-1.fc39.x86_64                                                   
  libmount-2.39.4-1.fc39.x86_64                                                 
  libnghttp2-1.55.1-5.fc39.x86_64                                               
  libnsl2-2.0.0-6.fc39.x86_64                                                   
  libpkgconf-1.9.5-2.fc39.x86_64                                                
  libpsl-0.21.2-4.fc39.x86_64                                                   
  libpwquality-1.4.5-6.fc39.x86_64                                              
  libselinux-3.5-5.fc39.x86_64                                                  
  libsemanage-3.5-4.fc39.x86_64                                                 
  libsepol-3.5-2.fc39.x86_64                                                    
  libsigsegv-2.14-5.fc39.x86_64                                                 
  libsmartcols-2.39.4-1.fc39.x86_64                                             
  libssh-0.10.6-2.fc39.x86_64                                                   
  libssh-config-0.10.6-2.fc39.noarch                                            
  libstdc++-13.3.1-3.fc39.x86_64                                                
  libtasn1-4.19.0-3.fc39.x86_64                                                 
  libtirpc-1.3.6-0.fc39.x86_64                                                  
  libtool-ltdl-2.4.7-7.fc39.x86_64                                              
  libunistring-1.1-5.fc39.x86_64                                                
  libutempter-1.2.1-10.fc39.x86_64                                              
  libuuid-2.39.4-1.fc39.x86_64                                                  
  libverto-0.3.2-6.fc39.x86_64                                                  
  libxcrypt-4.4.36-2.fc39.x86_64                                                
  libxml2-2.10.4-3.fc39.x86_64                                                  
  libzstd-1.5.6-1.fc39.x86_64                                                   
  lua-libs-5.4.6-3.fc39.x86_64                                                  
  lua-srpm-macros-1-13.fc39.noarch                                              
  lz4-libs-1.9.4-4.fc39.x86_64                                                  
  mpfr-4.2.0-3.fc39.x86_64                                                      
  ncurses-base-6.4-7.20230520.fc39.1.noarch                                     
  ncurses-libs-6.4-7.20230520.fc39.1.x86_64                                     
  ocaml-srpm-macros-8-2.fc39.noarch                                             
  openblas-srpm-macros-2-14.fc39.noarch                                         
  openldap-2.6.7-1.fc39.x86_64                                                  
  openssl-libs-1:3.1.4-4.fc39.x86_64                                            
  p11-kit-0.25.5-1.fc39.x86_64                                                  
  p11-kit-trust-0.25.5-1.fc39.x86_64                                            
  package-notes-srpm-macros-0.5-9.fc39.noarch                                   
  pam-1.5.3-3.fc39.x86_64                                                       
  pam-libs-1.5.3-3.fc39.x86_64                                                  
  patch-2.7.6-22.fc39.x86_64                                                    
  pcre2-10.42-1.fc39.2.x86_64                                                   
  pcre2-syntax-10.42-1.fc39.2.noarch                                            
  perl-srpm-macros-1-51.fc39.noarch                                             
  pkgconf-1.9.5-2.fc39.x86_64                                                   
  pkgconf-m4-1.9.5-2.fc39.noarch                                                
  pkgconf-pkg-config-1.9.5-2.fc39.x86_64                                        
  popt-1.19-3.fc39.x86_64                                                       
  publicsuffix-list-dafsa-20240107-1.fc39.noarch                                
  pyproject-srpm-macros-1.16.0-1.fc39.noarch                                    
  python-srpm-macros-3.12-8.fc39.noarch                                         
  qt5-srpm-macros-5.15.14-2.fc39.noarch                                         
  qt6-srpm-macros-6.6.2-1.fc39.noarch                                           
  readline-8.2-6.fc39.x86_64                                                    
  redhat-rpm-config-266-1.fc39.noarch                                           
  rpm-4.19.1.1-1.fc39.x86_64                                                    
  rpm-build-4.19.1.1-1.fc39.x86_64                                              
  rpm-build-libs-4.19.1.1-1.fc39.x86_64                                         
  rpm-libs-4.19.1.1-1.fc39.x86_64                                               
  rpm-sequoia-1.7.0-1.fc39.x86_64                                               
  rpmautospec-rpm-macros-0.7.3-1.fc39.noarch                                    
  rust-srpm-macros-26.3-1.fc39.noarch                                           
  sed-4.8-14.fc39.x86_64                                                        
  setup-2.14.4-1.fc39.noarch                                                    
  shadow-utils-2:4.14.0-2.fc39.x86_64                                           
  sqlite-libs-3.42.0-7.fc39.x86_64                                              
  systemd-libs-254.20-1.fc39.x86_64                                             
  tar-2:1.35-2.fc39.x86_64                                                      
  unzip-6.0-62.fc39.x86_64                                                      
  util-linux-2.39.4-1.fc39.x86_64                                               
  util-linux-core-2.39.4-1.fc39.x86_64                                          
  which-2.21-40.fc39.x86_64                                                     
  xxhash-libs-0.8.2-4.fc39.x86_64                                               
  xz-5.4.4-1.fc39.x86_64                                                        
  xz-libs-5.4.4-1.fc39.x86_64                                                   
  zip-3.0-39.fc39.x86_64                                                        
  zlib-1.2.13-4.fc39.x86_64                                                     
  zstd-1.5.6-1.fc39.x86_64                                                      

Complete!
Finish: installing minimal buildroot with dnf
Start: creating root cache
Finish: creating root cache
Finish: chroot init
INFO: Installed packages:
INFO: alternatives-1.26-1.fc39.x86_64
ansible-srpm-macros-1-12.fc39.noarch
audit-libs-3.1.5-1.fc39.x86_64
authselect-1.4.3-1.fc39.x86_64
authselect-libs-1.4.3-1.fc39.x86_64
basesystem-11-18.fc39.noarch
bash-5.2.26-1.fc39.x86_64
binutils-2.40-14.fc39.x86_64
binutils-gold-2.40-14.fc39.x86_64
bzip2-1.0.8-16.fc39.x86_64
bzip2-libs-1.0.8-16.fc39.x86_64
ca-certificates-2024.2.69_v8.0.401-1.0.fc39.noarch
coreutils-9.3-7.fc39.x86_64
coreutils-common-9.3-7.fc39.x86_64
cpio-2.14-4.fc39.x86_64
cracklib-2.9.11-2.fc39.x86_64
crypto-policies-20231204-1.git1e3a2e4.fc39.noarch
curl-8.2.1-5.fc39.x86_64
cyrus-sasl-lib-2.1.28-11.fc39.x86_64
debugedit-5.0-12.fc39.x86_64
diffutils-3.10-3.fc39.x86_64
dwz-0.15-3.fc39.x86_64
ed-1.19-4.fc39.x86_64
efi-srpm-macros-5-9.fc39.noarch
elfutils-0.192-4.fc39.x86_64
elfutils-debuginfod-client-0.192-4.fc39.x86_64
elfutils-default-yama-scope-0.192-4.fc39.noarch
elfutils-libelf-0.192-4.fc39.x86_64
elfutils-libs-0.192-4.fc39.x86_64
fedora-gpg-keys-39-2.noarch
fedora-release-39-36.noarch
fedora-release-common-39-36.noarch
fedora-release-identity-basic-39-36.noarch
fedora-repos-39-2.noarch
file-5.44-5.fc39.x86_64
file-libs-5.44-5.fc39.x86_64
filesystem-3.18-6.fc39.x86_64
findutils-4.9.0-6.fc39.x86_64
fonts-srpm-macros-2.0.5-12.fc39.noarch
forge-srpm-macros-0.3.1-1.fc39.noarch
fpc-srpm-macros-1.3-8.fc39.noarch
gawk-5.2.2-2.fc39.x86_64
gdb-minimal-15.1-1.fc39.x86_64
gdbm-libs-1.23-4.fc39.x86_64
ghc-srpm-macros-1.6.1-2.fc39.noarch
glibc-2.38-19.fc39.x86_64
glibc-common-2.38-19.fc39.x86_64
glibc-gconv-extra-2.38-19.fc39.x86_64
glibc-minimal-langpack-2.38-19.fc39.x86_64
gmp-6.2.1-5.fc39.x86_64
gnat-srpm-macros-6-3.fc39.noarch
go-srpm-macros-3.5.0-1.fc39.noarch
gpg-pubkey-18b8e74c-62f2920f
grep-3.11-3.fc39.x86_64
gzip-1.12-6.fc39.x86_64
info-7.0.3-3.fc39.x86_64
jansson-2.13.1-7.fc39.x86_64
json-c-0.17-1.fc39.x86_64
kernel-srpm-macros-1.0-20.fc39.noarch
keyutils-libs-1.6.3-1.fc39.x86_64
krb5-libs-1.21.3-2.fc39.x86_64
libacl-2.3.1-9.fc39.x86_64
libarchive-3.7.1-3.fc39.x86_64
libattr-2.5.1-8.fc39.x86_64
libblkid-2.39.4-1.fc39.x86_64
libbrotli-1.1.0-1.fc39.x86_64
libcap-2.48-9.fc39.x86_64
libcap-ng-0.8.3-8.fc39.x86_64
libcom_err-1.47.0-2.fc39.x86_64
libcurl-8.2.1-5.fc39.x86_64
libdb-5.3.28-56.fc39.x86_64
libeconf-0.5.2-2.fc39.x86_64
libevent-2.1.12-9.fc39.x86_64
libfdisk-2.39.4-1.fc39.x86_64
libffi-3.4.4-4.fc39.x86_64
libgcc-13.3.1-3.fc39.x86_64
libgomp-13.3.1-3.fc39.x86_64
libidn2-2.3.7-1.fc39.x86_64
libmount-2.39.4-1.fc39.x86_64
libnghttp2-1.55.1-5.fc39.x86_64
libnsl2-2.0.0-6.fc39.x86_64
libpkgconf-1.9.5-2.fc39.x86_64
libpsl-0.21.2-4.fc39.x86_64
libpwquality-1.4.5-6.fc39.x86_64
libselinux-3.5-5.fc39.x86_64
libsemanage-3.5-4.fc39.x86_64
libsepol-3.5-2.fc39.x86_64
libsigsegv-2.14-5.fc39.x86_64
libsmartcols-2.39.4-1.fc39.x86_64
libssh-0.10.6-2.fc39.x86_64
libssh-config-0.10.6-2.fc39.noarch
libstdc++-13.3.1-3.fc39.x86_64
libtasn1-4.19.0-3.fc39.x86_64
libtirpc-1.3.6-0.fc39.x86_64
libtool-ltdl-2.4.7-7.fc39.x86_64
libunistring-1.1-5.fc39.x86_64
libutempter-1.2.1-10.fc39.x86_64
libuuid-2.39.4-1.fc39.x86_64
libverto-0.3.2-6.fc39.x86_64
libxcrypt-4.4.36-2.fc39.x86_64
libxml2-2.10.4-3.fc39.x86_64
libzstd-1.5.6-1.fc39.x86_64
lua-libs-5.4.6-3.fc39.x86_64
lua-srpm-macros-1-13.fc39.noarch
lz4-libs-1.9.4-4.fc39.x86_64
mpfr-4.2.0-3.fc39.x86_64
ncurses-base-6.4-7.20230520.fc39.1.noarch
ncurses-libs-6.4-7.20230520.fc39.1.x86_64
ocaml-srpm-macros-8-2.fc39.noarch
openblas-srpm-macros-2-14.fc39.noarch
openldap-2.6.7-1.fc39.x86_64
openssl-libs-3.1.4-4.fc39.x86_64
p11-kit-0.25.5-1.fc39.x86_64
p11-kit-trust-0.25.5-1.fc39.x86_64
package-notes-srpm-macros-0.5-9.fc39.noarch
pam-1.5.3-3.fc39.x86_64
pam-libs-1.5.3-3.fc39.x86_64
patch-2.7.6-22.fc39.x86_64
pcre2-10.42-1.fc39.2.x86_64
pcre2-syntax-10.42-1.fc39.2.noarch
perl-srpm-macros-1-51.fc39.noarch
pkgconf-1.9.5-2.fc39.x86_64
pkgconf-m4-1.9.5-2.fc39.noarch
pkgconf-pkg-config-1.9.5-2.fc39.x86_64
popt-1.19-3.fc39.x86_64
publicsuffix-list-dafsa-20240107-1.fc39.noarch
pyproject-srpm-macros-1.16.0-1.fc39.noarch
python-srpm-macros-3.12-8.fc39.noarch
qt5-srpm-macros-5.15.14-2.fc39.noarch
qt6-srpm-macros-6.6.2-1.fc39.noarch
readline-8.2-6.fc39.x86_64
redhat-rpm-config-266-1.fc39.noarch
rpm-4.19.1.1-1.fc39.x86_64
rpm-build-4.19.1.1-1.fc39.x86_64
rpm-build-libs-4.19.1.1-1.fc39.x86_64
rpm-libs-4.19.1.1-1.fc39.x86_64
rpm-sequoia-1.7.0-1.fc39.x86_64
rpmautospec-rpm-macros-0.7.3-1.fc39.noarch
rust-srpm-macros-26.3-1.fc39.noarch
sed-4.8-14.fc39.x86_64
setup-2.14.4-1.fc39.noarch
shadow-utils-4.14.0-2.fc39.x86_64
sqlite-libs-3.42.0-7.fc39.x86_64
systemd-libs-254.20-1.fc39.x86_64
tar-1.35-2.fc39.x86_64
unzip-6.0-62.fc39.x86_64
util-linux-2.39.4-1.fc39.x86_64
util-linux-core-2.39.4-1.fc39.x86_64
which-2.21-40.fc39.x86_64
xxhash-libs-0.8.2-4.fc39.x86_64
xz-5.4.4-1.fc39.x86_64
xz-libs-5.4.4-1.fc39.x86_64
zip-3.0-39.fc39.x86_64
zlib-1.2.13-4.fc39.x86_64
zstd-1.5.6-1.fc39.x86_64
Start: buildsrpm
Start: rpmbuild -bs
Building target platforms: x86_64
Building for target x86_64
setting SOURCE_DATE_EPOCH=1733097600
Wrote: /builddir/build/SRPMS/pycharm-community-2024.3-2.fc39.src.rpm
Finish: rpmbuild -bs
INFO: chroot_scan: 3 files copied to /var/lib/copr-rpmbuild/results/chroot_scan
INFO: /var/lib/mock/fedora-39-x86_64-1733142171.782165/root/var/log/dnf.log
/var/lib/mock/fedora-39-x86_64-1733142171.782165/root/var/log/dnf.librepo.log
/var/lib/mock/fedora-39-x86_64-1733142171.782165/root/var/log/dnf.rpm.log
INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz
/bin/tar: Removing leading `/' from member names
Finish: buildsrpm
INFO: Done(/var/lib/copr-rpmbuild/workspace/workdir-3_23ausb/pycharm-community/pycharm-community.spec) Config(child) 1 minutes 16 seconds
INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results
INFO: Cleaning up build root ('cleanup_on_success=True')
Start: clean chroot
INFO: unmounting tmpfs.
Finish: clean chroot
INFO: Start(/var/lib/copr-rpmbuild/results/pycharm-community-2024.3-2.fc39.src.rpm)  Config(fedora-39-x86_64)
Start(bootstrap): chroot init
INFO: mounting tmpfs at /var/lib/mock/fedora-39-x86_64-bootstrap-1733142171.782165/root.
INFO: reusing tmpfs at /var/lib/mock/fedora-39-x86_64-bootstrap-1733142171.782165/root.
INFO: calling preinit hooks
INFO: enabled root cache
INFO: enabled package manager cache
Start(bootstrap): cleaning package manager metadata
Finish(bootstrap): cleaning package manager metadata
Finish(bootstrap): chroot init
Start: chroot init
INFO: mounting tmpfs at /var/lib/mock/fedora-39-x86_64-1733142171.782165/root.
INFO: calling preinit hooks
INFO: enabled root cache
Start: unpacking root cache
Finish: unpacking root cache
INFO: enabled package manager cache
Start: cleaning package manager metadata
Finish: cleaning package manager metadata
INFO: enabled HW Info plugin
INFO: Buildroot is handled by package management installed into bootstrap:
  rpm-4.19.1.1-1.fc39.x86_64
  rpm-sequoia-1.7.0-1.fc39.x86_64
  python3-dnf-4.21.1-1.fc39.noarch
  python3-dnf-plugins-core-4.9.0-1.fc39.noarch
Finish: chroot init
Start: build phase for pycharm-community-2024.3-2.fc39.src.rpm
Start: build setup for pycharm-community-2024.3-2.fc39.src.rpm
Building target platforms: x86_64
Building for target x86_64
setting SOURCE_DATE_EPOCH=1733097600
Wrote: /builddir/build/SRPMS/pycharm-community-2024.3-2.fc39.src.rpm
No matches found for the following disable plugin patterns: local, spacewalk, versionlock
Copr repository                                  78 kB/s | 2.1 kB     00:00    
fedora                                          184 kB/s |  32 kB     00:00    
updates                                         103 kB/s |  29 kB     00:00    
Dependencies resolved.
================================================================================
 Package                       Arch      Version               Repository  Size
================================================================================
Installing:
 desktop-file-utils            x86_64    0.26-9.fc39           fedora      72 k
 javapackages-filesystem       noarch    6.1.0-10.fc39         fedora      12 k
 libappstream-glib             x86_64    0.8.2-4.fc39          fedora     409 k
 librsvg2-tools                x86_64    2.57.1-2.fc39         updates    1.8 M
 python3-devel                 x86_64    3.12.7-1.fc39         updates    314 k
Installing dependencies:
 abattis-cantarell-vf-fonts    noarch    0.301-10.fc39         fedora     121 k
 cairo                         x86_64    1.18.0-1.fc39         fedora     710 k
 cairo-gobject                 x86_64    1.18.0-1.fc39         fedora      19 k
 default-fonts-core-sans       noarch    4.0-9.fc39            fedora      32 k
 emacs-filesystem              noarch    1:29.4-2.fc39         updates    7.3 k
 expat                         x86_64    2.6.3-1.fc39          updates    114 k
 fontconfig                    x86_64    2.14.2-6.fc39         updates    296 k
 fonts-filesystem              noarch    1:2.0.5-12.fc39       fedora     8.2 k
 freetype                      x86_64    2.13.1-2.fc39         fedora     414 k
 fribidi                       x86_64    1.0.13-2.fc39         fedora      91 k
 gdk-pixbuf2                   x86_64    2.42.10-5.fc39        fedora     484 k
 glib2                         x86_64    2.78.6-1.fc39         updates    2.8 M
 gnutls                        x86_64    3.8.6-1.fc39          updates    1.1 M
 google-noto-fonts-common      noarch    20240101-1.fc39       updates     17 k
 google-noto-sans-vf-fonts     noarch    20240101-1.fc39       updates    593 k
 graphite2                     x86_64    1.3.14-12.fc39        fedora      95 k
 harfbuzz                      x86_64    8.2.1-2.fc39          fedora     975 k
 json-glib                     x86_64    1.8.0-1.fc39          fedora     166 k
 libX11                        x86_64    1.8.9-1.fc39          updates    650 k
 libX11-common                 noarch    1.8.9-1.fc39          updates    176 k
 libXau                        x86_64    1.0.11-3.fc39         fedora      31 k
 libXext                       x86_64    1.3.5-3.fc39          fedora      39 k
 libXft                        x86_64    2.3.8-3.fc39          fedora      72 k
 libXrender                    x86_64    0.9.11-3.fc39         fedora      27 k
 libb2                         x86_64    0.98.1-9.fc39         fedora      25 k
 libdatrie                     x86_64    0.2.13-7.fc39         fedora      32 k
 libjpeg-turbo                 x86_64    2.1.4-3.fc39          fedora     183 k
 libpng                        x86_64    2:1.6.37-15.fc39      fedora     119 k
 librsvg2                      x86_64    2.57.1-2.fc39         updates    1.6 M
 libstemmer                    x86_64    2.2.0-7.fc39          fedora     171 k
 libthai                       x86_64    0.1.29-6.fc39         fedora     213 k
 libxcb                        x86_64    1.13.1-12.fc39        fedora     233 k
 mpdecimal                     x86_64    2.5.1-7.fc39          fedora      89 k
 nettle                        x86_64    3.9.1-2.fc39          fedora     425 k
 pango                         x86_64    1.51.0-1.fc39         fedora     343 k
 pixman                        x86_64    0.42.2-2.fc39         fedora     288 k
 pyproject-rpm-macros          noarch    1.16.0-1.fc39         updates     45 k
 python-pip-wheel              noarch    23.2.1-2.fc39         updates    1.5 M
 python-rpm-macros             noarch    3.12-8.fc39           updates     18 k
 python3                       x86_64    3.12.7-1.fc39         updates     28 k
 python3-libs                  x86_64    3.12.7-1.fc39         updates    9.2 M
 python3-packaging             noarch    23.1-4.fc39           fedora     114 k
 python3-rpm-generators        noarch    14-7.fc39             fedora      30 k
 python3-rpm-macros            noarch    3.12-8.fc39           updates     12 k
 rsvg-pixbuf-loader            x86_64    2.57.1-2.fc39         updates     16 k
 shared-mime-info              x86_64    2.2-4.fc39            fedora     380 k
 tzdata                        noarch    2024a-2.fc39          updates    715 k
 xml-common                    noarch    0.6.3-61.fc39         fedora      31 k

Transaction Summary
================================================================================
Install  53 Packages

Total download size: 27 M
Installed size: 101 M
Downloading Packages:
(1/53): cairo-gobject-1.18.0-1.fc39.x86_64.rpm  1.3 MB/s |  19 kB     00:00    
(2/53): default-fonts-core-sans-4.0-9.fc39.noar  21 MB/s |  32 kB     00:00    
(3/53): cairo-1.18.0-1.fc39.x86_64.rpm           38 MB/s | 710 kB     00:00    
(4/53): desktop-file-utils-0.26-9.fc39.x86_64.r  16 MB/s |  72 kB     00:00    
(5/53): fonts-filesystem-2.0.5-12.fc39.noarch.r 3.2 MB/s | 8.2 kB     00:00    
(6/53): fribidi-1.0.13-2.fc39.x86_64.rpm         45 MB/s |  91 kB     00:00    
(7/53): freetype-2.13.1-2.fc39.x86_64.rpm       120 MB/s | 414 kB     00:00    
(8/53): gdk-pixbuf2-2.42.10-5.fc39.x86_64.rpm   145 MB/s | 484 kB     00:00    
(9/53): abattis-cantarell-vf-fonts-0.301-10.fc3 4.3 MB/s | 121 kB     00:00    
(10/53): graphite2-1.3.14-12.fc39.x86_64.rpm     27 MB/s |  95 kB     00:00    
(11/53): harfbuzz-8.2.1-2.fc39.x86_64.rpm       200 MB/s | 975 kB     00:00    
(12/53): javapackages-filesystem-6.1.0-10.fc39. 2.5 MB/s |  12 kB     00:00    
(13/53): json-glib-1.8.0-1.fc39.x86_64.rpm       36 MB/s | 166 kB     00:00    
(14/53): libXau-1.0.11-3.fc39.x86_64.rpm         17 MB/s |  31 kB     00:00    
(15/53): libXext-1.3.5-3.fc39.x86_64.rpm         21 MB/s |  39 kB     00:00    
(16/53): libXft-2.3.8-3.fc39.x86_64.rpm          31 MB/s |  72 kB     00:00    
(17/53): libXrender-0.9.11-3.fc39.x86_64.rpm     14 MB/s |  27 kB     00:00    
(18/53): libb2-0.98.1-9.fc39.x86_64.rpm          10 MB/s |  25 kB     00:00    
(19/53): libjpeg-turbo-2.1.4-3.fc39.x86_64.rpm   94 MB/s | 183 kB     00:00    
(20/53): libpng-1.6.37-15.fc39.x86_64.rpm        44 MB/s | 119 kB     00:00    
(21/53): libstemmer-2.2.0-7.fc39.x86_64.rpm      75 MB/s | 171 kB     00:00    
(22/53): libappstream-glib-0.8.2-4.fc39.x86_64.  30 MB/s | 409 kB     00:00    
(23/53): libthai-0.1.29-6.fc39.x86_64.rpm        64 MB/s | 213 kB     00:00    
(24/53): libdatrie-0.2.13-7.fc39.x86_64.rpm     2.5 MB/s |  32 kB     00:00    
(25/53): mpdecimal-2.5.1-7.fc39.x86_64.rpm       27 MB/s |  89 kB     00:00    
(26/53): nettle-3.9.1-2.fc39.x86_64.rpm         116 MB/s | 425 kB     00:00    
(27/53): libxcb-1.13.1-12.fc39.x86_64.rpm        46 MB/s | 233 kB     00:00    
(28/53): pango-1.51.0-1.fc39.x86_64.rpm          95 MB/s | 343 kB     00:00    
(29/53): pixman-0.42.2-2.fc39.x86_64.rpm         60 MB/s | 288 kB     00:00    
(30/53): python3-packaging-23.1-4.fc39.noarch.r  25 MB/s | 114 kB     00:00    
(31/53): shared-mime-info-2.2-4.fc39.x86_64.rpm 117 MB/s | 380 kB     00:00    
(32/53): xml-common-0.6.3-61.fc39.noarch.rpm    9.4 MB/s |  31 kB     00:00    
(33/53): python3-rpm-generators-14-7.fc39.noarc 6.4 MB/s |  30 kB     00:00    
(34/53): emacs-filesystem-29.4-2.fc39.noarch.rp 3.5 MB/s | 7.3 kB     00:00    
(35/53): expat-2.6.3-1.fc39.x86_64.rpm           40 MB/s | 114 kB     00:00    
(36/53): fontconfig-2.14.2-6.fc39.x86_64.rpm     34 MB/s | 296 kB     00:00    
(37/53): gnutls-3.8.6-1.fc39.x86_64.rpm         102 MB/s | 1.1 MB     00:00    
(38/53): google-noto-fonts-common-20240101-1.fc 3.0 MB/s |  17 kB     00:00    
(39/53): glib2-2.78.6-1.fc39.x86_64.rpm         163 MB/s | 2.8 MB     00:00    
(40/53): google-noto-sans-vf-fonts-20240101-1.f  87 MB/s | 593 kB     00:00    
(41/53): libX11-1.8.9-1.fc39.x86_64.rpm          99 MB/s | 650 kB     00:00    
(42/53): libX11-common-1.8.9-1.fc39.noarch.rpm   74 MB/s | 176 kB     00:00    
(43/53): librsvg2-tools-2.57.1-2.fc39.x86_64.rp 170 MB/s | 1.8 MB     00:00    
(44/53): librsvg2-2.57.1-2.fc39.x86_64.rpm      128 MB/s | 1.6 MB     00:00    
(45/53): pyproject-rpm-macros-1.16.0-1.fc39.noa 3.6 MB/s |  45 kB     00:00    
(46/53): python-rpm-macros-3.12-8.fc39.noarch.r 7.9 MB/s |  18 kB     00:00    
(47/53): python-pip-wheel-23.2.1-2.fc39.noarch. 207 MB/s | 1.5 MB     00:00    
(48/53): python3-3.12.7-1.fc39.x86_64.rpm       5.1 MB/s |  28 kB     00:00    
(49/53): python3-devel-3.12.7-1.fc39.x86_64.rpm  91 MB/s | 314 kB     00:00    
(50/53): python3-rpm-macros-3.12-8.fc39.noarch. 5.3 MB/s |  12 kB     00:00    
(51/53): rsvg-pixbuf-loader-2.57.1-2.fc39.x86_6 5.1 MB/s |  16 kB     00:00    
(52/53): tzdata-2024a-2.fc39.noarch.rpm         113 MB/s | 715 kB     00:00    
(53/53): python3-libs-3.12.7-1.fc39.x86_64.rpm  281 MB/s | 9.2 MB     00:00    
--------------------------------------------------------------------------------
Total                                            65 MB/s |  27 MB     00:00     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : libpng-2:1.6.37-15.fc39.x86_64                        1/53 
  Installing       : python-rpm-macros-3.12-8.fc39.noarch                  2/53 
  Installing       : fonts-filesystem-1:2.0.5-12.fc39.noarch               3/53 
  Installing       : python3-rpm-macros-3.12-8.fc39.noarch                 4/53 
  Installing       : pyproject-rpm-macros-1.16.0-1.fc39.noarch             5/53 
  Installing       : abattis-cantarell-vf-fonts-0.301-10.fc39.noarch       6/53 
  Installing       : tzdata-2024a-2.fc39.noarch                            7/53 
  Installing       : python-pip-wheel-23.2.1-2.fc39.noarch                 8/53 
  Installing       : libX11-common-1.8.9-1.fc39.noarch                     9/53 
  Installing       : google-noto-fonts-common-20240101-1.fc39.noarch      10/53 
  Installing       : google-noto-sans-vf-fonts-20240101-1.fc39.noarch     11/53 
  Installing       : default-fonts-core-sans-4.0-9.fc39.noarch            12/53 
  Installing       : expat-2.6.3-1.fc39.x86_64                            13/53 
  Installing       : emacs-filesystem-1:29.4-2.fc39.noarch                14/53 
  Running scriptlet: xml-common-0.6.3-61.fc39.noarch                      15/53 
  Installing       : xml-common-0.6.3-61.fc39.noarch                      15/53 
  Installing       : pixman-0.42.2-2.fc39.x86_64                          16/53 
  Installing       : nettle-3.9.1-2.fc39.x86_64                           17/53 
  Installing       : gnutls-3.8.6-1.fc39.x86_64                           18/53 
  Installing       : glib2-2.78.6-1.fc39.x86_64                           19/53 
  Installing       : json-glib-1.8.0-1.fc39.x86_64                        20/53 
  Installing       : shared-mime-info-2.2-4.fc39.x86_64                   21/53 
  Running scriptlet: shared-mime-info-2.2-4.fc39.x86_64                   21/53 
  Installing       : mpdecimal-2.5.1-7.fc39.x86_64                        22/53 
  Installing       : libstemmer-2.2.0-7.fc39.x86_64                       23/53 
  Installing       : libjpeg-turbo-2.1.4-3.fc39.x86_64                    24/53 
  Installing       : gdk-pixbuf2-2.42.10-5.fc39.x86_64                    25/53 
  Installing       : libdatrie-0.2.13-7.fc39.x86_64                       26/53 
  Installing       : libthai-0.1.29-6.fc39.x86_64                         27/53 
  Installing       : libb2-0.98.1-9.fc39.x86_64                           28/53 
  Installing       : python3-3.12.7-1.fc39.x86_64                         29/53 
  Installing       : python3-libs-3.12.7-1.fc39.x86_64                    30/53 
  Installing       : python3-packaging-23.1-4.fc39.noarch                 31/53 
  Installing       : python3-rpm-generators-14-7.fc39.noarch              32/53 
  Installing       : libXau-1.0.11-3.fc39.x86_64                          33/53 
  Installing       : libxcb-1.13.1-12.fc39.x86_64                         34/53 
  Installing       : libX11-1.8.9-1.fc39.x86_64                           35/53 
  Installing       : libXrender-0.9.11-3.fc39.x86_64                      36/53 
  Installing       : libXext-1.3.5-3.fc39.x86_64                          37/53 
  Installing       : graphite2-1.3.14-12.fc39.x86_64                      38/53 
  Installing       : cairo-1.18.0-1.fc39.x86_64                           39/53 
  Installing       : harfbuzz-8.2.1-2.fc39.x86_64                         40/53 
  Installing       : freetype-2.13.1-2.fc39.x86_64                        41/53 
  Installing       : fontconfig-2.14.2-6.fc39.x86_64                      42/53 
  Running scriptlet: fontconfig-2.14.2-6.fc39.x86_64                      42/53 
  Installing       : cairo-gobject-1.18.0-1.fc39.x86_64                   43/53 
  Installing       : libXft-2.3.8-3.fc39.x86_64                           44/53 
  Installing       : fribidi-1.0.13-2.fc39.x86_64                         45/53 
  Installing       : pango-1.51.0-1.fc39.x86_64                           46/53 
  Installing       : librsvg2-2.57.1-2.fc39.x86_64                        47/53 
  Installing       : rsvg-pixbuf-loader-2.57.1-2.fc39.x86_64              48/53 
  Installing       : librsvg2-tools-2.57.1-2.fc39.x86_64                  49/53 
  Installing       : python3-devel-3.12.7-1.fc39.x86_64                   50/53 
  Installing       : libappstream-glib-0.8.2-4.fc39.x86_64                51/53 
  Installing       : desktop-file-utils-0.26-9.fc39.x86_64                52/53 
  Installing       : javapackages-filesystem-6.1.0-10.fc39.noarch         53/53 
  Running scriptlet: fontconfig-2.14.2-6.fc39.x86_64                      53/53 
  Running scriptlet: javapackages-filesystem-6.1.0-10.fc39.noarch         53/53 
  Verifying        : abattis-cantarell-vf-fonts-0.301-10.fc39.noarch       1/53 
  Verifying        : cairo-1.18.0-1.fc39.x86_64                            2/53 
  Verifying        : cairo-gobject-1.18.0-1.fc39.x86_64                    3/53 
  Verifying        : default-fonts-core-sans-4.0-9.fc39.noarch             4/53 
  Verifying        : desktop-file-utils-0.26-9.fc39.x86_64                 5/53 
  Verifying        : fonts-filesystem-1:2.0.5-12.fc39.noarch               6/53 
  Verifying        : freetype-2.13.1-2.fc39.x86_64                         7/53 
  Verifying        : fribidi-1.0.13-2.fc39.x86_64                          8/53 
  Verifying        : gdk-pixbuf2-2.42.10-5.fc39.x86_64                     9/53 
  Verifying        : graphite2-1.3.14-12.fc39.x86_64                      10/53 
  Verifying        : harfbuzz-8.2.1-2.fc39.x86_64                         11/53 
  Verifying        : javapackages-filesystem-6.1.0-10.fc39.noarch         12/53 
  Verifying        : json-glib-1.8.0-1.fc39.x86_64                        13/53 
  Verifying        : libXau-1.0.11-3.fc39.x86_64                          14/53 
  Verifying        : libXext-1.3.5-3.fc39.x86_64                          15/53 
  Verifying        : libXft-2.3.8-3.fc39.x86_64                           16/53 
  Verifying        : libXrender-0.9.11-3.fc39.x86_64                      17/53 
  Verifying        : libappstream-glib-0.8.2-4.fc39.x86_64                18/53 
  Verifying        : libb2-0.98.1-9.fc39.x86_64                           19/53 
  Verifying        : libdatrie-0.2.13-7.fc39.x86_64                       20/53 
  Verifying        : libjpeg-turbo-2.1.4-3.fc39.x86_64                    21/53 
  Verifying        : libpng-2:1.6.37-15.fc39.x86_64                       22/53 
  Verifying        : libstemmer-2.2.0-7.fc39.x86_64                       23/53 
  Verifying        : libthai-0.1.29-6.fc39.x86_64                         24/53 
  Verifying        : libxcb-1.13.1-12.fc39.x86_64                         25/53 
  Verifying        : mpdecimal-2.5.1-7.fc39.x86_64                        26/53 
  Verifying        : nettle-3.9.1-2.fc39.x86_64                           27/53 
  Verifying        : pango-1.51.0-1.fc39.x86_64                           28/53 
  Verifying        : pixman-0.42.2-2.fc39.x86_64                          29/53 
  Verifying        : python3-packaging-23.1-4.fc39.noarch                 30/53 
  Verifying        : python3-rpm-generators-14-7.fc39.noarch              31/53 
  Verifying        : shared-mime-info-2.2-4.fc39.x86_64                   32/53 
  Verifying        : xml-common-0.6.3-61.fc39.noarch                      33/53 
  Verifying        : emacs-filesystem-1:29.4-2.fc39.noarch                34/53 
  Verifying        : expat-2.6.3-1.fc39.x86_64                            35/53 
  Verifying        : fontconfig-2.14.2-6.fc39.x86_64                      36/53 
  Verifying        : glib2-2.78.6-1.fc39.x86_64                           37/53 
  Verifying        : gnutls-3.8.6-1.fc39.x86_64                           38/53 
  Verifying        : google-noto-fonts-common-20240101-1.fc39.noarch      39/53 
  Verifying        : google-noto-sans-vf-fonts-20240101-1.fc39.noarch     40/53 
  Verifying        : libX11-1.8.9-1.fc39.x86_64                           41/53 
  Verifying        : libX11-common-1.8.9-1.fc39.noarch                    42/53 
  Verifying        : librsvg2-2.57.1-2.fc39.x86_64                        43/53 
  Verifying        : librsvg2-tools-2.57.1-2.fc39.x86_64                  44/53 
  Verifying        : pyproject-rpm-macros-1.16.0-1.fc39.noarch            45/53 
  Verifying        : python-pip-wheel-23.2.1-2.fc39.noarch                46/53 
  Verifying        : python-rpm-macros-3.12-8.fc39.noarch                 47/53 
  Verifying        : python3-3.12.7-1.fc39.x86_64                         48/53 
  Verifying        : python3-devel-3.12.7-1.fc39.x86_64                   49/53 
  Verifying        : python3-libs-3.12.7-1.fc39.x86_64                    50/53 
  Verifying        : python3-rpm-macros-3.12-8.fc39.noarch                51/53 
  Verifying        : rsvg-pixbuf-loader-2.57.1-2.fc39.x86_64              52/53 
  Verifying        : tzdata-2024a-2.fc39.noarch                           53/53 

Installed:
  abattis-cantarell-vf-fonts-0.301-10.fc39.noarch                               
  cairo-1.18.0-1.fc39.x86_64                                                    
  cairo-gobject-1.18.0-1.fc39.x86_64                                            
  default-fonts-core-sans-4.0-9.fc39.noarch                                     
  desktop-file-utils-0.26-9.fc39.x86_64                                         
  emacs-filesystem-1:29.4-2.fc39.noarch                                         
  expat-2.6.3-1.fc39.x86_64                                                     
  fontconfig-2.14.2-6.fc39.x86_64                                               
  fonts-filesystem-1:2.0.5-12.fc39.noarch                                       
  freetype-2.13.1-2.fc39.x86_64                                                 
  fribidi-1.0.13-2.fc39.x86_64                                                  
  gdk-pixbuf2-2.42.10-5.fc39.x86_64                                             
  glib2-2.78.6-1.fc39.x86_64                                                    
  gnutls-3.8.6-1.fc39.x86_64                                                    
  google-noto-fonts-common-20240101-1.fc39.noarch                               
  google-noto-sans-vf-fonts-20240101-1.fc39.noarch                              
  graphite2-1.3.14-12.fc39.x86_64                                               
  harfbuzz-8.2.1-2.fc39.x86_64                                                  
  javapackages-filesystem-6.1.0-10.fc39.noarch                                  
  json-glib-1.8.0-1.fc39.x86_64                                                 
  libX11-1.8.9-1.fc39.x86_64                                                    
  libX11-common-1.8.9-1.fc39.noarch                                             
  libXau-1.0.11-3.fc39.x86_64                                                   
  libXext-1.3.5-3.fc39.x86_64                                                   
  libXft-2.3.8-3.fc39.x86_64                                                    
  libXrender-0.9.11-3.fc39.x86_64                                               
  libappstream-glib-0.8.2-4.fc39.x86_64                                         
  libb2-0.98.1-9.fc39.x86_64                                                    
  libdatrie-0.2.13-7.fc39.x86_64                                                
  libjpeg-turbo-2.1.4-3.fc39.x86_64                                             
  libpng-2:1.6.37-15.fc39.x86_64                                                
  librsvg2-2.57.1-2.fc39.x86_64                                                 
  librsvg2-tools-2.57.1-2.fc39.x86_64                                           
  libstemmer-2.2.0-7.fc39.x86_64                                                
  libthai-0.1.29-6.fc39.x86_64                                                  
  libxcb-1.13.1-12.fc39.x86_64                                                  
  mpdecimal-2.5.1-7.fc39.x86_64                                                 
  nettle-3.9.1-2.fc39.x86_64                                                    
  pango-1.51.0-1.fc39.x86_64                                                    
  pixman-0.42.2-2.fc39.x86_64                                                   
  pyproject-rpm-macros-1.16.0-1.fc39.noarch                                     
  python-pip-wheel-23.2.1-2.fc39.noarch                                         
  python-rpm-macros-3.12-8.fc39.noarch                                          
  python3-3.12.7-1.fc39.x86_64                                                  
  python3-devel-3.12.7-1.fc39.x86_64                                            
  python3-libs-3.12.7-1.fc39.x86_64                                             
  python3-packaging-23.1-4.fc39.noarch                                          
  python3-rpm-generators-14-7.fc39.noarch                                       
  python3-rpm-macros-3.12-8.fc39.noarch                                         
  rsvg-pixbuf-loader-2.57.1-2.fc39.x86_64                                       
  shared-mime-info-2.2-4.fc39.x86_64                                            
  tzdata-2024a-2.fc39.noarch                                                    
  xml-common-0.6.3-61.fc39.noarch                                               

Complete!
Finish: build setup for pycharm-community-2024.3-2.fc39.src.rpm
Start: rpmbuild pycharm-community-2024.3-2.fc39.src.rpm
Building target platforms: x86_64
Building for target x86_64
setting SOURCE_DATE_EPOCH=1733097600
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Rq1TD4
+ umask 022
+ cd /builddir/build/BUILD
+ cd /builddir/build/BUILD
+ rm -rf pycharm-community-2024.3
+ /usr/lib/rpm/rpmuncompress -x /builddir/build/SOURCES/pycharm-community-2024.3.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd pycharm-community-2024.3
+ rm -rf /builddir/build/BUILD/pycharm-community-2024.3-SPECPARTS
+ /usr/bin/mkdir -p /builddir/build/BUILD/pycharm-community-2024.3-SPECPARTS
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ rm -rf plugins/cwm-plugin plugins/cwm-plugin-projector plugins/marketplace plugins/space
+ '[' -z sP ']'
+ shebang_flags=-kasP
+ /usr/bin/python3 -B /usr/lib/rpm/redhat/pathfix.py -pni /usr/bin/python3 -kasP bin
recursedown('bin')
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.i4JYtQ
+ umask 022
+ cd /builddir/build/BUILD
+ '[' /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64 '!=' / ']'
+ rm -rf /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64
++ dirname /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64
+ mkdir -p /builddir/build/BUILDROOT
+ mkdir /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64
+ CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CFLAGS
+ CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CXXFLAGS
+ FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules '
+ export FFLAGS
+ FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules '
+ export FCFLAGS
+ VALAFLAGS=-g
+ export VALAFLAGS
+ RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn'
+ export RUSTFLAGS
+ LDFLAGS='-Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes '
+ export LDFLAGS
+ LT_SYS_LIBRARY_PATH=/usr/lib64:
+ export LT_SYS_LIBRARY_PATH
+ CC=gcc
+ export CC
+ CXX=g++
+ export CXX
+ cd pycharm-community-2024.3
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/java/pycharm-community
+ cp -arf ./bin ./jbr ./lib ./plugins ./build.txt ./product-info.json /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/java/pycharm-community/
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/pixmaps
+ install -m 0644 -p bin/pycharm.png /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/pixmaps/pycharm-community.png
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/scalable/apps
+ install -m 0644 -p bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/scalable/apps/pycharm-community.svg
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/16x16/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/16x16/apps
+ rsvg-convert -w 16 -h 16 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/16x16/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/16x16/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/16x16/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/22x22/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/22x22/apps
+ rsvg-convert -w 22 -h 22 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/22x22/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/22x22/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/22x22/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/24x24/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/24x24/apps
+ rsvg-convert -w 24 -h 24 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/24x24/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/24x24/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/24x24/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/32x32/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/32x32/apps
+ rsvg-convert -w 32 -h 32 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/32x32/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/32x32/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/32x32/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/48x48/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/48x48/apps
+ rsvg-convert -w 48 -h 48 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/48x48/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/48x48/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/48x48/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/64x64/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/64x64/apps
+ rsvg-convert -w 64 -h 64 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/64x64/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/64x64/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/64x64/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/128x128/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/128x128/apps
+ rsvg-convert -w 128 -h 128 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/128x128/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/128x128/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/128x128/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/256x256/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/256x256/apps
+ rsvg-convert -w 256 -h 256 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/256x256/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/256x256/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/icons/hicolor/256x256/apps/pycharm-community.png
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/metainfo
+ install -m 0644 -p /builddir/build/SOURCES/pycharm-community.metainfo.xml /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/metainfo/pycharm-community.metainfo.xml
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/bin
+ ln -s /usr/share/java/pycharm-community/bin/pycharm.sh /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/bin/pycharm-community
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/applications
+ install -m 0644 -p /builddir/build/SOURCES/pycharm-community.desktop /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/applications/pycharm-community.desktop
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/mime/packages
+ install -m 0644 -p /builddir/build/SOURCES/pycharm-community.xml /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/mime/packages/pycharm-community.xml
+ tail -n +2 /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle-2.10.0.py
# pycodestyle.py - Check Python source code formatting, according to
# PEP 8
#
# Copyright (C) 2006-2009 Johann C. Rocholl <johann@rocholl.net>
# Copyright (C) 2009-2014 Florent Xicluna <florent.xicluna@gmail.com>
# Copyright (C) 2014-2016 Ian Lee <ianlee1521@gmail.com>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
r"""
Check Python source code formatting, according to PEP 8.

For usage and a list of options, try this:
$ python pycodestyle.py -h

This program and its regression test suite live here:
https://github.com/pycqa/pycodestyle

Groups of errors and warnings:
E errors
W warnings
100 indentation
200 whitespace
300 blank lines
400 imports
500 line length
600 deprecation
700 statements
900 syntax error
"""
import bisect
import configparser
import inspect
import io
import keyword
import os
import re
import sys
import time
import tokenize
import warnings
from fnmatch import fnmatch
from functools import lru_cache
from optparse import OptionParser

# this is a performance hack.  see https://bugs.python.org/issue43014
if (
        sys.version_info < (3, 10) and
        callable(getattr(tokenize, '_compile', None))
):  # pragma: no cover (<py310)
    tokenize._compile = lru_cache()(tokenize._compile)  # type: ignore

__version__ = '2.10.0'  # patched PY-37054

DEFAULT_EXCLUDE = '.svn,CVS,.bzr,.hg,.git,__pycache__,.tox'
DEFAULT_IGNORE = 'E121,E123,E126,E226,E24,E704,W503,W504'
try:
    if sys.platform == 'win32':
        USER_CONFIG = os.path.expanduser(r'~\.pycodestyle')
    else:
        USER_CONFIG = os.path.join(
            os.getenv('XDG_CONFIG_HOME') or os.path.expanduser('~/.config'),
            'pycodestyle'
        )
except ImportError:
    USER_CONFIG = None

PROJECT_CONFIG = ('setup.cfg', 'tox.ini')
TESTSUITE_PATH = os.path.join(os.path.dirname(__file__), 'testsuite')
MAX_LINE_LENGTH = 79
# Number of blank lines between various code parts.
BLANK_LINES_CONFIG = {
    # Top level class and function.
    'top_level': 2,
    # Methods and nested class and function.
    'method': 1,
}
MAX_DOC_LENGTH = 72
INDENT_SIZE = 4
REPORT_FORMAT = {
    'default': '%(path)s:%(row)d:%(col)d: %(code)s %(text)s',
    'pylint': '%(path)s:%(row)d: [%(code)s] %(text)s',
}

PyCF_ONLY_AST = 1024
SINGLETONS = frozenset(['False', 'None', 'True'])
KEYWORDS = frozenset(keyword.kwlist + ['print', 'async']) - SINGLETONS
UNARY_OPERATORS = frozenset(['>>', '**', '*', '+', '-'])
ARITHMETIC_OP = frozenset(['**', '*', '/', '//', '+', '-', '@'])
WS_OPTIONAL_OPERATORS = ARITHMETIC_OP.union(['^', '&', '|', '<<', '>>', '%'])
ASSIGNMENT_EXPRESSION_OP = [':='] if sys.version_info >= (3, 8) else []
WS_NEEDED_OPERATORS = frozenset([
    '**=', '*=', '/=', '//=', '+=', '-=', '!=', '<>', '<', '>',
    '%=', '^=', '&=', '|=', '==', '<=', '>=', '<<=', '>>=', '=',
    'and', 'in', 'is', 'or', '->'] +
    ASSIGNMENT_EXPRESSION_OP)
WHITESPACE = frozenset(' \t\xa0')
NEWLINE = frozenset([tokenize.NL, tokenize.NEWLINE])
SKIP_TOKENS = NEWLINE.union([tokenize.INDENT, tokenize.DEDENT])
# ERRORTOKEN is triggered by backticks in Python 3
SKIP_COMMENTS = SKIP_TOKENS.union([tokenize.COMMENT, tokenize.ERRORTOKEN])
BENCHMARK_KEYS = ['directories', 'files', 'logical lines', 'physical lines']

INDENT_REGEX = re.compile(r'([ \t]*)')
ERRORCODE_REGEX = re.compile(r'\b[A-Z]\d{3}\b')
DOCSTRING_REGEX = re.compile(r'u?r?["\']')
EXTRANEOUS_WHITESPACE_REGEX = re.compile(r'[\[({][ \t]|[ \t][\]}),;:](?!=)')
WHITESPACE_AFTER_COMMA_REGEX = re.compile(r'[,;:]\s*(?:  |\t)')
COMPARE_SINGLETON_REGEX = re.compile(r'(\bNone|\bFalse|\bTrue)?\s*([=!]=)'
                                     r'\s*(?(1)|(None|False|True))\b')
COMPARE_NEGATIVE_REGEX = re.compile(r'\b(?<!is\s)(not)\s+[^][)(}{ ]+\s+'
                                    r'(in|is)\s')
COMPARE_TYPE_REGEX = re.compile(r'(?:[=!]=|is(?:\s+not)?)\s+type(?:s.\w+Type'
                                r'|\s*\(\s*([^)]*[^ )])\s*\))')
KEYWORD_REGEX = re.compile(r'(\s*)\b(?:%s)\b(\s*)' % r'|'.join(KEYWORDS))
OPERATOR_REGEX = re.compile(r'(?:[^,\s])(\s*)(?:[-+*/|!<=>%&^]+|:=)(\s*)')
LAMBDA_REGEX = re.compile(r'\blambda\b')
HUNK_REGEX = re.compile(r'^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@.*$')
STARTSWITH_DEF_REGEX = re.compile(r'^(async\s+def|def)\b')
STARTSWITH_TOP_LEVEL_REGEX = re.compile(r'^(async\s+def\s+|def\s+|class\s+|@)')
STARTSWITH_INDENT_STATEMENT_REGEX = re.compile(
    r'^\s*({})\b'.format('|'.join(s.replace(' ', r'\s+') for s in (
        'def', 'async def',
        'for', 'async for',
        'if', 'elif', 'else',
        'try', 'except', 'finally',
        'with', 'async with',
        'class',
        'while',
    )))
)
DUNDER_REGEX = re.compile(r"^__([^\s]+)__(?::\s*[a-zA-Z.0-9_\[\]\"]+)? = ")
BLANK_EXCEPT_REGEX = re.compile(r"except\s*:")

_checks = {'physical_line': {}, 'logical_line': {}, 'tree': {}}


def _get_parameters(function):
    return [parameter.name
            for parameter
            in inspect.signature(function).parameters.values()
            if parameter.kind == parameter.POSITIONAL_OR_KEYWORD]


def register_check(check, codes=None):
    """Register a new check object."""
    def _add_check(check, kind, codes, args):
        if check in _checks[kind]:
            _checks[kind][check][0].extend(codes or [])
        else:
            _checks[kind][check] = (codes or [''], args)
    if inspect.isfunction(check):
        args = _get_parameters(check)
        if args and args[0] in ('physical_line', 'logical_line'):
            if codes is None:
                codes = ERRORCODE_REGEX.findall(check.__doc__ or '')
            _add_check(check, args[0], codes, args)
    elif inspect.isclass(check):
        if _get_parameters(check.__init__)[:2] == ['self', 'tree']:
            _add_check(check, 'tree', codes, None)
    return check


########################################################################
# Plugins (check functions) for physical lines
########################################################################

@register_check
def tabs_or_spaces(physical_line, indent_char):
    r"""Never mix tabs and spaces.

    The most popular way of indenting Python is with spaces only.  The
    second-most popular way is with tabs only.  Code indented with a
    mixture of tabs and spaces should be converted to using spaces
    exclusively.  When invoking the Python command line interpreter with
    the -t option, it issues warnings about code that illegally mixes
    tabs and spaces.  When using -tt these warnings become errors.
    These options are highly recommended!

    Okay: if a == 0:\n    a = 1\n    b = 1
    E101: if a == 0:\n        a = 1\n\tb = 1
    """
    indent = INDENT_REGEX.match(physical_line).group(1)
    for offset, char in enumerate(indent):
        if char != indent_char:
            return offset, "E101 indentation contains mixed spaces and tabs"


@register_check
def tabs_obsolete(physical_line):
    r"""On new projects, spaces-only are strongly recommended over tabs.

    Okay: if True:\n    return
    W191: if True:\n\treturn
    """
    indent = INDENT_REGEX.match(physical_line).group(1)
    if '\t' in indent:
        return indent.index('\t'), "W191 indentation contains tabs"


@register_check
def trailing_whitespace(physical_line):
    r"""Trailing whitespace is superfluous.

    The warning returned varies on whether the line itself is blank,
    for easier filtering for those who want to indent their blank lines.

    Okay: spam(1)\n#
    W291: spam(1) \n#
    W293: class Foo(object):\n    \n    bang = 12
    """
    physical_line = physical_line.rstrip('\n')    # chr(10), newline
    physical_line = physical_line.rstrip('\r')    # chr(13), carriage return
    physical_line = physical_line.rstrip('\x0c')  # chr(12), form feed, ^L
    stripped = physical_line.rstrip(' \t\v')
    if physical_line != stripped:
        if stripped:
            return len(stripped), "W291 trailing whitespace"
        else:
            return 0, "W293 blank line contains whitespace"


@register_check
def trailing_blank_lines(physical_line, lines, line_number, total_lines):
    r"""Trailing blank lines are superfluous.

    Okay: spam(1)
    W391: spam(1)\n

    However the last line should end with a new line (warning W292).
    """
    if line_number == total_lines:
        stripped_last_line = physical_line.rstrip('\r\n')
        if physical_line and not stripped_last_line:
            return 0, "W391 blank line at end of file"
        if stripped_last_line == physical_line:
            return len(lines[-1]), "W292 no newline at end of file"


@register_check
def maximum_line_length(physical_line, max_line_length, multiline,
                        line_number, noqa):
    r"""Limit all lines to a maximum of 79 characters.

    There are still many devices around that are limited to 80 character
    lines; plus, limiting windows to 80 characters makes it possible to
    have several windows side-by-side.  The default wrapping on such
    devices looks ugly.  Therefore, please limit all lines to a maximum
    of 79 characters. For flowing long blocks of text (docstrings or
    comments), limiting the length to 72 characters is recommended.

    Reports error E501.
    """
    line = physical_line.rstrip()
    length = len(line)
    if length > max_line_length and not noqa:
        # Special case: ignore long shebang lines.
        if line_number == 1 and line.startswith('#!'):
            return
        # Special case for long URLs in multi-line docstrings or
        # comments, but still report the error when the 72 first chars
        # are whitespaces.
        chunks = line.split()
        if ((len(chunks) == 1 and multiline) or
            (len(chunks) == 2 and chunks[0] == '#')) and \
                len(line) - len(chunks[-1]) < max_line_length - 7:
            return
        if length > max_line_length:
            return (max_line_length, "E501 line too long "
                    "(%d > %d characters)" % (length, max_line_length))


########################################################################
# Plugins (check functions) for logical lines
########################################################################


def _is_one_liner(logical_line, indent_level, lines, line_number):
    if not STARTSWITH_TOP_LEVEL_REGEX.match(logical_line):
        return False

    line_idx = line_number - 1

    if line_idx < 1:
        prev_indent = 0
    else:
        prev_indent = expand_indent(lines[line_idx - 1])

    if prev_indent > indent_level:
        return False

    while line_idx < len(lines):
        line = lines[line_idx].strip()
        if not line.startswith('@') and STARTSWITH_TOP_LEVEL_REGEX.match(line):
            break
        else:
            line_idx += 1
    else:
        return False  # invalid syntax: EOF while searching for def/class

    next_idx = line_idx + 1
    while next_idx < len(lines):
        if lines[next_idx].strip():
            break
        else:
            next_idx += 1
    else:
        return True  # line is last in the file

    return expand_indent(lines[next_idx]) <= indent_level


@register_check
def blank_lines(logical_line, blank_lines, indent_level, line_number,
                blank_before, previous_logical,
                previous_unindented_logical_line, previous_indent_level,
                lines):
    r"""Separate top-level function and class definitions with two blank
    lines.

    Method definitions inside a class are separated by a single blank
    line.

    Extra blank lines may be used (sparingly) to separate groups of
    related functions.  Blank lines may be omitted between a bunch of
    related one-liners (e.g. a set of dummy implementations).

    Use blank lines in functions, sparingly, to indicate logical
    sections.

    Okay: def a():\n    pass\n\n\ndef b():\n    pass
    Okay: def a():\n    pass\n\n\nasync def b():\n    pass
    Okay: def a():\n    pass\n\n\n# Foo\n# Bar\n\ndef b():\n    pass
    Okay: default = 1\nfoo = 1
    Okay: classify = 1\nfoo = 1

    E301: class Foo:\n    b = 0\n    def bar():\n        pass
    E302: def a():\n    pass\n\ndef b(n):\n    pass
    E302: def a():\n    pass\n\nasync def b(n):\n    pass
    E303: def a():\n    pass\n\n\n\ndef b(n):\n    pass
    E303: def a():\n\n\n\n    pass
    E304: @decorator\n\ndef a():\n    pass
    E305: def a():\n    pass\na()
    E306: def a():\n    def b():\n        pass\n    def c():\n        pass
    """  # noqa
    top_level_lines = BLANK_LINES_CONFIG['top_level']
    method_lines = BLANK_LINES_CONFIG['method']

    if not previous_logical and blank_before < top_level_lines:
        return  # Don't expect blank lines before the first line
    if previous_logical.startswith('@'):
        if blank_lines:
            yield 0, "E304 blank lines found after function decorator"
    elif (blank_lines > top_level_lines or
            (indent_level and blank_lines == method_lines + 1)
          ):
        yield 0, "E303 too many blank lines (%d)" % blank_lines
    elif STARTSWITH_TOP_LEVEL_REGEX.match(logical_line):
        # allow a group of one-liners
        if (
            _is_one_liner(logical_line, indent_level, lines, line_number) and
            blank_before == 0
        ):
            return
        if indent_level:
            if not (blank_before == method_lines or
                    previous_indent_level < indent_level or
                    DOCSTRING_REGEX.match(previous_logical)
                    ):
                ancestor_level = indent_level
                nested = False
                # Search backwards for a def ancestor or tree root
                # (top level).
                for line in lines[line_number - top_level_lines::-1]:
                    if line.strip() and expand_indent(line) < ancestor_level:
                        ancestor_level = expand_indent(line)
                        nested = STARTSWITH_DEF_REGEX.match(line.lstrip())
                        if nested or ancestor_level == 0:
                            break
                if nested:
                    yield 0, "E306 expected %s blank line before a " \
                        "nested definition, found 0" % (method_lines,)
                else:
                    yield 0, "E301 expected {} blank line, found 0".format(
                        method_lines)
        elif blank_before != top_level_lines:
            yield 0, "E302 expected %s blank lines, found %d" % (
                top_level_lines, blank_before)
    elif (logical_line and
            not indent_level and
            blank_before != top_level_lines and
            previous_unindented_logical_line.startswith(('def ', 'class '))
          ):
        yield 0, "E305 expected %s blank lines after " \
            "class or function definition, found %d" % (
                top_level_lines, blank_before)


@register_check
def extraneous_whitespace(logical_line):
    r"""Avoid extraneous whitespace.

    Avoid extraneous whitespace in these situations:
    - Immediately inside parentheses, brackets or braces.
    - Immediately before a comma, semicolon, or colon.

    Okay: spam(ham[1], {eggs: 2})
    E201: spam( ham[1], {eggs: 2})
    E201: spam(ham[ 1], {eggs: 2})
    E201: spam(ham[1], { eggs: 2})
    E202: spam(ham[1], {eggs: 2} )
    E202: spam(ham[1 ], {eggs: 2})
    E202: spam(ham[1], {eggs: 2 })

    E203: if x == 4: print x, y; x, y = y , x
    E203: if x == 4: print x, y ; x, y = y, x
    E203: if x == 4 : print x, y; x, y = y, x
    """
    line = logical_line
    for match in EXTRANEOUS_WHITESPACE_REGEX.finditer(line):
        text = match.group()
        char = text.strip()
        found = match.start()
        if text[-1].isspace():
            # assert char in '([{'
            yield found + 1, "E201 whitespace after '%s'" % char
        elif line[found - 1] != ',':
            code = ('E202' if char in '}])' else 'E203')  # if char in ',;:'
            yield found, f"{code} whitespace before '{char}'"


@register_check
def whitespace_around_keywords(logical_line):
    r"""Avoid extraneous whitespace around keywords.

    Okay: True and False
    E271: True and  False
    E272: True  and False
    E273: True and\tFalse
    E274: True\tand False
    """
    for match in KEYWORD_REGEX.finditer(logical_line):
        before, after = match.groups()

        if '\t' in before:
            yield match.start(1), "E274 tab before keyword"
        elif len(before) > 1:
            yield match.start(1), "E272 multiple spaces before keyword"

        if '\t' in after:
            yield match.start(2), "E273 tab after keyword"
        elif len(after) > 1:
            yield match.start(2), "E271 multiple spaces after keyword"


@register_check
def missing_whitespace_after_keyword(logical_line, tokens):
    r"""Keywords should be followed by whitespace.

    Okay: from foo import (bar, baz)
    E275: from foo import(bar, baz)
    E275: from importable.module import(bar, baz)
    E275: if(foo): bar
    """
    for tok0, tok1 in zip(tokens, tokens[1:]):
        # This must exclude the True/False/None singletons, which can
        # appear e.g. as "if x is None:", and async/await, which were
        # valid identifier names in old Python versions.
        if (tok0.end == tok1.start and
                keyword.iskeyword(tok0.string) and
                tok0.string not in SINGLETONS and
                tok0.string not in ('async', 'await') and
                not (tok0.string == 'except' and tok1.string == '*') and
                not (tok0.string == 'yield' and tok1.string == ')') and
                tok1.string not in ':\n'):
            yield tok0.end, "E275 missing whitespace after keyword"


@register_check
def missing_whitespace(logical_line):
    r"""Each comma, semicolon or colon should be followed by whitespace.

    Okay: [a, b]
    Okay: (3,)
    Okay: a[3,] = 1
    Okay: a[1:4]
    Okay: a[:4]
    Okay: a[1:]
    Okay: a[1:4:2]
    E231: ['a','b']
    E231: foo(bar,baz)
    E231: [{'a':'b'}]
    """
    line = logical_line
    for index in range(len(line) - 1):
        char = line[index]
        next_char = line[index + 1]
        if char in ',;:' and next_char not in WHITESPACE:
            before = line[:index]
            if char == ':' and before.count('[') > before.count(']') and \
                    before.rfind('{') < before.rfind('['):
                continue  # Slice syntax, no space required
            if char == ',' and next_char in ')]':
                continue  # Allow tuple with only one element: (3,)
            if char == ':' and next_char == '=' and sys.version_info >= (3, 8):
                continue  # Allow assignment expression
            yield index, "E231 missing whitespace after '%s'" % char


@register_check
def indentation(logical_line, previous_logical, indent_char,
                indent_level, previous_indent_level,
                indent_size):
    r"""Use indent_size (PEP8 says 4) spaces per indentation level.

    For really old code that you don't want to mess up, you can continue
    to use 8-space tabs.

    Okay: a = 1
    Okay: if a == 0:\n    a = 1
    E111:   a = 1
    E114:   # a = 1

    Okay: for item in items:\n    pass
    E112: for item in items:\npass
    E115: for item in items:\n# Hi\n    pass

    Okay: a = 1\nb = 2
    E113: a = 1\n    b = 2
    E116: a = 1\n    # b = 2
    """
    c = 0 if logical_line else 3
    tmpl = "E11%d %s" if logical_line else "E11%d %s (comment)"
    if indent_level % indent_size:
        yield 0, tmpl % (
            1 + c,
            "indentation is not a multiple of " + str(indent_size),
        )
    indent_expect = previous_logical.endswith(':')
    if indent_expect and indent_level <= previous_indent_level:
        yield 0, tmpl % (2 + c, "expected an indented block")
    elif not indent_expect and indent_level > previous_indent_level:
        yield 0, tmpl % (3 + c, "unexpected indentation")

    if indent_expect:
        expected_indent_amount = 8 if indent_char == '\t' else 4
        expected_indent_level = previous_indent_level + expected_indent_amount
        if indent_level > expected_indent_level:
            yield 0, tmpl % (7, 'over-indented')


@register_check
def continued_indentation(logical_line, tokens, indent_level, hang_closing,
                          indent_char, indent_size, noqa, verbose):
    r"""Continuation lines indentation.

    Continuation lines should align wrapped elements either vertically
    using Python's implicit line joining inside parentheses, brackets
    and braces, or using a hanging indent.

    When using a hanging indent these considerations should be applied:
    - there should be no arguments on the first line, and
    - further indentation should be used to clearly distinguish itself
      as a continuation line.

    Okay: a = (\n)
    E123: a = (\n    )

    Okay: a = (\n    42)
    E121: a = (\n   42)
    E122: a = (\n42)
    E123: a = (\n    42\n    )
    E124: a = (24,\n     42\n)
    E125: if (\n    b):\n    pass
    E126: a = (\n        42)
    E127: a = (24,\n      42)
    E128: a = (24,\n    42)
    E129: if (a or\n    b):\n    pass
    E131: a = (\n    42\n 24)
    """
    first_row = tokens[0][2][0]
    nrows = 1 + tokens[-1][2][0] - first_row
    if noqa or nrows == 1:
        return

    # indent_next tells us whether the next block is indented; assuming
    # that it is indented by 4 spaces, then we should not allow 4-space
    # indents on the final continuation line; in turn, some other
    # indents are allowed to have an extra 4 spaces.
    indent_next = logical_line.endswith(':')

    row = depth = 0
    valid_hangs = (indent_size,) if indent_char != '\t' \
        else (indent_size, indent_size * 2)
    # remember how many brackets were opened on each line
    parens = [0] * nrows
    # relative indents of physical lines
    rel_indent = [0] * nrows
    # for each depth, collect a list of opening rows
    open_rows = [[0]]
    # for each depth, memorize the hanging indentation
    hangs = [None]
    # visual indents
    indent_chances = {}
    last_indent = tokens[0][2]
    visual_indent = None
    last_token_multiline = False
    # for each depth, memorize the visual indent column
    indent = [last_indent[1]]
    if verbose >= 3:
        print(">>> " + tokens[0][4].rstrip())

    for token_type, text, start, end, line in tokens:

        newline = row < start[0] - first_row
        if newline:
            row = start[0] - first_row
            newline = not last_token_multiline and token_type not in NEWLINE

        if newline:
            # this is the beginning of a continuation line.
            last_indent = start
            if verbose >= 3:
                print("... " + line.rstrip())

            # record the initial indent.
            rel_indent[row] = expand_indent(line) - indent_level

            # identify closing bracket
            close_bracket = (token_type == tokenize.OP and text in ']})')

            # is the indent relative to an opening bracket line?
            for open_row in reversed(open_rows[depth]):
                hang = rel_indent[row] - rel_indent[open_row]
                hanging_indent = hang in valid_hangs
                if hanging_indent:
                    break
            if hangs[depth]:
                hanging_indent = (hang == hangs[depth])
            # is there any chance of visual indent?
            visual_indent = (not close_bracket and hang > 0 and
                             indent_chances.get(start[1]))

            if close_bracket and indent[depth]:
                # closing bracket for visual indent
                if start[1] != indent[depth]:
                    yield (start, "E124 closing bracket does not match "
                           "visual indentation")
            elif close_bracket and not hang:
                # closing bracket matches indentation of opening
                # bracket's line
                if hang_closing:
                    yield start, "E133 closing bracket is missing indentation"
            elif indent[depth] and start[1] < indent[depth]:
                if visual_indent is not True:
                    # visual indent is broken
                    yield (start, "E128 continuation line "
                           "under-indented for visual indent")
            elif hanging_indent or (indent_next and
                                    rel_indent[row] == 2 * indent_size):
                # hanging indent is verified
                if close_bracket and not hang_closing:
                    yield (start, "E123 closing bracket does not match "
                           "indentation of opening bracket's line")
                hangs[depth] = hang
            elif visual_indent is True:
                # visual indent is verified
                indent[depth] = start[1]
            elif visual_indent in (text, str):
                # ignore token lined up with matching one from a
                # previous line
                pass
            else:
                # indent is broken
                if hang <= 0:
                    error = "E122", "missing indentation or outdented"
                elif indent[depth]:
                    error = "E127", "over-indented for visual indent"
                elif not close_bracket and hangs[depth]:
                    error = "E131", "unaligned for hanging indent"
                else:
                    hangs[depth] = hang
                    if hang > indent_size:
                        error = "E126", "over-indented for hanging indent"
                    else:
                        error = "E121", "under-indented for hanging indent"
                yield start, "%s continuation line %s" % error

        # look for visual indenting
        if (parens[row] and
                token_type not in (tokenize.NL, tokenize.COMMENT) and
                not indent[depth]):
            indent[depth] = start[1]
            indent_chances[start[1]] = True
            if verbose >= 4:
                print(f"bracket depth {depth} indent to {start[1]}")
        # deal with implicit string concatenation
        elif (token_type in (tokenize.STRING, tokenize.COMMENT) or
              text in ('u', 'ur', 'b', 'br')):
            indent_chances[start[1]] = str
        # visual indent after assert/raise/with
        elif not row and not depth and text in ["assert", "raise", "with"]:
            indent_chances[end[1] + 1] = True
        # special case for the "if" statement because len("if (") == 4
        elif not indent_chances and not row and not depth and text == 'if':
            indent_chances[end[1] + 1] = True
        elif text == ':' and line[end[1]:].isspace():
            open_rows[depth].append(row)

        # keep track of bracket depth
        if token_type == tokenize.OP:
            if text in '([{':
                depth += 1
                indent.append(0)
                hangs.append(None)
                if len(open_rows) == depth:
                    open_rows.append([])
                open_rows[depth].append(row)
                parens[row] += 1
                if verbose >= 4:
                    print("bracket depth %s seen, col %s, visual min = %s" %
                          (depth, start[1], indent[depth]))
            elif text in ')]}' and depth > 0:
                # parent indents should not be more than this one
                prev_indent = indent.pop() or last_indent[1]
                hangs.pop()
                for d in range(depth):
                    if indent[d] > prev_indent:
                        indent[d] = 0
                for ind in list(indent_chances):
                    if ind >= prev_indent:
                        del indent_chances[ind]
                del open_rows[depth + 1:]
                depth -= 1
                if depth:
                    indent_chances[indent[depth]] = True
                for idx in range(row, -1, -1):
                    if parens[idx]:
                        parens[idx] -= 1
                        break
            assert len(indent) == depth + 1
            if start[1] not in indent_chances:
                # allow lining up tokens
                indent_chances[start[1]] = text

        last_token_multiline = (start[0] != end[0])
        if last_token_multiline:
            rel_indent[end[0] - first_row] = rel_indent[row]

    if indent_next and expand_indent(line) == indent_level + indent_size:
        pos = (start[0], indent[0] + indent_size)
        if visual_indent:
            code = "E129 visually indented line"
        else:
            code = "E125 continuation line"
        yield pos, "%s with same indent as next logical line" % code


@register_check
def whitespace_before_parameters(logical_line, tokens):
    r"""Avoid extraneous whitespace.

    Avoid extraneous whitespace in the following situations:
    - before the open parenthesis that starts the argument list of a
      function call.
    - before the open parenthesis that starts an indexing or slicing.

    Okay: spam(1)
    E211: spam (1)

    Okay: dict['key'] = list[index]
    E211: dict ['key'] = list[index]
    E211: dict['key'] = list [index]
    """
    prev_type, prev_text, __, prev_end, __ = tokens[0]
    for index in range(1, len(tokens)):
        token_type, text, start, end, __ = tokens[index]
        if (
            token_type == tokenize.OP and
            text in '([' and
            start != prev_end and
            (prev_type == tokenize.NAME or prev_text in '}])') and
            # Syntax "class A (B):" is allowed, but avoid it
            (index < 2 or tokens[index - 2][1] != 'class') and
            # Allow "return (a.foo for a in range(5))"
            not keyword.iskeyword(prev_text) and
            # 'match' and 'case' are only soft keywords
            (
                sys.version_info < (3, 9) or
                not keyword.issoftkeyword(prev_text)
            )
        ):
            yield prev_end, "E211 whitespace before '%s'" % text
        prev_type = token_type
        prev_text = text
        prev_end = end


@register_check
def whitespace_around_operator(logical_line):
    r"""Avoid extraneous whitespace around an operator.

    Okay: a = 12 + 3
    E221: a = 4  + 5
    E222: a = 4 +  5
    E223: a = 4\t+ 5
    E224: a = 4 +\t5
    """
    for match in OPERATOR_REGEX.finditer(logical_line):
        before, after = match.groups()

        if '\t' in before:
            yield match.start(1), "E223 tab before operator"
        elif len(before) > 1:
            yield match.start(1), "E221 multiple spaces before operator"

        if '\t' in after:
            yield match.start(2), "E224 tab after operator"
        elif len(after) > 1:
            yield match.start(2), "E222 multiple spaces after operator"


@register_check
def missing_whitespace_around_operator(logical_line, tokens):
    r"""Surround operators with a single space on either side.

    - Always surround these binary operators with a single space on
      either side: assignment (=), augmented assignment (+=, -= etc.),
      comparisons (==, <, >, !=, <=, >=, in, not in, is, is not),
      Booleans (and, or, not).

    - If operators with different priorities are used, consider adding
      whitespace around the operators with the lowest priorities.

    Okay: i = i + 1
    Okay: submitted += 1
    Okay: x = x * 2 - 1
    Okay: hypot2 = x * x + y * y
    Okay: c = (a + b) * (a - b)
    Okay: foo(bar, key='word', *args, **kwargs)
    Okay: alpha[:-i]

    E225: i=i+1
    E225: submitted +=1
    E225: x = x /2 - 1
    E225: z = x **y
    E225: z = 1and 1
    E226: c = (a+b) * (a-b)
    E226: hypot2 = x*x + y*y
    E227: c = a|b
    E228: msg = fmt%(errno, errmsg)
    """
    parens = 0
    need_space = False
    prev_type = tokenize.OP
    prev_text = prev_end = None
    operator_types = (tokenize.OP, tokenize.NAME)
    for token_type, text, start, end, line in tokens:
        if token_type in SKIP_COMMENTS:
            continue
        if text in ('(', 'lambda'):
            parens += 1
        elif text == ')':
            parens -= 1
        if need_space:
            if start != prev_end:
                # Found a (probably) needed space
                if need_space is not True and not need_space[1]:
                    yield (need_space[0],
                           "E225 missing whitespace around operator")
                need_space = False
            elif text == '>' and prev_text in ('<', '-'):
                # Tolerate the "<>" operator, even if running Python 3
                # Deal with Python 3's annotated return value "->"
                pass
            elif (
                    # def f(a, /, b):
                    #           ^
                    # def f(a, b, /):
                    #              ^
                    # f = lambda a, /:
                    #                ^
                    prev_text == '/' and text in {',', ')', ':'} or
                    # def f(a, b, /):
                    #               ^
                    prev_text == ')' and text == ':'
            ):
                # Tolerate the "/" operator in function definition
                # For more info see PEP570
                pass
            else:
                if need_space is True or need_space[1]:
                    # A needed trailing space was not found
                    yield prev_end, "E225 missing whitespace around operator"
                elif prev_text != '**':
                    code, optype = 'E226', 'arithmetic'
                    if prev_text == '%':
                        code, optype = 'E228', 'modulo'
                    elif prev_text not in ARITHMETIC_OP:
                        code, optype = 'E227', 'bitwise or shift'
                    yield (need_space[0], "%s missing whitespace "
                           "around %s operator" % (code, optype))
                need_space = False
        elif token_type in operator_types and prev_end is not None:
            if text == '=' and parens:
                # Allow keyword args or defaults: foo(bar=None).
                pass
            elif text in WS_NEEDED_OPERATORS:
                need_space = True
            elif text in UNARY_OPERATORS:
                # Check if the operator is used as a binary operator
                # Allow unary operators: -123, -x, +1.
                # Allow argument unpacking: foo(*args, **kwargs).
                if prev_type == tokenize.OP and prev_text in '}])' or (
                    prev_type != tokenize.OP and
                    prev_text not in KEYWORDS and (
                        sys.version_info < (3, 9) or
                        not keyword.issoftkeyword(prev_text)
                    )
                ):
                    need_space = None
            elif text in WS_OPTIONAL_OPERATORS:
                need_space = None

            if need_space is None:
                # Surrounding space is optional, but ensure that
                # trailing space matches opening space
                need_space = (prev_end, start != prev_end)
            elif need_space and start == prev_end:
                # A needed opening space was not found
                yield prev_end, "E225 missing whitespace around operator"
                need_space = False
        prev_type = token_type
        prev_text = text
        prev_end = end


@register_check
def whitespace_around_comma(logical_line):
    r"""Avoid extraneous whitespace after a comma or a colon.

    Note: these checks are disabled by default

    Okay: a = (1, 2)
    E241: a = (1,  2)
    E242: a = (1,\t2)
    """
    line = logical_line
    for m in WHITESPACE_AFTER_COMMA_REGEX.finditer(line):
        found = m.start() + 1
        if '\t' in m.group():
            yield found, "E242 tab after '%s'" % m.group()[0]
        else:
            yield found, "E241 multiple spaces after '%s'" % m.group()[0]


@register_check
def whitespace_around_named_parameter_equals(logical_line, tokens):
    r"""Don't use spaces around the '=' sign in function arguments.

    Don't use spaces around the '=' sign when used to indicate a
    keyword argument or a default parameter value, except when
    using a type annotation.

    Okay: def complex(real, imag=0.0):
    Okay: return magic(r=real, i=imag)
    Okay: boolean(a == b)
    Okay: boolean(a != b)
    Okay: boolean(a <= b)
    Okay: boolean(a >= b)
    Okay: def foo(arg: int = 42):
    Okay: async def foo(arg: int = 42):

    E251: def complex(real, imag = 0.0):
    E251: return magic(r = real, i = imag)
    E252: def complex(real, image: float=0.0):
    """
    parens = 0
    no_space = False
    require_space = False
    prev_end = None
    annotated_func_arg = False
    in_def = bool(STARTSWITH_DEF_REGEX.match(logical_line))

    message = "E251 unexpected spaces around keyword / parameter equals"
    missing_message = "E252 missing whitespace around parameter equals"

    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.NL:
            continue
        if no_space:
            no_space = False
            if start != prev_end:
                yield (prev_end, message)
        if require_space:
            require_space = False
            if start == prev_end:
                yield (prev_end, missing_message)
        if token_type == tokenize.OP:
            if text in '([':
                parens += 1
            elif text in ')]':
                parens -= 1
            elif in_def and text == ':' and parens == 1:
                annotated_func_arg = True
            elif parens == 1 and text == ',':
                annotated_func_arg = False
            elif parens and text == '=':
                if annotated_func_arg and parens == 1:
                    require_space = True
                    if start == prev_end:
                        yield (prev_end, missing_message)
                else:
                    no_space = True
                    if start != prev_end:
                        yield (prev_end, message)
            if not parens:
                annotated_func_arg = False

        prev_end = end


@register_check
def whitespace_before_comment(logical_line, tokens):
    """Separate inline comments by at least two spaces.

    An inline comment is a comment on the same line as a statement.
    Inline comments should be separated by at least two spaces from the
    statement. They should start with a # and a single space.

    Each line of a block comment starts with a # and one or multiple
    spaces as there can be indented text inside the comment.

    Okay: x = x + 1  # Increment x
    Okay: x = x + 1    # Increment x
    Okay: # Block comments:
    Okay: #  - Block comment list
    Okay: # \xa0- Block comment list
    E261: x = x + 1 # Increment x
    E262: x = x + 1  #Increment x
    E262: x = x + 1  #  Increment x
    E262: x = x + 1  # \xa0Increment x
    E265: #Block comment
    E266: ### Block comment
    """
    prev_end = (0, 0)
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            inline_comment = line[:start[1]].strip()
            if inline_comment:
                if prev_end[0] == start[0] and start[1] < prev_end[1] + 2:
                    yield (prev_end,
                           "E261 at least two spaces before inline comment")
            symbol, sp, comment = text.partition(' ')
            bad_prefix = symbol not in '#:' and (symbol.lstrip('#')[:1] or '#')
            if inline_comment:
                if bad_prefix or comment[:1] in WHITESPACE:
                    yield start, "E262 inline comment should start with '# '"
            elif bad_prefix and (bad_prefix != '!' or start[0] > 1):
                if bad_prefix != '#':
                    yield start, "E265 block comment should start with '# '"
                elif comment:
                    yield start, "E266 too many leading '#' for block comment"
        elif token_type != tokenize.NL:
            prev_end = end


@register_check
def imports_on_separate_lines(logical_line):
    r"""Place imports on separate lines.

    Okay: import os\nimport sys
    E401: import sys, os

    Okay: from subprocess import Popen, PIPE
    Okay: from myclas import MyClass
    Okay: from foo.bar.yourclass import YourClass
    Okay: import myclass
    Okay: import foo.bar.yourclass
    """
    line = logical_line
    if line.startswith('import '):
        found = line.find(',')
        if -1 < found and ';' not in line[:found]:
            yield found, "E401 multiple imports on one line"


@register_check
def module_imports_on_top_of_file(
        logical_line, indent_level, checker_state, noqa):
    r"""Place imports at the top of the file.

    Always put imports at the top of the file, just after any module
    comments and docstrings, and before module globals and constants.

    Okay: import os
    Okay: # this is a comment\nimport os
    Okay: '''this is a module docstring'''\nimport os
    Okay: r'''this is a module docstring'''\nimport os
    Okay:
    try:\n\timport x\nexcept ImportError:\n\tpass\nelse:\n\tpass\nimport y
    Okay:
    try:\n\timport x\nexcept ImportError:\n\tpass\nfinally:\n\tpass\nimport y
    E402: a=1\nimport os
    E402: 'One string'\n"Two string"\nimport os
    E402: a=1\nfrom sys import x

    Okay: if x:\n    import os
    """  # noqa
    def is_string_literal(line):
        if line[0] in 'uUbB':
            line = line[1:]
        if line and line[0] in 'rR':
            line = line[1:]
        return line and (line[0] == '"' or line[0] == "'")

    allowed_keywords = (
        'try', 'except', 'else', 'finally', 'with', 'if', 'elif')

    if indent_level:  # Allow imports in conditional statement/function
        return
    if not logical_line:  # Allow empty lines or comments
        return
    if noqa:
        return
    line = logical_line
    if line.startswith('import ') or line.startswith('from '):
        if checker_state.get('seen_non_imports', False):
            yield 0, "E402 module level import not at top of file"
    elif re.match(DUNDER_REGEX, line):
        return
    elif any(line.startswith(kw) for kw in allowed_keywords):
        # Allow certain keywords intermixed with imports in order to
        # support conditional or filtered importing
        return
    elif is_string_literal(line):
        # The first literal is a docstring, allow it. Otherwise, report
        # error.
        if checker_state.get('seen_docstring', False):
            checker_state['seen_non_imports'] = True
        else:
            checker_state['seen_docstring'] = True
    else:
        checker_state['seen_non_imports'] = True


@register_check
def compound_statements(logical_line):
    r"""Compound statements (on the same line) are generally
    discouraged.

    While sometimes it's okay to put an if/for/while with a small body
    on the same line, never do this for multi-clause statements.
    Also avoid folding such long lines!

    Always use a def statement instead of an assignment statement that
    binds a lambda expression directly to a name.

    Okay: if foo == 'blah':\n    do_blah_thing()
    Okay: do_one()
    Okay: do_two()
    Okay: do_three()

    E701: if foo == 'blah': do_blah_thing()
    E701: for x in lst: total += x
    E701: while t < 10: t = delay()
    E701: if foo == 'blah': do_blah_thing()
    E701: else: do_non_blah_thing()
    E701: try: something()
    E701: finally: cleanup()
    E701: if foo == 'blah': one(); two(); three()
    E702: do_one(); do_two(); do_three()
    E703: do_four();  # useless semicolon
    E704: def f(x): return 2*x
    E731: f = lambda x: 2*x
    """
    line = logical_line
    last_char = len(line) - 1
    found = line.find(':')
    prev_found = 0
    counts = {char: 0 for char in '{}[]()'}
    while -1 < found < last_char:
        update_counts(line[prev_found:found], counts)
        if ((counts['{'] <= counts['}'] and   # {'a': 1} (dict)
             counts['['] <= counts[']'] and   # [1:2] (slice)
             counts['('] <= counts[')']) and  # (annotation)
            not (sys.version_info >= (3, 8) and
                 line[found + 1] == '=')):  # assignment expression
            lambda_kw = LAMBDA_REGEX.search(line, 0, found)
            if lambda_kw:
                before = line[:lambda_kw.start()].rstrip()
                if before[-1:] == '=' and before[:-1].strip().isidentifier():
                    yield 0, ("E731 do not assign a lambda expression, use a "
                              "def")
                break
            if STARTSWITH_DEF_REGEX.match(line):
                yield 0, "E704 multiple statements on one line (def)"
            elif STARTSWITH_INDENT_STATEMENT_REGEX.match(line):
                yield found, "E701 multiple statements on one line (colon)"
        prev_found = found
        found = line.find(':', found + 1)
    found = line.find(';')
    while -1 < found:
        if found < last_char:
            yield found, "E702 multiple statements on one line (semicolon)"
        else:
            yield found, "E703 statement ends with a semicolon"
        found = line.find(';', found + 1)


@register_check
def explicit_line_join(logical_line, tokens):
    r"""Avoid explicit line join between brackets.

    The preferred way of wrapping long lines is by using Python's
    implied line continuation inside parentheses, brackets and braces.
    Long lines can be broken over multiple lines by wrapping expressions
    in parentheses.  These should be used in preference to using a
    backslash for line continuation.

    E502: aaa = [123, \\n       123]
    E502: aaa = ("bbb " \\n       "ccc")

    Okay: aaa = [123,\n       123]
    Okay: aaa = ("bbb "\n       "ccc")
    Okay: aaa = "bbb " \\n    "ccc"
    Okay: aaa = 123  # \\
    """
    prev_start = prev_end = parens = 0
    comment = False
    backslash = None
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            comment = True
        if start[0] != prev_start and parens and backslash and not comment:
            yield backslash, "E502 the backslash is redundant between brackets"
        if end[0] != prev_end:
            if line.rstrip('\r\n').endswith('\\'):
                backslash = (end[0], len(line.splitlines()[-1]) - 1)
            else:
                backslash = None
            prev_start = prev_end = end[0]
        else:
            prev_start = start[0]
        if token_type == tokenize.OP:
            if text in '([{':
                parens += 1
            elif text in ')]}':
                parens -= 1


# The % character is strictly speaking a binary operator, but the
# common usage seems to be to put it next to the format parameters,
# after a line break.
_SYMBOLIC_OPS = frozenset("()[]{},:.;@=%~") | frozenset(("...",))


def _is_binary_operator(token_type, text):
    return (
        token_type == tokenize.OP or
        text in {'and', 'or'}
    ) and (
        text not in _SYMBOLIC_OPS
    )


def _break_around_binary_operators(tokens):
    """Private function to reduce duplication.

    This factors out the shared details between
    :func:`break_before_binary_operator` and
    :func:`break_after_binary_operator`.
    """
    line_break = False
    unary_context = True
    # Previous non-newline token types and text
    previous_token_type = None
    previous_text = None
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            continue
        if ('\n' in text or '\r' in text) and token_type != tokenize.STRING:
            line_break = True
        else:
            yield (token_type, text, previous_token_type, previous_text,
                   line_break, unary_context, start)
            unary_context = text in '([{,;'
            line_break = False
            previous_token_type = token_type
            previous_text = text


@register_check
def break_before_binary_operator(logical_line, tokens):
    r"""
    Avoid breaks before binary operators.

    The preferred place to break around a binary operator is after the
    operator, not before it.

    W503: (width == 0\n + height == 0)
    W503: (width == 0\n and height == 0)
    W503: var = (1\n       & ~2)
    W503: var = (1\n       / -2)
    W503: var = (1\n       + -1\n       + -2)

    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)
    """
    for context in _break_around_binary_operators(tokens):
        (token_type, text, previous_token_type, previous_text,
         line_break, unary_context, start) = context
        if (_is_binary_operator(token_type, text) and line_break and
                not unary_context and
                not _is_binary_operator(previous_token_type,
                                        previous_text)):
            yield start, "W503 line break before binary operator"


@register_check
def break_after_binary_operator(logical_line, tokens):
    r"""
    Avoid breaks after binary operators.

    The preferred place to break around a binary operator is before the
    operator, not after it.

    W504: (width == 0 +\n height == 0)
    W504: (width == 0 and\n height == 0)
    W504: var = (1 &\n       ~2)

    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: x = '' + '''\n'''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)

    The following should be W504 but unary_context is tricky with these
    Okay: var = (1 /\n       -2)
    Okay: var = (1 +\n       -1 +\n       -2)
    """
    prev_start = None
    for context in _break_around_binary_operators(tokens):
        (token_type, text, previous_token_type, previous_text,
         line_break, unary_context, start) = context
        if (_is_binary_operator(previous_token_type, previous_text) and
                line_break and
                not unary_context and
                not _is_binary_operator(token_type, text)):
            yield prev_start, "W504 line break after binary operator"
        prev_start = start


@register_check
def comparison_to_singleton(logical_line, noqa):
    r"""Comparison to singletons should use "is" or "is not".

    Comparisons to singletons like None should always be done
    with "is" or "is not", never the equality operators.

    Okay: if arg is not None:
    E711: if arg != None:
    E711: if None == arg:
    E712: if arg == True:
    E712: if False == arg:

    Also, beware of writing if x when you really mean if x is not None
    -- e.g. when testing whether a variable or argument that defaults to
    None was set to some other value.  The other value might have a type
    (such as a container) that could be false in a boolean context!
    """
    if noqa:
        return

    for match in COMPARE_SINGLETON_REGEX.finditer(logical_line):
        singleton = match.group(1) or match.group(3)
        same = (match.group(2) == '==')

        msg = "'if cond is %s:'" % (('' if same else 'not ') + singleton)
        if singleton in ('None',):
            code = 'E711'
        else:
            code = 'E712'
            nonzero = ((singleton == 'True' and same) or
                       (singleton == 'False' and not same))
            msg += " or 'if %scond:'" % ('' if nonzero else 'not ')
        yield match.start(2), ("%s comparison to %s should be %s" %
                               (code, singleton, msg))


@register_check
def comparison_negative(logical_line):
    r"""Negative comparison should be done using "not in" and "is not".

    Okay: if x not in y:\n    pass
    Okay: assert (X in Y or X is Z)
    Okay: if not (X in Y):\n    pass
    Okay: zz = x is not y
    E713: Z = not X in Y
    E713: if not X.B in Y:\n    pass
    E714: if not X is Y:\n    pass
    E714: Z = not X.B is Y
    """
    match = COMPARE_NEGATIVE_REGEX.search(logical_line)
    if match:
        pos = match.start(1)
        if match.group(2) == 'in':
            yield pos, "E713 test for membership should be 'not in'"
        else:
            yield pos, "E714 test for object identity should be 'is not'"


@register_check
def comparison_type(logical_line, noqa):
    r"""Object type comparisons should always use isinstance().

    Do not compare types directly.

    Okay: if isinstance(obj, int):
    E721: if type(obj) is type(1):

    When checking if an object is a string, keep in mind that it might
    be a unicode string too! In Python 2.3, str and unicode have a
    common base class, basestring, so you can do:

    Okay: if isinstance(obj, basestring):
    Okay: if type(a1) is type(b1):
    """
    match = COMPARE_TYPE_REGEX.search(logical_line)
    if match and not noqa:
        inst = match.group(1)
        if inst and inst.isidentifier() and inst not in SINGLETONS:
            return  # Allow comparison for types which are not obvious
        yield match.start(), "E721 do not compare types, use 'isinstance()'"


@register_check
def bare_except(logical_line, noqa):
    r"""When catching exceptions, mention specific exceptions when
    possible.

    Okay: except Exception:
    Okay: except BaseException:
    E722: except:
    """
    if noqa:
        return

    match = BLANK_EXCEPT_REGEX.match(logical_line)
    if match:
        yield match.start(), "E722 do not use bare 'except'"


@register_check
def ambiguous_identifier(logical_line, tokens):
    r"""Never use the characters 'l', 'O', or 'I' as variable names.

    In some fonts, these characters are indistinguishable from the
    numerals one and zero. When tempted to use 'l', use 'L' instead.

    Okay: L = 0
    Okay: o = 123
    Okay: i = 42
    E741: l = 0
    E741: O = 123
    E741: I = 42

    Variables can be bound in several other contexts, including class
    and function definitions, lambda functions, 'global' and 'nonlocal'
    statements, exception handlers, and 'with' and 'for' statements.
    In addition, we have a special handling for function parameters.

    Okay: except AttributeError as o:
    Okay: with lock as L:
    Okay: foo(l=12)
    Okay: foo(l=I)
    Okay: for a in foo(l=12):
    Okay: lambda arg: arg * l
    Okay: lambda a=l[I:5]: None
    Okay: lambda x=a.I: None
    Okay: if l >= 12:
    E741: except AttributeError as O:
    E741: with lock as l:
    E741: global I
    E741: nonlocal l
    E741: def foo(l):
    E741: def foo(l=12):
    E741: l = foo(l=12)
    E741: for l in range(10):
    E741: [l for l in lines if l]
    E741: lambda l: None
    E741: lambda a=x[1:5], l: None
    E741: lambda **l:
    E741: def f(**l):
    E742: class I(object):
    E743: def l(x):
    """
    func_depth = None  # set to brace depth if 'def' or 'lambda' is found
    seen_colon = False  # set to true if we're done with function parameters
    brace_depth = 0
    idents_to_avoid = ('l', 'O', 'I')
    prev_type, prev_text, prev_start, prev_end, __ = tokens[0]
    for index in range(1, len(tokens)):
        token_type, text, start, end, line = tokens[index]
        ident = pos = None
        # find function definitions
        if prev_text in {'def', 'lambda'}:
            func_depth = brace_depth
            seen_colon = False
        elif (
                func_depth is not None and
                text == ':' and
                brace_depth == func_depth
        ):
            seen_colon = True
        # update parameter parentheses level
        if text in '([{':
            brace_depth += 1
        elif text in ')]}':
            brace_depth -= 1
        # identifiers on the lhs of an assignment operator
        if text == ':=' or (text == '=' and brace_depth == 0):
            if prev_text in idents_to_avoid:
                ident = prev_text
                pos = prev_start
        # identifiers bound to values with 'as', 'for',
        # 'global', or 'nonlocal'
        if prev_text in ('as', 'for', 'global', 'nonlocal'):
            if text in idents_to_avoid:
                ident = text
                pos = start
        # function / lambda parameter definitions
        if (
                func_depth is not None and
                not seen_colon and
                index < len(tokens) - 1 and tokens[index + 1][1] in ':,=)' and
                prev_text in {'lambda', ',', '*', '**', '('} and
                text in idents_to_avoid
        ):
            ident = text
            pos = start
        if prev_text == 'class':
            if text in idents_to_avoid:
                yield start, "E742 ambiguous class definition '%s'" % text
        if prev_text == 'def':
            if text in idents_to_avoid:
                yield start, "E743 ambiguous function definition '%s'" % text
        if ident:
            yield pos, "E741 ambiguous variable name '%s'" % ident
        prev_text = text
        prev_start = start


@register_check
def python_3000_invalid_escape_sequence(logical_line, tokens, noqa):
    r"""Invalid escape sequences are deprecated in Python 3.6.

    Okay: regex = r'\.png$'
    W605: regex = '\.png$'
    """
    if noqa:
        return

    # https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals
    valid = [
        '\n',
        '\\',
        '\'',
        '"',
        'a',
        'b',
        'f',
        'n',
        'r',
        't',
        'v',
        '0', '1', '2', '3', '4', '5', '6', '7',
        'x',

        # Escape sequences only recognized in string literals
        'N',
        'u',
        'U',
    ]

    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.STRING:
            start_line, start_col = start
            quote = text[-3:] if text[-3:] in ('"""', "'''") else text[-1]
            # Extract string modifiers (e.g. u or r)
            quote_pos = text.index(quote)
            prefix = text[:quote_pos].lower()
            start = quote_pos + len(quote)
            string = text[start:-len(quote)]

            if 'r' not in prefix:
                pos = string.find('\\')
                while pos >= 0:
                    pos += 1
                    if string[pos] not in valid:
                        line = start_line + string.count('\n', 0, pos)
                        if line == start_line:
                            col = start_col + len(prefix) + len(quote) + pos
                        else:
                            col = pos - string.rfind('\n', 0, pos) - 1
                        yield (
                            (line, col - 1),
                            "W605 invalid escape sequence '\\%s'" %
                            string[pos],
                        )
                    pos = string.find('\\', pos + 1)


@register_check
def python_3000_async_await_keywords(logical_line, tokens):
    """'async' and 'await' are reserved keywords starting at Python 3.7.

    W606: async = 42
    W606: await = 42
    Okay: async def read(db):\n    data = await db.fetch('SELECT ...')
    """
    # The Python tokenize library before Python 3.5 recognizes
    # async/await as a NAME token. Therefore, use a state machine to
    # look for the possible async/await constructs as defined by the
    # Python grammar:
    # https://docs.python.org/3/reference/grammar.html

    state = None
    for token_type, text, start, end, line in tokens:
        error = False

        if token_type == tokenize.NL:
            continue

        if state is None:
            if token_type == tokenize.NAME:
                if text == 'async':
                    state = ('async_stmt', start)
                elif text == 'await':
                    state = ('await', start)
                elif (token_type == tokenize.NAME and
                      text in ('def', 'for')):
                    state = ('define', start)

        elif state[0] == 'async_stmt':
            if token_type == tokenize.NAME and text in ('def', 'with', 'for'):
                # One of funcdef, with_stmt, or for_stmt. Return to
                # looking for async/await names.
                state = None
            else:
                error = True
        elif state[0] == 'await':
            if token_type == tokenize.NAME:
                # An await expression. Return to looking for async/await
                # names.
                state = None
            elif token_type == tokenize.OP and text == '(':
                state = None
            else:
                error = True
        elif state[0] == 'define':
            if token_type == tokenize.NAME and text in ('async', 'await'):
                error = True
            else:
                state = None

        if error:
            yield (
                state[1],
                "W606 'async' and 'await' are reserved keywords starting with "
                "Python 3.7",
            )
            state = None

    # Last token
    if state is not None:
        yield (
            state[1],
            "W606 'async' and 'await' are reserved keywords starting with "
            "Python 3.7",
        )


########################################################################
@register_check
def maximum_doc_length(logical_line, max_doc_length, noqa, tokens):
    r"""Limit all doc lines to a maximum of 72 characters.

    For flowing long blocks of text (docstrings or comments), limiting
    the length to 72 characters is recommended.

    Reports warning W505
    """
    if max_doc_length is None or noqa:
        return

    prev_token = None
    skip_lines = set()
    # Skip lines that
    for token_type, text, start, end, line in tokens:
        if token_type not in SKIP_COMMENTS.union([tokenize.STRING]):
            skip_lines.add(line)

    for token_type, text, start, end, line in tokens:
        # Skip lines that aren't pure strings
        if token_type == tokenize.STRING and skip_lines:
            continue
        if token_type in (tokenize.STRING, tokenize.COMMENT):
            # Only check comment-only lines
            if prev_token is None or prev_token in SKIP_TOKENS:
                lines = line.splitlines()
                for line_num, physical_line in enumerate(lines):
                    if start[0] + line_num == 1 and line.startswith('#!'):
                        return
                    length = len(physical_line)
                    chunks = physical_line.split()
                    if token_type == tokenize.COMMENT:
                        if (len(chunks) == 2 and
                                length - len(chunks[-1]) < MAX_DOC_LENGTH):
                            continue
                    if len(chunks) == 1 and line_num + 1 < len(lines):
                        if (len(chunks) == 1 and
                                length - len(chunks[-1]) < MAX_DOC_LENGTH):
                            continue
                    if length > max_doc_length:
                        doc_error = (start[0] + line_num, max_doc_length)
                        yield (doc_error, "W505 doc line too long "
                                          "(%d > %d characters)"
                               % (length, max_doc_length))
        prev_token = token_type


########################################################################
# Helper functions
########################################################################


def readlines(filename):
    """Read the source code."""
    try:
        with tokenize.open(filename) as f:
            return f.readlines()
    except (LookupError, SyntaxError, UnicodeError):
        # Fall back if file encoding is improperly declared
        with open(filename, encoding='latin-1') as f:
            return f.readlines()


def stdin_get_value():
    """Read the value from stdin."""
    return io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='ignore').read()


noqa = lru_cache(512)(re.compile(r'# no(?:qa|pep8)\b', re.I).search)


def expand_indent(line):
    r"""Return the amount of indentation.

    Tabs are expanded to the next multiple of 8.

    >>> expand_indent('    ')
    4
    >>> expand_indent('\t')
    8
    >>> expand_indent('       \t')
    8
    >>> expand_indent('        \t')
    16
    """
    line = line.rstrip('\n\r')
    if '\t' not in line:
        return len(line) - len(line.lstrip())
    result = 0
    for char in line:
        if char == '\t':
            result = result // 8 * 8 + 8
        elif char == ' ':
            result += 1
        else:
            break
    return result


def mute_string(text):
    """Replace contents with 'xxx' to prevent syntax matching.

    >>> mute_string('"abc"')
    '"xxx"'
    >>> mute_string("'''abc'''")
    "'''xxx'''"
    >>> mute_string("r'abc'")
    "r'xxx'"
    """
    # String modifiers (e.g. u or r)
    start = text.index(text[-1]) + 1
    end = len(text) - 1
    # Triple quotes
    if text[-3:] in ('"""', "'''"):
        start += 2
        end -= 2
    return text[:start] + 'x' * (end - start) + text[end:]


def parse_udiff(diff, patterns=None, parent='.'):
    """Return a dictionary of matching lines."""
    # For each file of the diff, the entry key is the filename,
    # and the value is a set of row numbers to consider.
    rv = {}
    path = nrows = None
    for line in diff.splitlines():
        if nrows:
            if line[:1] != '-':
                nrows -= 1
            continue
        if line[:3] == '@@ ':
            hunk_match = HUNK_REGEX.match(line)
            (row, nrows) = (int(g or '1') for g in hunk_match.groups())
            rv[path].update(range(row, row + nrows))
        elif line[:3] == '+++':
            path = line[4:].split('\t', 1)[0]
            # Git diff will use (i)ndex, (w)ork tree, (c)ommit and
            # (o)bject instead of a/b/c/d as prefixes for patches
            if path[:2] in ('b/', 'w/', 'i/'):
                path = path[2:]
            rv[path] = set()
    return {
        os.path.join(parent, filepath): rows
        for (filepath, rows) in rv.items()
        if rows and filename_match(filepath, patterns)
    }


def normalize_paths(value, parent=os.curdir):
    """Parse a comma-separated list of paths.

    Return a list of absolute paths.
    """
    if not value:
        return []
    if isinstance(value, list):
        return value
    paths = []
    for path in value.split(','):
        path = path.strip()
        if '/' in path:
            path = os.path.abspath(os.path.join(parent, path))
        paths.append(path.rstrip('/'))
    return paths


def filename_match(filename, patterns, default=True):
    """Check if patterns contains a pattern that matches filename.

    If patterns is unspecified, this always returns True.
    """
    if not patterns:
        return default
    return any(fnmatch(filename, pattern) for pattern in patterns)


def update_counts(s, counts):
    r"""Adds one to the counts of each appearance of characters in s,
        for characters in counts"""
    for char in s:
        if char in counts:
            counts[char] += 1


def _is_eol_token(token):
    return token[0] in NEWLINE or token[4][token[3][1]:].lstrip() == '\\\n'


########################################################################
# Framework to run all checks
########################################################################


class Checker:
    """Load a Python source file, tokenize it, check coding style."""

    def __init__(self, filename=None, lines=None,
                 options=None, report=None, **kwargs):
        if options is None:
            options = StyleGuide(kwargs).options
        else:
            assert not kwargs
        self._io_error = None
        self._physical_checks = options.physical_checks
        self._logical_checks = options.logical_checks
        self._ast_checks = options.ast_checks
        self.max_line_length = options.max_line_length
        self.max_doc_length = options.max_doc_length
        self.indent_size = options.indent_size
        self.multiline = False  # in a multiline string?
        self.hang_closing = options.hang_closing
        self.indent_size = options.indent_size
        self.verbose = options.verbose
        self.filename = filename
        # Dictionary where a checker can store its custom state.
        self._checker_states = {}
        if filename is None:
            self.filename = 'stdin'
            self.lines = lines or []
        elif filename == '-':
            self.filename = 'stdin'
            self.lines = stdin_get_value().splitlines(True)
        elif lines is None:
            try:
                self.lines = readlines(filename)
            except OSError:
                (exc_type, exc) = sys.exc_info()[:2]
                self._io_error = f'{exc_type.__name__}: {exc}'
                self.lines = []
        else:
            self.lines = lines
        if self.lines:
            ord0 = ord(self.lines[0][0])
            if ord0 in (0xef, 0xfeff):  # Strip the UTF-8 BOM
                if ord0 == 0xfeff:
                    self.lines[0] = self.lines[0][1:]
                elif self.lines[0][:3] == '\xef\xbb\xbf':
                    self.lines[0] = self.lines[0][3:]
        self.report = report or options.report
        self.report_error = self.report.error
        self.noqa = False

    def report_invalid_syntax(self):
        """Check if the syntax is valid."""
        (exc_type, exc) = sys.exc_info()[:2]
        if len(exc.args) > 1:
            offset = exc.args[1]
            if len(offset) > 2:
                offset = offset[1:3]
        else:
            offset = (1, 0)
        self.report_error(offset[0], offset[1] or 0,
                          f'E901 {exc_type.__name__}: {exc.args[0]}',
                          self.report_invalid_syntax)

    def readline(self):
        """Get the next line from the input buffer."""
        if self.line_number >= self.total_lines:
            return ''
        line = self.lines[self.line_number]
        self.line_number += 1
        if self.indent_char is None and line[:1] in WHITESPACE:
            self.indent_char = line[0]
        return line

    def run_check(self, check, argument_names):
        """Run a check plugin."""
        arguments = []
        for name in argument_names:
            arguments.append(getattr(self, name))
        return check(*arguments)

    def init_checker_state(self, name, argument_names):
        """Prepare custom state for the specific checker plugin."""
        if 'checker_state' in argument_names:
            self.checker_state = self._checker_states.setdefault(name, {})

    def check_physical(self, line):
        """Run all physical checks on a raw input line."""
        self.physical_line = line
        for name, check, argument_names in self._physical_checks:
            self.init_checker_state(name, argument_names)
            result = self.run_check(check, argument_names)
            if result is not None:
                (offset, text) = result
                self.report_error(self.line_number, offset, text, check)
                if text[:4] == 'E101':
                    self.indent_char = line[0]

    def build_tokens_line(self):
        """Build a logical line from tokens."""
        logical = []
        comments = []
        length = 0
        prev_row = prev_col = mapping = None
        for token_type, text, start, end, line in self.tokens:
            if token_type in SKIP_TOKENS:
                continue
            if not mapping:
                mapping = [(0, start)]
            if token_type == tokenize.COMMENT:
                comments.append(text)
                continue
            if token_type == tokenize.STRING:
                text = mute_string(text)
            if prev_row:
                (start_row, start_col) = start
                if prev_row != start_row:    # different row
                    prev_text = self.lines[prev_row - 1][prev_col - 1]
                    if prev_text == ',' or (prev_text not in '{[(' and
                                            text not in '}])'):
                        text = ' ' + text
                elif prev_col != start_col:  # different column
                    text = line[prev_col:start_col] + text
            logical.append(text)
            length += len(text)
            mapping.append((length, end))
            (prev_row, prev_col) = end
        self.logical_line = ''.join(logical)
        self.noqa = comments and noqa(''.join(comments))
        return mapping

    def check_logical(self):
        """Build a line from tokens and run all logical checks on it."""
        self.report.increment_logical_line()
        mapping = self.build_tokens_line()
        if not mapping:
            return

        mapping_offsets = [offset for offset, _ in mapping]
        (start_row, start_col) = mapping[0][1]
        start_line = self.lines[start_row - 1]
        self.indent_level = expand_indent(start_line[:start_col])
        if self.blank_before < self.blank_lines:
            self.blank_before = self.blank_lines
        if self.verbose >= 2:
            print(self.logical_line[:80].rstrip())
        for name, check, argument_names in self._logical_checks:
            if self.verbose >= 4:
                print('   ' + name)
            self.init_checker_state(name, argument_names)
            for offset, text in self.run_check(check, argument_names) or ():
                if not isinstance(offset, tuple):
                    # As mappings are ordered, bisecting is a fast way
                    # to find a given offset in them.
                    token_offset, pos = mapping[bisect.bisect_left(
                        mapping_offsets, offset)]
                    offset = (pos[0], pos[1] + offset - token_offset)
                self.report_error(offset[0], offset[1], text, check)
        if self.logical_line:
            self.previous_indent_level = self.indent_level
            self.previous_logical = self.logical_line
            if not self.indent_level:
                self.previous_unindented_logical_line = self.logical_line
        self.blank_lines = 0
        self.tokens = []

    def check_ast(self):
        """Build the file's AST and run all AST checks."""
        try:
            tree = compile(''.join(self.lines), '', 'exec', PyCF_ONLY_AST)
        except (ValueError, SyntaxError, TypeError):
            return self.report_invalid_syntax()
        for name, cls, __ in self._ast_checks:
            checker = cls(tree, self.filename)
            for lineno, offset, text, check in checker.run():
                if not self.lines or not noqa(self.lines[lineno - 1]):
                    self.report_error(lineno, offset, text, check)

    def generate_tokens(self):
        """Tokenize file, run physical line checks and yield tokens."""
        if self._io_error:
            self.report_error(1, 0, 'E902 %s' % self._io_error, readlines)
        tokengen = tokenize.generate_tokens(self.readline)
        try:
            prev_physical = ''
            for token in tokengen:
                if token[2][0] > self.total_lines:
                    return
                self.noqa = token[4] and noqa(token[4])
                self.maybe_check_physical(token, prev_physical)
                yield token
                prev_physical = token[4]
        except (SyntaxError, tokenize.TokenError):
            self.report_invalid_syntax()

    def maybe_check_physical(self, token, prev_physical):
        """If appropriate for token, check current physical line(s)."""
        # Called after every token, but act only on end of line.

        # a newline token ends a single physical line.
        if _is_eol_token(token):
            # if the file does not end with a newline, the NEWLINE
            # token is inserted by the parser, but it does not contain
            # the previous physical line in `token[4]`
            if token[4] == '':
                self.check_physical(prev_physical)
            else:
                self.check_physical(token[4])
        elif token[0] == tokenize.STRING and '\n' in token[1]:
            # Less obviously, a string that contains newlines is a
            # multiline string, either triple-quoted or with internal
            # newlines backslash-escaped. Check every physical line in
            # the string *except* for the last one: its newline is
            # outside of the multiline string, so we consider it a
            # regular physical line, and will check it like any other
            # physical line.
            #
            # Subtleties:
            # - we don't *completely* ignore the last line; if it
            #   contains the magical "# noqa" comment, we disable all
            #   physical checks for the entire multiline string
            # - have to wind self.line_number back because initially it
            #   points to the last line of the string, and we want
            #   check_physical() to give accurate feedback
            if noqa(token[4]):
                return
            self.multiline = True
            self.line_number = token[2][0]
            _, src, (_, offset), _, _ = token
            src = self.lines[self.line_number - 1][:offset] + src
            for line in src.split('\n')[:-1]:
                self.check_physical(line + '\n')
                self.line_number += 1
            self.multiline = False

    def check_all(self, expected=None, line_offset=0):
        """Run all checks on the input file."""
        self.report.init_file(self.filename, self.lines, expected, line_offset)
        self.total_lines = len(self.lines)
        if self._ast_checks:
            self.check_ast()
        self.line_number = 0
        self.indent_char = None
        self.indent_level = self.previous_indent_level = 0
        self.previous_logical = ''
        self.previous_unindented_logical_line = ''
        self.tokens = []
        self.blank_lines = self.blank_before = 0
        parens = 0
        for token in self.generate_tokens():
            self.tokens.append(token)
            token_type, text = token[0:2]
            if self.verbose >= 3:
                if token[2][0] == token[3][0]:
                    pos = '[{}:{}]'.format(token[2][1] or '', token[3][1])
                else:
                    pos = 'l.%s' % token[3][0]
                print('l.%s\t%s\t%s\t%r' %
                      (token[2][0], pos, tokenize.tok_name[token[0]], text))
            if token_type == tokenize.OP:
                if text in '([{':
                    parens += 1
                elif text in '}])':
                    parens -= 1
            elif not parens:
                if token_type in NEWLINE:
                    if token_type == tokenize.NEWLINE:
                        self.check_logical()
                        self.blank_before = 0
                    elif len(self.tokens) == 1:
                        # The physical line contains only this token.
                        self.blank_lines += 1
                        del self.tokens[0]
                    else:
                        self.check_logical()
        if self.tokens:
            self.check_physical(self.lines[-1])
            self.check_logical()
        return self.report.get_file_results()


class BaseReport:
    """Collect the results of the checks."""

    print_filename = False

    def __init__(self, options):
        self._benchmark_keys = options.benchmark_keys
        self._ignore_code = options.ignore_code
        # Results
        self.elapsed = 0
        self.total_errors = 0
        self.counters = dict.fromkeys(self._benchmark_keys, 0)
        self.messages = {}

    def start(self):
        """Start the timer."""
        self._start_time = time.time()

    def stop(self):
        """Stop the timer."""
        self.elapsed = time.time() - self._start_time

    def init_file(self, filename, lines, expected, line_offset):
        """Signal a new file."""
        self.filename = filename
        self.lines = lines
        self.expected = expected or ()
        self.line_offset = line_offset
        self.file_errors = 0
        self.counters['files'] += 1
        self.counters['physical lines'] += len(lines)

    def increment_logical_line(self):
        """Signal a new logical line."""
        self.counters['logical lines'] += 1

    def error(self, line_number, offset, text, check):
        """Report an error, according to options."""
        code = text[:4]
        if self._ignore_code(code):
            return
        if code in self.counters:
            self.counters[code] += 1
        else:
            self.counters[code] = 1
            self.messages[code] = text[5:]
        # Don't care about expected errors or warnings
        if code in self.expected:
            return
        if self.print_filename and not self.file_errors:
            print(self.filename)
        self.file_errors += 1
        self.total_errors += 1
        return code

    def get_file_results(self):
        """Return the count of errors and warnings for this file."""
        return self.file_errors

    def get_count(self, prefix=''):
        """Return the total count of errors and warnings."""
        return sum(self.counters[key]
                   for key in self.messages if key.startswith(prefix))

    def get_statistics(self, prefix=''):
        """Get statistics for message codes that start with the prefix.

        prefix='' matches all errors and warnings
        prefix='E' matches all errors
        prefix='W' matches all warnings
        prefix='E4' matches all errors that have to do with imports
        """
        return ['%-7s %s %s' % (self.counters[key], key, self.messages[key])
                for key in sorted(self.messages) if key.startswith(prefix)]

    def print_statistics(self, prefix=''):
        """Print overall statistics (number of errors and warnings)."""
        for line in self.get_statistics(prefix):
            print(line)

    def print_benchmark(self):
        """Print benchmark numbers."""
        print('{:<7.2f} {}'.format(self.elapsed, 'seconds elapsed'))
        if self.elapsed:
            for key in self._benchmark_keys:
                print('%-7d %s per second (%d total)' %
                      (self.counters[key] / self.elapsed, key,
                       self.counters[key]))


class FileReport(BaseReport):
    """Collect the results of the checks and print the filenames."""

    print_filename = True


class StandardReport(BaseReport):
    """Collect and print the results of the checks."""

    def __init__(self, options):
        super().__init__(options)
        self._fmt = REPORT_FORMAT.get(options.format.lower(),
                                      options.format)
        self._repeat = options.repeat
        self._show_source = options.show_source
        self._show_pep8 = options.show_pep8

    def init_file(self, filename, lines, expected, line_offset):
        """Signal a new file."""
        self._deferred_print = []
        return super().init_file(
            filename, lines, expected, line_offset)

    def error(self, line_number, offset, text, check):
        """Report an error, according to options."""
        code = super().error(line_number, offset, text, check)
        if code and (self.counters[code] == 1 or self._repeat):
            self._deferred_print.append(
                (line_number, offset, code, text[5:], check.__doc__))
        return code

    def get_file_results(self):
        """Print results and return the overall count for this file."""
        self._deferred_print.sort()
        for line_number, offset, code, text, doc in self._deferred_print:
            print(self._fmt % {
                'path': self.filename,
                'row': self.line_offset + line_number, 'col': offset + 1,
                'code': code, 'text': text,
            })
            if self._show_source:
                if line_number > len(self.lines):
                    line = ''
                else:
                    line = self.lines[line_number - 1]
                print(line.rstrip())
                print(re.sub(r'\S', ' ', line[:offset]) + '^')
            if self._show_pep8 and doc:
                print('    ' + doc.strip())

            # stdout is block buffered when not stdout.isatty().
            # line can be broken where buffer boundary since other
            # processes write to same file.
            # flush() after print() to avoid buffer boundary.
            # Typical buffer size is 8192. line written safely when
            # len(line) < 8192.
            sys.stdout.flush()
        return self.file_errors


class DiffReport(StandardReport):
    """Collect and print the results for the changed lines only."""

    def __init__(self, options):
        super().__init__(options)
        self._selected = options.selected_lines

    def error(self, line_number, offset, text, check):
        if line_number not in self._selected[self.filename]:
            return
        return super().error(line_number, offset, text, check)


class StyleGuide:
    """Initialize a PEP-8 instance with few options."""

    def __init__(self, *args, **kwargs):
        # build options from the command line
        self.checker_class = kwargs.pop('checker_class', Checker)
        parse_argv = kwargs.pop('parse_argv', False)
        config_file = kwargs.pop('config_file', False)
        parser = kwargs.pop('parser', None)
        # build options from dict
        options_dict = dict(*args, **kwargs)
        arglist = None if parse_argv else options_dict.get('paths', None)
        verbose = options_dict.get('verbose', None)
        options, self.paths = process_options(
            arglist, parse_argv, config_file, parser, verbose)
        if options_dict:
            options.__dict__.update(options_dict)
            if 'paths' in options_dict:
                self.paths = options_dict['paths']

        self.runner = self.input_file
        self.options = options

        if not options.reporter:
            options.reporter = BaseReport if options.quiet else StandardReport

        options.select = tuple(options.select or ())
        if not (options.select or options.ignore or
                options.testsuite or options.doctest) and DEFAULT_IGNORE:
            # The default choice: ignore controversial checks
            options.ignore = tuple(DEFAULT_IGNORE.split(','))
        else:
            # Ignore all checks which are not explicitly selected
            options.ignore = ('',) if options.select else tuple(options.ignore)
        options.benchmark_keys = BENCHMARK_KEYS[:]
        options.ignore_code = self.ignore_code
        options.physical_checks = self.get_checks('physical_line')
        options.logical_checks = self.get_checks('logical_line')
        options.ast_checks = self.get_checks('tree')
        self.init_report()

    def init_report(self, reporter=None):
        """Initialize the report instance."""
        self.options.report = (reporter or self.options.reporter)(self.options)
        return self.options.report

    def check_files(self, paths=None):
        """Run all checks on the paths."""
        if paths is None:
            paths = self.paths
        report = self.options.report
        runner = self.runner
        report.start()
        try:
            for path in paths:
                if os.path.isdir(path):
                    self.input_dir(path)
                elif not self.excluded(path):
                    runner(path)
        except KeyboardInterrupt:
            print('... stopped')
        report.stop()
        return report

    def input_file(self, filename, lines=None, expected=None, line_offset=0):
        """Run all checks on a Python source file."""
        if self.options.verbose:
            print('checking %s' % filename)
        fchecker = self.checker_class(
            filename, lines=lines, options=self.options)
        return fchecker.check_all(expected=expected, line_offset=line_offset)

    def input_dir(self, dirname):
        """Check all files in this directory and all subdirectories."""
        dirname = dirname.rstrip('/')
        if self.excluded(dirname):
            return 0
        counters = self.options.report.counters
        verbose = self.options.verbose
        filepatterns = self.options.filename
        runner = self.runner
        for root, dirs, files in os.walk(dirname):
            if verbose:
                print('directory ' + root)
            counters['directories'] += 1
            for subdir in sorted(dirs):
                if self.excluded(subdir, root):
                    dirs.remove(subdir)
            for filename in sorted(files):
                # contain a pattern that matches?
                if (
                    filename_match(filename, filepatterns) and
                    not self.excluded(filename, root)
                ):
                    runner(os.path.join(root, filename))

    def excluded(self, filename, parent=None):
        """Check if the file should be excluded.

        Check if 'options.exclude' contains a pattern matching filename.
        """
        if not self.options.exclude:
            return False
        basename = os.path.basename(filename)
        if filename_match(basename, self.options.exclude):
            return True
        if parent:
            filename = os.path.join(parent, filename)
        filename = os.path.abspath(filename)
        return filename_match(filename, self.options.exclude)

    def ignore_code(self, code):
        """Check if the error code should be ignored.

        If 'options.select' contains a prefix of the error code,
        return False.  Else, if 'options.ignore' contains a prefix of
        the error code, return True.
        """
        if len(code) < 4 and any(s.startswith(code)
                                 for s in self.options.select):
            return False
        return (code.startswith(self.options.ignore) and
                not code.startswith(self.options.select))

    def get_checks(self, argument_name):
        """Get all the checks for this category.

        Find all globally visible functions where the first argument
        name starts with argument_name and which contain selected tests.
        """
        checks = []
        for check, attrs in _checks[argument_name].items():
            (codes, args) = attrs
            if any(not (code and self.ignore_code(code)) for code in codes):
                checks.append((check.__name__, check, args))
        return sorted(checks)


def get_parser(prog='pycodestyle', version=__version__):
    """Create the parser for the program."""
    parser = OptionParser(prog=prog, version=version,
                          usage="%prog [options] input ...")
    parser.config_options = [
        'exclude', 'filename', 'select', 'ignore', 'max-line-length',
        'max-doc-length', 'indent-size', 'hang-closing', 'count', 'format',
        'quiet', 'show-pep8', 'show-source', 'statistics', 'verbose']
    parser.add_option('-v', '--verbose', default=0, action='count',
                      help="print status messages, or debug with -vv")
    parser.add_option('-q', '--quiet', default=0, action='count',
                      help="report only file names, or nothing with -qq")
    parser.add_option('-r', '--repeat', default=True, action='store_true',
                      help="(obsolete) show all occurrences of the same error")
    parser.add_option('--first', action='store_false', dest='repeat',
                      help="show first occurrence of each error")
    parser.add_option('--exclude', metavar='patterns', default=DEFAULT_EXCLUDE,
                      help="exclude files or directories which match these "
                           "comma separated patterns (default: %default)")
    parser.add_option('--filename', metavar='patterns', default='*.py',
                      help="when parsing directories, only check filenames "
                           "matching these comma separated patterns "
                           "(default: %default)")
    parser.add_option('--select', metavar='errors', default='',
                      help="select errors and warnings (e.g. E,W6)")
    parser.add_option('--ignore', metavar='errors', default='',
                      help="skip errors and warnings (e.g. E4,W) "
                           "(default: %s)" % DEFAULT_IGNORE)
    parser.add_option('--show-source', action='store_true',
                      help="show source code for each error")
    parser.add_option('--show-pep8', action='store_true',
                      help="show text of PEP 8 for each error "
                           "(implies --first)")
    parser.add_option('--statistics', action='store_true',
                      help="count errors and warnings")
    parser.add_option('--count', action='store_true',
                      help="print total number of errors and warnings "
                           "to standard error and set exit code to 1 if "
                           "total is not null")
    parser.add_option('--max-line-length', type='int', metavar='n',
                      default=MAX_LINE_LENGTH,
                      help="set maximum allowed line length "
                           "(default: %default)")
    parser.add_option('--max-doc-length', type='int', metavar='n',
                      default=None,
                      help="set maximum allowed doc line length and perform "
                           "these checks (unchecked if not set)")
    parser.add_option('--indent-size', type='int', metavar='n',
                      default=INDENT_SIZE,
                      help="set how many spaces make up an indent "
                           "(default: %default)")
    parser.add_option('--hang-closing', action='store_true',
                      help="hang closing bracket instead of matching "
                           "indentation of opening bracket's line")
    parser.add_option('--format', metavar='format', default='default',
                      help="set the error format [default|pylint|<custom>]")
    parser.add_option('--diff', action='store_true',
                      help="report changes only within line number ranges in "
                           "the unified diff received on STDIN")
    group = parser.add_option_group("Testing Options")
    if os.path.exists(TESTSUITE_PATH):
        group.add_option('--testsuite', metavar='dir',
                         help="run regression tests from dir")
        group.add_option('--doctest', action='store_true',
                         help="run doctest on myself")
    group.add_option('--benchmark', action='store_true',
                     help="measure processing speed")
    return parser


def read_config(options, args, arglist, parser):
    """Read and parse configurations.

    If a config file is specified on the command line with the
    "--config" option, then only it is used for configuration.

    Otherwise, the user configuration (~/.config/pycodestyle) and any
    local configurations in the current directory or above will be
    merged together (in that order) using the read method of
    ConfigParser.
    """
    config = configparser.RawConfigParser()

    cli_conf = options.config

    local_dir = os.curdir

    if USER_CONFIG and os.path.isfile(USER_CONFIG):
        if options.verbose:
            print('user configuration: %s' % USER_CONFIG)
        config.read(USER_CONFIG)

    parent = tail = args and os.path.abspath(os.path.commonprefix(args))
    while tail:
        if config.read(os.path.join(parent, fn) for fn in PROJECT_CONFIG):
            local_dir = parent
            if options.verbose:
                print('local configuration: in %s' % parent)
            break
        (parent, tail) = os.path.split(parent)

    if cli_conf and os.path.isfile(cli_conf):
        if options.verbose:
            print('cli configuration: %s' % cli_conf)
        config.read(cli_conf)

    pycodestyle_section = None
    if config.has_section(parser.prog):
        pycodestyle_section = parser.prog
    elif config.has_section('pep8'):
        pycodestyle_section = 'pep8'  # Deprecated
        warnings.warn('[pep8] section is deprecated. Use [pycodestyle].')

    if pycodestyle_section:
        option_list = {o.dest: o.type or o.action for o in parser.option_list}

        # First, read the default values
        (new_options, __) = parser.parse_args([])

        # Second, parse the configuration
        for opt in config.options(pycodestyle_section):
            if opt.replace('_', '-') not in parser.config_options:
                print("  unknown option '%s' ignored" % opt)
                continue
            if options.verbose > 1:
                print("  {} = {}".format(opt,
                                         config.get(pycodestyle_section, opt)))
            normalized_opt = opt.replace('-', '_')
            opt_type = option_list[normalized_opt]
            if opt_type in ('int', 'count'):
                value = config.getint(pycodestyle_section, opt)
            elif opt_type in ('store_true', 'store_false'):
                value = config.getboolean(pycodestyle_section, opt)
            else:
                value = config.get(pycodestyle_section, opt)
                if normalized_opt == 'exclude':
                    value = normalize_paths(value, local_dir)
            setattr(new_options, normalized_opt, value)

        # Third, overwrite with the command-line options
        (options, __) = parser.parse_args(arglist, values=new_options)
    options.doctest = options.testsuite = False
    return options


def process_options(arglist=None, parse_argv=False, config_file=None,
                    parser=None, verbose=None):
    """Process options passed either via arglist or command line args.

    Passing in the ``config_file`` parameter allows other tools, such as
    flake8 to specify their own options to be processed in pycodestyle.
    """
    if not parser:
        parser = get_parser()
    if not parser.has_option('--config'):
        group = parser.add_option_group("Configuration", description=(
            "The project options are read from the [%s] section of the "
            "tox.ini file or the setup.cfg file located in any parent folder "
            "of the path(s) being processed.  Allowed options are: %s." %
            (parser.prog, ', '.join(parser.config_options))))
        group.add_option('--config', metavar='path', default=config_file,
                         help="user config file location")
    # Don't read the command line if the module is used as a library.
    if not arglist and not parse_argv:
        arglist = []
    # If parse_argv is True and arglist is None, arguments are
    # parsed from the command line (sys.argv)
    (options, args) = parser.parse_args(arglist)
    options.reporter = None

    # If explicitly specified verbosity, override any `-v` CLI flag
    if verbose is not None:
        options.verbose = verbose

    if options.ensure_value('testsuite', False):
        args.append(options.testsuite)
    elif not options.ensure_value('doctest', False):
        if parse_argv and not args:
            if options.diff or any(os.path.exists(name)
                                   for name in PROJECT_CONFIG):
                args = ['.']
            else:
                parser.error('input not specified')
        options = read_config(options, args, arglist, parser)
        options.reporter = parse_argv and options.quiet == 1 and FileReport

    options.filename = _parse_multi_options(options.filename)
    options.exclude = normalize_paths(options.exclude)
    options.select = _parse_multi_options(options.select)
    options.ignore = _parse_multi_options(options.ignore)

    if options.diff:
        options.reporter = DiffReport
        stdin = stdin_get_value()
        options.selected_lines = parse_udiff(stdin, options.filename, args[0])
        args = sorted(options.selected_lines)

    return options, args


def _parse_multi_options(options, split_token=','):
    r"""Split and strip and discard empties.

    Turns the following:

    A,
    B,

    into ["A", "B"]
    """
    if options:
        return [o.strip() for o in options.split(split_token) if o.strip()]
    else:
        return options


def _main():
    """Parse options and run checks on Python source."""
    import signal

    # Handle "Broken pipe" gracefully
    try:
        signal.signal(signal.SIGPIPE, lambda signum, frame: sys.exit(1))
    except AttributeError:
        pass    # not supported on Windows

    style_guide = StyleGuide(parse_argv=True)
    options = style_guide.options

    if options.doctest or options.testsuite:
        from testsuite.support import run_tests
        report = run_tests(style_guide)
    else:
        report = style_guide.check_files()

    if options.statistics:
        report.print_statistics()

    if options.benchmark:
        report.print_benchmark()

    if options.testsuite and not options.quiet:
        report.print_results()

    if report.total_errors:
        if options.count:
            sys.stderr.write(str(report.total_errors) + '\n')
        sys.exit(1)


if __name__ == '__main__':
    _main()
# pycodestyle.py - Check Python source code formatting, according to
# PEP 8
#
# Copyright (C) 2006-2009 Johann C. Rocholl <johann@rocholl.net>
# Copyright (C) 2009-2014 Florent Xicluna <florent.xicluna@gmail.com>
# Copyright (C) 2014-2016 Ian Lee <ianlee1521@gmail.com>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
r"""
Check Python source code formatting, according to PEP 8.

For usage and a list of options, try this:
$ python pycodestyle.py -h

This program and its regression test suite live here:
https://github.com/pycqa/pycodestyle

Groups of errors and warnings:
E errors
W warnings
100 indentation
200 whitespace
300 blank lines
400 imports
500 line length
600 deprecation
700 statements
900 syntax error
"""
import bisect
import configparser
import inspect
import io
import keyword
import os
import re
import sys
import time
import tokenize
import warnings
from fnmatch import fnmatch
from functools import lru_cache
from optparse import OptionParser

# this is a performance hack.  see https://bugs.python.org/issue43014
if (
        sys.version_info < (3, 10) and
        callable(getattr(tokenize, '_compile', None))
):  # pragma: no cover (<py310)
    tokenize._compile = lru_cache(tokenize._compile)  # type: ignore

__version__ = '2.11.0'  # patched PY-37054

DEFAULT_EXCLUDE = '.svn,CVS,.bzr,.hg,.git,__pycache__,.tox'
DEFAULT_IGNORE = 'E121,E123,E126,E226,E24,E704,W503,W504'
try:
    if sys.platform == 'win32':  # pragma: win32 cover
        USER_CONFIG = os.path.expanduser(r'~\.pycodestyle')
    else:  # pragma: win32 no cover
        USER_CONFIG = os.path.join(
            os.getenv('XDG_CONFIG_HOME') or os.path.expanduser('~/.config'),
            'pycodestyle'
        )
except ImportError:
    USER_CONFIG = None

PROJECT_CONFIG = ('setup.cfg', 'tox.ini')
MAX_LINE_LENGTH = 79
# Number of blank lines between various code parts.
BLANK_LINES_CONFIG = {
    # Top level class and function.
    'top_level': 2,
    # Methods and nested class and function.
    'method': 1,
}
MAX_DOC_LENGTH = 72
INDENT_SIZE = 4
REPORT_FORMAT = {
    'default': '%(path)s:%(row)d:%(col)d: %(code)s %(text)s',
    'pylint': '%(path)s:%(row)d: [%(code)s] %(text)s',
}

PyCF_ONLY_AST = 1024
SINGLETONS = frozenset(['False', 'None', 'True'])
KEYWORDS = frozenset(keyword.kwlist + ['print']) - SINGLETONS
UNARY_OPERATORS = frozenset(['>>', '**', '*', '+', '-'])
ARITHMETIC_OP = frozenset(['**', '*', '/', '//', '+', '-', '@'])
WS_OPTIONAL_OPERATORS = ARITHMETIC_OP.union(['^', '&', '|', '<<', '>>', '%'])
WS_NEEDED_OPERATORS = frozenset([
    '**=', '*=', '/=', '//=', '+=', '-=', '!=', '<', '>',
    '%=', '^=', '&=', '|=', '==', '<=', '>=', '<<=', '>>=', '=',
    'and', 'in', 'is', 'or', '->', ':='])
WHITESPACE = frozenset(' \t\xa0')
NEWLINE = frozenset([tokenize.NL, tokenize.NEWLINE])
SKIP_TOKENS = NEWLINE.union([tokenize.INDENT, tokenize.DEDENT])
# ERRORTOKEN is triggered by backticks in Python 3
SKIP_COMMENTS = SKIP_TOKENS.union([tokenize.COMMENT, tokenize.ERRORTOKEN])
BENCHMARK_KEYS = ['directories', 'files', 'logical lines', 'physical lines']

INDENT_REGEX = re.compile(r'([ \t]*)')
ERRORCODE_REGEX = re.compile(r'\b[A-Z]\d{3}\b')
DOCSTRING_REGEX = re.compile(r'u?r?["\']')
EXTRANEOUS_WHITESPACE_REGEX = re.compile(r'[\[({][ \t]|[ \t][\]}),;:](?!=)')
WHITESPACE_AFTER_COMMA_REGEX = re.compile(r'[,;:]\s*(?:  |\t)')
COMPARE_SINGLETON_REGEX = re.compile(r'(\bNone|\bFalse|\bTrue)?\s*([=!]=)'
                                     r'\s*(?(1)|(None|False|True))\b')
COMPARE_NEGATIVE_REGEX = re.compile(r'\b(?<!is\s)(not)\s+[^][)(}{ ]+\s+'
                                    r'(in|is)\s')
COMPARE_TYPE_REGEX = re.compile(
    r'[=!]=\s+type(?:\s*\(\s*([^)]*[^ )])\s*\))'
    r'|\btype(?:\s*\(\s*([^)]*[^ )])\s*\))\s+[=!]='
)
KEYWORD_REGEX = re.compile(r'(\s*)\b(?:%s)\b(\s*)' % r'|'.join(KEYWORDS))
OPERATOR_REGEX = re.compile(r'(?:[^,\s])(\s*)(?:[-+*/|!<=>%&^]+|:=)(\s*)')
LAMBDA_REGEX = re.compile(r'\blambda\b')
HUNK_REGEX = re.compile(r'^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@.*$')
STARTSWITH_DEF_REGEX = re.compile(r'^(async\s+def|def)\b')
STARTSWITH_TOP_LEVEL_REGEX = re.compile(r'^(async\s+def\s+|def\s+|class\s+|@)')
STARTSWITH_INDENT_STATEMENT_REGEX = re.compile(
    r'^\s*({})\b'.format('|'.join(s.replace(' ', r'\s+') for s in (
        'def', 'async def',
        'for', 'async for',
        'if', 'elif', 'else',
        'try', 'except', 'finally',
        'with', 'async with',
        'class',
        'while',
    )))
)
DUNDER_REGEX = re.compile(r"^__([^\s]+)__(?::\s*[a-zA-Z.0-9_\[\]\"]+)? = ")
BLANK_EXCEPT_REGEX = re.compile(r"except\s*:")

if sys.version_info >= (3, 12):  # pragma: >=3.12 cover
    FSTRING_START = tokenize.FSTRING_START
    FSTRING_MIDDLE = tokenize.FSTRING_MIDDLE
    FSTRING_END = tokenize.FSTRING_END
else:  # pragma: <3.12 cover
    FSTRING_START = FSTRING_MIDDLE = FSTRING_END = -1

_checks = {'physical_line': {}, 'logical_line': {}, 'tree': {}}


def _get_parameters(function):
    return [parameter.name
            for parameter
            in inspect.signature(function).parameters.values()
            if parameter.kind == parameter.POSITIONAL_OR_KEYWORD]


def register_check(check, codes=None):
    """Register a new check object."""
    def _add_check(check, kind, codes, args):
        if check in _checks[kind]:
            _checks[kind][check][0].extend(codes or [])
        else:
            _checks[kind][check] = (codes or [''], args)
    if inspect.isfunction(check):
        args = _get_parameters(check)
        if args and args[0] in ('physical_line', 'logical_line'):
            if codes is None:
                codes = ERRORCODE_REGEX.findall(check.__doc__ or '')
            _add_check(check, args[0], codes, args)
    elif inspect.isclass(check):
        if _get_parameters(check.__init__)[:2] == ['self', 'tree']:
            _add_check(check, 'tree', codes, None)
    return check


########################################################################
# Plugins (check functions) for physical lines
########################################################################

@register_check
def tabs_or_spaces(physical_line, indent_char):
    r"""Never mix tabs and spaces.

    The most popular way of indenting Python is with spaces only.  The
    second-most popular way is with tabs only.  Code indented with a
    mixture of tabs and spaces should be converted to using spaces
    exclusively.  When invoking the Python command line interpreter with
    the -t option, it issues warnings about code that illegally mixes
    tabs and spaces.  When using -tt these warnings become errors.
    These options are highly recommended!

    Okay: if a == 0:\n    a = 1\n    b = 1
    """
    indent = INDENT_REGEX.match(physical_line).group(1)
    for offset, char in enumerate(indent):
        if char != indent_char:
            return offset, "E101 indentation contains mixed spaces and tabs"


@register_check
def tabs_obsolete(physical_line):
    r"""On new projects, spaces-only are strongly recommended over tabs.

    Okay: if True:\n    return
    W191: if True:\n\treturn
    """
    indent = INDENT_REGEX.match(physical_line).group(1)
    if '\t' in indent:
        return indent.index('\t'), "W191 indentation contains tabs"


@register_check
def trailing_whitespace(physical_line):
    r"""Trailing whitespace is superfluous.

    The warning returned varies on whether the line itself is blank,
    for easier filtering for those who want to indent their blank lines.

    Okay: spam(1)\n#
    W291: spam(1) \n#
    W293: class Foo(object):\n    \n    bang = 12
    """
    physical_line = physical_line.rstrip('\n')    # chr(10), newline
    physical_line = physical_line.rstrip('\r')    # chr(13), carriage return
    physical_line = physical_line.rstrip('\x0c')  # chr(12), form feed, ^L
    stripped = physical_line.rstrip(' \t\v')
    if physical_line != stripped:
        if stripped:
            return len(stripped), "W291 trailing whitespace"
        else:
            return 0, "W293 blank line contains whitespace"


@register_check
def trailing_blank_lines(physical_line, lines, line_number, total_lines):
    r"""Trailing blank lines are superfluous.

    Okay: spam(1)
    W391: spam(1)\n

    However the last line should end with a new line (warning W292).
    """
    if line_number == total_lines:
        stripped_last_line = physical_line.rstrip('\r\n')
        if physical_line and not stripped_last_line:
            return 0, "W391 blank line at end of file"
        if stripped_last_line == physical_line:
            return len(lines[-1]), "W292 no newline at end of file"


@register_check
def maximum_line_length(physical_line, max_line_length, multiline,
                        line_number, noqa):
    r"""Limit all lines to a maximum of 79 characters.

    There are still many devices around that are limited to 80 character
    lines; plus, limiting windows to 80 characters makes it possible to
    have several windows side-by-side.  The default wrapping on such
    devices looks ugly.  Therefore, please limit all lines to a maximum
    of 79 characters. For flowing long blocks of text (docstrings or
    comments), limiting the length to 72 characters is recommended.

    Reports error E501.
    """
    line = physical_line.rstrip()
    length = len(line)
    if length > max_line_length and not noqa:
        # Special case: ignore long shebang lines.
        if line_number == 1 and line.startswith('#!'):
            return
        # Special case for long URLs in multi-line docstrings or
        # comments, but still report the error when the 72 first chars
        # are whitespaces.
        chunks = line.split()
        if ((len(chunks) == 1 and multiline) or
            (len(chunks) == 2 and chunks[0] == '#')) and \
                len(line) - len(chunks[-1]) < max_line_length - 7:
            return
        if length > max_line_length:
            return (max_line_length, "E501 line too long "
                    "(%d > %d characters)" % (length, max_line_length))


########################################################################
# Plugins (check functions) for logical lines
########################################################################


def _is_one_liner(logical_line, indent_level, lines, line_number):
    if not STARTSWITH_TOP_LEVEL_REGEX.match(logical_line):
        return False

    line_idx = line_number - 1

    if line_idx < 1:
        prev_indent = 0
    else:
        prev_indent = expand_indent(lines[line_idx - 1])

    if prev_indent > indent_level:
        return False

    while line_idx < len(lines):
        line = lines[line_idx].strip()
        if not line.startswith('@') and STARTSWITH_TOP_LEVEL_REGEX.match(line):
            break
        else:
            line_idx += 1
    else:
        return False  # invalid syntax: EOF while searching for def/class

    next_idx = line_idx + 1
    while next_idx < len(lines):
        if lines[next_idx].strip():
            break
        else:
            next_idx += 1
    else:
        return True  # line is last in the file

    return expand_indent(lines[next_idx]) <= indent_level


@register_check
def blank_lines(logical_line, blank_lines, indent_level, line_number,
                blank_before, previous_logical,
                previous_unindented_logical_line, previous_indent_level,
                lines):
    r"""Separate top-level function and class definitions with two blank
    lines.

    Method definitions inside a class are separated by a single blank
    line.

    Extra blank lines may be used (sparingly) to separate groups of
    related functions.  Blank lines may be omitted between a bunch of
    related one-liners (e.g. a set of dummy implementations).

    Use blank lines in functions, sparingly, to indicate logical
    sections.

    Okay: def a():\n    pass\n\n\ndef b():\n    pass
    Okay: def a():\n    pass\n\n\nasync def b():\n    pass
    Okay: def a():\n    pass\n\n\n# Foo\n# Bar\n\ndef b():\n    pass
    Okay: default = 1\nfoo = 1
    Okay: classify = 1\nfoo = 1

    E301: class Foo:\n    b = 0\n    def bar():\n        pass
    E302: def a():\n    pass\n\ndef b(n):\n    pass
    E302: def a():\n    pass\n\nasync def b(n):\n    pass
    E303: def a():\n    pass\n\n\n\ndef b(n):\n    pass
    E303: def a():\n\n\n\n    pass
    E304: @decorator\n\ndef a():\n    pass
    E305: def a():\n    pass\na()
    E306: def a():\n    def b():\n        pass\n    def c():\n        pass
    """  # noqa
    top_level_lines = BLANK_LINES_CONFIG['top_level']
    method_lines = BLANK_LINES_CONFIG['method']

    if not previous_logical and blank_before < top_level_lines:
        return  # Don't expect blank lines before the first line
    if previous_logical.startswith('@'):
        if blank_lines:
            yield 0, "E304 blank lines found after function decorator"
    elif (blank_lines > top_level_lines or
            (indent_level and blank_lines == method_lines + 1)
          ):
        yield 0, "E303 too many blank lines (%d)" % blank_lines
    elif STARTSWITH_TOP_LEVEL_REGEX.match(logical_line):
        # allow a group of one-liners
        if (
            _is_one_liner(logical_line, indent_level, lines, line_number) and
            blank_before == 0
        ):
            return
        if indent_level:
            if not (blank_before == method_lines or
                    previous_indent_level < indent_level or
                    DOCSTRING_REGEX.match(previous_logical)
                    ):
                ancestor_level = indent_level
                nested = False
                # Search backwards for a def ancestor or tree root
                # (top level).
                for line in lines[line_number - top_level_lines::-1]:
                    if line.strip() and expand_indent(line) < ancestor_level:
                        ancestor_level = expand_indent(line)
                        nested = STARTSWITH_DEF_REGEX.match(line.lstrip())
                        if nested or ancestor_level == 0:
                            break
                if nested:
                    yield 0, "E306 expected %s blank line before a " \
                        "nested definition, found 0" % (method_lines,)
                else:
                    yield 0, "E301 expected {} blank line, found 0".format(
                        method_lines)
        elif blank_before != top_level_lines:
            yield 0, "E302 expected %s blank lines, found %d" % (
                top_level_lines, blank_before)
    elif (logical_line and
            not indent_level and
            blank_before != top_level_lines and
            previous_unindented_logical_line.startswith(('def ', 'class '))
          ):
        yield 0, "E305 expected %s blank lines after " \
            "class or function definition, found %d" % (
                top_level_lines, blank_before)


@register_check
def extraneous_whitespace(logical_line):
    r"""Avoid extraneous whitespace.

    Avoid extraneous whitespace in these situations:
    - Immediately inside parentheses, brackets or braces.
    - Immediately before a comma, semicolon, or colon.

    Okay: spam(ham[1], {eggs: 2})
    E201: spam( ham[1], {eggs: 2})
    E201: spam(ham[ 1], {eggs: 2})
    E201: spam(ham[1], { eggs: 2})
    E202: spam(ham[1], {eggs: 2} )
    E202: spam(ham[1 ], {eggs: 2})
    E202: spam(ham[1], {eggs: 2 })

    E203: if x == 4: print x, y; x, y = y , x
    E203: if x == 4: print x, y ; x, y = y, x
    E203: if x == 4 : print x, y; x, y = y, x
    """
    line = logical_line
    for match in EXTRANEOUS_WHITESPACE_REGEX.finditer(line):
        text = match.group()
        char = text.strip()
        found = match.start()
        if text[-1].isspace():
            # assert char in '([{'
            yield found + 1, "E201 whitespace after '%s'" % char
        elif line[found - 1] != ',':
            code = ('E202' if char in '}])' else 'E203')  # if char in ',;:'
            yield found, f"{code} whitespace before '{char}'"


@register_check
def whitespace_around_keywords(logical_line):
    r"""Avoid extraneous whitespace around keywords.

    Okay: True and False
    E271: True and  False
    E272: True  and False
    E273: True and\tFalse
    E274: True\tand False
    """
    for match in KEYWORD_REGEX.finditer(logical_line):
        before, after = match.groups()

        if '\t' in before:
            yield match.start(1), "E274 tab before keyword"
        elif len(before) > 1:
            yield match.start(1), "E272 multiple spaces before keyword"

        if '\t' in after:
            yield match.start(2), "E273 tab after keyword"
        elif len(after) > 1:
            yield match.start(2), "E271 multiple spaces after keyword"


@register_check
def missing_whitespace_after_keyword(logical_line, tokens):
    r"""Keywords should be followed by whitespace.

    Okay: from foo import (bar, baz)
    E275: from foo import(bar, baz)
    E275: from importable.module import(bar, baz)
    E275: if(foo): bar
    """
    for tok0, tok1 in zip(tokens, tokens[1:]):
        # This must exclude the True/False/None singletons, which can
        # appear e.g. as "if x is None:", and async/await, which were
        # valid identifier names in old Python versions.
        if (tok0.end == tok1.start and
                keyword.iskeyword(tok0.string) and
                tok0.string not in SINGLETONS and
                not (tok0.string == 'except' and tok1.string == '*') and
                not (tok0.string == 'yield' and tok1.string == ')') and
                tok1.string not in ':\n'):
            yield tok0.end, "E275 missing whitespace after keyword"


@register_check
def indentation(logical_line, previous_logical, indent_char,
                indent_level, previous_indent_level,
                indent_size):
    r"""Use indent_size (PEP8 says 4) spaces per indentation level.

    For really old code that you don't want to mess up, you can continue
    to use 8-space tabs.

    Okay: a = 1
    Okay: if a == 0:\n    a = 1
    E111:   a = 1
    E114:   # a = 1

    Okay: for item in items:\n    pass
    E112: for item in items:\npass
    E115: for item in items:\n# Hi\n    pass

    Okay: a = 1\nb = 2
    E113: a = 1\n    b = 2
    E116: a = 1\n    # b = 2
    """
    c = 0 if logical_line else 3
    tmpl = "E11%d %s" if logical_line else "E11%d %s (comment)"
    if indent_level % indent_size:
        yield 0, tmpl % (
            1 + c,
            "indentation is not a multiple of " + str(indent_size),
        )
    indent_expect = previous_logical.endswith(':')
    if indent_expect and indent_level <= previous_indent_level:
        yield 0, tmpl % (2 + c, "expected an indented block")
    elif not indent_expect and indent_level > previous_indent_level:
        yield 0, tmpl % (3 + c, "unexpected indentation")

    if indent_expect:
        expected_indent_amount = 8 if indent_char == '\t' else 4
        expected_indent_level = previous_indent_level + expected_indent_amount
        if indent_level > expected_indent_level:
            yield 0, tmpl % (7, 'over-indented')


@register_check
def continued_indentation(logical_line, tokens, indent_level, hang_closing,
                          indent_char, indent_size, noqa, verbose):
    r"""Continuation lines indentation.

    Continuation lines should align wrapped elements either vertically
    using Python's implicit line joining inside parentheses, brackets
    and braces, or using a hanging indent.

    When using a hanging indent these considerations should be applied:
    - there should be no arguments on the first line, and
    - further indentation should be used to clearly distinguish itself
      as a continuation line.

    Okay: a = (\n)
    E123: a = (\n    )

    Okay: a = (\n    42)
    E121: a = (\n   42)
    E122: a = (\n42)
    E123: a = (\n    42\n    )
    E124: a = (24,\n     42\n)
    E125: if (\n    b):\n    pass
    E126: a = (\n        42)
    E127: a = (24,\n      42)
    E128: a = (24,\n    42)
    E129: if (a or\n    b):\n    pass
    E131: a = (\n    42\n 24)
    """
    first_row = tokens[0][2][0]
    nrows = 1 + tokens[-1][2][0] - first_row
    if noqa or nrows == 1:
        return

    # indent_next tells us whether the next block is indented; assuming
    # that it is indented by 4 spaces, then we should not allow 4-space
    # indents on the final continuation line; in turn, some other
    # indents are allowed to have an extra 4 spaces.
    indent_next = logical_line.endswith(':')

    row = depth = 0
    valid_hangs = (indent_size,) if indent_char != '\t' \
        else (indent_size, indent_size * 2)
    # remember how many brackets were opened on each line
    parens = [0] * nrows
    # relative indents of physical lines
    rel_indent = [0] * nrows
    # for each depth, collect a list of opening rows
    open_rows = [[0]]
    # for each depth, memorize the hanging indentation
    hangs = [None]
    # visual indents
    indent_chances = {}
    last_indent = tokens[0][2]
    visual_indent = None
    last_token_multiline = False
    # for each depth, memorize the visual indent column
    indent = [last_indent[1]]
    if verbose >= 3:
        print(">>> " + tokens[0][4].rstrip())

    for token_type, text, start, end, line in tokens:

        newline = row < start[0] - first_row
        if newline:
            row = start[0] - first_row
            newline = not last_token_multiline and token_type not in NEWLINE

        if newline:
            # this is the beginning of a continuation line.
            last_indent = start
            if verbose >= 3:
                print("... " + line.rstrip())

            # record the initial indent.
            rel_indent[row] = expand_indent(line) - indent_level

            # identify closing bracket
            close_bracket = (token_type == tokenize.OP and text in ']})')

            # is the indent relative to an opening bracket line?
            for open_row in reversed(open_rows[depth]):
                hang = rel_indent[row] - rel_indent[open_row]
                hanging_indent = hang in valid_hangs
                if hanging_indent:
                    break
            if hangs[depth]:
                hanging_indent = (hang == hangs[depth])
            # is there any chance of visual indent?
            visual_indent = (not close_bracket and hang > 0 and
                             indent_chances.get(start[1]))

            if close_bracket and indent[depth]:
                # closing bracket for visual indent
                if start[1] != indent[depth]:
                    yield (start, "E124 closing bracket does not match "
                           "visual indentation")
            elif close_bracket and not hang:
                # closing bracket matches indentation of opening
                # bracket's line
                if hang_closing:
                    yield start, "E133 closing bracket is missing indentation"
            elif indent[depth] and start[1] < indent[depth]:
                if visual_indent is not True:
                    # visual indent is broken
                    yield (start, "E128 continuation line "
                           "under-indented for visual indent")
            elif hanging_indent or (indent_next and
                                    rel_indent[row] == 2 * indent_size):
                # hanging indent is verified
                if close_bracket and not hang_closing:
                    yield (start, "E123 closing bracket does not match "
                           "indentation of opening bracket's line")
                hangs[depth] = hang
            elif visual_indent is True:
                # visual indent is verified
                indent[depth] = start[1]
            elif visual_indent in (text, str):
                # ignore token lined up with matching one from a
                # previous line
                pass
            else:
                # indent is broken
                if hang <= 0:
                    error = "E122", "missing indentation or outdented"
                elif indent[depth]:
                    error = "E127", "over-indented for visual indent"
                elif not close_bracket and hangs[depth]:
                    error = "E131", "unaligned for hanging indent"
                else:
                    hangs[depth] = hang
                    if hang > indent_size:
                        error = "E126", "over-indented for hanging indent"
                    else:
                        error = "E121", "under-indented for hanging indent"
                yield start, "%s continuation line %s" % error

        # look for visual indenting
        if (parens[row] and
                token_type not in (tokenize.NL, tokenize.COMMENT) and
                not indent[depth]):
            indent[depth] = start[1]
            indent_chances[start[1]] = True
            if verbose >= 4:
                print(f"bracket depth {depth} indent to {start[1]}")
        # deal with implicit string concatenation
        elif token_type in (tokenize.STRING, tokenize.COMMENT, FSTRING_START):
            indent_chances[start[1]] = str
        # visual indent after assert/raise/with
        elif not row and not depth and text in ["assert", "raise", "with"]:
            indent_chances[end[1] + 1] = True
        # special case for the "if" statement because len("if (") == 4
        elif not indent_chances and not row and not depth and text == 'if':
            indent_chances[end[1] + 1] = True
        elif text == ':' and line[end[1]:].isspace():
            open_rows[depth].append(row)

        # keep track of bracket depth
        if token_type == tokenize.OP:
            if text in '([{':
                depth += 1
                indent.append(0)
                hangs.append(None)
                if len(open_rows) == depth:
                    open_rows.append([])
                open_rows[depth].append(row)
                parens[row] += 1
                if verbose >= 4:
                    print("bracket depth %s seen, col %s, visual min = %s" %
                          (depth, start[1], indent[depth]))
            elif text in ')]}' and depth > 0:
                # parent indents should not be more than this one
                prev_indent = indent.pop() or last_indent[1]
                hangs.pop()
                for d in range(depth):
                    if indent[d] > prev_indent:
                        indent[d] = 0
                for ind in list(indent_chances):
                    if ind >= prev_indent:
                        del indent_chances[ind]
                del open_rows[depth + 1:]
                depth -= 1
                if depth:
                    indent_chances[indent[depth]] = True
                for idx in range(row, -1, -1):
                    if parens[idx]:
                        parens[idx] -= 1
                        break
            assert len(indent) == depth + 1
            if start[1] not in indent_chances:
                # allow lining up tokens
                indent_chances[start[1]] = text

        last_token_multiline = (start[0] != end[0])
        if last_token_multiline:
            rel_indent[end[0] - first_row] = rel_indent[row]

    if indent_next and expand_indent(line) == indent_level + indent_size:
        pos = (start[0], indent[0] + indent_size)
        if visual_indent:
            code = "E129 visually indented line"
        else:
            code = "E125 continuation line"
        yield pos, "%s with same indent as next logical line" % code


@register_check
def whitespace_before_parameters(logical_line, tokens):
    r"""Avoid extraneous whitespace.

    Avoid extraneous whitespace in the following situations:
    - before the open parenthesis that starts the argument list of a
      function call.
    - before the open parenthesis that starts an indexing or slicing.

    Okay: spam(1)
    E211: spam (1)

    Okay: dict['key'] = list[index]
    E211: dict ['key'] = list[index]
    E211: dict['key'] = list [index]
    """
    prev_type, prev_text, __, prev_end, __ = tokens[0]
    for index in range(1, len(tokens)):
        token_type, text, start, end, __ = tokens[index]
        if (
            token_type == tokenize.OP and
            text in '([' and
            start != prev_end and
            (prev_type == tokenize.NAME or prev_text in '}])') and
            # Syntax "class A (B):" is allowed, but avoid it
            (index < 2 or tokens[index - 2][1] != 'class') and
            # Allow "return (a.foo for a in range(5))"
            not keyword.iskeyword(prev_text) and
            (
                sys.version_info < (3, 9) or
                # 3.12+: type is a soft keyword but no braces after
                prev_text == 'type' or
                not keyword.issoftkeyword(prev_text)
            )
        ):
            yield prev_end, "E211 whitespace before '%s'" % text
        prev_type = token_type
        prev_text = text
        prev_end = end


@register_check
def whitespace_around_operator(logical_line):
    r"""Avoid extraneous whitespace around an operator.

    Okay: a = 12 + 3
    E221: a = 4  + 5
    E222: a = 4 +  5
    E223: a = 4\t+ 5
    E224: a = 4 +\t5
    """
    for match in OPERATOR_REGEX.finditer(logical_line):
        before, after = match.groups()

        if '\t' in before:
            yield match.start(1), "E223 tab before operator"
        elif len(before) > 1:
            yield match.start(1), "E221 multiple spaces before operator"

        if '\t' in after:
            yield match.start(2), "E224 tab after operator"
        elif len(after) > 1:
            yield match.start(2), "E222 multiple spaces after operator"


@register_check
def missing_whitespace(logical_line, tokens):
    r"""Surround operators with the correct amount of whitespace.

    - Always surround these binary operators with a single space on
      either side: assignment (=), augmented assignment (+=, -= etc.),
      comparisons (==, <, >, !=, <=, >=, in, not in, is, is not),
      Booleans (and, or, not).

    - Each comma, semicolon or colon should be followed by whitespace.

    - If operators with different priorities are used, consider adding
      whitespace around the operators with the lowest priorities.

    Okay: i = i + 1
    Okay: submitted += 1
    Okay: x = x * 2 - 1
    Okay: hypot2 = x * x + y * y
    Okay: c = (a + b) * (a - b)
    Okay: foo(bar, key='word', *args, **kwargs)
    Okay: alpha[:-i]
    Okay: [a, b]
    Okay: (3,)
    Okay: a[3,] = 1
    Okay: a[1:4]
    Okay: a[:4]
    Okay: a[1:]
    Okay: a[1:4:2]

    E225: i=i+1
    E225: submitted +=1
    E225: x = x /2 - 1
    E225: z = x **y
    E225: z = 1and 1
    E226: c = (a+b) * (a-b)
    E226: hypot2 = x*x + y*y
    E227: c = a|b
    E228: msg = fmt%(errno, errmsg)
    E231: ['a','b']
    E231: foo(bar,baz)
    E231: [{'a':'b'}]
    """
    need_space = False
    prev_type = tokenize.OP
    prev_text = prev_end = None
    operator_types = (tokenize.OP, tokenize.NAME)
    brace_stack = []
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.OP and text in {'[', '(', '{'}:
            brace_stack.append(text)
        elif token_type == FSTRING_START:  # pragma: >=3.12 cover
            brace_stack.append('f')
        elif token_type == tokenize.NAME and text == 'lambda':
            brace_stack.append('l')
        elif brace_stack:
            if token_type == tokenize.OP and text in {']', ')', '}'}:
                brace_stack.pop()
            elif token_type == FSTRING_END:  # pragma: >=3.12 cover
                brace_stack.pop()
            elif (
                    brace_stack[-1] == 'l' and
                    token_type == tokenize.OP and
                    text == ':'
            ):
                brace_stack.pop()

        if token_type in SKIP_COMMENTS:
            continue

        if token_type == tokenize.OP and text in {',', ';', ':'}:
            next_char = line[end[1]:end[1] + 1]
            if next_char not in WHITESPACE and next_char not in '\r\n':
                # slice
                if text == ':' and brace_stack[-1:] == ['[']:
                    pass
                # 3.12+ fstring format specifier
                elif text == ':' and brace_stack[-2:] == ['f', '{']:  # pragma: >=3.12 cover  # noqa: E501
                    pass
                # tuple (and list for some reason?)
                elif text == ',' and next_char in ')]':
                    pass
                else:
                    yield start, f'E231 missing whitespace after {text!r}'

        if need_space:
            if start != prev_end:
                # Found a (probably) needed space
                if need_space is not True and not need_space[1]:
                    yield (need_space[0],
                           "E225 missing whitespace around operator")
                need_space = False
            elif (
                    # def f(a, /, b):
                    #           ^
                    # def f(a, b, /):
                    #              ^
                    # f = lambda a, /:
                    #                ^
                    prev_text == '/' and text in {',', ')', ':'} or
                    # def f(a, b, /):
                    #               ^
                    prev_text == ')' and text == ':'
            ):
                # Tolerate the "/" operator in function definition
                # For more info see PEP570
                pass
            else:
                if need_space is True or need_space[1]:
                    # A needed trailing space was not found
                    yield prev_end, "E225 missing whitespace around operator"
                elif prev_text != '**':
                    code, optype = 'E226', 'arithmetic'
                    if prev_text == '%':
                        code, optype = 'E228', 'modulo'
                    elif prev_text not in ARITHMETIC_OP:
                        code, optype = 'E227', 'bitwise or shift'
                    yield (need_space[0], "%s missing whitespace "
                           "around %s operator" % (code, optype))
                need_space = False
        elif token_type in operator_types and prev_end is not None:
            if (
                    text == '=' and (
                        # allow lambda default args: lambda x=None: None
                        brace_stack[-1:] == ['l'] or
                        # allow keyword args or defaults: foo(bar=None).
                        brace_stack[-1:] == ['('] or
                        # allow python 3.8 fstring repr specifier
                        brace_stack[-2:] == ['f', '{']
                    )
            ):
                pass
            elif text in WS_NEEDED_OPERATORS:
                need_space = True
            elif text in UNARY_OPERATORS:
                # Check if the operator is used as a binary operator
                # Allow unary operators: -123, -x, +1.
                # Allow argument unpacking: foo(*args, **kwargs).
                if prev_type == tokenize.OP and prev_text in '}])' or (
                    prev_type != tokenize.OP and
                    prev_text not in KEYWORDS and (
                        sys.version_info < (3, 9) or
                        not keyword.issoftkeyword(prev_text)
                    )
                ):
                    need_space = None
            elif text in WS_OPTIONAL_OPERATORS:
                need_space = None

            if need_space is None:
                # Surrounding space is optional, but ensure that
                # trailing space matches opening space
                need_space = (prev_end, start != prev_end)
            elif need_space and start == prev_end:
                # A needed opening space was not found
                yield prev_end, "E225 missing whitespace around operator"
                need_space = False
        prev_type = token_type
        prev_text = text
        prev_end = end


@register_check
def whitespace_around_comma(logical_line):
    r"""Avoid extraneous whitespace after a comma or a colon.

    Note: these checks are disabled by default

    Okay: a = (1, 2)
    E241: a = (1,  2)
    E242: a = (1,\t2)
    """
    line = logical_line
    for m in WHITESPACE_AFTER_COMMA_REGEX.finditer(line):
        found = m.start() + 1
        if '\t' in m.group():
            yield found, "E242 tab after '%s'" % m.group()[0]
        else:
            yield found, "E241 multiple spaces after '%s'" % m.group()[0]


@register_check
def whitespace_around_named_parameter_equals(logical_line, tokens):
    r"""Don't use spaces around the '=' sign in function arguments.

    Don't use spaces around the '=' sign when used to indicate a
    keyword argument or a default parameter value, except when
    using a type annotation.

    Okay: def complex(real, imag=0.0):
    Okay: return magic(r=real, i=imag)
    Okay: boolean(a == b)
    Okay: boolean(a != b)
    Okay: boolean(a <= b)
    Okay: boolean(a >= b)
    Okay: def foo(arg: int = 42):
    Okay: async def foo(arg: int = 42):

    E251: def complex(real, imag = 0.0):
    E251: return magic(r = real, i = imag)
    E252: def complex(real, image: float=0.0):
    """
    parens = 0
    no_space = False
    require_space = False
    prev_end = None
    annotated_func_arg = False
    in_def = bool(STARTSWITH_DEF_REGEX.match(logical_line))

    message = "E251 unexpected spaces around keyword / parameter equals"
    missing_message = "E252 missing whitespace around parameter equals"

    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.NL:
            continue
        if no_space:
            no_space = False
            if start != prev_end:
                yield (prev_end, message)
        if require_space:
            require_space = False
            if start == prev_end:
                yield (prev_end, missing_message)
        if token_type == tokenize.OP:
            if text in '([':
                parens += 1
            elif text in ')]':
                parens -= 1
            elif in_def and text == ':' and parens == 1:
                annotated_func_arg = True
            elif parens == 1 and text == ',':
                annotated_func_arg = False
            elif parens and text == '=':
                if annotated_func_arg and parens == 1:
                    require_space = True
                    if start == prev_end:
                        yield (prev_end, missing_message)
                else:
                    no_space = True
                    if start != prev_end:
                        yield (prev_end, message)
            if not parens:
                annotated_func_arg = False

        prev_end = end


@register_check
def whitespace_before_comment(logical_line, tokens):
    """Separate inline comments by at least two spaces.

    An inline comment is a comment on the same line as a statement.
    Inline comments should be separated by at least two spaces from the
    statement. They should start with a # and a single space.

    Each line of a block comment starts with a # and one or multiple
    spaces as there can be indented text inside the comment.

    Okay: x = x + 1  # Increment x
    Okay: x = x + 1    # Increment x
    Okay: # Block comments:
    Okay: #  - Block comment list
    Okay: # \xa0- Block comment list
    E261: x = x + 1 # Increment x
    E262: x = x + 1  #Increment x
    E262: x = x + 1  #  Increment x
    E262: x = x + 1  # \xa0Increment x
    E265: #Block comment
    E266: ### Block comment
    """
    prev_end = (0, 0)
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            inline_comment = line[:start[1]].strip()
            if inline_comment:
                if prev_end[0] == start[0] and start[1] < prev_end[1] + 2:
                    yield (prev_end,
                           "E261 at least two spaces before inline comment")
            symbol, sp, comment = text.partition(' ')
            bad_prefix = symbol not in '#:' and (symbol.lstrip('#')[:1] or '#')
            if inline_comment:
                if bad_prefix or comment[:1] in WHITESPACE:
                    yield start, "E262 inline comment should start with '# '"
            elif bad_prefix and (bad_prefix != '!' or start[0] > 1):
                if bad_prefix != '#':
                    yield start, "E265 block comment should start with '# '"
                elif comment:
                    yield start, "E266 too many leading '#' for block comment"
        elif token_type != tokenize.NL:
            prev_end = end


@register_check
def imports_on_separate_lines(logical_line):
    r"""Place imports on separate lines.

    Okay: import os\nimport sys
    E401: import sys, os

    Okay: from subprocess import Popen, PIPE
    Okay: from myclas import MyClass
    Okay: from foo.bar.yourclass import YourClass
    Okay: import myclass
    Okay: import foo.bar.yourclass
    """
    line = logical_line
    if line.startswith('import '):
        found = line.find(',')
        if -1 < found and ';' not in line[:found]:
            yield found, "E401 multiple imports on one line"


@register_check
def module_imports_on_top_of_file(
        logical_line, indent_level, checker_state, noqa):
    r"""Place imports at the top of the file.

    Always put imports at the top of the file, just after any module
    comments and docstrings, and before module globals and constants.

    Okay: import os
    Okay: # this is a comment\nimport os
    Okay: '''this is a module docstring'''\nimport os
    Okay: r'''this is a module docstring'''\nimport os
    E402: a=1\nimport os
    E402: 'One string'\n"Two string"\nimport os
    E402: a=1\nfrom sys import x

    Okay: if x:\n    import os
    """  # noqa
    def is_string_literal(line):
        if line[0] in 'uUbB':
            line = line[1:]
        if line and line[0] in 'rR':
            line = line[1:]
        return line and (line[0] == '"' or line[0] == "'")

    allowed_keywords = (
        'try', 'except', 'else', 'finally', 'with', 'if', 'elif')

    if indent_level:  # Allow imports in conditional statement/function
        return
    if not logical_line:  # Allow empty lines or comments
        return
    if noqa:
        return
    line = logical_line
    if line.startswith('import ') or line.startswith('from '):
        if checker_state.get('seen_non_imports', False):
            yield 0, "E402 module level import not at top of file"
    elif re.match(DUNDER_REGEX, line):
        return
    elif any(line.startswith(kw) for kw in allowed_keywords):
        # Allow certain keywords intermixed with imports in order to
        # support conditional or filtered importing
        return
    elif is_string_literal(line):
        # The first literal is a docstring, allow it. Otherwise, report
        # error.
        if checker_state.get('seen_docstring', False):
            checker_state['seen_non_imports'] = True
        else:
            checker_state['seen_docstring'] = True
    else:
        checker_state['seen_non_imports'] = True


@register_check
def compound_statements(logical_line):
    r"""Compound statements (on the same line) are generally
    discouraged.

    While sometimes it's okay to put an if/for/while with a small body
    on the same line, never do this for multi-clause statements.
    Also avoid folding such long lines!

    Always use a def statement instead of an assignment statement that
    binds a lambda expression directly to a name.

    Okay: if foo == 'blah':\n    do_blah_thing()
    Okay: do_one()
    Okay: do_two()
    Okay: do_three()

    E701: if foo == 'blah': do_blah_thing()
    E701: for x in lst: total += x
    E701: while t < 10: t = delay()
    E701: if foo == 'blah': do_blah_thing()
    E701: else: do_non_blah_thing()
    E701: try: something()
    E701: finally: cleanup()
    E701: if foo == 'blah': one(); two(); three()
    E702: do_one(); do_two(); do_three()
    E703: do_four();  # useless semicolon
    E704: def f(x): return 2*x
    E731: f = lambda x: 2*x
    """
    line = logical_line
    last_char = len(line) - 1
    found = line.find(':')
    prev_found = 0
    counts = {char: 0 for char in '{}[]()'}
    while -1 < found < last_char:
        update_counts(line[prev_found:found], counts)
        if (
                counts['{'] <= counts['}'] and  # {'a': 1} (dict)
                counts['['] <= counts[']'] and  # [1:2] (slice)
                counts['('] <= counts[')'] and  # (annotation)
                line[found + 1] != '='  # assignment expression
        ):
            lambda_kw = LAMBDA_REGEX.search(line, 0, found)
            if lambda_kw:
                before = line[:lambda_kw.start()].rstrip()
                if before[-1:] == '=' and before[:-1].strip().isidentifier():
                    yield 0, ("E731 do not assign a lambda expression, use a "
                              "def")
                break
            if STARTSWITH_DEF_REGEX.match(line):
                yield 0, "E704 multiple statements on one line (def)"
            elif STARTSWITH_INDENT_STATEMENT_REGEX.match(line):
                yield found, "E701 multiple statements on one line (colon)"
        prev_found = found
        found = line.find(':', found + 1)
    found = line.find(';')
    while -1 < found:
        if found < last_char:
            yield found, "E702 multiple statements on one line (semicolon)"
        else:
            yield found, "E703 statement ends with a semicolon"
        found = line.find(';', found + 1)


@register_check
def explicit_line_join(logical_line, tokens):
    r"""Avoid explicit line join between brackets.

    The preferred way of wrapping long lines is by using Python's
    implied line continuation inside parentheses, brackets and braces.
    Long lines can be broken over multiple lines by wrapping expressions
    in parentheses.  These should be used in preference to using a
    backslash for line continuation.

    E502: aaa = [123, \\n       123]
    E502: aaa = ("bbb " \\n       "ccc")

    Okay: aaa = [123,\n       123]
    Okay: aaa = ("bbb "\n       "ccc")
    Okay: aaa = "bbb " \\n    "ccc"
    Okay: aaa = 123  # \\
    """
    prev_start = prev_end = parens = 0
    comment = False
    backslash = None
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            comment = True
        if start[0] != prev_start and parens and backslash and not comment:
            yield backslash, "E502 the backslash is redundant between brackets"
        if end[0] != prev_end:
            if line.rstrip('\r\n').endswith('\\'):
                backslash = (end[0], len(line.splitlines()[-1]) - 1)
            else:
                backslash = None
            prev_start = prev_end = end[0]
        else:
            prev_start = start[0]
        if token_type == tokenize.OP:
            if text in '([{':
                parens += 1
            elif text in ')]}':
                parens -= 1


# The % character is strictly speaking a binary operator, but the
# common usage seems to be to put it next to the format parameters,
# after a line break.
_SYMBOLIC_OPS = frozenset("()[]{},:.;@=%~") | frozenset(("...",))


def _is_binary_operator(token_type, text):
    return (
        token_type == tokenize.OP or
        text in {'and', 'or'}
    ) and (
        text not in _SYMBOLIC_OPS
    )


def _break_around_binary_operators(tokens):
    """Private function to reduce duplication.

    This factors out the shared details between
    :func:`break_before_binary_operator` and
    :func:`break_after_binary_operator`.
    """
    line_break = False
    unary_context = True
    # Previous non-newline token types and text
    previous_token_type = None
    previous_text = None
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            continue
        if ('\n' in text or '\r' in text) and token_type != tokenize.STRING:
            line_break = True
        else:
            yield (token_type, text, previous_token_type, previous_text,
                   line_break, unary_context, start)
            unary_context = text in '([{,;'
            line_break = False
            previous_token_type = token_type
            previous_text = text


@register_check
def break_before_binary_operator(logical_line, tokens):
    r"""
    Avoid breaks before binary operators.

    The preferred place to break around a binary operator is after the
    operator, not before it.

    W503: (width == 0\n + height == 0)
    W503: (width == 0\n and height == 0)
    W503: var = (1\n       & ~2)
    W503: var = (1\n       / -2)
    W503: var = (1\n       + -1\n       + -2)

    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)
    """
    for context in _break_around_binary_operators(tokens):
        (token_type, text, previous_token_type, previous_text,
         line_break, unary_context, start) = context
        if (_is_binary_operator(token_type, text) and line_break and
                not unary_context and
                not _is_binary_operator(previous_token_type,
                                        previous_text)):
            yield start, "W503 line break before binary operator"


@register_check
def break_after_binary_operator(logical_line, tokens):
    r"""
    Avoid breaks after binary operators.

    The preferred place to break around a binary operator is before the
    operator, not after it.

    W504: (width == 0 +\n height == 0)
    W504: (width == 0 and\n height == 0)
    W504: var = (1 &\n       ~2)

    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: x = '' + '''\n'''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)

    The following should be W504 but unary_context is tricky with these
    Okay: var = (1 /\n       -2)
    Okay: var = (1 +\n       -1 +\n       -2)
    """
    prev_start = None
    for context in _break_around_binary_operators(tokens):
        (token_type, text, previous_token_type, previous_text,
         line_break, unary_context, start) = context
        if (_is_binary_operator(previous_token_type, previous_text) and
                line_break and
                not unary_context and
                not _is_binary_operator(token_type, text)):
            yield prev_start, "W504 line break after binary operator"
        prev_start = start


@register_check
def comparison_to_singleton(logical_line, noqa):
    r"""Comparison to singletons should use "is" or "is not".

    Comparisons to singletons like None should always be done
    with "is" or "is not", never the equality operators.

    Okay: if arg is not None:
    E711: if arg != None:
    E711: if None == arg:
    E712: if arg == True:
    E712: if False == arg:

    Also, beware of writing if x when you really mean if x is not None
    -- e.g. when testing whether a variable or argument that defaults to
    None was set to some other value.  The other value might have a type
    (such as a container) that could be false in a boolean context!
    """
    if noqa:
        return

    for match in COMPARE_SINGLETON_REGEX.finditer(logical_line):
        singleton = match.group(1) or match.group(3)
        same = (match.group(2) == '==')

        msg = "'if cond is %s:'" % (('' if same else 'not ') + singleton)
        if singleton in ('None',):
            code = 'E711'
        else:
            code = 'E712'
            nonzero = ((singleton == 'True' and same) or
                       (singleton == 'False' and not same))
            msg += " or 'if %scond:'" % ('' if nonzero else 'not ')
        yield match.start(2), ("%s comparison to %s should be %s" %
                               (code, singleton, msg))


@register_check
def comparison_negative(logical_line):
    r"""Negative comparison should be done using "not in" and "is not".

    Okay: if x not in y:\n    pass
    Okay: assert (X in Y or X is Z)
    Okay: if not (X in Y):\n    pass
    Okay: zz = x is not y
    E713: Z = not X in Y
    E713: if not X.B in Y:\n    pass
    E714: if not X is Y:\n    pass
    E714: Z = not X.B is Y
    """
    match = COMPARE_NEGATIVE_REGEX.search(logical_line)
    if match:
        pos = match.start(1)
        if match.group(2) == 'in':
            yield pos, "E713 test for membership should be 'not in'"
        else:
            yield pos, "E714 test for object identity should be 'is not'"


@register_check
def comparison_type(logical_line, noqa):
    r"""Object type comparisons should `is` / `is not` / `isinstance()`.

    Do not compare types directly.

    Okay: if isinstance(obj, int):
    Okay: if type(obj) is int:
    E721: if type(obj) == type(1):
    """
    match = COMPARE_TYPE_REGEX.search(logical_line)
    if match and not noqa:
        inst = match.group(1)
        if inst and inst.isidentifier() and inst not in SINGLETONS:
            return  # Allow comparison for types which are not obvious
        yield (
            match.start(),
            "E721 do not compare types, for exact checks use `is` / `is not`, "
            "for instance checks use `isinstance()`",
        )


@register_check
def bare_except(logical_line, noqa):
    r"""When catching exceptions, mention specific exceptions when
    possible.

    Okay: except Exception:
    Okay: except BaseException:
    E722: except:
    """
    if noqa:
        return

    match = BLANK_EXCEPT_REGEX.match(logical_line)
    if match:
        yield match.start(), "E722 do not use bare 'except'"


@register_check
def ambiguous_identifier(logical_line, tokens):
    r"""Never use the characters 'l', 'O', or 'I' as variable names.

    In some fonts, these characters are indistinguishable from the
    numerals one and zero. When tempted to use 'l', use 'L' instead.

    Okay: L = 0
    Okay: o = 123
    Okay: i = 42
    E741: l = 0
    E741: O = 123
    E741: I = 42

    Variables can be bound in several other contexts, including class
    and function definitions, lambda functions, 'global' and 'nonlocal'
    statements, exception handlers, and 'with' and 'for' statements.
    In addition, we have a special handling for function parameters.

    Okay: except AttributeError as o:
    Okay: with lock as L:
    Okay: foo(l=12)
    Okay: foo(l=I)
    Okay: for a in foo(l=12):
    Okay: lambda arg: arg * l
    Okay: lambda a=l[I:5]: None
    Okay: lambda x=a.I: None
    Okay: if l >= 12:
    E741: except AttributeError as O:
    E741: with lock as l:
    E741: global I
    E741: nonlocal l
    E741: def foo(l):
    E741: def foo(l=12):
    E741: l = foo(l=12)
    E741: for l in range(10):
    E741: [l for l in lines if l]
    E741: lambda l: None
    E741: lambda a=x[1:5], l: None
    E741: lambda **l:
    E741: def f(**l):
    E742: class I(object):
    E743: def l(x):
    """
    func_depth = None  # set to brace depth if 'def' or 'lambda' is found
    seen_colon = False  # set to true if we're done with function parameters
    brace_depth = 0
    idents_to_avoid = ('l', 'O', 'I')
    prev_type, prev_text, prev_start, prev_end, __ = tokens[0]
    for index in range(1, len(tokens)):
        token_type, text, start, end, line = tokens[index]
        ident = pos = None
        # find function definitions
        if prev_text in {'def', 'lambda'}:
            func_depth = brace_depth
            seen_colon = False
        elif (
                func_depth is not None and
                text == ':' and
                brace_depth == func_depth
        ):
            seen_colon = True
        # update parameter parentheses level
        if text in '([{':
            brace_depth += 1
        elif text in ')]}':
            brace_depth -= 1
        # identifiers on the lhs of an assignment operator
        if text == ':=' or (text == '=' and brace_depth == 0):
            if prev_text in idents_to_avoid:
                ident = prev_text
                pos = prev_start
        # identifiers bound to values with 'as', 'for',
        # 'global', or 'nonlocal'
        if prev_text in ('as', 'for', 'global', 'nonlocal'):
            if text in idents_to_avoid:
                ident = text
                pos = start
        # function / lambda parameter definitions
        if (
                func_depth is not None and
                not seen_colon and
                index < len(tokens) - 1 and tokens[index + 1][1] in ':,=)' and
                prev_text in {'lambda', ',', '*', '**', '('} and
                text in idents_to_avoid
        ):
            ident = text
            pos = start
        if prev_text == 'class':
            if text in idents_to_avoid:
                yield start, "E742 ambiguous class definition '%s'" % text
        if prev_text == 'def':
            if text in idents_to_avoid:
                yield start, "E743 ambiguous function definition '%s'" % text
        if ident:
            yield pos, "E741 ambiguous variable name '%s'" % ident
        prev_text = text
        prev_start = start


@register_check
def python_3000_invalid_escape_sequence(logical_line, tokens, noqa):
    r"""Invalid escape sequences are deprecated in Python 3.6.

    Okay: regex = r'\.png$'
    W605: regex = '\.png$'
    """
    if noqa:
        return

    # https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals
    valid = [
        '\n',
        '\\',
        '\'',
        '"',
        'a',
        'b',
        'f',
        'n',
        'r',
        't',
        'v',
        '0', '1', '2', '3', '4', '5', '6', '7',
        'x',

        # Escape sequences only recognized in string literals
        'N',
        'u',
        'U',
    ]

    prefixes = []
    for token_type, text, start, _, _ in tokens:
        if token_type in {tokenize.STRING, FSTRING_START}:
            # Extract string modifiers (e.g. u or r)
            prefixes.append(text[:text.index(text[-1])].lower())

        if token_type in {tokenize.STRING, FSTRING_MIDDLE}:
            if 'r' not in prefixes[-1]:
                start_line, start_col = start
                pos = text.find('\\')
                while pos >= 0:
                    pos += 1
                    if text[pos] not in valid:
                        line = start_line + text.count('\n', 0, pos)
                        if line == start_line:
                            col = start_col + pos
                        else:
                            col = pos - text.rfind('\n', 0, pos) - 1
                        yield (
                            (line, col - 1),
                            f"W605 invalid escape sequence '\\{text[pos]}'"
                        )
                    pos = text.find('\\', pos + 1)

        if token_type in {tokenize.STRING, FSTRING_END}:
            prefixes.pop()


########################################################################
@register_check
def maximum_doc_length(logical_line, max_doc_length, noqa, tokens):
    r"""Limit all doc lines to a maximum of 72 characters.

    For flowing long blocks of text (docstrings or comments), limiting
    the length to 72 characters is recommended.

    Reports warning W505
    """
    if max_doc_length is None or noqa:
        return

    prev_token = None
    skip_lines = set()
    # Skip lines that
    for token_type, text, start, end, line in tokens:
        if token_type not in SKIP_COMMENTS.union([tokenize.STRING]):
            skip_lines.add(line)

    for token_type, text, start, end, line in tokens:
        # Skip lines that aren't pure strings
        if token_type == tokenize.STRING and skip_lines:
            continue
        if token_type in (tokenize.STRING, tokenize.COMMENT):
            # Only check comment-only lines
            if prev_token is None or prev_token in SKIP_TOKENS:
                lines = line.splitlines()
                for line_num, physical_line in enumerate(lines):
                    if start[0] + line_num == 1 and line.startswith('#!'):
                        return
                    length = len(physical_line)
                    chunks = physical_line.split()
                    if token_type == tokenize.COMMENT:
                        if (len(chunks) == 2 and
                                length - len(chunks[-1]) < MAX_DOC_LENGTH):
                            continue
                    if len(chunks) == 1 and line_num + 1 < len(lines):
                        if (len(chunks) == 1 and
                                length - len(chunks[-1]) < MAX_DOC_LENGTH):
                            continue
                    if length > max_doc_length:
                        doc_error = (start[0] + line_num, max_doc_length)
                        yield (doc_error, "W505 doc line too long "
                                          "(%d > %d characters)"
                               % (length, max_doc_length))
        prev_token = token_type


########################################################################
# Helper functions
########################################################################


def readlines(filename):
    """Read the source code."""
    try:
        with tokenize.open(filename) as f:
            return f.readlines()
    except (LookupError, SyntaxError, UnicodeError):
        # Fall back if file encoding is improperly declared
        with open(filename, encoding='latin-1') as f:
            return f.readlines()


def stdin_get_value():
    """Read the value from stdin."""
    return io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='ignore').read()


noqa = lru_cache(512)(re.compile(r'# no(?:qa|pep8)\b', re.I).search)


def expand_indent(line):
    r"""Return the amount of indentation.

    Tabs are expanded to the next multiple of 8.
    """
    line = line.rstrip('\n\r')
    if '\t' not in line:
        return len(line) - len(line.lstrip())
    result = 0
    for char in line:
        if char == '\t':
            result = result // 8 * 8 + 8
        elif char == ' ':
            result += 1
        else:
            break
    return result


def mute_string(text):
    """Replace contents with 'xxx' to prevent syntax matching."""
    # String modifiers (e.g. u or r)
    start = text.index(text[-1]) + 1
    end = len(text) - 1
    # Triple quotes
    if text[-3:] in ('"""', "'''"):
        start += 2
        end -= 2
    return text[:start] + 'x' * (end - start) + text[end:]


def parse_udiff(diff, patterns=None, parent='.'):
    """Return a dictionary of matching lines."""
    # For each file of the diff, the entry key is the filename,
    # and the value is a set of row numbers to consider.
    rv = {}
    path = nrows = None
    for line in diff.splitlines():
        if nrows:
            if line[:1] != '-':
                nrows -= 1
            continue
        if line[:3] == '@@ ':
            hunk_match = HUNK_REGEX.match(line)
            (row, nrows) = (int(g or '1') for g in hunk_match.groups())
            rv[path].update(range(row, row + nrows))
        elif line[:3] == '+++':
            path = line[4:].split('\t', 1)[0]
            # Git diff will use (i)ndex, (w)ork tree, (c)ommit and
            # (o)bject instead of a/b/c/d as prefixes for patches
            if path[:2] in ('b/', 'w/', 'i/'):
                path = path[2:]
            rv[path] = set()
    return {
        os.path.join(parent, filepath): rows
        for (filepath, rows) in rv.items()
        if rows and filename_match(filepath, patterns)
    }


def normalize_paths(value, parent=os.curdir):
    """Parse a comma-separated list of paths.

    Return a list of absolute paths.
    """
    if not value:
        return []
    if isinstance(value, list):
        return value
    paths = []
    for path in value.split(','):
        path = path.strip()
        if '/' in path:
            path = os.path.abspath(os.path.join(parent, path))
        paths.append(path.rstrip('/'))
    return paths


def filename_match(filename, patterns, default=True):
    """Check if patterns contains a pattern that matches filename.

    If patterns is unspecified, this always returns True.
    """
    if not patterns:
        return default
    return any(fnmatch(filename, pattern) for pattern in patterns)


def update_counts(s, counts):
    r"""Adds one to the counts of each appearance of characters in s,
        for characters in counts"""
    for char in s:
        if char in counts:
            counts[char] += 1


def _is_eol_token(token):
    return token[0] in NEWLINE or token[4][token[3][1]:].lstrip() == '\\\n'


########################################################################
# Framework to run all checks
########################################################################


class Checker:
    """Load a Python source file, tokenize it, check coding style."""

    def __init__(self, filename=None, lines=None,
                 options=None, report=None, **kwargs):
        if options is None:
            options = StyleGuide(kwargs).options
        else:
            assert not kwargs
        self._io_error = None
        self._physical_checks = options.physical_checks
        self._logical_checks = options.logical_checks
        self._ast_checks = options.ast_checks
        self.max_line_length = options.max_line_length
        self.max_doc_length = options.max_doc_length
        self.indent_size = options.indent_size
        self.fstring_start = 0
        self.multiline = False  # in a multiline string?
        self.hang_closing = options.hang_closing
        self.indent_size = options.indent_size
        self.verbose = options.verbose
        self.filename = filename
        # Dictionary where a checker can store its custom state.
        self._checker_states = {}
        if filename is None:
            self.filename = 'stdin'
            self.lines = lines or []
        elif filename == '-':
            self.filename = 'stdin'
            self.lines = stdin_get_value().splitlines(True)
        elif lines is None:
            try:
                self.lines = readlines(filename)
            except OSError:
                (exc_type, exc) = sys.exc_info()[:2]
                self._io_error = f'{exc_type.__name__}: {exc}'
                self.lines = []
        else:
            self.lines = lines
        if self.lines:
            ord0 = ord(self.lines[0][0])
            if ord0 in (0xef, 0xfeff):  # Strip the UTF-8 BOM
                if ord0 == 0xfeff:
                    self.lines[0] = self.lines[0][1:]
                elif self.lines[0][:3] == '\xef\xbb\xbf':
                    self.lines[0] = self.lines[0][3:]
        self.report = report or options.report
        self.report_error = self.report.error
        self.noqa = False

    def report_invalid_syntax(self):
        """Check if the syntax is valid."""
        (exc_type, exc) = sys.exc_info()[:2]
        if len(exc.args) > 1:
            offset = exc.args[1]
            if len(offset) > 2:
                offset = offset[1:3]
        else:
            offset = (1, 0)
        self.report_error(offset[0], offset[1] or 0,
                          f'E901 {exc_type.__name__}: {exc.args[0]}',
                          self.report_invalid_syntax)

    def readline(self):
        """Get the next line from the input buffer."""
        if self.line_number >= self.total_lines:
            return ''
        line = self.lines[self.line_number]
        self.line_number += 1
        if self.indent_char is None and line[:1] in WHITESPACE:
            self.indent_char = line[0]
        return line

    def run_check(self, check, argument_names):
        """Run a check plugin."""
        arguments = []
        for name in argument_names:
            arguments.append(getattr(self, name))
        return check(*arguments)

    def init_checker_state(self, name, argument_names):
        """Prepare custom state for the specific checker plugin."""
        if 'checker_state' in argument_names:
            self.checker_state = self._checker_states.setdefault(name, {})

    def check_physical(self, line):
        """Run all physical checks on a raw input line."""
        self.physical_line = line
        for name, check, argument_names in self._physical_checks:
            self.init_checker_state(name, argument_names)
            result = self.run_check(check, argument_names)
            if result is not None:
                (offset, text) = result
                self.report_error(self.line_number, offset, text, check)
                if text[:4] == 'E101':
                    self.indent_char = line[0]

    def build_tokens_line(self):
        """Build a logical line from tokens."""
        logical = []
        comments = []
        length = 0
        prev_row = prev_col = mapping = None
        for token_type, text, start, end, line in self.tokens:
            if token_type in SKIP_TOKENS:
                continue
            if not mapping:
                mapping = [(0, start)]
            if token_type == tokenize.COMMENT:
                comments.append(text)
                continue
            if token_type == tokenize.STRING:
                text = mute_string(text)
            elif token_type == FSTRING_MIDDLE:  # pragma: >=3.12 cover
                text = 'x' * len(text)
            if prev_row:
                (start_row, start_col) = start
                if prev_row != start_row:    # different row
                    prev_text = self.lines[prev_row - 1][prev_col - 1]
                    if prev_text == ',' or (prev_text not in '{[(' and
                                            text not in '}])'):
                        text = ' ' + text
                elif prev_col != start_col:  # different column
                    text = line[prev_col:start_col] + text
            logical.append(text)
            length += len(text)
            mapping.append((length, end))
            (prev_row, prev_col) = end
        self.logical_line = ''.join(logical)
        self.noqa = comments and noqa(''.join(comments))
        return mapping

    def check_logical(self):
        """Build a line from tokens and run all logical checks on it."""
        self.report.increment_logical_line()
        mapping = self.build_tokens_line()
        if not mapping:
            return

        mapping_offsets = [offset for offset, _ in mapping]
        (start_row, start_col) = mapping[0][1]
        start_line = self.lines[start_row - 1]
        self.indent_level = expand_indent(start_line[:start_col])
        if self.blank_before < self.blank_lines:
            self.blank_before = self.blank_lines
        if self.verbose >= 2:
            print(self.logical_line[:80].rstrip())
        for name, check, argument_names in self._logical_checks:
            if self.verbose >= 4:
                print('   ' + name)
            self.init_checker_state(name, argument_names)
            for offset, text in self.run_check(check, argument_names) or ():
                if not isinstance(offset, tuple):
                    # As mappings are ordered, bisecting is a fast way
                    # to find a given offset in them.
                    token_offset, pos = mapping[bisect.bisect_left(
                        mapping_offsets, offset)]
                    offset = (pos[0], pos[1] + offset - token_offset)
                self.report_error(offset[0], offset[1], text, check)
        if self.logical_line:
            self.previous_indent_level = self.indent_level
            self.previous_logical = self.logical_line
            if not self.indent_level:
                self.previous_unindented_logical_line = self.logical_line
        self.blank_lines = 0
        self.tokens = []

    def check_ast(self):
        """Build the file's AST and run all AST checks."""
        try:
            tree = compile(''.join(self.lines), '', 'exec', PyCF_ONLY_AST)
        except (ValueError, SyntaxError, TypeError):
            return self.report_invalid_syntax()
        for name, cls, __ in self._ast_checks:
            checker = cls(tree, self.filename)
            for lineno, offset, text, check in checker.run():
                if not self.lines or not noqa(self.lines[lineno - 1]):
                    self.report_error(lineno, offset, text, check)

    def generate_tokens(self):
        """Tokenize file, run physical line checks and yield tokens."""
        if self._io_error:
            self.report_error(1, 0, 'E902 %s' % self._io_error, readlines)
        tokengen = tokenize.generate_tokens(self.readline)
        try:
            prev_physical = ''
            for token in tokengen:
                if token[2][0] > self.total_lines:
                    return
                self.noqa = token[4] and noqa(token[4])
                self.maybe_check_physical(token, prev_physical)
                yield token
                prev_physical = token[4]
        except (SyntaxError, tokenize.TokenError):
            self.report_invalid_syntax()

    def maybe_check_physical(self, token, prev_physical):
        """If appropriate for token, check current physical line(s)."""
        # Called after every token, but act only on end of line.

        if token.type == FSTRING_START:  # pragma: >=3.12 cover
            self.fstring_start = token.start[0]
        # a newline token ends a single physical line.
        elif _is_eol_token(token):
            # if the file does not end with a newline, the NEWLINE
            # token is inserted by the parser, but it does not contain
            # the previous physical line in `token[4]`
            if token.line == '':
                self.check_physical(prev_physical)
            else:
                self.check_physical(token.line)
        elif (
                token.type == tokenize.STRING and '\n' in token.string or
                token.type == FSTRING_END
        ):
            # Less obviously, a string that contains newlines is a
            # multiline string, either triple-quoted or with internal
            # newlines backslash-escaped. Check every physical line in
            # the string *except* for the last one: its newline is
            # outside of the multiline string, so we consider it a
            # regular physical line, and will check it like any other
            # physical line.
            #
            # Subtleties:
            # - we don't *completely* ignore the last line; if it
            #   contains the magical "# noqa" comment, we disable all
            #   physical checks for the entire multiline string
            # - have to wind self.line_number back because initially it
            #   points to the last line of the string, and we want
            #   check_physical() to give accurate feedback
            if noqa(token.line):
                return
            if token.type == FSTRING_END:  # pragma: >=3.12 cover
                start = self.fstring_start
            else:
                start = token.start[0]
            end = token.end[0]

            self.multiline = True
            self.line_number = start
            for line_number in range(start, end):
                self.check_physical(self.lines[line_number - 1] + '\n')
                self.line_number += 1
            self.multiline = False

    def check_all(self, expected=None, line_offset=0):
        """Run all checks on the input file."""
        self.report.init_file(self.filename, self.lines, expected, line_offset)
        self.total_lines = len(self.lines)
        if self._ast_checks:
            self.check_ast()
        self.line_number = 0
        self.indent_char = None
        self.indent_level = self.previous_indent_level = 0
        self.previous_logical = ''
        self.previous_unindented_logical_line = ''
        self.tokens = []
        self.blank_lines = self.blank_before = 0
        parens = 0
        for token in self.generate_tokens():
            self.tokens.append(token)
            token_type, text = token[0:2]
            if self.verbose >= 3:
                if token[2][0] == token[3][0]:
                    pos = '[{}:{}]'.format(token[2][1] or '', token[3][1])
                else:
                    pos = 'l.%s' % token[3][0]
                print('l.%s\t%s\t%s\t%r' %
                      (token[2][0], pos, tokenize.tok_name[token[0]], text))
            if token_type == tokenize.OP:
                if text in '([{':
                    parens += 1
                elif text in '}])':
                    parens -= 1
            elif not parens:
                if token_type in NEWLINE:
                    if token_type == tokenize.NEWLINE:
                        self.check_logical()
                        self.blank_before = 0
                    elif len(self.tokens) == 1:
                        # The physical line contains only this token.
                        self.blank_lines += 1
                        del self.tokens[0]
                    else:
                        self.check_logical()
        if self.tokens:
            self.check_physical(self.lines[-1])
            self.check_logical()
        return self.report.get_file_results()


class BaseReport:
    """Collect the results of the checks."""

    print_filename = False

    def __init__(self, options):
        self._benchmark_keys = options.benchmark_keys
        self._ignore_code = options.ignore_code
        # Results
        self.elapsed = 0
        self.total_errors = 0
        self.counters = dict.fromkeys(self._benchmark_keys, 0)
        self.messages = {}

    def start(self):
        """Start the timer."""
        self._start_time = time.time()

    def stop(self):
        """Stop the timer."""
        self.elapsed = time.time() - self._start_time

    def init_file(self, filename, lines, expected, line_offset):
        """Signal a new file."""
        self.filename = filename
        self.lines = lines
        self.expected = expected or ()
        self.line_offset = line_offset
        self.file_errors = 0
        self.counters['files'] += 1
        self.counters['physical lines'] += len(lines)

    def increment_logical_line(self):
        """Signal a new logical line."""
        self.counters['logical lines'] += 1

    def error(self, line_number, offset, text, check):
        """Report an error, according to options."""
        code = text[:4]
        if self._ignore_code(code):
            return
        if code in self.counters:
            self.counters[code] += 1
        else:
            self.counters[code] = 1
            self.messages[code] = text[5:]
        # Don't care about expected errors or warnings
        if code in self.expected:
            return
        if self.print_filename and not self.file_errors:
            print(self.filename)
        self.file_errors += 1
        self.total_errors += 1
        return code

    def get_file_results(self):
        """Return the count of errors and warnings for this file."""
        return self.file_errors

    def get_count(self, prefix=''):
        """Return the total count of errors and warnings."""
        return sum(self.counters[key]
                   for key in self.messages if key.startswith(prefix))

    def get_statistics(self, prefix=''):
        """Get statistics for message codes that start with the prefix.

        prefix='' matches all errors and warnings
        prefix='E' matches all errors
        prefix='W' matches all warnings
        prefix='E4' matches all errors that have to do with imports
        """
        return ['%-7s %s %s' % (self.counters[key], key, self.messages[key])
                for key in sorted(self.messages) if key.startswith(prefix)]

    def print_statistics(self, prefix=''):
        """Print overall statistics (number of errors and warnings)."""
        for line in self.get_statistics(prefix):
            print(line)

    def print_benchmark(self):
        """Print benchmark numbers."""
        print('{:<7.2f} {}'.format(self.elapsed, 'seconds elapsed'))
        if self.elapsed:
            for key in self._benchmark_keys:
                print('%-7d %s per second (%d total)' %
                      (self.counters[key] / self.elapsed, key,
                       self.counters[key]))


class FileReport(BaseReport):
    """Collect the results of the checks and print the filenames."""

    print_filename = True


class StandardReport(BaseReport):
    """Collect and print the results of the checks."""

    def __init__(self, options):
        super().__init__(options)
        self._fmt = REPORT_FORMAT.get(options.format.lower(),
                                      options.format)
        self._repeat = options.repeat
        self._show_source = options.show_source
        self._show_pep8 = options.show_pep8

    def init_file(self, filename, lines, expected, line_offset):
        """Signal a new file."""
        self._deferred_print = []
        return super().init_file(
            filename, lines, expected, line_offset)

    def error(self, line_number, offset, text, check):
        """Report an error, according to options."""
        code = super().error(line_number, offset, text, check)
        if code and (self.counters[code] == 1 or self._repeat):
            self._deferred_print.append(
                (line_number, offset, code, text[5:], check.__doc__))
        return code

    def get_file_results(self):
        """Print results and return the overall count for this file."""
        self._deferred_print.sort()
        for line_number, offset, code, text, doc in self._deferred_print:
            print(self._fmt % {
                'path': self.filename,
                'row': self.line_offset + line_number, 'col': offset + 1,
                'code': code, 'text': text,
            })
            if self._show_source:
                if line_number > len(self.lines):
                    line = ''
                else:
                    line = self.lines[line_number - 1]
                print(line.rstrip())
                print(re.sub(r'\S', ' ', line[:offset]) + '^')
            if self._show_pep8 and doc:
                print('    ' + doc.strip())

            # stdout is block buffered when not stdout.isatty().
            # line can be broken where buffer boundary since other
            # processes write to same file.
            # flush() after print() to avoid buffer boundary.
            # Typical buffer size is 8192. line written safely when
            # len(line) < 8192.
            sys.stdout.flush()
        return self.file_errors


class DiffReport(StandardReport):
    """Collect and print the results for the changed lines only."""

    def __init__(self, options):
        super().__init__(options)
        self._selected = options.selected_lines

    def error(self, line_number, offset, text, check):
        if line_number not in self._selected[self.filename]:
            return
        return super().error(line_number, offset, text, check)


class StyleGuide:
    """Initialize a PEP-8 instance with few options."""

    def __init__(self, *args, **kwargs):
        # build options from the command line
        self.checker_class = kwargs.pop('checker_class', Checker)
        parse_argv = kwargs.pop('parse_argv', False)
        config_file = kwargs.pop('config_file', False)
        parser = kwargs.pop('parser', None)
        # build options from dict
        options_dict = dict(*args, **kwargs)
        arglist = None if parse_argv else options_dict.get('paths', None)
        verbose = options_dict.get('verbose', None)
        options, self.paths = process_options(
            arglist, parse_argv, config_file, parser, verbose)
        if options_dict:
            options.__dict__.update(options_dict)
            if 'paths' in options_dict:
                self.paths = options_dict['paths']

        self.runner = self.input_file
        self.options = options

        if not options.reporter:
            options.reporter = BaseReport if options.quiet else StandardReport

        options.select = tuple(options.select or ())
        if not (options.select or options.ignore) and DEFAULT_IGNORE:
            # The default choice: ignore controversial checks
            options.ignore = tuple(DEFAULT_IGNORE.split(','))
        else:
            # Ignore all checks which are not explicitly selected
            options.ignore = ('',) if options.select else tuple(options.ignore)
        options.benchmark_keys = BENCHMARK_KEYS[:]
        options.ignore_code = self.ignore_code
        options.physical_checks = self.get_checks('physical_line')
        options.logical_checks = self.get_checks('logical_line')
        options.ast_checks = self.get_checks('tree')
        self.init_report()

    def init_report(self, reporter=None):
        """Initialize the report instance."""
        self.options.report = (reporter or self.options.reporter)(self.options)
        return self.options.report

    def check_files(self, paths=None):
        """Run all checks on the paths."""
        if paths is None:
            paths = self.paths
        report = self.options.report
        runner = self.runner
        report.start()
        try:
            for path in paths:
                if os.path.isdir(path):
                    self.input_dir(path)
                elif not self.excluded(path):
                    runner(path)
        except KeyboardInterrupt:
            print('... stopped')
        report.stop()
        return report

    def input_file(self, filename, lines=None, expected=None, line_offset=0):
        """Run all checks on a Python source file."""
        if self.options.verbose:
            print('checking %s' % filename)
        fchecker = self.checker_class(
            filename, lines=lines, options=self.options)
        return fchecker.check_all(expected=expected, line_offset=line_offset)

    def input_dir(self, dirname):
        """Check all files in this directory and all subdirectories."""
        dirname = dirname.rstrip('/')
        if self.excluded(dirname):
            return 0
        counters = self.options.report.counters
        verbose = self.options.verbose
        filepatterns = self.options.filename
        runner = self.runner
        for root, dirs, files in os.walk(dirname):
            if verbose:
                print('directory ' + root)
            counters['directories'] += 1
            for subdir in sorted(dirs):
                if self.excluded(subdir, root):
                    dirs.remove(subdir)
            for filename in sorted(files):
                # contain a pattern that matches?
                if (
                    filename_match(filename, filepatterns) and
                    not self.excluded(filename, root)
                ):
                    runner(os.path.join(root, filename))

    def excluded(self, filename, parent=None):
        """Check if the file should be excluded.

        Check if 'options.exclude' contains a pattern matching filename.
        """
        if not self.options.exclude:
            return False
        basename = os.path.basename(filename)
        if filename_match(basename, self.options.exclude):
            return True
        if parent:
            filename = os.path.join(parent, filename)
        filename = os.path.abspath(filename)
        return filename_match(filename, self.options.exclude)

    def ignore_code(self, code):
        """Check if the error code should be ignored.

        If 'options.select' contains a prefix of the error code,
        return False.  Else, if 'options.ignore' contains a prefix of
        the error code, return True.
        """
        if len(code) < 4 and any(s.startswith(code)
                                 for s in self.options.select):
            return False
        return (code.startswith(self.options.ignore) and
                not code.startswith(self.options.select))

    def get_checks(self, argument_name):
        """Get all the checks for this category.

        Find all globally visible functions where the first argument
        name starts with argument_name and which contain selected tests.
        """
        checks = []
        for check, attrs in _checks[argument_name].items():
            (codes, args) = attrs
            if any(not (code and self.ignore_code(code)) for code in codes):
                checks.append((check.__name__, check, args))
        return sorted(checks)


def get_parser(prog='pycodestyle', version=__version__):
    """Create the parser for the program."""
    parser = OptionParser(prog=prog, version=version,
                          usage="%prog [options] input ...")
    parser.config_options = [
        'exclude', 'filename', 'select', 'ignore', 'max-line-length',
        'max-doc-length', 'indent-size', 'hang-closing', 'count', 'format',
        'quiet', 'show-pep8', 'show-source', 'statistics', 'verbose']
    parser.add_option('-v', '--verbose', default=0, action='count',
                      help="print status messages, or debug with -vv")
    parser.add_option('-q', '--quiet', default=0, action='count',
                      help="report only file names, or nothing with -qq")
    parser.add_option('-r', '--repeat', default=True, action='store_true',
                      help="(obsolete) show all occurrences of the same error")
    parser.add_option('--first', action='store_false', dest='repeat',
                      help="show first occurrence of each error")
    parser.add_option('--exclude', metavar='patterns', default=DEFAULT_EXCLUDE,
                      help="exclude files or directories which match these "
                           "comma separated patterns (default: %default)")
    parser.add_option('--filename', metavar='patterns', default='*.py',
                      help="when parsing directories, only check filenames "
                           "matching these comma separated patterns "
                           "(default: %default)")
    parser.add_option('--select', metavar='errors', default='',
                      help="select errors and warnings (e.g. E,W6)")
    parser.add_option('--ignore', metavar='errors', default='',
                      help="skip errors and warnings (e.g. E4,W) "
                           "(default: %s)" % DEFAULT_IGNORE)
    parser.add_option('--show-source', action='store_true',
                      help="show source code for each error")
    parser.add_option('--show-pep8', action='store_true',
                      help="show text of PEP 8 for each error "
                           "(implies --first)")
    parser.add_option('--statistics', action='store_true',
                      help="count errors and warnings")
    parser.add_option('--count', action='store_true',
                      help="print total number of errors and warnings "
                           "to standard error and set exit code to 1 if "
                           "total is not null")
    parser.add_option('--max-line-length', type='int', metavar='n',
                      default=MAX_LINE_LENGTH,
                      help="set maximum allowed line length "
                           "(default: %default)")
    parser.add_option('--max-doc-length', type='int', metavar='n',
                      default=None,
                      help="set maximum allowed doc line length and perform "
                           "these checks (unchecked if not set)")
    parser.add_option('--indent-size', type='int', metavar='n',
                      default=INDENT_SIZE,
                      help="set how many spaces make up an indent "
                           "(default: %default)")
    parser.add_option('--hang-closing', action='store_true',
                      help="hang closing bracket instead of matching "
                           "indentation of opening bracket's line")
    parser.add_option('--format', metavar='format', default='default',
                      help="set the error format [default|pylint|<custom>]")
    parser.add_option('--diff', action='store_true',
                      help="report changes only within line number ranges in "
                           "the unified diff received on STDIN")
    group = parser.add_option_group("Testing Options")
    group.add_option('--benchmark', action='store_true',
                     help="measure processing speed")
    return parser


def read_config(options, args, arglist, parser):
    """Read and parse configurations.

    If a config file is specified on the command line with the
    "--config" option, then only it is used for configuration.

    Otherwise, the user configuration (~/.config/pycodestyle) and any
    local configurations in the current directory or above will be
    merged together (in that order) using the read method of
    ConfigParser.
    """
    config = configparser.RawConfigParser()

    cli_conf = options.config

    local_dir = os.curdir

    if USER_CONFIG and os.path.i+ sed -i '1 i #!/usr/bin/env python3' /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle-2.10.0.py
+ tail -n +2 /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle.py
+ sed -i '1 i #!/usr/bin/env python3' /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle.py
+ /usr/lib/rpm/check-buildroot
sfile(USER_CONFIG):
        if options.verbose:
            print('user configuration: %s' % USER_CONFIG)
        config.read(USER_CONFIG)

    parent = tail = args and os.path.abspath(os.path.commonprefix(args))
    while tail:
        if config.read(os.path.join(parent, fn) for fn in PROJECT_CONFIG):
            local_dir = parent
            if options.verbose:
                print('local configuration: in %s' % parent)
            break
        (parent, tail) = os.path.split(parent)

    if cli_conf and os.path.isfile(cli_conf):
        if options.verbose:
            print('cli configuration: %s' % cli_conf)
        config.read(cli_conf)

    pycodestyle_section = None
    if config.has_section(parser.prog):
        pycodestyle_section = parser.prog
    elif config.has_section('pep8'):
        pycodestyle_section = 'pep8'  # Deprecated
        warnings.warn('[pep8] section is deprecated. Use [pycodestyle].')

    if pycodestyle_section:
        option_list = {o.dest: o.type or o.action for o in parser.option_list}

        # First, read the default values
        (new_options, __) = parser.parse_args([])

        # Second, parse the configuration
        for opt in config.options(pycodestyle_section):
            if opt.replace('_', '-') not in parser.config_options:
                print("  unknown option '%s' ignored" % opt)
                continue
            if options.verbose > 1:
                print("  {} = {}".format(opt,
                                         config.get(pycodestyle_section, opt)))
            normalized_opt = opt.replace('-', '_')
            opt_type = option_list[normalized_opt]
            if opt_type in ('int', 'count'):
                value = config.getint(pycodestyle_section, opt)
            elif opt_type in ('store_true', 'store_false'):
                value = config.getboolean(pycodestyle_section, opt)
            else:
                value = config.get(pycodestyle_section, opt)
                if normalized_opt == 'exclude':
                    value = normalize_paths(value, local_dir)
            setattr(new_options, normalized_opt, value)

        # Third, overwrite with the command-line options
        (options, __) = parser.parse_args(arglist, values=new_options)
    return options


def process_options(arglist=None, parse_argv=False, config_file=None,
                    parser=None, verbose=None):
    """Process options passed either via arglist or command line args.

    Passing in the ``config_file`` parameter allows other tools, such as
    flake8 to specify their own options to be processed in pycodestyle.
    """
    if not parser:
        parser = get_parser()
    if not parser.has_option('--config'):
        group = parser.add_option_group("Configuration", description=(
            "The project options are read from the [%s] section of the "
            "tox.ini file or the setup.cfg file located in any parent folder "
            "of the path(s) being processed.  Allowed options are: %s." %
            (parser.prog, ', '.join(parser.config_options))))
        group.add_option('--config', metavar='path', default=config_file,
                         help="user config file location")
    # Don't read the command line if the module is used as a library.
    if not arglist and not parse_argv:
        arglist = []
    # If parse_argv is True and arglist is None, arguments are
    # parsed from the command line (sys.argv)
    (options, args) = parser.parse_args(arglist)
    options.reporter = None

    # If explicitly specified verbosity, override any `-v` CLI flag
    if verbose is not None:
        options.verbose = verbose

    if parse_argv and not args:
        if options.diff or any(os.path.exists(name)
                               for name in PROJECT_CONFIG):
            args = ['.']
        else:
            parser.error('input not specified')
    options = read_config(options, args, arglist, parser)
    options.reporter = parse_argv and options.quiet == 1 and FileReport

    options.filename = _parse_multi_options(options.filename)
    options.exclude = normalize_paths(options.exclude)
    options.select = _parse_multi_options(options.select)
    options.ignore = _parse_multi_options(options.ignore)

    if options.diff:
        options.reporter = DiffReport
        stdin = stdin_get_value()
        options.selected_lines = parse_udiff(stdin, options.filename, args[0])
        args = sorted(options.selected_lines)

    return options, args


def _parse_multi_options(options, split_token=','):
    r"""Split and strip and discard empties.

    Turns the following:

    A,
    B,

    into ["A", "B"]
    """
    if options:
        return [o.strip() for o in options.split(split_token) if o.strip()]
    else:
        return options


def _main():
    """Parse options and run checks on Python source."""
    import signal

    # Handle "Broken pipe" gracefully
    try:
        signal.signal(signal.SIGPIPE, lambda signum, frame: sys.exit(1))
    except AttributeError:
        pass    # not supported on Windows

    style_guide = StyleGuide(parse_argv=True)
    options = style_guide.options

    report = style_guide.check_files()

    if options.statistics:
        report.print_statistics()

    if options.benchmark:
        report.print_benchmark()

    if report.total_errors:
        if options.count:
            sys.stderr.write(str(report.total_errors) + '\n')
        sys.exit(1)


if __name__ == '__main__':
    _main()
+ /usr/lib/rpm/redhat/brp-ldconfig
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-strip /bin/true
+ /usr/lib/rpm/brp-strip-comment-note /bin/true /usr/bin/objdump
+ /usr/lib/rpm/redhat/brp-strip-lto /bin/true
+ /usr/lib/rpm/brp-strip-static-archive /bin/true
+ /usr/lib/rpm/redhat/brp-mangle-shebangs
mangling shebang in /usr/share/java/pycharm-community/bin/pycharm.sh from /bin/sh to #!/usr/bin/sh
mangling shebang in /usr/share/java/pycharm-community/bin/inspect.sh from /bin/sh to #!/usr/bin/sh
mangling shebang in /usr/share/java/pycharm-community/bin/format.sh from /bin/sh to #!/usr/bin/sh
mangling shebang in /usr/share/java/pycharm-community/bin/jetbrains_client.sh from /bin/sh to #!/usr/bin/sh
mangling shebang in /usr/share/java/pycharm-community/bin/ltedit.sh from /bin/sh to #!/usr/bin/sh
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle.py from /usr/bin/env python3 to #!/usr/bin/python3
*** WARNING: ./usr/share/java/pycharm-community/plugins/python-ce/helpers/pockets/autolog.py is executable but has no shebang, removing executable bit
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/py3only/docutils/writers/odf_odt/prepstyles.py from /usr/bin/env python3 to #!/usr/bin/python3
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/py3only/docutils/utils/math/math2html.py from /usr/bin/env python3 to #!/usr/bin/python3
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/pydev/pydevd_attach_to_process/linux_and_mac/compile_linux_aarch64.sh from /bin/bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/pydev/pydevd_attach_to_process/linux_and_mac/compile_linux.sh from /bin/bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/pydev/pydevd_attach_to_process/linux_and_mac/compile_mac.sh from /bin/bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/typeshed/scripts/sync_s2clientprotocol_protobuf_stubs.sh from /bin/bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/typeshed/scripts/generate_proto_stubs.sh from /usr/bin/env bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/typeshed/scripts/sync_tensorflow_protobuf_stubs.sh from /bin/bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle-2.10.0.py from /usr/bin/env python3 to #!/usr/bin/python3
+ /usr/lib/rpm/brp-remove-la-files
+ env
SHELL=/bin/bash
RPM_SOURCE_DIR=/builddir/build/SOURCES
HISTCONTROL=ignoredups
PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig
HOSTNAME=3b610ea3384449238042182232e19ab2
HISTSIZE=1000
RPM_SPECPARTS_DIR=/builddir/build/BUILD/pycharm-community-2024.3-SPECPARTS
container_host_version_id=41
FFLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules 
PWD=/builddir/build/BUILD/pycharm-community-2024.3
SOURCE_DATE_EPOCH=1733097600
LOGNAME=mockbuild
CXX=g++
CXXFLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer 
RPM_ARCH=x86_64
container=systemd-nspawn
LDFLAGS=-Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes 
HOME=/builddir
LANG=C.UTF-8
RPM_LD_FLAGS=-Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes 
RUSTFLAGS=-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn
PROMPT_COMMAND=printf "\033]0;<mock-chroot>\007"
RPM_PACKAGE_RELEASE=2.fc39
RPM_OS=linux
LT_SYS_LIBRARY_PATH=/usr/lib64:
FCFLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules 
TERM=vt100
USER=mockbuild
NOTIFY_SOCKET=/run/host/notify
SHLVL=1
RPM_BUILD_DIR=/builddir/build/BUILD
container_host_id=fedora
RPM_OPT_FLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wno-complain-wrong-lang -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
VALAFLAGS=-g
RPM_DOC_DIR=/usr/share/doc
RPM_PACKAGE_VERSION=2024.3
container_host_variant_id=cloud
CONFIG_SITE=NONE
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin
CC=gcc
CFLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer 
MAIL=/var/spool/mail/mockbuild
RPM_BUILD_NCPUS=4
container_uuid=fb537f59-a2ae-4271-a4cc-d230df1014e8
RPM_PACKAGE_NAME=pycharm-community
RPM_BUILD_ROOT=/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64
OLDPWD=/builddir/build/BUILD
_=/usr/bin/env
+ /usr/lib/rpm/redhat/brp-python-hardlink
Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.RupxBL
+ umask 022
+ cd /builddir/build/BUILD
+ CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CFLAGS
+ CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CXXFLAGS
+ FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules '
+ export FFLAGS
+ FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64   -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules '
+ export FCFLAGS
+ VALAFLAGS=-g
+ export VALAFLAGS
+ RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn'
+ export RUSTFLAGS
+ LDFLAGS='-Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes '
+ export LDFLAGS
+ LT_SYS_LIBRARY_PATH=/usr/lib64:
+ export LT_SYS_LIBRARY_PATH
+ CC=gcc
+ export CC
+ CXX=g++
+ export CXX
+ cd pycharm-community-2024.3
+ appstream-util validate-relax --nonet /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/metainfo/pycharm-community.metainfo.xml
/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/metainfo/pycharm-community.metainfo.xml: OK
+ desktop-file-validate /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/applications/pycharm-community.desktop
+ RPM_EC=0
++ jobs -p
+ exit 0
Processing files: pycharm-community-2024.3-2.fc39.x86_64
Executing(%license): /bin/sh -e /var/tmp/rpm-tmp.cz8Ziw
+ umask 022
+ cd /builddir/build/BUILD
+ cd pycharm-community-2024.3
+ LICENSEDIR=/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/licenses/pycharm-community
+ export LC_ALL=
+ LC_ALL=
+ export LICENSEDIR
+ /usr/bin/mkdir -p /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3/license/LICENSE.txt /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3/license/NOTICE.txt /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3/license/javahelp_license.txt /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3/license/javolution_license.txt /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3/license/launcher-third-party-libraries.html /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3/license/saxon-conditions.html /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3/license/third-party-libraries.html /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3/license/third-party-libraries.json /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3/license/yourkit-license-redist.txt /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/licenses/pycharm-community
+ RPM_EC=0
++ jobs -p
+ exit 0
warning: absolute symlink: /usr/bin/pycharm-community -> /usr/share/java/pycharm-community/bin/pycharm.sh
Provides: application() application(pycharm-community.desktop) metainfo() metainfo(pycharm-community.metainfo.xml) mimehandler(application/x-python-code) mimehandler(application/xml) mimehandler(text/markdown) mimehandler(text/plain) mimehandler(text/x-python) pycharm-community = 2024.3-2.fc39 pycharm-community(x86-64) = 2024.3-2.fc39
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /usr/bin/sh libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.15)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.9)(64bit) libdl.so.2()(64bit) libdl.so.2(GLIBC_2.2.5)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libgcc_s.so.1(GCC_3.3)(64bit) libgcc_s.so.1(GCC_4.2.0)(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.12)(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) librt.so.1()(64bit) librt.so.1(GLIBC_2.2.5)(64bit) rtld(GNU_HASH)
Obsoletes: pycharm-community-jre < 2024.3-2.fc39
Processing files: pycharm-community-doc-2024.3-2.fc39.noarch
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.MzjQLL
+ umask 022
+ cd /builddir/build/BUILD
+ cd pycharm-community-2024.3
+ DOCDIR=/builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/doc/pycharm-community-doc
+ export LC_ALL=
+ LC_ALL=
+ export DOCDIR
+ /usr/bin/mkdir -p /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/doc/pycharm-community-doc
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3/help /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/doc/pycharm-community-doc
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3/Install-Linux-tar.txt /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64/usr/share/doc/pycharm-community-doc
+ RPM_EC=0
++ jobs -p
+ exit 0
Provides: pycharm-community-doc = 2024.3-2.fc39
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64
Wrote: /builddir/build/RPMS/pycharm-community-doc-2024.3-2.fc39.noarch.rpm
Wrote: /builddir/build/RPMS/pycharm-community-2024.3-2.fc39.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.XNuB7s
+ umask 022
+ cd /builddir/build/BUILD
+ cd pycharm-community-2024.3
+ /usr/bin/rm -rf /builddir/build/BUILDROOT/pycharm-community-2024.3-2.fc39.x86_64
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(rmbuild): /bin/sh -e /var/tmp/rpm-tmp.oWgPou
+ umask 022
+ cd /builddir/build/BUILD
+ rm -rf /builddir/build/BUILD/pycharm-community-2024.3-SPECPARTS
+ rm -rf pycharm-community-2024.3 pycharm-community-2024.3.gemspec
+ RPM_EC=0
++ jobs -p
+ exit 0

RPM build warnings:
    absolute symlink: /usr/bin/pycharm-community -> /usr/share/java/pycharm-community/bin/pycharm.sh
Finish: rpmbuild pycharm-community-2024.3-2.fc39.src.rpm
Finish: build phase for pycharm-community-2024.3-2.fc39.src.rpm
INFO: chroot_scan: 3 files copied to /var/lib/copr-rpmbuild/results/chroot_scan
INFO: /var/lib/mock/fedora-39-x86_64-1733142171.782165/root/var/log/dnf.log
/var/lib/mock/fedora-39-x86_64-1733142171.782165/root/var/log/dnf.librepo.log
/var/lib/mock/fedora-39-x86_64-1733142171.782165/root/var/log/dnf.rpm.log
INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz
/bin/tar: Removing leading `/' from member names
INFO: Done(/var/lib/copr-rpmbuild/results/pycharm-community-2024.3-2.fc39.src.rpm) Config(child) 13 minutes 8 seconds
INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results
INFO: Cleaning up build root ('cleanup_on_success=True')
Start: clean chroot
INFO: unmounting tmpfs.
Finish: clean chroot
Finish: run
Running RPMResults tool
Package info:
{
    "packages": [
        {
            "name": "pycharm-community",
            "epoch": null,
            "version": "2024.3",
            "release": "2.fc39",
            "arch": "src"
        },
        {
            "name": "pycharm-community-doc",
            "epoch": null,
            "version": "2024.3",
            "release": "2.fc39",
            "arch": "noarch"
        },
        {
            "name": "pycharm-community",
            "epoch": null,
            "version": "2024.3",
            "release": "2.fc39",
            "arch": "x86_64"
        }
    ]
}
RPMResults finished